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

📄 extent.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// extent.cc//#ifdef __GNUC__#pragma implementation#endif#include <util/misc/formio.h>#include <chemistry/qc/basis/extent.h>using namespace std;using namespace sc;ShellExtent::ShellExtent(){  contributing_shells_ = 0;  n_[0] = n_[1] = n_[2] = 0;}ShellExtent::~ShellExtent(){  delete[] contributing_shells_;}std::vector<ExtentData> &ShellExtent::data(int x, int y, int z){  if (x>=n_[0] || y>=n_[1] || z>= n_[2] || x<0 || y<0 || z<0) {      ExEnv::outn() << "ShellExtent::data: out of bounds" << endl;      abort();    }  return contributing_shells_[z + n_[2]*(y + n_[1]*x)];}std::vector<ExtentData> &ShellExtent::data(int *b){  return data(b[0],b[1],b[2]);}doubleShellExtent::distance(double loc, int axis, int origin, int point){  if (point < origin)      return loc - (lower_[axis]+resolution_*(point+1));  else if (point == origin)      return 0.0;  else      return loc - (lower_[axis]+resolution_*point);}voidShellExtent::init(const Ref<GaussianBasisSet>&gbs,                  double resolution, double tolerance){  int i,j,k,l,m,n;  Ref<Molecule> mol = gbs->molecule();  resolution_ = resolution;  delete[] contributing_shells_;  n_[0] = n_[1] = n_[2] = 0;  for (i=0; i<3; i++) lower_[i] = 0.0;  contributing_shells_ = 0;  if (mol->natom() == 0) return;  double upper[3];  for (i=0; i<3; i++) upper[i] = lower_[i] = mol->r(0,i);  for (i=0; i<mol->natom(); i++) {      for (j=0; j<gbs->nshell_on_center(i); j++) {          double r = gbs->shell(gbs->shell_on_center(i, j)).extent(tolerance);          for (k=0; k<3; k++) {              if (lower_[k]>mol->r(i,k)-r) lower_[k] = mol->r(i,k)-r;              if (upper [k]<mol->r(i,k)+r) upper [k] = mol->r(i,k)+r;            }        }    }  for (i=0; i<3; i++) {      double l;      l = upper[i]-lower_[i];      n_[i] = int(l/resolution_);      if (n_[i]*resolution_ + lower_[i] < upper[i]) n_[i]++;    }  contributing_shells_ = new std::vector<ExtentData>[n_[0]*n_[1]*n_[2]];  for (i=0; i<mol->natom(); i++) {      //ExEnv::outn() << indent << "working on atom " << i << endl;      //ExEnv::outn() << incindent;      for (j=0; j<gbs->nshell_on_center(i); j++) {          int ishell = gbs->shell_on_center(i,j);          const GaussianShell &shell = gbs->shell(ishell);          double r = shell.extent(tolerance);          int ir = int(r/resolution_);          if (ir*resolution_ < r) ir++;          int atom_block[3];          for (l=0; l<3; l++) {              atom_block[l] = int((mol->r(i,l)-lower_[l])/resolution_);            }          int block[3];          //ExEnv::outn() << indent << "working on shell " << ishell << endl;          //ExEnv::outn() << incindent;          for (k=atom_block[0]-ir; k<=atom_block[0]+ir; k++) {              block[0] = k;              for (l=atom_block[1]-ir; l<=atom_block[1]+ir; l++) {                  block[1] = l;                  for (m=atom_block[2]-ir; m<=atom_block[2]+ir; m++) {                      block[2] = m;                      //ExEnv::outn() << indent                      //     << "working on block " << block[0]                      //     << " " << block[1]                      //     << " " << block[2] << endl;                      // find the distance to the atom from this block                      double dist = 0.0;                      for (n=0; n<3; n++) {                          double r                              = distance(mol->r(i,n),n,atom_block[n],block[n]);                          dist += r*r;                        }                      dist = sqrt(dist);                      double bound = shell.monobound(dist);                      //ExEnv::outn() << indent                      //     << "dist = " << dist                      //     << " bound = " << bound << endl;                      if (bound < tolerance) continue;                      data(block).push_back(ExtentData(ishell, bound));                    }                }            }          //ExEnv::outn() << decindent;        }      //ExEnv::outn() << decindent;    }}const std::vector<ExtentData> &ShellExtent::contributing_shells(double x, double y, double z){  int i, block[3];  block[0] = int((x-lower_[0])/resolution_);  block[1] = int((y-lower_[1])/resolution_);  block[2] = int((z-lower_[2])/resolution_);  for (i=0; i<3; i++) {      if (block[i] < 0 || block[i] >= n_[i]) return null_;    }  return data(block);}voidShellExtent::print(ostream &o){  int i,j,k,l;  o    << indent << "ShellExent:" << endl;  o << incindent;  o    << indent << "n = " << n_[0] << " " << n_[1] << " " << n_[2] << endl;;  o << indent << "resolution = " << resolution_ << endl;  o << indent    << "lower = " << lower_[0]    << " " << lower_[1]    << " " << lower_[2] << endl;;  o << indent    << "upper = " << lower_[0] + n_[0] * resolution_    << " " << lower_[1] + n_[1] * resolution_    << " " << lower_[2] + n_[2] * resolution_ << endl;;  for (i=0; i<n_[0]; i++) {      for (j=0; j<n_[1]; j++) {          for (k=0; k<n_[2]; k++) {              const std::vector<ExtentData> &d = data(i,j,k);              if (d.size()) {                  o << indent                       << i << " " << j << " " << k << ":" << endl;                  for (l=0; l<d.size(); l++) {                      o << indent                           << "  " << d[l].shell << " " << d[l].bound << endl;                    }                }            }        }    }  o << decindent;}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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