source: ThirdParty/mpqc_open/src/lib/chemistry/qc/mbptr12/r12int_eval.h@ 41bd14

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 41bd14 was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 11.6 KB
Line 
1//
2// r12int_eval.h
3//
4// Copyright (C) 2004 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 __GNUG__
29#pragma interface
30#endif
31
32#ifndef _chemistry_qc_mbptr12_r12inteval_h
33#define _chemistry_qc_mbptr12_r12inteval_h
34
35#include <util/ref/ref.h>
36#include <chemistry/qc/mbptr12/vxb_eval_info.h>
37#include <chemistry/qc/mbptr12/linearr12.h>
38#include <chemistry/qc/mbptr12/r12_amps.h>
39
40namespace sc {
41
42 /** R12IntEval is the top-level class which computes intermediates occuring in linear R12 theories.
43 This class is used by all Wavefunction classes that implement linear R12 methods.
44 */
45
46class R12IntEval : virtual public SavableState {
47
48 bool evaluated_;
49
50 // Calculation information (number of basis functions, R12 approximation, etc.)
51 Ref<R12IntEvalInfo> r12info_;
52
53 // Note that intermediate B is symmetric but is stored as a full matrix to simplify the code
54 // that computes asymmetric form of B
55 RefSCMatrix Vaa_, Vab_, Xaa_, Xab_, Baa_, Bab_, Aaa_, Aab_, T2aa_, T2ab_;
56 RefSCMatrix Ac_aa_, Ac_ab_;
57 RefSCMatrix Raa_, Rab_; // Not sure if I'll compute and keep these explicitly later
58 Ref<R12Amplitudes> Amps_; // Amplitudes of various R12-contributed terms in pair functions
59 RefSCVector emp2pair_aa_, emp2pair_ab_;
60 RefSCDimension dim_ij_aa_, dim_ij_ab_, dim_ij_s_, dim_ij_t_;
61 RefSCDimension dim_ab_aa_, dim_ab_ab_;
62
63 bool gbc_;
64 bool ebc_;
65 LinearR12::ABSMethod abs_method_;
66 LinearR12::StandardApproximation stdapprox_;
67 bool spinadapted_;
68 bool include_mp1_;
69 /// should I follow Klopper-Samson approach in the intermediates formulation for the EBC-free method?
70 bool follow_ks_ebcfree_;
71 int debug_;
72
73 // Map to TwoBodyMOIntsTransform objects that have been computed previously
74 typedef std::map<std::string, Ref<TwoBodyMOIntsTransform> > TformMap;
75 TformMap tform_map_;
76 // Returns pointer to the appropriate transform.
77 // If the transform is not found then throw runtime_error
78 Ref<TwoBodyMOIntsTransform> get_tform_(const std::string&);
79
80 /// Fock-weighted occupied space |i_f> = f_i^R |R>, where R is a function in RI-BS
81 Ref<MOIndexSpace> focc_space_;
82 /// Form Fock-weighted occupied space
83 void form_focc_space_();
84 /// Fock-weighted active occupied space |i_f> = f_i^R |R>, where R is a function in RI-BS
85 Ref<MOIndexSpace> factocc_space_;
86 /// Form Fock-weighted active occupied space
87 void form_factocc_space_();
88 /// Space of canonical virtual MOs
89 Ref<MOIndexSpace> canonvir_space_;
90 /// Form space of auxiliary virtuals
91 void form_canonvir_space_();
92
93 /// Initialize standard transforms
94 void init_tforms_();
95 /// Set intermediates to zero + add the "diagonal" contributions
96 void init_intermeds_();
97 /// Compute r^2 contribution to X
98 void r2_contrib_to_X_orig_();
99 /// Compute r^2 contribution to X using compute_r2_()
100 void r2_contrib_to_X_new_();
101 /// Compute <space1 space1|r_{12}^2|space1 space2> matrix
102 RefSCMatrix compute_r2_(const Ref<MOIndexSpace>& space1, const Ref<MOIndexSpace>& space2);
103 /** Compute the Fock matrix between 2 spaces. scale_J and scale_K are used to scale Coulomb
104 and exchange contributions */
105 RefSCMatrix fock_(const Ref<MOIndexSpace>& occ_space, const Ref<MOIndexSpace>& bra_space,
106 const Ref<MOIndexSpace>& ket_space, double scale_J = 1.0, double scale_K = 1.0);
107 /// Compute the coulomb matrix between 2 spaces
108 RefSCMatrix coulomb_(const Ref<MOIndexSpace>& occ_space, const Ref<MOIndexSpace>& bra_space,
109 const Ref<MOIndexSpace>& ket_space);
110 /// Compute the exchange matrix between 2 spaces
111 RefSCMatrix exchange_(const Ref<MOIndexSpace>& occ_space, const Ref<MOIndexSpace>& bra_space,
112 const Ref<MOIndexSpace>& ket_space);
113
114 /// Checkpoint the top-level molecular energy
115 void checkpoint_() const;
116
117 /** Compute the number tasks which have access to the integrals.
118 map_to_twi is a vector<int> each element of which will hold the
119 number of tasks with access to the integrals of lower rank than that task
120 (or -1 if the task doesn't have access to the integrals) */
121 const int tasks_with_ints_(const Ref<R12IntsAcc> ints_acc, vector<int>& map_to_twi);
122
123 /** Compute contribution to V, X, and B of the following form:
124 0.5 * \bar{g}_{ij}^{pq} * \bar{r}_{pq}^{kl}, where p and q span mospace.
125 tform_name is the name of the transform to be used to get the integrals.
126 mospace is either space2() or space4() of that transform
127 */
128 void contrib_to_VXB_a_symm_(const std::string& tform_name);
129
130 /** Compute contribution to V, X, and B of the following form:
131 \bar{g}_{ij}^{am} * \bar{r}_{am}^{kl}, where m and a span space1 and space2, respectively.
132 tform_name is the name of the transform to be used to get the integrals.
133 mospace1 and mospace2 are space2() and space4() of that transform, respectively
134 */
135 void contrib_to_VXB_a_asymm_(const std::string& tform_name);
136
137 /// Compute OBS contribution to V, X, and B (these contributions are independent of the method)
138 void obs_contrib_to_VXB_gebc_vbseqobs_();
139
140 /// Compute 1-ABS contribution to V, X, and B (these contributions are independent of the method)
141 void abs1_contrib_to_VXB_gebc_();
142
143 /// Equiv to the sum of above, except for this doesn't assume that VBS is the same as OBS
144 void contrib_to_VXB_gebc_vbsneqobs_();
145
146 /// Compute A using the "simple" formula obtained using direct substitution alpha'->a'
147 void compute_A_simple_();
148
149 /// Compute A using the standard commutator approach
150 void compute_A_via_commutator_();
151
152 /// Compute MP2 T2
153 void compute_T2_();
154
155 /// Compute R "intermediate" (r12 integrals in occ-pair/vir-pair basis)
156 void compute_R_();
157
158 /// Compute A*T2 contribution to V (needed if EBC is not assumed)
159 void AT2_contrib_to_V_();
160
161 /// Compute -2*A*R contribution to B (needed if EBC is not assumed)
162 void AR_contrib_to_B_();
163
164 /** Compute the first (r<sub>kl</sub>^<sup>AB</sup> f<sub>A</sub><sup>m</sup> r<sub>mB</sub>^<sup>ij</sup>)
165 contribution to B that vanishes under GBC */
166 void compute_B_gbc_1_();
167
168 /** Compute the second (r<sub>kl</sub>^<sup>AB</sup> r<sub>AB</sub>^<sup>Kj</sup> f<sub>K</sub><sup>i</sup>)
169 contribution to B that vanishes under GBC */
170 void compute_B_gbc_2_();
171
172 /// Compute dual-basis MP2 energy (contribution from doubles to MP2 energy)
173 void compute_dualEmp2_();
174
175 /// Compute dual-basis MP1 energy (contribution from singles to HF energy)
176 void compute_dualEmp1_();
177
178 /// This function computes T2 amplitudes
179 void compute_T2_vbsneqobs_();
180
181 /** New general function to compute <ij|r<sub>12</sub>|pq> integrals. ipjq_tform
182 is the source of the integrals.*/
183 void compute_R_vbsneqobs_(const Ref<TwoBodyMOIntsTransform>& ipjq_tform,
184 RefSCMatrix& Raa, RefSCMatrix& Rab);
185
186 /** Initialize amplitude objects */
187 void compute_amps_();
188
189 /** Sum contributions to SCMatrix A from all nodes and broadcast so
190 every node has the correct SCMatrix. If to_all_tasks is false, then
191 collect all contributions to task 0 and zero out the matrix on other tasks,
192 otherwise distribute the sum to every task. If to_average is true then
193 each result is scaled by the inverse of the number of tasks. */
194 void globally_sum_scmatrix_(RefSCMatrix& A, bool to_all_tasks = false, bool to_average = false);
195
196 /** Sum contributions to SCVector A from all nodes and broadcast so
197 every node has the correct SCVector. If to_all_tasks is false, then
198 collect all contributions to task 0 and zero out the matrix on other tasks,
199 otherwise distribute the sum to every task. If to_average is true then
200 each result is scaled by the inverse of the number of tasks. */
201 void globally_sum_scvector_(RefSCVector& A, bool to_all_tasks = false, bool to_average = false);
202
203 /** Sum contributions to the intermediates from all nodes and broadcast so
204 every node has the correct matrices. If to_all_tasks is false, then
205 collect all contributions to task 0 and zero out the matrix on other tasks,
206 otherwise distribute the sum to every task. */
207 void globally_sum_intermeds_(bool to_all_tasks = false);
208
209public:
210 R12IntEval(StateIn&);
211 /** Constructs R12IntEval. If follow_ks_ebcfree is true then follow formalism of Klopper and Samson
212 to compute EBC-free MP2-R12 energy. */
213 R12IntEval(const Ref<R12IntEvalInfo>& info, bool gbc = true, bool ebc = true,
214 LinearR12::ABSMethod abs_method = LinearR12::ABS_CABSPlus,
215 LinearR12::StandardApproximation stdapprox = LinearR12::StdApprox_Ap,
216 bool follow_ks_ebcfree = false);
217 ~R12IntEval();
218
219 void save_data_state(StateOut&);
220 virtual void obsolete();
221
222 void include_mp1(bool include_mp1);
223 void set_debug(int debug);
224 void set_dynamic(bool dynamic);
225 void set_print_percent(double print_percent);
226 void set_memory(size_t nbytes);
227
228 const bool gbc() const { return gbc_; }
229 const bool ebc() const { return ebc_; }
230 const LinearR12::StandardApproximation stdapprox() const { return stdapprox_; }
231 bool follow_ks_ebcfree() const { return follow_ks_ebcfree_; }
232
233 Ref<R12IntEvalInfo> r12info() const;
234 RefSCDimension dim_oo_aa() const;
235 RefSCDimension dim_oo_ab() const;
236 RefSCDimension dim_oo_s() const;
237 RefSCDimension dim_oo_t() const;
238 RefSCDimension dim_vv_aa() const;
239 RefSCDimension dim_vv_ab() const;
240
241 /// This function causes the intermediate matrices to be computed.
242 virtual void compute();
243
244 /// Returns alpha-alpha block of the V intermediate matrix.
245 RefSCMatrix V_aa();
246 /// Returns alpha-alpha block of the X intermediate matrix.
247 RefSCMatrix X_aa();
248 /// Returns alpha-alpha block of the B intermediate matrix.
249 RefSymmSCMatrix B_aa();
250 /// Returns alpha-alpha block of the A intermediate matrix. Returns 0 if EBC is assumed.
251 RefSCMatrix A_aa();
252 /// Returns alpha-alpha block of the A intermediate matrix. Returns 0 if EBC is assumed.
253 RefSCMatrix Ac_aa();
254 /// Returns alpha-alpha block of the MP2 T2 matrix. Returns 0 if EBC is assumed.
255 RefSCMatrix T2_aa();
256 /// Returns alpha-beta block of the V intermediate matrix.
257 RefSCMatrix V_ab();
258 /// Returns alpha-beta block of the X intermediate matrix.
259 RefSCMatrix X_ab();
260 /// Returns alpha-beta block of the B intermediate matrix.
261 RefSymmSCMatrix B_ab();
262 /// Returns alpha-beta block of the A intermediate matrix. Returns 0 if EBC is assumed
263 RefSCMatrix A_ab();
264 /// Returns alpha-beta block of the A intermediate matrix. Returns 0 if EBC is assumed
265 RefSCMatrix Ac_ab();
266 /// Returns alpha-beta block of the MP2 T2 matrix. Returns 0 if EBC is assumed
267 RefSCMatrix T2_ab();
268 /// Returns alpha-alpha MP2 pair energies.
269 RefSCVector emp2_aa();
270 /// Returns alpha-beta MP2 pair energies.
271 RefSCVector emp2_ab();
272 /// Returns amplitudes of pair correlation functions
273 Ref<R12Amplitudes> amps();
274
275 RefDiagSCMatrix evals() const;
276};
277
278}
279
280#endif
281
282// Local Variables:
283// mode: c++
284// c-file-style: "CLJ"
285// End:
286
287
Note: See TracBrowser for help on using the repository browser.