| [0b990d] | 1 | //
 | 
|---|
 | 2 | // mbptr12.cc
 | 
|---|
 | 3 | //
 | 
|---|
 | 4 | // Copyright (C) 2001 Edward Valeev
 | 
|---|
 | 5 | //
 | 
|---|
 | 6 | // Author: Edward Valeev <edward.valeev@chemistry.gatech.edu>
 | 
|---|
 | 7 | // Maintainer: EV
 | 
|---|
 | 8 | //
 | 
|---|
 | 9 | // This file is part of the SC Toolkit.
 | 
|---|
 | 10 | //
 | 
|---|
 | 11 | // The SC Toolkit is free software; you can redistribute it and/or modify
 | 
|---|
 | 12 | // it under the terms of the GNU Library General Public License as published by
 | 
|---|
 | 13 | // the Free Software Foundation; either version 2, or (at your option)
 | 
|---|
 | 14 | // any later version.
 | 
|---|
 | 15 | //
 | 
|---|
 | 16 | // The SC Toolkit is distributed in the hope that it will be useful,
 | 
|---|
 | 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
 | 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|---|
 | 19 | // GNU Library General Public License for more details.
 | 
|---|
 | 20 | //
 | 
|---|
 | 21 | // You should have received a copy of the GNU Library General Public License
 | 
|---|
 | 22 | // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
 | 
|---|
 | 23 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
|---|
 | 24 | //
 | 
|---|
 | 25 | // The U.S. Government is granted a limited license as per AL 91-7.
 | 
|---|
 | 26 | //
 | 
|---|
 | 27 | 
 | 
|---|
 | 28 | #ifdef __GNUC__
 | 
|---|
 | 29 | #pragma implementation
 | 
|---|
 | 30 | #endif
 | 
|---|
 | 31 | 
 | 
|---|
 | 32 | #include <stdexcept>
 | 
|---|
 | 33 | #include <sstream>
 | 
|---|
 | 34 | #include <util/misc/string.h>
 | 
|---|
 | 35 | 
 | 
|---|
 | 36 | #include <util/class/scexception.h>
 | 
|---|
 | 37 | #include <util/misc/formio.h>
 | 
|---|
 | 38 | #include <util/misc/exenv.h>
 | 
|---|
 | 39 | #include <util/state/stateio.h>
 | 
|---|
 | 40 | #include <math/scmat/blocked.h>
 | 
|---|
 | 41 | #include <chemistry/qc/basis/petite.h>
 | 
|---|
 | 42 | #include <chemistry/qc/scf/clhf.h>
 | 
|---|
 | 43 | #include <chemistry/qc/cints/cints.h>
 | 
|---|
 | 44 | #include <chemistry/qc/mbptr12/mbptr12.h>
 | 
|---|
 | 45 | 
 | 
|---|
 | 46 | using namespace std;
 | 
|---|
 | 47 | using namespace sc;
 | 
|---|
 | 48 | 
 | 
|---|
 | 49 | /*--------------------------------
 | 
|---|
 | 50 |   MBPT2_R12
 | 
|---|
 | 51 |  --------------------------------*/
 | 
|---|
 | 52 | 
 | 
|---|
 | 53 | static ClassDesc MBPT2_R12_cd(
 | 
|---|
 | 54 |   typeid(MBPT2_R12),"MBPT2_R12",4,"public MBPT2",
 | 
|---|
 | 55 |   0, create<MBPT2_R12>, create<MBPT2_R12>);
 | 
|---|
 | 56 | 
 | 
|---|
 | 57 | MBPT2_R12::MBPT2_R12(StateIn& s):
 | 
|---|
 | 58 |   MBPT2(s)
 | 
