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

📄 dist.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// dist.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 <iostream>#include <math.h>#include <util/misc/formio.h>#include <util/keyval/keyval.h>#include <math/scmat/dist.h>#include <math/scmat/cmatrix.h>#include <math/scmat/elemop.h>using namespace std;using namespace sc;/////////////////////////////////////////////////////////////////////////////// DistSCMatrixKit member functionsstatic ClassDesc DistSCMatrixKit_cd(  typeid(DistSCMatrixKit),"DistSCMatrixKit",1,"public SCMatrixKit",  0, create<DistSCMatrixKit>, 0);DistSCMatrixKit::DistSCMatrixKit(const Ref<MessageGrp> &grp){  // if grp is nonnull, then reset grp_ (it gets set to the default in the  // default SCMatrixKit constructor  if (grp.nonnull())    grp_ = grp;}DistSCMatrixKit::DistSCMatrixKit(const Ref<KeyVal>& keyval):  SCMatrixKit(keyval){}DistSCMatrixKit::~DistSCMatrixKit(){}SCMatrix*DistSCMatrixKit::matrix(const RefSCDimension&d1, const RefSCDimension&d2){  return new DistSCMatrix(d1,d2,this);}SymmSCMatrix*DistSCMatrixKit::symmmatrix(const RefSCDimension&d){  return new DistSymmSCMatrix(d,this);}DiagSCMatrix*DistSCMatrixKit::diagmatrix(const RefSCDimension&d){  return new DistDiagSCMatrix(d,this);}SCVector*DistSCMatrixKit::vector(const RefSCDimension&d){  return new DistSCVector(d,this);}/////////////////////////////////////////////////////////////////////////////// DistSCMatrixKit member functionsDistSCMatrixListSubblockIter::DistSCMatrixListSubblockIter(    Access access,    const Ref<SCMatrixBlockList> &list,    const Ref<MessageGrp> &grp    ):  SCMatrixListSubblockIter(access, list->deepcopy()),  grp_(grp),  out_(grp),  in_(grp),  step_(0),  locallist_(list){  if (access == Write) {      ExEnv::errn() << indent           << "DistSCMatrixListSubblockIter: write access not allowed"           << endl;      abort();    }  if (grp->n() == 1) return;  out_.target(grp->me() == grp->n()-1 ? 0: grp->me()+1);  in_.source(grp->me() == 0 ? grp->n()-1: grp->me()-1);  out_.copy_references();}voidDistSCMatrixListSubblockIter::begin(){  if (step_ == grp_->n()) step_ = 0;  else if (step_ != 0) {      ExEnv::errn() << indent << "DistSCMatrixListSubblockIter::begin(): "           << "step != 0: tried to begin in middle of iteration"           << endl;      abort();    }  SCMatrixListSubblockIter::begin();  maybe_advance_list();}voidDistSCMatrixListSubblockIter::maybe_advance_list(){  while (!ready() && grp_->n() > 1 && step_ < grp_->n() - 1) {      advance_list();    }}voidDistSCMatrixListSubblockIter::advance_list(){  SavableState::save_state(list_.pointer(), out_);  out_.flush();  list_ << SavableState::restore_state(in_);  SCMatrixListSubblockIter::begin();  step_++;}voidDistSCMatrixListSubblockIter::next(){  SCMatrixListSubblockIter::next();  maybe_advance_list();}DistSCMatrixListSubblockIter::~DistSCMatrixListSubblockIter(){  if (access_ == Accum) {      while (step_%grp_->n() != 0) {          advance_list();        }      SCMatrixBlockListIter i1, i2;      for (i1=list_->begin(),i2=locallist_->begin();           i1!=list_->end() && i2!=locallist_->end();           i1++,i2++) {          int n = i1.block()->ndat();          if (n != i2.block()->ndat()) {              ExEnv::errn() << indent                   << "DistSCMatrixListSubblockIter: block mismatch: "                   << "internal error" << endl;              abort();            }          double *dat1 = i1.block()->dat();          double *dat2 = i2.block()->dat();          for (int i=0; i<n; i++) {              dat2[i] += dat1[i];            }        }    }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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