1 //
2 // BAGEL - Brilliantly Advanced General Electronic Structure Library
3 // Filename: RelMRCI_tasks16.cc
4 // Copyright (C) 2014 Toru Shiozaki
5 //
6 // Author: Toru Shiozaki <shiozaki@northwestern.edu>
7 // Maintainer: Shiozaki group
8 //
9 // This file is part of the BAGEL package.
10 //
11 // This program is free software: you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation, either version 3 of the License, or
14 // (at your option) any later version.
15 //
16 // This program 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 General Public License for more details.
20 //
21 // You should have received a copy of the GNU General Public License
22 // along with this program. If not, see <http://www.gnu.org/licenses/>.
23 //
24
25 #include <bagel_config.h>
26 #ifdef COMPILE_SMITH
27
28 #include <src/smith/relmrci/RelMRCI_tasks16.h>
29
30 using namespace std;
31 using namespace bagel;
32 using namespace bagel::SMITH;
33 using namespace bagel::SMITH::RelMRCI;
34
compute()35 void Task750::Task_local::compute() {
36 const Index x0 = b(0);
37 const Index a3 = b(1);
38 const Index c2 = b(2);
39 const Index a1 = b(3);
40 // tensor label: I1338
41 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
42 std::fill_n(odata.get(), out()->get_size(x0, a3, c2, a1), 0.0);
43 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
44 std::fill_n(odata_sorted.get(), out()->get_size(x0, a3, c2, a1), 0.0);
45 for (auto& x1 : *range_[1]) {
46 // tensor label: v2
47 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x1, a3, c2, a1);
48 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x1, a3, c2, a1)]);
49 sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a3.size(), c2.size(), a1.size());
50 // tensor label: Gamma27
51 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x1, x0);
52 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x1, x0)]);
53 sort_indices<0,1,0,1,-1,1>(i1data, i1data_sorted, x1.size(), x0.size());
54 zgemm3m_("T", "N", a3.size()*c2.size()*a1.size(), x0.size(), x1.size(),
55 1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
56 1.0, odata_sorted, a3.size()*c2.size()*a1.size());
57 }
58 sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, a3.size(), c2.size(), a1.size(), x0.size());
59 out()->add_block(odata, x0, a3, c2, a1);
60 }
61
compute()62 void Task751::Task_local::compute() {
63 const Index x0 = b(0);
64 const Index a3 = b(1);
65 const Index c2 = b(2);
66 const Index a1 = b(3);
67 // tensor label: I1338
68 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
69 std::fill_n(odata.get(), out()->get_size(x0, a3, c2, a1), 0.0);
70 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
71 std::fill_n(odata_sorted.get(), out()->get_size(x0, a3, c2, a1), 0.0);
72 for (auto& x1 : *range_[1]) {
73 // tensor label: v2
74 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x1, a1, c2, a3);
75 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x1, a1, c2, a3)]);
76 sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a1.size(), c2.size(), a3.size());
77 // tensor label: Gamma27
78 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x1, x0);
79 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x1, x0)]);
80 sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, x1.size(), x0.size());
81 zgemm3m_("T", "N", a1.size()*c2.size()*a3.size(), x0.size(), x1.size(),
82 1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
83 1.0, odata_sorted, a1.size()*c2.size()*a3.size());
84 }
85 sort_indices<3,2,1,0,1,1,1,1>(odata_sorted, odata, a1.size(), c2.size(), a3.size(), x0.size());
86 out()->add_block(odata, x0, a3, c2, a1);
87 }
88
compute()89 void Task752::Task_local::compute() {
90 const Index x1 = b(0);
91 const Index a2 = b(1);
92 const Index x0 = b(2);
93 const Index a1 = b(3);
94 // tensor label: r
95 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x1, a2, x0, a1)]);
96 std::fill_n(odata.get(), out()->get_size(x1, a2, x0, a1), 0.0);
97 {
98 // tensor label: I1342
99 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(a1, a2, x0, x1);
100 sort_indices<3,1,2,0,1,1,1,1>(i0data, odata, a1.size(), a2.size(), x0.size(), x1.size());
101 }
102 out()->add_block(odata, x1, a2, x0, a1);
103 }
104
compute()105 void Task753::Task_local::compute() {
106 const Index a1 = b(0);
107 const Index a2 = b(1);
108 const Index x0 = b(2);
109 const Index x1 = b(3);
110 // tensor label: I1342
111 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(a1, a2, x0, x1)]);
112 std::fill_n(odata.get(), out()->get_size(a1, a2, x0, x1), 0.0);
113 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(a1, a2, x0, x1)]);
114 std::fill_n(odata_sorted.get(), out()->get_size(a1, a2, x0, x1), 0.0);
115 for (auto& x3 : *range_[1]) {
116 for (auto& x2 : *range_[1]) {
117 // tensor label: Gamma33
118 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x3, x0, x2, x1);
119 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x3, x0, x2, x1)]);
120 sort_indices<0,2,1,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
121 // tensor label: v2
122 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x3, a1, x2, a2);
123 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x3, a1, x2, a2)]);
124 sort_indices<0,2,1,3,0,1,1,1>(i1data, i1data_sorted, x3.size(), a1.size(), x2.size(), a2.size());
125 zgemm3m_("T", "N", x0.size()*x1.size(), a1.size()*a2.size(), x3.size()*x2.size(),
126 1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
127 1.0, odata_sorted, x0.size()*x1.size());
128 }
129 }
130 sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x0.size(), x1.size(), a1.size(), a2.size());
131 out()->add_block(odata, a1, a2, x0, x1);
132 }
133
compute()134 void Task755::Task_local::compute() {
135 const Index c2 = b(0);
136 const Index x1 = b(1);
137 const Index c1 = b(2);
138 const Index x0 = b(3);
139 // tensor label: r
140 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c2, x1, c1, x0)]);
141 std::fill_n(odata.get(), out()->get_size(c2, x1, c1, x0), 0.0);
142 {
143 // tensor label: I1344
144 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x0, x1, c1, c2);
145 sort_indices<3,1,2,0,1,1,1,1>(i0data, odata, x0.size(), x1.size(), c1.size(), c2.size());
146 }
147 out()->add_block(odata, c2, x1, c1, x0);
148 }
149
compute()150 void Task756::Task_local::compute() {
151 const Index x0 = b(0);
152 const Index x1 = b(1);
153 const Index c1 = b(2);
154 const Index c2 = b(3);
155 // tensor label: I1344
156 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, x1, c1, c2)]);
157 std::fill_n(odata.get(), out()->get_size(x0, x1, c1, c2), 0.0);
158 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(x0, x1, c1, c2)]);
159 std::fill_n(odata_sorted.get(), out()->get_size(x0, x1, c1, c2), 0.0);
160 for (auto& x3 : *range_[1]) {
161 for (auto& x2 : *range_[1]) {
162 // tensor label: t2
163 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c1, x3, c2, x2);
164 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(c1, x3, c2, x2)]);
165 sort_indices<1,3,0,2,0,1,1,1>(i0data, i0data_sorted, c1.size(), x3.size(), c2.size(), x2.size());
166 // tensor label: Gamma0
167 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x0, x3, x1, x2);
168 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x0, x3, x1, x2)]);
169 sort_indices<1,3,0,2,0,1,2,1>(i1data, i1data_sorted, x0.size(), x3.size(), x1.size(), x2.size());
170 zgemm3m_("T", "N", c1.size()*c2.size(), x0.size()*x1.size(), x3.size()*x2.size(),
171 1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
172 1.0, odata_sorted, c1.size()*c2.size());
173 }
174 }
175 sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, c1.size(), c2.size(), x0.size(), x1.size());
176 out()->add_block(odata, x0, x1, c1, c2);
177 }
178
compute()179 void Task757::Task_local::compute() {
180 const Index c1 = b(0);
181 const Index x2 = b(1);
182 const Index x0 = b(2);
183 const Index x1 = b(3);
184 // tensor label: r
185 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c1, x2, x0, x1)]);
186 std::fill_n(odata.get(), out()->get_size(c1, x2, x0, x1), 0.0);
187 {
188 // tensor label: I1346
189 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c1, x2, x1, x0);
190 sort_indices<0,1,3,2,1,1,1,1>(i0data, odata, c1.size(), x2.size(), x1.size(), x0.size());
191 }
192 out()->add_block(odata, c1, x2, x0, x1);
193 }
194
compute()195 void Task758::Task_local::compute() {
196 const Index c1 = b(0);
197 const Index x2 = b(1);
198 const Index x1 = b(2);
199 const Index x0 = b(3);
200 // tensor label: I1346
201 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c1, x2, x1, x0)]);
202 std::fill_n(odata.get(), out()->get_size(c1, x2, x1, x0), 0.0);
203 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(c1, x2, x1, x0)]);
204 std::fill_n(odata_sorted.get(), out()->get_size(c1, x2, x1, x0), 0.0);
205 for (auto& x5 : *range_[1]) {
206 for (auto& x4 : *range_[1]) {
207 for (auto& x3 : *range_[1]) {
208 // tensor label: Gamma4
209 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x5, x4, x2, x3, x1, x0);
210 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x5, x4, x2, x3, x1, x0)]);
211 sort_indices<0,1,3,2,4,5,0,1,1,1>(i0data, i0data_sorted, x5.size(), x4.size(), x2.size(), x3.size(), x1.size(), x0.size());
212 // tensor label: t2
213 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x5, x4, c1, x3);
214 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x5, x4, c1, x3)]);
215 sort_indices<0,1,3,2,0,1,1,1>(i1data, i1data_sorted, x5.size(), x4.size(), c1.size(), x3.size());
216 zgemm3m_("T", "N", x2.size()*x1.size()*x0.size(), c1.size(), x5.size()*x4.size()*x3.size(),
217 1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
218 1.0, odata_sorted, x2.size()*x1.size()*x0.size());
219 }
220 }
221 }
222 sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x2.size(), x1.size(), x0.size(), c1.size());
223 out()->add_block(odata, c1, x2, x1, x0);
224 }
225
compute()226 void Task759::Task_local::compute() {
227 const Index c3 = b(0);
228 const Index x0 = b(1);
229 const Index c1 = b(2);
230 const Index a2 = b(3);
231 // tensor label: r
232 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c3, x0, c1, a2)]);
233 std::fill_n(odata.get(), out()->get_size(c3, x0, c1, a2), 0.0);
234 {
235 // tensor label: I1348
236 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c3, a2, c1, x0);
237 sort_indices<0,3,2,1,1,1,1,1>(i0data, odata, c3.size(), a2.size(), c1.size(), x0.size());
238 }
239 out()->add_block(odata, c3, x0, c1, a2);
240 }
241
compute()242 void Task760::Task_local::compute() {
243 const Index c3 = b(0);
244 const Index a2 = b(1);
245 const Index c1 = b(2);
246 const Index x0 = b(3);
247 // tensor label: I1348
248 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c3, a2, c1, x0)]);
249 std::fill_n(odata.get(), out()->get_size(c3, a2, c1, x0), 0.0);
250 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(c3, a2, c1, x0)]);
251 std::fill_n(odata_sorted.get(), out()->get_size(c3, a2, c1, x0), 0.0);
252 for (auto& x1 : *range_[1]) {
253 // tensor label: Gamma11
254 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x0, x1);
255 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x0, x1)]);
256 sort_indices<1,0,0,1,1,1>(i0data, i0data_sorted, x0.size(), x1.size());
257 // tensor label: t2
258 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(c3, a2, c1, x1);
259 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(c3, a2, c1, x1)]);
260 sort_indices<3,0,1,2,0,1,-1,1>(i1data, i1data_sorted, c3.size(), a2.size(), c1.size(), x1.size());
261 zgemm3m_("T", "N", x0.size(), c3.size()*a2.size()*c1.size(), x1.size(),
262 1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
263 1.0, odata_sorted, x0.size());
264 }
265 sort_indices<1,2,3,0,1,1,1,1>(odata_sorted, odata, x0.size(), c3.size(), a2.size(), c1.size());
266 out()->add_block(odata, c3, a2, c1, x0);
267 }
268
compute()269 void Task761::Task_local::compute() {
270 const Index c3 = b(0);
271 const Index a2 = b(1);
272 const Index c1 = b(2);
273 const Index x0 = b(3);
274 // tensor label: I1348
275 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c3, a2, c1, x0)]);
276 std::fill_n(odata.get(), out()->get_size(c3, a2, c1, x0), 0.0);
277 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(c3, a2, c1, x0)]);
278 std::fill_n(odata_sorted.get(), out()->get_size(c3, a2, c1, x0), 0.0);
279 for (auto& x1 : *range_[1]) {
280 // tensor label: t2
281 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c1, a2, c3, x1);
282 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(c1, a2, c3, x1)]);
283 sort_indices<3,0,1,2,0,1,1,1>(i0data, i0data_sorted, c1.size(), a2.size(), c3.size(), x1.size());
284 // tensor label: Gamma11
285 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x0, x1);
286 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x0, x1)]);
287 sort_indices<1,0,0,1,1,1>(i1data, i1data_sorted, x0.size(), x1.size());
288 zgemm3m_("T", "N", c1.size()*a2.size()*c3.size(), x0.size(), x1.size(),
289 1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
290 1.0, odata_sorted, c1.size()*a2.size()*c3.size());
291 }
292 sort_indices<2,1,0,3,1,1,1,1>(odata_sorted, odata, c1.size(), a2.size(), c3.size(), x0.size());
293 out()->add_block(odata, c3, a2, c1, x0);
294 }
295
compute()296 void Task762::Task_local::compute() {
297 const Index x0 = b(0);
298 const Index x1 = b(1);
299 const Index c1 = b(2);
300 const Index a2 = b(3);
301 // tensor label: r
302 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, x1, c1, a2)]);
303 std::fill_n(odata.get(), out()->get_size(x0, x1, c1, a2), 0.0);
304 {
305 // tensor label: I1352
306 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c1, a2, x1, x0);
307 sort_indices<3,2,0,1,1,1,1,1>(i0data, odata, c1.size(), a2.size(), x1.size(), x0.size());
308 }
309 out()->add_block(odata, x0, x1, c1, a2);
310 }
311
compute()312 void Task763::Task_local::compute() {
313 const Index c1 = b(0);
314 const Index a2 = b(1);
315 const Index x1 = b(2);
316 const Index x0 = b(3);
317 // tensor label: I1352
318 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c1, a2, x1, x0)]);
319 std::fill_n(odata.get(), out()->get_size(c1, a2, x1, x0), 0.0);
320 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(c1, a2, x1, x0)]);
321 std::fill_n(odata_sorted.get(), out()->get_size(c1, a2, x1, x0), 0.0);
322 for (auto& x3 : *range_[1]) {
323 for (auto& x2 : *range_[1]) {
324 // tensor label: Gamma24
325 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x3, x2, x1, x0);
326 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x3, x2, x1, x0)]);
327 sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), x2.size(), x1.size(), x0.size());
328 // tensor label: t2
329 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(c1, a2, x3, x2);
330 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(c1, a2, x3, x2)]);
331 sort_indices<2,3,0,1,0,1,1,1>(i1data, i1data_sorted, c1.size(), a2.size(), x3.size(), x2.size());
332 zgemm3m_("T", "N", x1.size()*x0.size(), c1.size()*a2.size(), x3.size()*x2.size(),
333 1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
334 1.0, odata_sorted, x1.size()*x0.size());
335 }
336 }
337 sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, x1.size(), x0.size(), c1.size(), a2.size());
338 out()->add_block(odata, c1, a2, x1, x0);
339 }
340
compute()341 void Task764::Task_local::compute() {
342 const Index x1 = b(0);
343 const Index x2 = b(1);
344 const Index x0 = b(2);
345 const Index a1 = b(3);
346 // tensor label: r
347 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x1, x2, x0, a1)]);
348 std::fill_n(odata.get(), out()->get_size(x1, x2, x0, a1), 0.0);
349 {
350 // tensor label: I1354
351 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(a1, x0, x2, x1);
352 sort_indices<3,2,1,0,1,1,1,1>(i0data, odata, a1.size(), x0.size(), x2.size(), x1.size());
353 }
354 out()->add_block(odata, x1, x2, x0, a1);
355 }
356
compute()357 void Task765::Task_local::compute() {
358 const Index a1 = b(0);
359 const Index x0 = b(1);
360 const Index x2 = b(2);
361 const Index x1 = b(3);
362 // tensor label: I1354
363 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(a1, x0, x2, x1)]);
364 std::fill_n(odata.get(), out()->get_size(a1, x0, x2, x1), 0.0);
365 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(a1, x0, x2, x1)]);
366 std::fill_n(odata_sorted.get(), out()->get_size(a1, x0, x2, x1), 0.0);
367 for (auto& x5 : *range_[1]) {
368 for (auto& x4 : *range_[1]) {
369 for (auto& x3 : *range_[1]) {
370 // tensor label: Gamma32
371 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x5, x0, x4, x3, x2, x1);
372 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x5, x0, x4, x3, x2, x1)]);
373 sort_indices<0,2,3,1,4,5,0,1,1,1>(i0data, i0data_sorted, x5.size(), x0.size(), x4.size(), x3.size(), x2.size(), x1.size());
374 // tensor label: t2
375 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x5, a1, x4, x3);
376 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x5, a1, x4, x3)]);
377 sort_indices<0,2,3,1,0,1,1,1>(i1data, i1data_sorted, x5.size(), a1.size(), x4.size(), x3.size());
378 zgemm3m_("T", "N", x0.size()*x2.size()*x1.size(), a1.size(), x5.size()*x4.size()*x3.size(),
379 1.0, i0data_sorted, x5.size()*x4.size()*x3.size(), i1data_sorted, x5.size()*x4.size()*x3.size(),
380 1.0, odata_sorted, x0.size()*x2.size()*x1.size());
381 }
382 }
383 }
384 sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, x0.size(), x2.size(), x1.size(), a1.size());
385 out()->add_block(odata, a1, x0, x2, x1);
386 }
387
compute()388 void Task766::Task_local::compute() {
389 const Index c3 = b(0);
390 const Index a4 = b(1);
391 const Index c1 = b(2);
392 const Index a2 = b(3);
393 // tensor label: r
394 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c3, a4, c1, a2)]);
395 std::fill_n(odata.get(), out()->get_size(c3, a4, c1, a2), 0.0);
396 {
397 // tensor label: I1356
398 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c1, a4, c3, a2);
399 sort_indices<2,1,0,3,1,1,1,1>(i0data, odata, c1.size(), a4.size(), c3.size(), a2.size());
400 }
401 out()->add_block(odata, c3, a4, c1, a2);
402 }
403
compute()404 void Task767::Task_local::compute() {
405 const Index c1 = b(0);
406 const Index a4 = b(1);
407 const Index c3 = b(2);
408 const Index a2 = b(3);
409 // tensor label: I1356
410 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c1, a4, c3, a2)]);
411 std::fill_n(odata.get(), out()->get_size(c1, a4, c3, a2), 0.0);
412 {
413 // tensor label: t2
414 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(c1, a4, c3, a2);
415 sort_indices<0,1,2,3,1,1,-2,1>(i0data, odata, c1.size(), a4.size(), c3.size(), a2.size());
416 }
417 {
418 // tensor label: t2
419 std::unique_ptr<std::complex<double>[]> i1data = in(0)->get_block(c1, a2, c3, a4);
420 sort_indices<0,3,2,1,1,1,2,1>(i1data, odata, c1.size(), a2.size(), c3.size(), a4.size());
421 }
422 out()->add_block(odata, c1, a4, c3, a2);
423 }
424
compute()425 void Task768::Task_local::compute() {
426 const Index c2 = b(0);
427 const Index a3 = b(1);
428 const Index x0 = b(2);
429 const Index a1 = b(3);
430 // tensor label: r
431 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(c2, a3, x0, a1)]);
432 std::fill_n(odata.get(), out()->get_size(c2, a3, x0, a1), 0.0);
433 {
434 // tensor label: I1358
435 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x0, a3, c2, a1);
436 sort_indices<2,1,0,3,1,1,1,1>(i0data, odata, x0.size(), a3.size(), c2.size(), a1.size());
437 }
438 out()->add_block(odata, c2, a3, x0, a1);
439 }
440
compute()441 void Task769::Task_local::compute() {
442 const Index x0 = b(0);
443 const Index a3 = b(1);
444 const Index c2 = b(2);
445 const Index a1 = b(3);
446 // tensor label: I1358
447 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
448 std::fill_n(odata.get(), out()->get_size(x0, a3, c2, a1), 0.0);
449 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
450 std::fill_n(odata_sorted.get(), out()->get_size(x0, a3, c2, a1), 0.0);
451 for (auto& x1 : *range_[1]) {
452 // tensor label: t2
453 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x1, a3, c2, a1);
454 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x1, a3, c2, a1)]);
455 sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a3.size(), c2.size(), a1.size());
456 // tensor label: Gamma27
457 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x1, x0);
458 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x1, x0)]);
459 sort_indices<0,1,0,1,-1,1>(i1data, i1data_sorted, x1.size(), x0.size());
460 zgemm3m_("T", "N", a3.size()*c2.size()*a1.size(), x0.size(), x1.size(),
461 1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
462 1.0, odata_sorted, a3.size()*c2.size()*a1.size());
463 }
464 sort_indices<3,0,1,2,1,1,1,1>(odata_sorted, odata, a3.size(), c2.size(), a1.size(), x0.size());
465 out()->add_block(odata, x0, a3, c2, a1);
466 }
467
compute()468 void Task770::Task_local::compute() {
469 const Index x0 = b(0);
470 const Index a3 = b(1);
471 const Index c2 = b(2);
472 const Index a1 = b(3);
473 // tensor label: I1358
474 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
475 std::fill_n(odata.get(), out()->get_size(x0, a3, c2, a1), 0.0);
476 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(x0, a3, c2, a1)]);
477 std::fill_n(odata_sorted.get(), out()->get_size(x0, a3, c2, a1), 0.0);
478 for (auto& x1 : *range_[1]) {
479 // tensor label: t2
480 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x1, a1, c2, a3);
481 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x1, a1, c2, a3)]);
482 sort_indices<0,1,2,3,0,1,1,1>(i0data, i0data_sorted, x1.size(), a1.size(), c2.size(), a3.size());
483 // tensor label: Gamma27
484 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x1, x0);
485 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x1, x0)]);
486 sort_indices<0,1,0,1,1,1>(i1data, i1data_sorted, x1.size(), x0.size());
487 zgemm3m_("T", "N", a1.size()*c2.size()*a3.size(), x0.size(), x1.size(),
488 1.0, i0data_sorted, x1.size(), i1data_sorted, x1.size(),
489 1.0, odata_sorted, a1.size()*c2.size()*a3.size());
490 }
491 sort_indices<3,2,1,0,1,1,1,1>(odata_sorted, odata, a1.size(), c2.size(), a3.size(), x0.size());
492 out()->add_block(odata, x0, a3, c2, a1);
493 }
494
compute()495 void Task771::Task_local::compute() {
496 const Index x1 = b(0);
497 const Index a2 = b(1);
498 const Index x0 = b(2);
499 const Index a1 = b(3);
500 // tensor label: r
501 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x1, a2, x0, a1)]);
502 std::fill_n(odata.get(), out()->get_size(x1, a2, x0, a1), 0.0);
503 {
504 // tensor label: I1362
505 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x0, x1, a1, a2);
506 sort_indices<1,3,0,2,1,1,1,1>(i0data, odata, x0.size(), x1.size(), a1.size(), a2.size());
507 }
508 out()->add_block(odata, x1, a2, x0, a1);
509 }
510
compute()511 void Task772::Task_local::compute() {
512 const Index x0 = b(0);
513 const Index x1 = b(1);
514 const Index a1 = b(2);
515 const Index a2 = b(3);
516 // tensor label: I1362
517 std::unique_ptr<std::complex<double>[]> odata(new std::complex<double>[out()->get_size(x0, x1, a1, a2)]);
518 std::fill_n(odata.get(), out()->get_size(x0, x1, a1, a2), 0.0);
519 std::unique_ptr<std::complex<double>[]> odata_sorted(new std::complex<double>[out()->get_size(x0, x1, a1, a2)]);
520 std::fill_n(odata_sorted.get(), out()->get_size(x0, x1, a1, a2), 0.0);
521 for (auto& x3 : *range_[1]) {
522 for (auto& x2 : *range_[1]) {
523 // tensor label: t2
524 std::unique_ptr<std::complex<double>[]> i0data = in(0)->get_block(x3, a1, x2, a2);
525 std::unique_ptr<std::complex<double>[]> i0data_sorted(new std::complex<double>[in(0)->get_size(x3, a1, x2, a2)]);
526 sort_indices<0,2,1,3,0,1,1,1>(i0data, i0data_sorted, x3.size(), a1.size(), x2.size(), a2.size());
527 // tensor label: Gamma33
528 std::unique_ptr<std::complex<double>[]> i1data = in(1)->get_block(x3, x0, x2, x1);
529 std::unique_ptr<std::complex<double>[]> i1data_sorted(new std::complex<double>[in(1)->get_size(x3, x0, x2, x1)]);
530 sort_indices<0,2,1,3,0,1,2,1>(i1data, i1data_sorted, x3.size(), x0.size(), x2.size(), x1.size());
531 zgemm3m_("T", "N", a1.size()*a2.size(), x0.size()*x1.size(), x3.size()*x2.size(),
532 1.0, i0data_sorted, x3.size()*x2.size(), i1data_sorted, x3.size()*x2.size(),
533 1.0, odata_sorted, a1.size()*a2.size());
534 }
535 }
536 sort_indices<2,3,0,1,1,1,1,1>(odata_sorted, odata, a1.size(), a2.size(), x0.size(), x1.size());
537 out()->add_block(odata, x0, x1, a1, a2);
538 }
539
540 #endif
541