|---|
 | 59 | {
 | 
|---|
 | 60 |   r12eval_ << SavableState::restore_state(s);
 | 
|---|
 | 61 |   r12a_energy_ << SavableState::restore_state(s);
 | 
|---|
 | 62 |   r12ap_energy_ << SavableState::restore_state(s);
 | 
|---|
 | 63 |   r12b_energy_ << SavableState::restore_state(s);
 | 
|---|
 | 64 |   aux_basis_ << SavableState::restore_state(s);
 | 
|---|
 | 65 |   vir_basis_ << SavableState::restore_state(s);
 | 
|---|
 | 66 |   if (s.version(::class_desc<MBPT2_R12>()) >= 3) {
 | 
|---|
 | 67 |     int gbc; s.get(gbc); gbc_ = (bool)gbc;
 | 
|---|
 | 68 |     int ebc; s.get(ebc); ebc_ = (bool)ebc;
 | 
|---|
 | 69 |   }
 | 
|---|
 | 70 |   if (s.version(::class_desc<MBPT2_R12>()) >= 2) {
 | 
|---|
 | 71 |     int absmethod; s.get(absmethod); abs_method_ = (LinearR12::ABSMethod)absmethod;
 | 
|---|
 | 72 |   }
 | 
|---|
 | 73 |   int stdapprox; s.get(stdapprox); stdapprox_ = (LinearR12::StandardApproximation) stdapprox;
 | 
|---|
 | 74 |   int spinadapted; s.get(spinadapted); spinadapted_ = (bool)spinadapted;
 | 
|---|
 | 75 |   if (s.version(::class_desc<MBPT2_R12>()) >= 4) {
 | 
|---|
 | 76 |     int include_mp1; s.get(include_mp1); include_mp1_ = static_cast<bool>(include_mp1);
 | 
|---|
 | 77 |   }
 | 
|---|
 | 78 |   int r12ints_method; s.get(r12ints_method); r12ints_method_ = (R12IntEvalInfo::StoreMethod) r12ints_method;
 | 
|---|
 | 79 |   s.get(r12ints_file_);
 | 
|---|
 | 80 |   s.get(mp2_corr_energy_);
 | 
|---|
 | 81 |   s.get(r12_corr_energy_);
 | 
|---|
 | 82 | }
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 | MBPT2_R12::MBPT2_R12(const Ref<KeyVal>& keyval):
 | 
|---|
 | 85 |   MBPT2(keyval)
 | 
