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

📄 intv3.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// intv3.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 <stdexcept>#include <util/state/stateio.h>#include <chemistry/qc/basis/integral.h>#include <chemistry/qc/intv3/intv3.h>#include <chemistry/qc/intv3/cartitv3.h>#include <chemistry/qc/intv3/tformv3.h>#include <chemistry/qc/intv3/obintv3.h>#include <chemistry/qc/intv3/tbintv3.h>using namespace std;using namespace sc;static ClassDesc IntegralV3_cd(  typeid(IntegralV3),"IntegralV3",1,"public Integral",  0, create<IntegralV3>, create<IntegralV3>);extern Ref<Integral> default_integral;Integral*Integral::get_default_integral(){  if (default_integral.null())    default_integral = new IntegralV3;  return default_integral;}IntegralV3::IntegralV3(const Ref<GaussianBasisSet> &b1,                       const Ref<GaussianBasisSet> &b2,                       const Ref<GaussianBasisSet> &b3,                       const Ref<GaussianBasisSet> &b4):  Integral(b1,b2,b3,b4){  initialize_transforms();}IntegralV3::IntegralV3(StateIn& s) :  Integral(s){  initialize_transforms();}IntegralV3::IntegralV3(const Ref<KeyVal>& k) :  Integral(k){  initialize_transforms();}voidIntegralV3::save_data_state(StateOut& s){  Integral::save_data_state(s);}IntegralV3::~IntegralV3(){  free_transforms();}Integral*IntegralV3::clone(){  return new IntegralV3;}CartesianIter *IntegralV3::new_cartesian_iter(int l){  return new CartesianIterV3(l);}RedundantCartesianIter *IntegralV3::new_redundant_cartesian_iter(int l){  return new RedundantCartesianIterV3(l);}RedundantCartesianSubIter *IntegralV3::new_redundant_cartesian_sub_iter(int l){  return new RedundantCartesianSubIterV3(l);}SphericalTransformIter *IntegralV3::new_spherical_transform_iter(int l, int inv, int subl){  if (l>maxl_ || l<0) {      ExEnv::errn() << "IntegralV3::new_spherical_transform_iter: bad l" << endl;      abort();    }  if (subl == -1) subl = l;  if (subl < 0 || subl > l || (l-subl)%2 != 0) {      ExEnv::errn() << "IntegralV3::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 *IntegralV3::spherical_transform(int l, int inv, int subl){  if (l>maxl_ || l<0) {      ExEnv::errn() << "IntegralV3::spherical_transform_iter: bad l" << endl;      abort();    }  if (subl == -1) subl = l;  if (subl < 0 || subl > l || (l-subl)%2 != 0) {      ExEnv::errn() << "IntegralV3::spherical_transform_iter: bad subl" << endl;      abort();    }  if (inv) {      return ist_[l][(l-subl)/2];    }  return st_[l][(l-subl)/2];}Ref<OneBodyInt>IntegralV3::overlap(){  return new OneBodyIntV3(this, bs1_, bs2_, &Int1eV3::overlap);}Ref<OneBodyInt>IntegralV3::kinetic(){  return new OneBodyIntV3(this, bs1_, bs2_, &Int1eV3::kinetic);}Ref<OneBodyInt>IntegralV3::nuclear(){  return new OneBodyIntV3(this, bs1_, bs2_, &Int1eV3::nuclear);}Ref<OneBodyInt>IntegralV3::hcore(){  return new OneBodyIntV3(this, bs1_, bs2_, &Int1eV3::hcore);}Ref<OneBodyInt>IntegralV3::point_charge(const Ref<PointChargeData>& dat){  return new PointChargeIntV3(this, bs1_, bs2_, dat);}Ref<OneBodyInt>IntegralV3::efield_dot_vector(const Ref<EfieldDotVectorData>&dat){  return new EfieldDotVectorIntV3(this, bs1_, bs2_, dat);}Ref<OneBodyInt>IntegralV3::dipole(const Ref<DipoleData>& dat){  return new DipoleIntV3(this, bs1_, bs2_, dat);}Ref<OneBodyInt>IntegralV3::quadrupole(const Ref<DipoleData>& dat){  throw std::runtime_error("IntegralV3 cannot compute quadrupole moment integrals yet. Try IntegralCints instead.");}Ref<OneBodyDerivInt>IntegralV3::overlap_deriv(){  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::overlap_1der);}Ref<OneBodyDerivInt>IntegralV3::kinetic_deriv(){  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::kinetic_1der);}Ref<OneBodyDerivInt>IntegralV3::nuclear_deriv(){  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::nuclear_1der);}Ref<OneBodyDerivInt>IntegralV3::hcore_deriv(){  return new OneBodyDerivIntV3(this, bs1_, bs2_, &Int1eV3::hcore_1der);}Ref<TwoBodyInt>IntegralV3::electron_repulsion(){  return new TwoBodyIntV3(this, bs1_, bs2_, bs3_, bs4_, storage_);}Ref<TwoBodyDerivInt>IntegralV3::electron_repulsion_deriv(){  return new TwoBodyDerivIntV3(this, bs1_, bs2_, bs3_, bs4_, storage_);}voidIntegralV3::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);  initialize_transforms();}voidIntegralV3::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];    }  delete[] st_;  delete[] ist_;  st_ = 0;  ist_ = 0;}voidIntegralV3::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;  st_ = new SphericalTransformV3**[maxl_+1];  ist_ = new ISphericalTransformV3**[maxl_+1];;  int i,j;  for (i=0; i<=maxl_; i++) {      st_[i] = new SphericalTransformV3*[i/2+1];      ist_[i] = new ISphericalTransformV3*[i/2+1];      for (j=0; j<=i/2; j++) {          st_[i][j] = new SphericalTransformV3(i,i-2*j);          ist_[i][j] = new ISphericalTransformV3(i,i-2*j);        }    }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ"// End:

⌨️ 快捷键说明

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