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

📄 integral.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// integral.cc --- implementation of the Integral class//// Copyright (C) 1996 Limit Point Systems, Inc.//// Author: Edward Seidl <seidl@janed.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 <stdexcept>#include <sstream>#include <util/state/stateio.h>#include <chemistry/qc/basis/integral.h>#include <chemistry/qc/basis/shellrot.h>#include <chemistry/qc/basis/petite.h>#include <chemistry/qc/basis/obint.h>using namespace std;using namespace sc;static ClassDesc Integral_cd(  typeid(Integral),"Integral",2,"public SavableState",  0, 0, 0);Integral::Integral(const Ref<GaussianBasisSet> &b1,                   const Ref<GaussianBasisSet> &b2,                   const Ref<GaussianBasisSet> &b3,                   const Ref<GaussianBasisSet> &b4){  storage_ = 0;  storage_used_ = 0;  grp_ = MessageGrp::get_default_messagegrp();  set_basis(b1,b2,b3,b4);}Integral::Integral(StateIn& s) :  SavableState(s){  storage_used_ = 0;  bs1_ << SavableState::restore_state(s);  bs2_ << SavableState::restore_state(s);  bs3_ << SavableState::restore_state(s);  bs4_ << SavableState::restore_state(s);  if (s.version(::class_desc<Integral>()) >= 2) {    double dstorage;    s.get(dstorage);    storage_ = size_t(dstorage);  }  else {    unsigned int istorage;    s.get(istorage);    storage_ = istorage;  }  grp_ = MessageGrp::get_default_messagegrp();}Integral::Integral(const Ref<KeyVal>&){  storage_used_ = 0;  storage_ = 0;  grp_ = MessageGrp::get_default_messagegrp();}voidIntegral::save_data_state(StateOut&o){  SavableState::save_state(bs1_.pointer(),o);  SavableState::save_state(bs2_.pointer(),o);  SavableState::save_state(bs3_.pointer(),o);  SavableState::save_state(bs4_.pointer(),o);  double dstorage = storage_;  o.put(dstorage);}Ref<Integral> default_integral;voidIntegral::set_default_integral(const Ref<Integral>& intf){  default_integral = intf;}// Liberally borrowed from ThreadGrpIntegral*Integral::initial_integral(int& argc, char ** argv){  Integral *intf = 0;  char * keyval_string = 0;    // see if an integral factory is given on the command line  if (argc && argv) {    for (int i=0; i < argc; i++) {      if (argv[i] && !strcmp(argv[i], "-integral")) {        char *integral_string = argv[i];        i++;        if (i >= argc) {          throw runtime_error("-integral must be followed by an argument");        }        keyval_string = argv[i];        // move the integral arguments to the end of argv        int j;        for (j=i+1; j<argc; j++) {          argv[j-2] = argv[j];        }        argv[j++] = integral_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 integral    keyval_string = getenv("INTEGRAL");    if (keyval_string) {      if (!strncmp("INTEGRAL=", keyval_string, 11)) {        keyval_string = strchr(keyval_string, '=');      }      if (*keyval_string == '=') keyval_string++;    }  }  // if keyval input for a integral was found, then  // create it.  if (keyval_string) {    if (keyval_string[0] == '\0') return 0;    Ref<ParsedKeyVal> strkv = new ParsedKeyVal();    strkv->parse_string(keyval_string);    Ref<DescribedClass> dc = strkv->describedclassvalue();    intf = dynamic_cast<Integral*>(dc.pointer());    if (dc.null()) {      ostringstream errmsg;      errmsg << "Integral::initial_integral: couldn't find a Integral in " << keyval_string << ends;      throw runtime_error(errmsg.str());    } else if (!intf) {      ostringstream errmsg;      errmsg << "initial_integral: wanted Integral but got " << dc->class_name() << ends;      throw runtime_error(errmsg.str());    }    // prevent an accidental delete    intf->reference();    strkv = 0;    dc = 0;    // accidental delete not a problem anymore since all smart pointers    // to intf are dead    intf->dereference();    return intf;  }  return 0;}intIntegral::equiv(const Ref<Integral> &integral){  return eq(class_desc(),integral->class_desc());}Ref<PetiteList>Integral::petite_list(){  return new PetiteList(bs1_, this);}Ref<PetiteList>Integral::petite_list(const Ref<GaussianBasisSet>& gbs){  return new PetiteList(gbs, this);}ShellRotationIntegral::shell_rotation(int am, SymmetryOperation& so, int pure){  this->reference();  ShellRotation r(am, so, this, pure);  this->dereference();  return r;}voidIntegral::set_basis(const Ref<GaussianBasisSet> &b1,                    const Ref<GaussianBasisSet> &b2,                    const Ref<GaussianBasisSet> &b3,                    const Ref<GaussianBasisSet> &b4){  bs1_ = b1;  bs2_ = b2;  bs3_ = b3;  bs4_ = b4;  if (bs2_.null()) bs2_ = bs1_;  if (bs3_.null()) bs3_ = bs2_;  if (bs4_.null()) bs4_ = bs3_;}size_tIntegral::storage_required_eri(const Ref<GaussianBasisSet> &b1,			       const Ref<GaussianBasisSet> &b2,			       const Ref<GaussianBasisSet> &b3,			       const Ref<GaussianBasisSet> &b4){  // By default, generated ERI evaluator will not need  // any significant amount of memory  return 0;}size_tIntegral::storage_required_eri_deriv(const Ref<GaussianBasisSet> &b1,				     const Ref<GaussianBasisSet> &b2,				     const Ref<GaussianBasisSet> &b3,				     const Ref<GaussianBasisSet> &b4){  // By default, generated derivative ERI evaluator will not need  // any significant amount of memory  return 0;}size_tIntegral::storage_required_grt(const Ref<GaussianBasisSet> &b1,			       const Ref<GaussianBasisSet> &b2,			       const Ref<GaussianBasisSet> &b3,			       const Ref<GaussianBasisSet> &b4){  // By default, generated GRT evaluator will not need  // any significant amount of memory  return 0;}size_tIntegral::storage_unused(){  ptrdiff_t tmp=storage_-storage_used_;  return (tmp<0?0:tmp);}Ref<TwoBodyInt>Integral::grt(){  throw std::runtime_error("Integral::grt(): not implemented in this particular integrals factory.");}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "ETS"// End:

⌨️ 快捷键说明

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