|---|
 | 86 | {
 | 
|---|
 | 87 |   // Make sure can use the integral factory for linear R12
 | 
|---|
 | 88 |   check_integral_factory_();
 | 
|---|
 | 89 |   
 | 
|---|
 | 90 |   // Check is this is a closed-shell reference
 | 
|---|
 | 91 |   CLHF* clhfref = dynamic_cast<CLHF*>(reference_.pointer());
 | 
|---|
 | 92 |   if (!clhfref) {
 | 
|---|
 | 93 |     ExEnv::err0() << "MBPT2_R12::MBPT2_R12: reference wavefunction is of non-CLHF type" << endl;
 | 
|---|
 | 94 |     abort();
 | 
|---|
 | 95 |   }
 | 
|---|
 | 96 | 
 | 
|---|
 | 97 |   aux_basis_ = require_dynamic_cast<GaussianBasisSet*>(
 | 
|---|
 | 98 |     keyval->describedclassvalue("aux_basis").pointer(),
 | 
|---|
 | 99 |     "MBPT2_R12::MBPT2_R12\n"
 | 
|---|
 | 100 |     );
 | 
|---|
 | 101 |   if (aux_basis_.pointer() == NULL)
 | 
|---|
 | 102 |     aux_basis_ = basis();
 | 
|---|
 | 103 | 
 | 
|---|
 | 104 |   vir_basis_ = require_dynamic_cast<GaussianBasisSet*>(
 | 
|---|
 | 105 |     keyval->describedclassvalue("vir_basis").pointer(),
 | 
|---|
 | 106 |     "MBPT2_R12::MBPT2_R12\n"
 | 
|---|
 | 107 |     );
 | 
|---|
 | 108 |   if (vir_basis_.pointer() == NULL)
 | 
|---|
 | 109 |     vir_basis_ = basis();
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 |   // Default is to assume GBC
 | 
|---|
 | 112 |   gbc_ = keyval->booleanvalue("gbc",KeyValValueboolean((int)true));
 | 
|---|
 | 113 |   // Default is to assume EBC
 | 
|---|
 | 114 |   ebc_ = keyval->booleanvalue("ebc",KeyValValueboolean((int)true));
 | 
|---|
 | 115 |   
 | 
|---|
 | 116 |   // For now the default is to use the old ABS method, of Klopper and Samson
 | 
|---|
 | 117 |   char* abs_method_str = keyval->pcharvalue("abs_method",KeyValValuepchar("ABS"));
 | 
|---|
 | 118 |   if ( !strcmp(abs_method_str,"KS") ||
 | 
|---|
 | 119 |        !strcmp(abs_method_str,"ks") ||
 | 
|---|
 | 120 |        !strcmp(abs_method_str,"ABS") ||
 | 
|---|
 | 121 |        !strcmp(abs_method_str,"abs") ) {
 | 
|---|
 | 122 |     abs_method_ = LinearR12::ABS_ABS;
 | 
|---|
 | 123 |   }
 | 
|---|
 | 124 |   else if ( !strcmp(abs_method_str,"KS+") ||
 | 
|---|
 | 125 |             !strcmp(abs_method_str,"ks+") ||
 | 
|---|
 | 126 |             !strcmp(abs_method_str,"ABS+") ||
 | 
|---|
 | 127 |             !strcmp(abs_method_str,"abs+") ) {
 | 
|---|
 | 128 |     abs_method_ = LinearR12::ABS_ABSPlus;
 | 
|---|
 | 129 |   }
 | 
|---|
 | 130 |   else if ( !strcmp(abs_method_str,"EV") ||
 | 
|---|
 | 131 |             !strcmp(abs_method_str,"ev") ||
 | 
|---|
 | 132 |             !strcmp(abs_method_str,"CABS") ||
 | 
|---|
 | 133 |             !strcmp(abs_method_str,"cabs") ) {
 | 
|---|
 | 134 |     abs_method_ = LinearR12::ABS_CABS;
 | 
|---|
 | 135 |   }
 | 
|---|
 | 136 |   else if ( !strcmp(abs_method_str,"EV+") ||
 | 
|---|
 | 137 |             !strcmp(abs_method_str,"ev+") ||
 | 
|---|
 | 138 |             !strcmp(abs_method_str,"CABS+") ||
 | 
|---|
 | 139 |             !strcmp(abs_method_str,"cabs+") ) {
 | 
|---|
 | 140 |     abs_method_ = LinearR12::ABS_CABSPlus;
 | 
|---|
 | 141 |   }
 | 
|---|
 | 142 |   else {
 | 
|---|
 | 143 |     delete[] abs_method_str;
 | 
|---|
 | 144 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12 -- unrecognized value for abs_method");
 | 
|---|
 | 145 |   }
 | 
|---|
 | 146 |   delete[] abs_method_str;
 | 
|---|
 | 147 | 
 | 
|---|
 | 148 |   // Default method is MBPT2-R12/A'
 | 
|---|
 | 149 |   char *sa_string = keyval->pcharvalue("stdapprox",KeyValValuepchar("A'"));
 | 
|---|
 | 150 |   if ( !strcmp(sa_string,"A") ||
 | 
|---|
 | 151 |        !strcmp(sa_string,"a") ) {
 | 
|---|
 | 152 |     stdapprox_ = LinearR12::StdApprox_A;
 | 
|---|
 | 153 |   }
 | 
|---|
 | 154 |   else if ( !strcmp(sa_string,"Ap") ||
 | 
|---|
 | 155 |             !strcmp(sa_string,"ap") ||
 | 
|---|
 | 156 |             !strcmp(sa_string,"A'") ||
 | 
|---|
 | 157 |             !strcmp(sa_string,"a'") ) {
 | 
|---|
 | 158 |     stdapprox_ = LinearR12::StdApprox_Ap;
 | 
|---|
 | 159 |   }
 | 
|---|
 | 160 |   else if ( !strcmp(sa_string,"B") ||
 | 
|---|
 | 161 |             !strcmp(sa_string,"b") ) {
 | 
|---|
 | 162 |     delete[] sa_string;
 | 
|---|
 | 163 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12() -- MP2-R12/B energy is not implemented yet");
 | 
|---|
 | 164 |   }
 | 
|---|
 | 165 |   else {
 | 
|---|
 | 166 |     delete[] sa_string;
 | 
|---|
 | 167 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12() -- unrecognized value for stdapprox");
 | 
|---|
 | 168 |   }
 | 
|---|
 | 169 | 
 | 
|---|
 | 170 |   // Default is to use spin-adapted algorithm
 | 
|---|
 | 171 |   spinadapted_ = keyval->booleanvalue("spinadapted",KeyValValueboolean((int)true));
 | 
|---|
 | 172 | 
 | 
|---|
 | 173 |   // Default is to not compute MP1 energy
 | 
|---|
 | 174 |   include_mp1_ = keyval->booleanvalue("include_mp1",KeyValValueboolean((int)false));
 | 
|---|
 | 175 | 
 | 
|---|
 | 176 |   // Klopper and Samson's ABS method is only implemented for certain "old" methods
 | 
|---|
 | 177 |   // Make sure that the ABS method is available for the requested MP2-R12 energy
 | 
|---|
 | 178 |   const bool must_use_cabs = (!gbc_ || !ebc_ || stdapprox_ == LinearR12::StdApprox_B ||
 | 
|---|
 | 179 |                               !basis()->equiv(vir_basis_));
 | 
|---|
 | 180 |   if (must_use_cabs &&
 | 
|---|
 | 181 |       (abs_method_ == LinearR12::ABS_ABS || abs_method_ == LinearR12::ABS_ABSPlus))
 | 
|---|
 | 182 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12() -- abs_method must be set to cabs or cabs+ for this MP2-R12 method");
 | 
|---|
 | 183 |     
 | 
|---|
 | 184 |   // Standard approximation A is not valid when gbc_ = false or ebc_ = false
 | 
|---|
 | 185 |   if ( (!gbc_ || !ebc_) && stdapprox_ == LinearR12::StdApprox_A )
 | 
|---|
 | 186 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12() -- stdapprox=A is not valid when gbc_ = false or ebc_ = false");
 | 
|---|
 | 187 |     
 | 
|---|
 | 188 | 
 | 
|---|
 | 189 |   // Determine how to store MO integrals
 | 
|---|
 | 190 |   char *r12ints_str = keyval->pcharvalue("r12ints",KeyValValuepchar("mem-posix"));
 | 
|---|
 | 191 |   if (!strcmp(r12ints_str,"mem")) {
 | 
|---|
 | 192 |     r12ints_method_ = R12IntEvalInfo::mem_only;
 | 
|---|
 | 193 |   }
 | 
|---|
 | 194 | #if HAVE_MPIIO
 | 
|---|
 | 195 |   else if (!strcmp(r12ints_str,"mem-mpi")) {
 | 
|---|
 | 196 |     r12ints_method_ = R12IntEvalInfo::mem_mpi;
 | 
|---|
 | 197 |   }
 | 
|---|
 | 198 |   else if (!strcmp(r12ints_str,"mpi")) {
 | 
|---|
 | 199 |     r12ints_method_ = R12IntEvalInfo::mpi;
 | 
|---|
 | 200 |   }
 | 
|---|
 | 201 | #else
 | 
|---|
 | 202 |   else if ( !strcmp(r12ints_str,"mem-mpi") ||
 | 
|---|
 | 203 |             !strcmp(r12ints_str,"mpi") ) {
 | 
|---|
 | 204 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12 -- the value for keyword r12ints is not valid in this environment (no MPI-I/O detected)");
 | 
|---|
 | 205 |   }
 | 
|---|
 | 206 | #endif
 | 
|---|
 | 207 |   else if (!strcmp(r12ints_str,"mem-posix")) {
 | 
|---|
 | 208 |     r12ints_method_ = R12IntEvalInfo::mem_posix;
 | 
|---|
 | 209 |   }
 | 
|---|
 | 210 |   else if (!strcmp(r12ints_str,"posix")) {
 | 
|---|
 | 211 |     r12ints_method_ = R12IntEvalInfo::posix;
 | 
|---|
 | 212 |   }
 | 
|---|
 | 213 |   else {
 | 
|---|
 | 214 |     delete[] r12ints_str;
 | 
|---|
 | 215 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12 -- invalid value for keyword r12ints");
 | 
|---|
 | 216 |   }
 | 
|---|
 | 217 |   delete[] r12ints_str;
 | 
|---|
 | 218 | 
 | 
|---|
 | 219 |   // Make sure that integrals storage method is compatible with standard approximation
 | 
|---|
 | 220 |   // If it's a MP2-R12/B calculation or EBC or GBC are not assumed then must use disk
 | 
|---|
 | 221 |   const bool must_use_disk = (!gbc_ || !ebc_ || stdapprox_ == LinearR12::StdApprox_B);
 | 
|---|
 | 222 |   if (must_use_disk && r12ints_method_ == R12IntEvalInfo::mem_only)
 | 
|---|
 | 223 |     throw std::runtime_error("MBPT2_R12::MBPT2_R12 -- r12ints=mem is only possible for MP2-R12/A and MP2-R12/A' (GBC+EBC) methods");
 | 
|---|
 | 224 |   if (must_use_disk) {
 | 
|---|
 | 225 |     if (r12ints_method_ == R12IntEvalInfo::mem_posix)
 | 
|---|
 | 226 |       r12ints_method_ = R12IntEvalInfo::posix;
 | 
|---|
 | 227 | #if HAVE_MPIIO
 | 
|---|
 | 228 |     if (r12ints_method_ == R12IntEvalInfo::mem_mpi)
 | 
|---|
 | 229 |       r12ints_method_ = R12IntEvalInfo::mpi;
 | 
|---|
 | 230 | #endif
 | 
|---|
 | 231 |   }
 | 
|---|
 | 232 | 
 | 
|---|
 | 233 |   // Get the prefix for the filename to store the integrals
 | 
|---|
 | 234 |   std::ostringstream oss;
 | 
|---|
 | 235 |   oss << SCFormIO::default_basename() << ".r12ints";
 | 
|---|
 | 236 |   r12ints_file_ = keyval->stringvalue("r12ints_file",KeyValValuestring(oss.str()));
 | 
|---|
 | 237 | 
 | 
|---|
 | 238 |   r12eval_ = 0;
 | 
|---|
 | 239 |   r12a_energy_ = 0;
 | 
|---|
 | 240 |   r12ap_energy_ = 0;
 | 
|---|
 | 241 |   r12b_energy_ = 0;
 | 
|---|
 | 242 |   mp2_corr_energy_ = 0.0;
 | 
|---|
 | 243 |   r12_corr_energy_ = 0.0;
 | 
|---|
 | 244 | 
 | 
|---|
 | 245 |   twopdm_grid_aa_ = require_dynamic_cast<TwoBodyGrid*>(keyval->describedclassvalue("twopdm_grid_aa").pointer(),
 | 
|---|
 | 246 |                                                "MBPT2_R12::MBPT2_R12\n");
 | 
|---|
 | 247 |   twopdm_grid_ab_ = require_dynamic_cast<TwoBodyGrid*>(keyval->describedclassvalue("twopdm_grid_ab").pointer(),
 | 
|---|
 | 248 |                                                "MBPT2_R12::MBPT2_R12\n");
 | 
|---|
 | 249 | }
 | 
