⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 files.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// files.cc//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Curtis Janssen <cljanss@limitpt.com>// Maintainer: LPS//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#include <ctype.h>#include <string.h>#include <stdio.h>#include <fstream>#include <scconfig.h>#ifdef HAVE_SSTREAM#  include <sstream>#else#  include <strstream.h>#endif#include <sys/stat.h>#include <util/misc/formio.h>#include <util/group/message.h>#include <chemistry/qc/basis/files.h>using namespace std;using namespace sc;BasisFileSet::BasisFileSet(const Ref<KeyVal>& keyval){  nbasissets_ = 0;  basissets_ = 0;  dir_[0] = keyval->pcharvalue("basisdir");  dir_[1] = getenv("SCLIBDIR");  if (dir_[1]) {      char *tmp = strchr(dir_[1],'=');      if (!tmp) tmp = dir_[1];      else tmp = &tmp[1];      dir_[1] = strcpy(new char[strlen(tmp)+6+1], tmp);      strcat(dir_[1], "/basis");    }  else {      struct stat sb;      const char *bdir = SCDATADIR "/basis";#ifdef SRC_SCLIBDIR      if (stat(bdir, &sb) != 0) {          bdir = SRC_SCLIBDIR "/basis";        }#endif      dir_[1] = strcpy(new char[strlen(bdir)+1], bdir);    }}BasisFileSet::~BasisFileSet(){  int i;  for (i=0; i<nbasissets_; i++) delete[] basissets_[i];  delete[] basissets_;  delete[] dir_[0];  delete[] dir_[1];}Ref<KeyVal>BasisFileSet::keyval(const Ref<KeyVal> &keyval, const char *basisname){  int i;  // check if the basisname has already been located  for (i=0; i<nbasissets_; i++) {      if (!strcmp(basisname, basissets_[i])) return keyval;    }  char *filename = new char[strlen(basisname)+1];  for (i=0; basisname[i] != '\0'; i++) {      if (basisname[i] >= 'A' && basisname[i] <= 'Z') {          filename[i] = tolower(basisname[i]);        }      else if (basisname[i] == ','               || basisname[i] == ' ') {          filename[i] = '_';        }      else if (basisname[i] == '+') {          filename[i] = 'P';        }      else if (basisname[i] == '*') {          filename[i] = 'S';        }      else if (basisname[i] == '(') {          filename[i] = 'L';        }      else if (basisname[i] == ')') {          filename[i] = 'R';        }      else {          filename[i] = basisname[i];        }    }  filename[i] = '\0';  Ref<MessageGrp> grp = MessageGrp::get_default_messagegrp();  // find the basis file  Ref<KeyVal> newkeyval(keyval);  for (i=0; i<2; i++) {      if (!dir_[i]) continue;      if (grp->me() == 0) {          char *path = new char[strlen(dir_[i]) + strlen(filename) + 5];          strcpy(path, dir_[i]);          strcat(path, "/");          strcat(path, filename);          strcat(path, ".kv");          // test to see if the file can be opened read only.          ifstream is(path);          if (is.good()) {              int status = 1;              ExEnv::out0() << indent << "Reading file " << path << "." << endl;              grp->bcast(status);#ifdef HAVE_SSTREAM              ostringstream ostrs;#else              ostrstream ostrs;#endif              is >> ostrs.rdbuf();#ifdef HAVE_SSTREAM              int n = 1 + strlen(ostrs.str().c_str());              char *in_char_array = strcpy(new char[n],ostrs.str().c_str());#else              ostrs << ends;              char *in_char_array = ostrs.str();              int n = ostrs.pcount();#endif              grp->bcast(n);              grp->bcast(in_char_array, n);              Ref<ParsedKeyVal> parsedkv = new ParsedKeyVal;              parsedkv->parse_string(in_char_array);              delete[] in_char_array;              Ref<KeyVal> libkeyval = parsedkv.pointer();              newkeyval = new AggregateKeyVal(keyval,libkeyval);              delete[] path;              break;            }          else {              int status = 0;              grp->bcast(status);            }          delete[] path;        }      else {          int status;          grp->bcast(status);          if (status) {              int n;              grp->bcast(n);              char *in_char_array = new char[n];              grp->bcast(in_char_array, n);              Ref<ParsedKeyVal> parsedkv = new ParsedKeyVal;              parsedkv->parse_string(in_char_array);              delete[] in_char_array;              Ref<KeyVal> libkeyval = parsedkv.pointer();              newkeyval = new AggregateKeyVal(keyval,libkeyval);              break;            }        }    }  // add the current basis set to basissets_  char **newbasissets = new char*[nbasissets_+1];  for (i=0; i<nbasissets_; i++) newbasissets[i] = basissets_[i];  newbasissets[nbasissets_] = strcpy(new char[strlen(basisname)+1],                                     basisname);  nbasissets_++;  delete[] basissets_;  basissets_ = newbasissets;  delete[] filename;  return newkeyval;}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -