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

📄 cints.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// cints.cc//// Copyright (C) 2001 Edward Valeev//// Author: Edward Valeev <edward.valeev@chemistry.gatech.edu>// Maintainer: EV//// 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 <stdexcept>#include <util/state/stateio.h>#include <util/misc/formio.h>#include <chemistry/qc/cints/cints.h>#include <chemistry/qc/cints/cartit.h>#include <chemistry/qc/cints/tform.h>#include <chemistry/qc/cints/obint.h>#include <chemistry/qc/cints/tbint.h>#include <chemistry/qc/cints/eri.h>#include <chemistry/qc/cints/grt.h>using namespace std;using namespace sc;inline void fail(){  ExEnv::errn() << scprintf("failing module:\n%s",__FILE__) << endl;  abort();}static ClassDesc IntegralCints_cd(  typeid(IntegralCints),"IntegralCints",1,"public Integral",  0, create<IntegralCints>, create<IntegralCints>);IntegralCints::IntegralCints(const Ref<GaussianBasisSet> &b1,			     const Ref<GaussianBasisSet> &b2,			     const Ref<GaussianBasisSet> &b3,			     const Ref<GaussianBasisSet> &b4):  Integral(b1,b2,b3,b4){  initialize_transforms();}IntegralCints::IntegralCints(StateIn& s) :  Integral(s){  initialize_transforms();}IntegralCints::IntegralCints(const Ref<KeyVal>& k) :  Integral(k){  initialize_transforms();}voidIntegralCints::save_data_state(StateOut& s){  Integral::save_data_state(s);}IntegralCints::~IntegralCints(){  free_transforms();}Integral*IntegralCints::clone(){  return new IntegralCints;}size_tIntegralCints::storage_required_eri(const Ref<GaussianBasisSet> &b1,				    const Ref<GaussianBasisSet> &b2,				    const Ref<GaussianBasisSet> &b3,				    const Ref<GaussianBasisSet> &b4){  return EriCints::storage_required(b1,b2,b3,b4);}size_tIntegralCints::storage_required_grt(const Ref<GaussianBasisSet> &b1,				    const Ref<GaussianBasisSet> &b2,				    const Ref<GaussianBasisSet> &b3,				    const Ref<GaussianBasisSet> &b4){  return GRTCints::storage_required(b1,b2,b3,b4);}CartesianIter *IntegralCints::new_cartesian_iter(int l){  return new CartesianIterCints(l);}RedundantCartesianIter *IntegralCints::new_redundant_cartesian_iter(int l){  return new RedundantCartesianIterCints(l);}RedundantCartesianSubIter *IntegralCints::new_redundant_cartesian_sub_iter(int l){  return new RedundantCartesianSubIterCints(l);}SphericalTransformIter *IntegralCints::new_spherical_transform_iter(int l, int inv, int subl){  if (l>maxl_ || l<0) {      ExEnv::errn() << "IntegralCints::new_spherical_transform_iter: bad l" << endl;      abort();    }  if (subl == -1) subl = l;  if (subl < 0 || subl > l || (l-subl)%2 != 0) {      ExEnv::errn() << "IntegralCints::new_spherical_transform_iter: bad subl" << endl;      abort();    }  if (inv) {      return new SphericalTransformIter(ist_[l][(l-subl)/2]);    }  return new SphericalTransformIter(st_[l][(l-subl)/2]);}const SphericalTransform *IntegralCints::spherical_transform(int l, int inv, int subl){  if (l>maxl_ || l<0) {      ExEnv::errn() << "IntegralCints::spherical_transform_iter: bad l" << endl;      abort();    }  if (subl == -1) subl = l;  if (subl < 0 || subl > l || (l-subl)%2 != 0) {      ExEnv::errn() << "IntegralCints::spherical_transform_iter: bad subl" << endl;      abort();    }  if (inv) {      return ist_[l][(l-subl)/2];    }  return st_[l][(l-subl)/2];}Ref<OneBodyInt>IntegralCints::overlap(){  return new OneBodyIntCints(this, bs1_, bs2_, &Int1eCints::overlap);}Ref<OneBodyInt>IntegralCints::kinetic(){  return new OneBodyIntCints(this, bs1_, bs2_, &Int1eCints::kinetic);}Ref<OneBodyInt>IntegralCints::nuclear(){  return new OneBodyIntCints(this, bs1_, bs2_, &Int1eCints::nuclear);}Ref<OneBodyInt>IntegralCints::hcore(){  return new OneBodyIntCints(this, bs1_, bs2_, &Int1eCints::hcore);}Ref<OneBodyInt>IntegralCints::point_charge(const Ref<PointChargeData>& dat){  ExEnv::errn() << scprintf("IntegralCints::point_charge() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;  //  return new PointChargeIntV3(this, bs1_, bs2_, dat);}Ref<OneBodyInt>IntegralCints::efield_dot_vector(const Ref<EfieldDotVectorData>&dat){  ExEnv::errn() << scprintf("IntegralCints::efield_dot_vector() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;  //  return new EfieldDotVectorIntV3(this, bs1_, bs2_, dat);}Ref<OneBodyInt>IntegralCints::dipole(const Ref<DipoleData>& dat){  Ref<OneBodyIntCints> dipoleint = new OneBodyIntCints(this, bs1_, bs2_, &Int1eCints::edipole);  dipoleint->set_multipole_origin(dat);  return dipoleint;}Ref<OneBodyInt>IntegralCints::quadrupole(const Ref<DipoleData>& dat){  Ref<OneBodyIntCints> quadint = new OneBodyIntCints(this, bs1_, bs2_, &Int1eCints::equadrupole);  quadint->set_multipole_origin(dat);  return quadint;}Ref<OneBodyDerivInt>IntegralCints::overlap_deriv(){  ExEnv::errn() << scprintf("IntegralCints::overlap_deriv() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;  //  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::overlap_1der);}Ref<OneBodyDerivInt>IntegralCints::kinetic_deriv(){  ExEnv::errn() << scprintf("IntegralCints::kinetic_deriv() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;  //  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::kinetic_1der);}Ref<OneBodyDerivInt>IntegralCints::nuclear_deriv(){  ExEnv::errn() << scprintf("IntegralCints::nuclear_deriv() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;  //  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::nuclear_1der);}Ref<OneBodyDerivInt>IntegralCints::hcore_deriv(){  ExEnv::errn() << scprintf("IntegralCints::hcore_deriv() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;  //  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::hcore_1der);}Ref<TwoBodyInt>IntegralCints::electron_repulsion(){  return new TwoBodyIntCints(this, bs1_, bs2_, bs3_, bs4_, storage_, erieval);}Ref<TwoBodyDerivInt>IntegralCints::electron_repulsion_deriv(){  ExEnv::errn() << scprintf("IntegralCints::electron_repulsion_deriv() is not yet implemented.\n");  ExEnv::errn() << scprintf("Try using the IntegralV3 factory instead.\n");  fail();  return 0;}Ref<TwoBodyInt>IntegralCints::grt(){  return new TwoBodyIntCints(this, bs1_, bs2_, bs3_, bs4_, storage_, grteval);}voidIntegralCints::set_basis(const Ref<GaussianBasisSet> &b1,			 const Ref<GaussianBasisSet> &b2,			 const Ref<GaussianBasisSet> &b3,			 const Ref<GaussianBasisSet> &b4){  free_transforms();  Integral::set_basis(b1,b2,b3,b4);  check_fullgencon();  initialize_transforms();}voidIntegralCints::free_transforms(){  int i,j;  for (i=0; i<=maxl_; i++) {      for (j=0; j<=i/2; j++) {          delete st_[i][j];          delete ist_[i][j];        }      delete[] st_[i];      delete[] ist_[i];    }  if (maxl_ >= 0) {    delete[] st_;    delete[] ist_;  }  st_ = NULL;  ist_ = NULL;}voidIntegralCints::initialize_transforms(){  maxl_ = -1;  int maxam;  maxam = bs1_.nonnull()?bs1_->max_angular_momentum():-1;  if (maxl_ < maxam) maxl_ = maxam;  maxam = bs2_.nonnull()?bs2_->max_angular_momentum():-1;  if (maxl_ < maxam) maxl_ = maxam;  maxam = bs3_.nonnull()?bs3_->max_angular_momentum():-1;  if (maxl_ < maxam) maxl_ = maxam;  maxam = bs4_.nonnull()?bs4_->max_angular_momentum():-1;  if (maxl_ < maxam) maxl_ = maxam;  if (maxl_ >= 0) {    st_ = new SphericalTransformCints**[maxl_+1];    ist_ = new ISphericalTransformCints**[maxl_+1];;    int i,j;    for (i=0; i<=maxl_; i++) {      st_[i] = new SphericalTransformCints*[i/2+1];      ist_[i] = new ISphericalTransformCints*[i/2+1];      for (j=0; j<=i/2; j++) {        st_[i][j] = new SphericalTransformCints(i,i-2*j);        ist_[i][j] = new ISphericalTransformCints(i,i-2*j);      }    }  }  else {    st_ = NULL;    ist_ = NULL;  }}static bool has_fullgencon(const Ref<GaussianBasisSet>&);voidIntegralCints::check_fullgencon() const{  if ( has_fullgencon(bs1_) ||       has_fullgencon(bs2_) ||       has_fullgencon(bs3_) ||       has_fullgencon(bs4_) ) {      throw std::runtime_error("IntegralCints cannot handle basis sets with fully general contractions yet, try IntegralV3 instead");  }}boolhas_fullgencon(const Ref<GaussianBasisSet>& bs){  bool has_it = false;  int nshell = bs->nshell();  for(int i=0; i<nshell; i++) {    GaussianShell& shell = bs->shell(i);    int minam = shell.min_am();    int maxam = shell.max_am();    if (minam != maxam)      has_it = true;  }  return has_it;}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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