|---|
 | 250 | 
 | 
|---|
 | 251 | MBPT2_R12::~MBPT2_R12()
 | 
|---|
 | 252 | {
 | 
|---|
 | 253 |   r12eval_ = 0;
 | 
|---|
 | 254 |   r12a_energy_ = 0;
 | 
|---|
 | 255 |   r12ap_energy_ = 0;
 | 
|---|
 | 256 |   r12b_energy_ = 0;
 | 
|---|
 | 257 | }
 | 
|---|
 | 258 | 
 | 
|---|
 | 259 | void
 | 
|---|
 | 260 | MBPT2_R12::save_data_state(StateOut& s)
 | 
|---|
 | 261 | {
 | 
|---|
 | 262 |   MBPT2::save_data_state(s);
 | 
|---|
 | 263 |   SavableState::save_state(r12eval_.pointer(),s);
 | 
|---|
 | 264 |   SavableState::save_state(r12a_energy_.pointer(),s);
 | 
|---|
 | 265 |   SavableState::save_state(r12ap_energy_.pointer(),s);
 | 
|---|
 | 266 |   SavableState::save_state(r12b_energy_.pointer(),s);
 | 
|---|
 | 267 |   SavableState::save_state(aux_basis_.pointer(),s);
 | 
|---|
 | 268 |   SavableState::save_state(vir_basis_.pointer(),s);
 | 
|---|
 | 269 |   s.put((int)gbc_);
 | 
|---|
 | 270 |   s.put((int)ebc_);
 | 
|---|
 | 271 |   s.put((int)abs_method_);
 | 
|---|
 | 272 |   s.put((int)stdapprox_);
 | 
|---|
 | 273 |   s.put((int)spinadapted_);
 | 
|---|
 | 274 |   s.put((int)include_mp1_);
 | 
|---|
 | 275 |   s.put((int)r12ints_method_);
 | 
|---|
 | 276 |   s.put(r12ints_file_);
 | 
|---|
 | 277 | 
 | 
|---|
 | 278 |   s.put(mp2_corr_energy_);
 | 
|---|
 | 279 |   s.put(r12_corr_energy_);
 | 
|---|
 | 280 | }
 | 
