@@ -95,26 +95,11 @@ void SA_MRDSRG::guess_t2_impl(BlockedTensor& T2) {
95
95
std::vector<std::string> T2blocks (T2.block_labels ());
96
96
if (ccvv_source_ == " ZERO" ) {
97
97
T2blocks.erase (std::remove (T2blocks.begin (), T2blocks.end (), " ccvv" ), T2blocks.end ());
98
- T2.block (" ccvv" ).iterate([&](const std::vector<size_t >& i, double & value) {
99
- size_t i0 = core_mos_[i[0 ]];
100
- size_t i1 = core_mos_[i[1 ]];
101
- size_t i2 = virt_mos_[i[2 ]];
102
- size_t i3 = virt_mos_[i[3 ]];
103
-
104
- value /= Fdiag_[i0] + Fdiag_[i1] - Fdiag_[i2] - Fdiag_[i3];
105
- });
98
+ apply_denominator (T2, {" ccvv" }, [](double d) { return 1.0 / d; });
106
99
}
107
100
108
- for (const std::string& block : T2blocks) {
109
- T2.block (block).iterate([&](const std::vector<size_t >& i, double & value) {
110
- size_t i0 = label_to_spacemo_[block[0 ]][i[0 ]];
111
- size_t i1 = label_to_spacemo_[block[1 ]][i[1 ]];
112
- size_t i2 = label_to_spacemo_[block[2 ]][i[2 ]];
113
- size_t i3 = label_to_spacemo_[block[3 ]][i[3 ]];
114
- double denom = Fdiag_[i0] + Fdiag_[i1] - Fdiag_[i2] - Fdiag_[i3];
115
- value *= dsrg_source_->compute_renormalized_denominator (denom);
116
- });
117
- }
101
+ apply_denominator (T2, T2blocks,
102
+ [&](double d) { return dsrg_source_->compute_renormalized_denominator (d); });
118
103
119
104
// transform back to non-canonical basis
120
105
if (!semi_canonical_) {
@@ -161,22 +146,12 @@ void SA_MRDSRG::guess_t1(BlockedTensor& F, BlockedTensor& T2, BlockedTensor& T1)
161
146
std::vector<std::string> T1blocks (T1.block_labels ());
162
147
if (ccvv_source_ == " ZERO" ) {
163
148
T1blocks.erase (std::remove (T1blocks.begin (), T1blocks.end (), " cv" ), T1blocks.end ());
164
- T1.block (" cv" ).iterate([&](const std::vector<size_t >& i, double & value) {
165
- size_t i0 = core_mos_[i[0 ]];
166
- size_t i1 = virt_mos_[i[1 ]];
167
-
168
- value /= Fdiag_[i0] - Fdiag_[i1];
169
- });
149
+ apply_denominator (T1, {" cv" }, [](double d) { return 1.0 / d; });
170
150
}
171
151
172
- for (const std::string& block : T1blocks) {
173
- T1.block (block).iterate([&](const std::vector<size_t >& i, double & value) {
174
- size_t i0 = label_to_spacemo_[block[0 ]][i[0 ]];
175
- size_t i1 = label_to_spacemo_[block[1 ]][i[1 ]];
176
- value *=
177
- dsrg_source_->compute_renormalized_denominator (Fdiag_[i0] - Fdiag_[i1]);
178
- });
179
- }
152
+ apply_denominator (T1, T1blocks, [&](double d) {
153
+ return dsrg_source_->compute_renormalized_denominator (d);
154
+ });
180
155
181
156
// transform back to non-canonical basis
182
157
if (!semi_canonical_) {
@@ -230,25 +205,11 @@ void SA_MRDSRG::update_t2() {
230
205
timer t2 (" scale Hbar2 by renormalized denominator" );
231
206
// scale Hbar2 by renormalized denominator
232
207
if (ccvv_source_ == " ZERO" ) {
233
- DT2_.block (" ccvv" ).iterate([&](const std::vector<size_t >& i, double & value) {
234
- size_t i0 = core_mos_[i[0 ]];
235
- size_t i1 = core_mos_[i[1 ]];
236
- size_t i2 = virt_mos_[i[2 ]];
237
- size_t i3 = virt_mos_[i[3 ]];
238
- value /= Fdiag_[i0] + Fdiag_[i1] - Fdiag_[i2] - Fdiag_[i3];
239
- });
208
+ apply_denominator (DT2_, {" ccvv" }, [](double d) { return 1.0 / d; });
240
209
}
241
210
242
- for (const std::string& block : T2blocks) {
243
- DT2_.block (block).iterate([&](const std::vector<size_t >& i, double & value) {
244
- size_t i0 = label_to_spacemo_[block[0 ]][i[0 ]];
245
- size_t i1 = label_to_spacemo_[block[1 ]][i[1 ]];
246
- size_t i2 = label_to_spacemo_[block[2 ]][i[2 ]];
247
- size_t i3 = label_to_spacemo_[block[3 ]][i[3 ]];
248
- double denom = Fdiag_[i0] + Fdiag_[i1] - Fdiag_[i2] - Fdiag_[i3];
249
- value *= dsrg_source_->compute_renormalized_denominator (denom);
250
- });
251
- }
211
+ apply_denominator (DT2_, T2blocks,
212
+ [&](double d) { return dsrg_source_->compute_renormalized_denominator (d); });
252
213
t2.stop ();
253
214
254
215
// Step 2: work on T2 where Hbar2 is treated as intermediate
@@ -269,16 +230,8 @@ void SA_MRDSRG::update_t2() {
269
230
270
231
timer t6 (" scale T2 by delta exponential" );
271
232
// scale T2 by delta exponential
272
- for (const std::string& block : T2blocks) {
273
- T2_.block (block).iterate([&](const std::vector<size_t >& i, double & value) {
274
- size_t i0 = label_to_spacemo_[block[0 ]][i[0 ]];
275
- size_t i1 = label_to_spacemo_[block[1 ]][i[1 ]];
276
- size_t i2 = label_to_spacemo_[block[2 ]][i[2 ]];
277
- size_t i3 = label_to_spacemo_[block[3 ]][i[3 ]];
278
- double denom = Fdiag_[i0] + Fdiag_[i1] - Fdiag_[i2] - Fdiag_[i3];
279
- value *= dsrg_source_->compute_renormalized (denom);
280
- });
281
- }
233
+ apply_denominator (T2_, T2blocks,
234
+ [&](double d) { return dsrg_source_->compute_renormalized (d); });
282
235
if (ccvv_source_ == " ZERO" ) {
283
236
T2_.block (" ccvv" ).zero ();
284
237
}
@@ -349,21 +302,11 @@ void SA_MRDSRG::update_t1() {
349
302
350
303
// scale Hbar1 by renormalized denominator
351
304
if (ccvv_source_ == " ZERO" ) {
352
- DT1_.block (" cv" ).iterate([&](const std::vector<size_t >& i, double & value) {
353
- size_t i0 = core_mos_[i[0 ]];
354
- size_t i1 = virt_mos_[i[1 ]];
355
- value /= Fdiag_[i0] - Fdiag_[i1];
356
- });
305
+ apply_denominator (DT1_, {" cv" }, [](double d) { return 1.0 / d; });
357
306
}
358
307
359
- for (const std::string& block : T1blocks) {
360
- DT1_.block (block).iterate([&](const std::vector<size_t >& i, double & value) {
361
- size_t i0 = label_to_spacemo_[block[0 ]][i[0 ]];
362
- size_t i1 = label_to_spacemo_[block[1 ]][i[1 ]];
363
- double denom = Fdiag_[i0] - Fdiag_[i1];
364
- value *= dsrg_source_->compute_renormalized_denominator (denom);
365
- });
366
- }
308
+ apply_denominator (DT1_, T1blocks,
309
+ [&](double d) { return dsrg_source_->compute_renormalized_denominator (d); });
367
310
368
311
// Step 2: work on T1 where Hbar1 is treated as intermediate
369
312
@@ -379,14 +322,9 @@ void SA_MRDSRG::update_t1() {
379
322
}
380
323
381
324
// scale T1 by delta exponential
382
- for (const std::string& block : T1blocks) {
383
- T1_.block (block).iterate([&](const std::vector<size_t >& i, double & value) {
384
- size_t i0 = label_to_spacemo_[block[0 ]][i[0 ]];
385
- size_t i1 = label_to_spacemo_[block[1 ]][i[1 ]];
386
- double denom = Fdiag_[i0] - Fdiag_[i1];
387
- value *= dsrg_source_->compute_renormalized (denom);
388
- });
389
- }
325
+ apply_denominator (T1_, T1blocks,
326
+ [&](double d) { return dsrg_source_->compute_renormalized (d); });
327
+
390
328
if (ccvv_source_ == " ZERO" ) {
391
329
T1_.block (" cv" ).zero ();
392
330
}
0 commit comments