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:
|
---|