|---|
 | 281 | 
 | 
|---|
 | 282 | void
 | 
|---|
 | 283 | MBPT2_R12::print(ostream&o) const
 | 
|---|
 | 284 | {
 | 
|---|
 | 285 |   o << indent << "MBPT2_R12:" << endl;
 | 
|---|
 | 286 |   o << incindent;
 | 
|---|
 | 287 |   o << indent << "GBC assumed: " << (gbc_ ? "true" : "false") << endl;
 | 
|---|
 | 288 |   o << indent << "EBC assumed: " << (ebc_ ? "true" : "false") << endl;
 | 
|---|
 | 289 |   switch(abs_method_) {
 | 
|---|
 | 290 |   case LinearR12::ABS_ABS :
 | 
|---|
 | 291 |     o << indent << "ABS method variant: ABS  (Klopper and Samson)" << endl;
 | 
|---|
 | 292 |     break;
 | 
|---|
 | 293 |   case LinearR12::ABS_ABSPlus :
 | 
|---|
 | 294 |     o << indent << "ABS method variant: ABS+ (Klopper and Samson using the union of OBS and ABS for RI)" << endl;
 | 
|---|
 | 295 |     break;
 | 
|---|
 | 296 |   case LinearR12::ABS_CABS :
 | 
|---|
 | 297 |     o << indent << "ABS method variant: CABS  (Valeev)" << endl;
 | 
|---|
 | 298 |     break;
 | 
|---|
 | 299 |   case LinearR12::ABS_CABSPlus :
 | 
|---|
 | 300 |     o << indent << "ABS method variant: CABS+ (Valeev using the union of OBS and ABS for RI)" << endl;
 | 
|---|
 | 301 |     break;
 | 
|---|
 | 302 |   }
 | 
|---|
 | 303 |   switch (stdapprox_) {
 | 
|---|
 | 304 |     case LinearR12::StdApprox_A :
 | 
|---|
 | 305 |       o << indent << "Standard Approximation: A" << endl;
 | 
|---|
 | 306 |     break;
 | 
|---|
 | 307 |     case LinearR12::StdApprox_Ap :
 | 
|---|
 | 308 |       o << indent << "Standard Approximation: A'" << endl;
 | 
|---|
 | 309 |     break;
 | 
|---|
 | 310 |     case LinearR12::StdApprox_B :
 | 
|---|
 | 311 |       o << indent << "Standard Approximation: B" << endl;
 | 
|---|
 | 312 |     break;
 | 
|---|
 | 313 |   }
 | 
|---|
 | 314 | 
 | 
|---|
 | 315 |   o << indent << "Spin-adapted algorithm: " << (spinadapted_ ? "true" : "false") << endl;
 | 
|---|
 | 316 |   if (!vir_basis_->equiv(basis()))
 | 
|---|
 | 317 |     o << indent << "Compute MP1 energy: " << (include_mp1_ ? "true" : "false") << endl;
 | 
|---|
 | 318 | 
 | 
|---|
 | 319 |   char* r12ints_str;
 | 
|---|
 | 320 |   switch (r12ints_method_) {
 | 
|---|
 | 321 |   case R12IntEvalInfo::mem_only:
 | 
|---|
 | 322 |     r12ints_str = strdup("mem"); break;
 | 
|---|
 | 323 |   case R12IntEvalInfo::mem_posix:
 | 
|---|
 | 324 |     r12ints_str = strdup("mem_posix"); break;
 | 
|---|
 | 325 |   case R12IntEvalInfo::posix:
 | 
|---|
 | 326 |     r12ints_str = strdup("posix"); break;
 | 
|---|
 | 327 | #if HAVE_MPIIO
 | 
|---|
 | 328 |   case R12IntEvalInfo::mem_mpi:
 | 
|---|
 | 329 |     r12ints_str = strdup("mem-mpi"); break;
 | 
|---|
 | 330 |   case R12IntEvalInfo::mpi:
 | 
|---|
 | 331 |     r12ints_str = strdup("mpi"); break;
 | 
|---|
 | 332 | #endif
 | 
|---|
 | 333 |   default:
 | 
|---|
 | 334 |     throw std::runtime_error("MBPT2_R12::print -- invalid value of r12ints_method_");
 | 
|---|
 | 335 |   }
 | 
|---|
 | 336 |   o << indent << "How to Store Transformed Integrals: " << r12ints_str << endl << endl;
 | 
|---|
 | 337 |   free(r12ints_str);
 | 
|---|
 | 338 |   o << indent << "Transformed Integrals file suffix: " << r12ints_file_ << endl << endl;
 | 
|---|
 | 339 |   o << indent << "Auxiliary Basis Set (ABS):" << endl;
 | 
|---|
 | 340 |   o << incindent; aux_basis_->print(o); o << decindent << endl;
 | 
|---|
 | 341 |   o << indent << " Virtuals Basis Set (VBS):" << endl;
 | 
|---|
 | 342 |   o << incindent; vir_basis_->print(o); o << decindent << endl;
 | 
|---|
 | 343 |   MBPT2::print(o);
 | 
|---|
 | 344 |   o << decindent;
 | 
|---|
 | 345 | }
 | 
