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