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

📄 file.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// file.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.//#ifdef __GNUC__#pragma implementation#endif#include <sstream>#include <string.h>#ifdef HAVE_CONFIG_H#include <scconfig.h>#endif#include <util/misc/formio.h>#include <util/group/file.h>#include <util/group/fileproc.h>#if defined(HAVE_MPI)#  include <util/group/messmpi.h>//#  include <util/group/filemtmpi.h>#endifusing namespace std;using namespace sc;//////////////////////////////////////////////////////////////////////// FileGrp membersstatic ClassDesc FileGrp_cd(  typeid(FileGrp),"FileGrp",1,"public DescribedClass",  0, 0, 0);FileGrp::FileGrp(){  debug_ = 0;  datafile_ = 0;  filename_ = 0;  offsets_ = 0;  init_locks();}FileGrp::FileGrp(const Ref<KeyVal>& keyval){  debug_ = keyval->intvalue("debug");  datafile_ = 0;  filename_ = 0;  offsets_ = 0;  init_locks();}FileGrp::~FileGrp(){  delete[] offsets_;  delete[] locks_;  datafile_ = 0;  filename_ = 0;}voidFileGrp::open(){  if (filename_) {    datafile_ = open(filename_, O_RDWR);  }  else {    ostringstream errmsg;    errsmg << "FileGrp::open() called but filename has not been set" << ends;    throw runtime_error(errmsg.str());  }}voidFileGrp::close(){  close(datafile_);}voidFileGrp::set_filename(char *name){  if (filename_) {    ostringstream errmsg;    errsmg << "FileGrp::set_filename() called but filename has been set already" << ends;    throw runtime_error(errmsg.str());  }  else    filename_ = strdup(name);}const char*FileGrp::get_filename() const{  return filename_;}voidFileGrp::init_locks(){  Ref<ThreadGrp> thgrp = ThreadGrp::get_default_threadgrp();  nlock_ = 2 * thgrp->nthread();  locks_ = new Ref<ThreadLock>[nlock_];  for (int i=0; i<nlock_; i++) locks_[i] = thgrp->new_lock();}FileGrp *FileGrp::initial_filegrp(){  int argc = 0;  return initial_filegrp(argc,0);}FileGrp *FileGrp::initial_filegrp(int &argc, char *argv[]){  FileGrp *grp = 0;  char *keyval_string = 0;  // see if a file group is given on the command line  if (argc && argv) {      for (int i=0; i<argc; i++) {	  if (argv[i] && !strcmp(argv[i], "-filegrp")) {              char *filegrp_string = argv[i];              i++;              if (i >= argc) {                  ExEnv::errn() << "-filegrp must be following by an argument"                       << endl;                  abort();                }              keyval_string = argv[i];              // move the filegrp arguments to the end of argv              int j;              for (j=i+1; j<argc; j++) {                  argv[j-2] = argv[j];                }              argv[j++] = filegrp_string;              argv[j++] = keyval_string;              // decrement argc to hide the last two arguments              argc -= 2;              break;            }        }    }  if (!keyval_string) {      // find out if the environment gives the containing file group      keyval_string = getenv("FILEGRP");      if (keyval_string) {          if (!strncmp("FILEGRP=", keyval_string, 11)) {              keyval_string = strchr(keyval_string, '=');            }          if (*keyval_string == '=') keyval_string++;        }    }  // if keyval input for a file group was found, then  // create it.  if (keyval_string) {      //ExEnv::outn() << "Creating FileGrp from \"" << keyval_string << "\"" << endl;      Ref<ParsedKeyVal> strkv = new ParsedKeyVal();      strkv->parse_string(keyval_string);      Ref<DescribedClass> dc = strkv->describedclassvalue();      grp = dynamic_cast<FileGrp*>(dc.pointer());      if (dc.null()) {          ExEnv::errn() << "initial_filegrp: couldn't find a FileGrp in "               << keyval_string << endl;          abort();        }      else if (!grp) {          ExEnv::errn() << "initial_filegrp: wanted FileGrp but got "               << dc->class_name() << endl;          abort();        }      // prevent an accidental delete      grp->reference();      strkv = 0;      dc = 0;      // accidental delete not a problem anymore since all smart pointers      // to grp are dead      grp->dereference();      return grp;    }  return grp;}voidFileGrp::activate(){}voidFileGrp::deactivate(){}voidFileGrp::print(ostream&o) const{  o << scprintf("FileGrp (node %d):\n", me());  o << scprintf("%d: n = %d\n", me(), n());  for (int i=0; i<=n_; i++) {      o << scprintf("%d: offset[%d] = %5d\n", me(), i, offsets_[i]);    }}voidFileGrp::sum_reduction(double *data, distsize_t doffset, int dlength){  distsize_t offset = doffset * sizeof(double);  int length = dlength * sizeof(double);  if (offset + length > totalsize()) {      ExEnv::errn() << scprintf("FileGrp::sum_reduction: arg out of range\n");      abort();    }  double *source_data = (double*) obtain_readwrite(offset, length);  for (int i=0; i<dlength; i++) {      source_data[i] += data[i];    }  release_readwrite((void*) source_data, offset, length);}voidFileGrp::sum_reduction_on_node(double *data, size_t doffset, int dlength,                                 int node){  if (node == -1) node = me();  sum_reduction(data, doffset + offset(node)/sizeof(double),                dlength);}voidFileGrp::catchup(){  return;}voidFileGrp::obtain_local_lock(size_t start, size_t fence){  distsize_t locked_region_size = 1 + localsize()/nlock_;  int lstart = start/locked_region_size;  int llast = fence/locked_region_size;  for (int i=lstart; i<=llast; i++) {      locks_[i]->lock();    }}voidFileGrp::release_local_lock(size_t start, size_t fence){  distsize_t locked_region_size = 1 + localsize()/nlock_;  int lstart = start/locked_region_size;  int llast = fence/locked_region_size;  for (int i=lstart; i<=llast; i++) {      locks_[i]->unlock();    }}static Ref<FileGrp> default_filegrp;voidFileGrp::set_default_filegrp(const Ref<FileGrp>& grp){  default_filegrp = grp;}FileGrp*FileGrp::get_default_filegrp(){  if (default_filegrp.nonnull()) return default_filegrp.pointer();  Ref<MessageGrp> msg = MessageGrp::get_default_messagegrp();#if defined(HAVE_MPI) && defined(DEFAULT_MTMPI)  Ref<ThreadGrp> thr = ThreadGrp::get_default_threadgrp();//  default_filegrp = new MTMPIFileGrp(msg,thr);  return default_filegrp.pointer();#endif  if (msg.null()) {      ExEnv::errn() << scprintf("FileGrp::get_default_filegrp: requires default MessageGrp if default behavior not configured\n");      abort();    }#if defined(HAVE_MPI)  else if (msg->class_desc() == ::class_desc<MPIMessageGrp>()) {      Ref<ThreadGrp> thr = ThreadGrp::get_default_threadgrp();//      default_filegrp = new MTMPIFileGrp(msg,thr);      return default_filegrp.pointer();    }#endif  else if (msg->n() == 1) {      default_filegrp = new ProcFileGrp();      return default_filegrp.pointer();    }  else {      ExEnv::errn() << scprintf("FileGrp::get_default_filegrp: cannot create "              "default for \"%s\"\n.", msg->class_name());      abort();    }  if (default_filegrp.null()) {      ExEnv::err0() << scprintf("WARNING: FileGrp::get_default_filegrp(): failed\n");      default_filegrp = new ProcFileGrp;    }  return default_filegrp.pointer();}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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