|---|
 | 346 | 
 | 
|---|
 | 347 | RefSymmSCMatrix
 | 
|---|
 | 348 | MBPT2_R12::density()
 | 
|---|
 | 349 | {
 | 
|---|
 | 350 |   ExEnv::out0() << "MBPT2_R12::density() is not implemented" << endl;
 | 
|---|
 | 351 |   abort();
 | 
|---|
 | 352 |   return 0;
 | 
|---|
 | 353 | }
 | 
|---|
 | 354 | 
 | 
|---|
 | 355 | //////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 356 | 
 | 
|---|
 | 357 | void
 | 
|---|
 | 358 | MBPT2_R12::compute()
 | 
|---|
 | 359 | {
 | 
|---|
 | 360 |   if (std::string(reference_->integral()->class_name())
 | 
|---|
 | 361 |       !=integral()->class_name()) {
 | 
|---|
 | 362 |       FeatureNotImplemented ex(
 | 
|---|
 | 363 |           "cannot use a reference with a different Integral specialization",
 | 
|---|
 | 364 |           __FILE__, __LINE__, class_desc());
 | 
|---|
 | 365 |       try {
 | 
|---|
 | 366 |           ex.elaborate()
 | 
|---|
 | 367 |               << "reference uses " << reference_->integral()->class_name()
 | 
|---|
 | 368 |               << " but this object uses " << integral()->class_name()
 | 
|---|
 | 369 |               << std::endl;
 | 
|---|
 | 370 |         }
 | 
|---|
 | 371 |       catch (...) {}
 | 
|---|
 | 372 |       throw ex;
 | 
|---|
 | 373 |     }
 | 
|---|
 | 374 | 
 | 
|---|
 | 375 |   init_variables_();
 | 
|---|
 | 376 |   reference_->set_desired_value_accuracy(desired_value_accuracy()
 | 
|---|
 | 377 |                                          / ref_to_mp2r12_acc_);
 | 
|---|
 | 378 | 
 | 
|---|
 | 379 |   compute_energy_a_();
 | 
|---|
 | 380 | }
 | 
