1 //
2 // BAGEL - Brilliantly Advanced General Electronic Structure Library
3 // Filename: CASA_sourceqq.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 
29 #include <src/smith/casa/CASA.h>
30 #include <src/smith/casa/CASA_tasks.h>
31 
32 using namespace std;
33 using namespace bagel;
34 using namespace bagel::SMITH;
35 
make_sourceq(const bool reset,const bool diagonal)36 shared_ptr<Queue> CASA::CASA::make_sourceq(const bool reset, const bool diagonal) {
37 
38   array<shared_ptr<const IndexRange>,3> pindex = {{rclosed_, ractive_, rvirt_}};
39   auto sourceq = make_shared<Queue>();
40   auto tensor235 = vector<shared_ptr<Tensor>>{s};
41   auto task235 = make_shared<Task235>(tensor235, reset);
42   sourceq->add_task(task235);
43 
44   vector<IndexRange> I330_index = {closed_, closed_, active_, active_};
45   auto I330 = make_shared<Tensor>(I330_index);
46   auto tensor236 = vector<shared_ptr<Tensor>>{s, I330};
47   auto task236 = make_shared<Task236>(tensor236, pindex);
48   task236->add_dep(task235);
49   sourceq->add_task(task236);
50 
51   auto tensor237 = vector<shared_ptr<Tensor>>{I330, Gamma0_(), v2_};
52   auto task237 = make_shared<Task237>(tensor237, pindex);
53   task236->add_dep(task237);
54   task237->add_dep(task235);
55   sourceq->add_task(task237);
56 
57   vector<IndexRange> I332_index = {closed_, active_, active_, active_};
58   auto I332 = make_shared<Tensor>(I332_index);
59   auto tensor238 = vector<shared_ptr<Tensor>>{s, I332};
60   auto task238 = make_shared<Task238>(tensor238, pindex);
61   task238->add_dep(task235);
62   sourceq->add_task(task238);
63 
64   auto tensor239 = vector<shared_ptr<Tensor>>{I332, Gamma121_(), v2_};
65   auto task239 = make_shared<Task239>(tensor239, pindex);
66   task238->add_dep(task239);
67   task239->add_dep(task235);
68   sourceq->add_task(task239);
69 
70   auto tensor240 = vector<shared_ptr<Tensor>>{I332, Gamma3_(), v2_};
71   auto task240 = make_shared<Task240>(tensor240, pindex);
72   task238->add_dep(task240);
73   task240->add_dep(task235);
74   sourceq->add_task(task240);
75 
76   auto tensor241 = vector<shared_ptr<Tensor>>{I332, Gamma5_(), h1_};
77   auto task241 = make_shared<Task241>(tensor241, pindex);
78   task238->add_dep(task241);
79   task241->add_dep(task235);
80   sourceq->add_task(task241);
81 
82   vector<IndexRange> I336_index = {closed_, closed_, virt_, active_};
83   auto I336 = make_shared<Tensor>(I336_index);
84   auto tensor242 = vector<shared_ptr<Tensor>>{s, I336};
85   auto task242 = make_shared<Task242>(tensor242, pindex);
86   task242->add_dep(task235);
87   sourceq->add_task(task242);
88 
89   vector<IndexRange> I337_index = {closed_, active_, closed_, virt_};
90   auto I337 = make_shared<Tensor>(I337_index);
91   auto tensor243 = vector<shared_ptr<Tensor>>{I336, Gamma9_(), I337};
92   auto task243 = make_shared<Task243>(tensor243, pindex);
93   task242->add_dep(task243);
94   task243->add_dep(task235);
95   sourceq->add_task(task243);
96 
97   auto tensor244 = vector<shared_ptr<Tensor>>{I337, v2_};
98   auto task244 = make_shared<Task244>(tensor244, pindex);
99   task243->add_dep(task244);
100   task244->add_dep(task235);
101   sourceq->add_task(task244);
102 
103   vector<IndexRange> I340_index = {closed_, virt_, active_, active_};
104   auto I340 = make_shared<Tensor>(I340_index);
105   auto tensor245 = vector<shared_ptr<Tensor>>{s, I340};
106   auto task245 = make_shared<Task245>(tensor245, pindex);
107   task245->add_dep(task235);
108   sourceq->add_task(task245);
109 
110   vector<IndexRange> I341_index = {closed_, virt_, active_, active_};
111   auto I341 = make_shared<Tensor>(I341_index);
112   auto tensor246 = vector<shared_ptr<Tensor>>{I340, Gamma25_(), I341};
113   auto task246 = make_shared<Task246>(tensor246, pindex);
114   task245->add_dep(task246);
115   task246->add_dep(task235);
116   sourceq->add_task(task246);
117 
118   auto tensor247 = vector<shared_ptr<Tensor>>{I341, v2_};
119   auto task247 = make_shared<Task247>(tensor247, pindex);
120   task246->add_dep(task247);
121   task247->add_dep(task235);
122   sourceq->add_task(task247);
123 
124   auto tensor248 = vector<shared_ptr<Tensor>>{I340, Gamma26_(), v2_};
125   auto task248 = make_shared<Task248>(tensor248, pindex);
126   task245->add_dep(task248);
127   task248->add_dep(task235);
128   sourceq->add_task(task248);
129 
130   auto tensor249 = vector<shared_ptr<Tensor>>{I340, Gamma24_(), v2_};
131   auto task249 = make_shared<Task249>(tensor249, pindex);
132   task245->add_dep(task249);
133   task249->add_dep(task235);
134   sourceq->add_task(task249);
135 
136   auto tensor250 = vector<shared_ptr<Tensor>>{I340, Gamma29_(), h1_};
137   auto task250 = make_shared<Task250>(tensor250, pindex);
138   task245->add_dep(task250);
139   task250->add_dep(task235);
140   sourceq->add_task(task250);
141 
142   vector<IndexRange> I348_index = {closed_, virt_, active_, active_};
143   auto I348 = make_shared<Tensor>(I348_index);
144   auto tensor251 = vector<shared_ptr<Tensor>>{s, I348};
145   auto task251 = make_shared<Task251>(tensor251, pindex);
146   task251->add_dep(task235);
147   sourceq->add_task(task251);
148 
149   vector<IndexRange> I349_index = {closed_, virt_, active_, active_};
150   auto I349 = make_shared<Tensor>(I349_index);
151   auto tensor252 = vector<shared_ptr<Tensor>>{I348, Gamma25_(), I349};
152   auto task252 = make_shared<Task252>(tensor252, pindex);
153   task251->add_dep(task252);
154   task252->add_dep(task235);
155   sourceq->add_task(task252);
156 
157   auto tensor253 = vector<shared_ptr<Tensor>>{I349, v2_};
158   auto task253 = make_shared<Task253>(tensor253, pindex);
159   task252->add_dep(task253);
160   task253->add_dep(task235);
161   sourceq->add_task(task253);
162 
163   auto tensor254 = vector<shared_ptr<Tensor>>{I348, Gamma5_(), v2_};
164   auto task254 = make_shared<Task254>(tensor254, pindex);
165   task251->add_dep(task254);
166   task254->add_dep(task235);
167   sourceq->add_task(task254);
168 
169   auto tensor255 = vector<shared_ptr<Tensor>>{I348, Gamma29_(), h1_};
170   auto task255 = make_shared<Task255>(tensor255, pindex);
171   task251->add_dep(task255);
172   task255->add_dep(task235);
173   sourceq->add_task(task255);
174 
175   vector<IndexRange> I356_index = {virt_, active_, active_, active_};
176   auto I356 = make_shared<Tensor>(I356_index);
177   auto tensor256 = vector<shared_ptr<Tensor>>{s, I356};
178   auto task256 = make_shared<Task256>(tensor256, pindex);
179   task256->add_dep(task235);
180   sourceq->add_task(task256);
181 
182   auto tensor257 = vector<shared_ptr<Tensor>>{I356, Gamma52_(), v2_};
183   auto task257 = make_shared<Task257>(tensor257, pindex);
184   task256->add_dep(task257);
185   task257->add_dep(task235);
186   sourceq->add_task(task257);
187 
188   auto tensor258 = vector<shared_ptr<Tensor>>{I356, Gamma49_(), v2_};
189   auto task258 = make_shared<Task258>(tensor258, pindex);
190   task256->add_dep(task258);
191   task258->add_dep(task235);
192   sourceq->add_task(task258);
193 
194   auto tensor259 = vector<shared_ptr<Tensor>>{I356, Gamma50_(), h1_};
195   auto task259 = make_shared<Task259>(tensor259, pindex);
196   task256->add_dep(task259);
197   task259->add_dep(task235);
198   sourceq->add_task(task259);
199 
200   shared_ptr<Tensor> I360;
201   if (diagonal) {
202     vector<IndexRange> I360_index = {closed_, virt_, closed_, virt_};
203     I360 = make_shared<Tensor>(I360_index);
204   }
205   shared_ptr<Task260> task260;
206   if (diagonal) {
207     auto tensor260 = vector<shared_ptr<Tensor>>{s, I360};
208     task260 = make_shared<Task260>(tensor260, pindex);
209     task260->add_dep(task235);
210     sourceq->add_task(task260);
211   }
212 
213   shared_ptr<Task261> task261;
214   if (diagonal) {
215     auto tensor261 = vector<shared_ptr<Tensor>>{I360, v2_};
216     task261 = make_shared<Task261>(tensor261, pindex);
217     task260->add_dep(task261);
218     task261->add_dep(task235);
219     sourceq->add_task(task261);
220   }
221 
222   vector<IndexRange> I362_index = {virt_, closed_, virt_, active_};
223   auto I362 = make_shared<Tensor>(I362_index);
224   auto tensor262 = vector<shared_ptr<Tensor>>{s, I362};
225   auto task262 = make_shared<Task262>(tensor262, pindex);
226   task262->add_dep(task235);
227   sourceq->add_task(task262);
228 
229   vector<IndexRange> I363_index = {active_, virt_, closed_, virt_};
230   auto I363 = make_shared<Tensor>(I363_index);
231   auto tensor263 = vector<shared_ptr<Tensor>>{I362, Gamma29_(), I363};
232   auto task263 = make_shared<Task263>(tensor263, pindex);
233   task262->add_dep(task263);
234   task263->add_dep(task235);
235   sourceq->add_task(task263);
236 
237   auto tensor264 = vector<shared_ptr<Tensor>>{I363, v2_};
238   auto task264 = make_shared<Task264>(tensor264, pindex);
239   task263->add_dep(task264);
240   task264->add_dep(task235);
241   sourceq->add_task(task264);
242 
243   vector<IndexRange> I366_index = {virt_, virt_, active_, active_};
244   auto I366 = make_shared<Tensor>(I366_index);
245   auto tensor265 = vector<shared_ptr<Tensor>>{s, I366};
246   auto task265 = make_shared<Task265>(tensor265, pindex);
247   task265->add_dep(task235);
248   sourceq->add_task(task265);
249 
250   auto tensor266 = vector<shared_ptr<Tensor>>{I366, Gamma50_(), v2_};
251   auto task266 = make_shared<Task266>(tensor266, pindex);
252   task265->add_dep(task266);
253   task266->add_dep(task235);
254   sourceq->add_task(task266);
255 
256   return sourceq;
257 }
258 
259 
260 #endif
261