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 |
|
---|
40 | namespace 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 |
|
---|
46 | class 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 |
|
---|
209 | public:
|
---|
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 |
|
---|