|---|
 | 381 | 
 | 
|---|
 | 382 | //////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 383 | 
 | 
|---|
 | 384 | void
 | 
|---|
 | 385 | MBPT2_R12::obsolete()
 | 
|---|
 | 386 | {
 | 
|---|
 | 387 |   r12eval_ = 0;
 | 
|---|
 | 388 |   r12a_energy_ = 0;
 | 
|---|
 | 389 |   r12ap_energy_ = 0;
 | 
|---|
 | 390 |   r12b_energy_ = 0;
 | 
|---|
 | 391 |   mp2_corr_energy_ = 0.0;
 | 
|---|
 | 392 |   r12_corr_energy_ = 0.0;
 | 
|---|
 | 393 |   MBPT2::obsolete();
 | 
|---|
 | 394 | }
 | 
|---|
 | 395 | 
 | 
|---|
 | 396 | //////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 397 | 
 | 
|---|
 | 398 | int
 | 
|---|
 | 399 | MBPT2_R12::gradient_implemented() const
 | 
|---|
 | 400 | {
 | 
|---|
 | 401 |   return 0;
 | 
|---|
 | 402 | }
 | 
|---|
 | 403 | 
 | 
|---|
 | 404 | //////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 405 | 
 | 
|---|
 | 406 | int
 | 
|---|
 | 407 | MBPT2_R12::value_implemented() const
 | 
|---|
 | 408 | {
 | 
|---|
 | 409 |   return 1;
 | 
|---|
 | 410 | }
 | 
|---|
 | 411 | 
 | 
|---|
 | 412 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 413 | 
 | 
|---|
 | 414 | Ref<GaussianBasisSet>
 | 
|---|
 | 415 | MBPT2_R12::aux_basis() const
 | 
|---|
 | 416 | {
 | 
|---|
 | 417 |   return aux_basis_;
 | 
|---|
 | 418 | }
 | 
|---|
 | 419 | 
 | 
|---|
 | 420 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 421 | 
 | 
|---|
 | 422 | Ref<GaussianBasisSet>
 | 
|---|
 | 423 | MBPT2_R12::vir_basis() const
 | 
|---|
 | 424 | {
 | 
|---|
 | 425 |   return vir_basis_;
 | 
|---|
 | 426 | }
 | 
|---|
 | 427 | 
 | 
|---|
 | 428 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 429 | 
 | 
|---|
 | 430 | bool
 | 
|---|
 | 431 | MBPT2_R12::gbc() const
 | 
|---|
 | 432 | {
 | 
|---|
 | 433 |   return gbc_;
 | 
|---|
 | 434 | }
 | 
|---|
 | 435 | 
 | 
|---|
 | 436 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 437 | 
 | 
|---|
 | 438 | bool
 | 
|---|
 | 439 | MBPT2_R12::ebc() const
 | 
|---|
 | 440 | {
 | 
|---|
 | 441 |   return ebc_;
 | 
|---|
 | 442 | }
 | 
|---|
 | 443 | 
 | 
|---|
 | 444 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 445 | 
 | 
|---|
 | 446 | LinearR12::ABSMethod
 | 
|---|
 | 447 | MBPT2_R12::abs_method() const
 | 
|---|
 | 448 | {
 | 
|---|
 | 449 |   return abs_method_;
 | 
|---|
 | 450 | }
 | 
|---|
 | 451 | 
 | 
|---|
 | 452 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 453 | 
 | 
|---|
 | 454 | LinearR12::StandardApproximation
 | 
|---|
 | 455 | MBPT2_R12::stdapprox() const
 | 
|---|
 | 456 | {
 | 
|---|
 | 457 |   return stdapprox_;
 | 
|---|
 | 458 | }
 | 
|---|
 | 459 | 
 | 
|---|
 | 460 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 461 | 
 | 
|---|
 | 462 | bool
 | 
|---|
 | 463 | MBPT2_R12::spinadapted() const
 | 
|---|
 | 464 | {
 | 
|---|
 | 465 |   return spinadapted_;
 | 
|---|
 | 466 | }
 | 
|---|
 | 467 | 
 | 
|---|
 | 468 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 469 | 
 | 
|---|
 | 470 | R12IntEvalInfo::StoreMethod
 | 
|---|
 | 471 | MBPT2_R12::r12ints_method() const
 | 
|---|
 | 472 | {
 | 
|---|
 | 473 |   return r12ints_method_;
 | 
|---|
 | 474 | }
 | 
|---|
 | 475 | 
 | 
|---|
 | 476 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 477 | 
 | 
|---|
 | 478 | const std::string&
 | 
|---|
 | 479 | MBPT2_R12::r12ints_file() const
 | 
|---|
 | 480 | {
 | 
|---|
 | 481 |   return r12ints_file_;
 | 
|---|
 | 482 | }
 | 
|---|
 | 483 | 
 | 
|---|
 | 484 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 485 | 
 | 
|---|
 | 486 | double
 | 
|---|
 | 487 | MBPT2_R12::corr_energy()
 | 
|---|
 | 488 | {
 | 
|---|
 | 489 |   energy();
 | 
|---|
 | 490 |   return energy() - ref_energy();
 | 
|---|
 | 491 | }
 | 
|---|
 | 492 | 
 | 
|---|
 | 493 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 494 | 
 | 
|---|
 | 495 | double
 | 
|---|
 | 496 | MBPT2_R12::r12_corr_energy()
 | 
|---|
 | 497 | {
 | 
|---|
 | 498 |   energy();
 | 
|---|
 | 499 |   return energy() - mp2_corr_energy_ - ref_energy();
 | 
|---|
 | 500 | }
 | 
|---|
 | 501 | 
 | 
|---|
 | 502 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 503 | 
 | 
|---|
 | 504 | void
 | 
|---|
 | 505 | MBPT2_R12::init_variables_()
 | 
|---|
 | 506 | {
 | 
|---|
 | 507 |   MBPT2::init_variables();
 | 
|---|
 | 508 | }
 | 
|---|
 | 509 | 
 | 
|---|
 | 510 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 511 | 
 | 
|---|
 | 512 | void
 | 
|---|
 | 513 | MBPT2_R12::check_integral_factory_()
 | 
|---|
 | 514 | {
 | 
|---|
 | 515 |   // Only IntegralCints can be used at the moment
 | 
|---|
 | 516 |   IntegralCints* r12intf = dynamic_cast<IntegralCints*>(integral().pointer());
 | 
|---|
 | 517 |   if (!r12intf) {
 | 
|---|
 | 518 |     ostringstream errmsg;
 | 
|---|
 | 519 |     errmsg << "Integral factory " << (integral().null() ? "null" : integral()->class_name())
 | 
|---|
 | 520 |            << " cannot be used in MBPT2_R12 class - try IntegralCints instead" << ends;
 | 
|---|
 | 521 |     throw runtime_error(errmsg.str());
 | 
|---|
 | 522 |   }
 | 
|---|
 | 523 | }
 | 
|---|
 | 524 | 
 | 
|---|
 | 525 | /////////////////////////////////////////////////////////////////////////////
 | 
|---|
 | 526 | 
 | 
|---|
 | 527 | // Local Variables:
 | 
|---|
 | 528 | // mode: c++
 | 
|---|
 | 529 | // c-file-style: "CLJ"
 | 
|---|
 | 530 | // End:
 | 
|---|