37
37
// Regular constructor
38
38
IndepPairs::IndepPairs(int nirr, int num_ras, int **ras_opi, int ***ras_orbs,
39
int **fzc_orbs, int **fzv_orbs, int *frozen_docc,
40
int *frozen_uocc, int *ci2relpitz, int fciflag)
39
int *fzc, int **fzc_orbs, int *cor, int **cor_orbs,
40
int *vir, int **vir_orbs, int *fzv, int **fzv_orbs,
41
int *ci2relpitz, int ignore_ras_ras, int ignore_fz)
43
set(nirr, num_ras, ras_opi, ras_orbs, fzc_orbs, fzv_orbs,
44
frozen_docc, frozen_uocc, ci2relpitz, fciflag);
44
set(nirr, num_ras, ras_opi, ras_orbs, fzc, fzc_orbs, cor, cor_orbs,
45
vir, vir_orbs, fzv, fzv_orbs, ci2relpitz, ignore_ras_ras, ignore_fz);
52
** This function sets the independent pairs info
54
** \param nirr = number of irreps in point group
55
** \param num_ras = number of RAS spaces
56
** \param ras_opi = number of orbitals per irrep per RAS space
57
** \param ras_orbs = ras_orbs[ras][irr][cnt] gives an orbital number
58
** \param fzc = number of frozen core orbs per irrep
59
** \param fzc_orbs = fzc_orbs[irr][cnt] gives an orbital number
60
** \param cor = number of restricted core orbs per irrep
61
** \param cor_orbs = cor_orbs[irr][cnt] gives an orbital number
62
** \param vir = number of restricted virtual orbitals per irrep
63
** \param vir_orbs = vir_orbs[irr][cnt] gives an orbital number
64
** \param fzv = number of frozen virtual orbitals per irrep
65
** \param fzv_orbs = fzv_orbs[irr][cnt] gives an orbital number
66
** \param ci2relpitz = maps CI orbitals to relative Pitzer indices
67
** \param ignore_ras_ras = ignore RAS/RAS independent pairs
68
** \param ignore_fz = ignore FZC and FZV from all independent pairs
48
72
void IndepPairs::set(int nirr, int num_ras, int **ras_opi, int ***ras_orbs,
49
int **fzc_orbs, int **fzv_orbs, int *frozen_docc,
50
int *frozen_uocc, int *ci2relpitz, int fciflag)
73
int *fzc, int **fzc_orbs,
74
int *cor, int **cor_orbs,
75
int *vir, int **vir_orbs,
76
int *fzv, int **fzv_orbs,
77
int *ci2relpitz, int ignore_ras_ras, int ignore_fz)
52
79
int count, ir_count, *ir_cnt;
53
80
int rasi, rasj, irrep;
61
88
for (irrep=0; irrep<nirreps; irrep++) ir_npairs[irrep] = 0;
92
for (irrep=0; irrep<nirreps; irrep++)
93
ir_npairs[irrep] += fzc[irrep] * cor[irrep];
96
for (rasj=0; rasj<num_ras; rasj++)
97
for (irrep=0; irrep<nirreps; irrep++)
98
ir_npairs[irrep] += ras_opi[rasj][irrep] * fzc[irrep];
101
for (irrep=0; irrep<nirreps; irrep++)
102
ir_npairs[irrep] += fzc[irrep] * vir[irrep];
105
for (irrep=0; irrep<nirreps; irrep++)
106
ir_npairs[irrep] += fzc[irrep] * fzv[irrep];
63
111
for (rasj=0; rasj<num_ras; rasj++)
64
112
for (irrep=0; irrep<nirreps; irrep++)
65
ir_npairs[irrep] += ras_opi[rasj][irrep] * frozen_docc[irrep];
113
ir_npairs[irrep] += ras_opi[rasj][irrep] * cor[irrep];
116
for (irrep=0; irrep<nirreps; irrep++)
117
ir_npairs[irrep] += cor[irrep] * vir[irrep];
120
if (!ignore_ras_ras) {
68
121
for (rasj=0; rasj<num_ras; rasj++)
69
122
for (rasi=rasj+1; rasi<num_ras; rasi++)
70
123
for (irrep=0; irrep<nirreps; irrep++)
71
124
ir_npairs[irrep] += ras_opi[rasi][irrep] * ras_opi[rasj][irrep];
74
128
for (rasj=0; rasj<num_ras; rasj++)
75
129
for (irrep=0; irrep<nirreps; irrep++)
76
ir_npairs[irrep] += ras_opi[rasj][irrep] * frozen_uocc[irrep];
78
for (irrep=0; irrep<nirreps; irrep++)
79
ir_npairs[irrep] += frozen_docc[irrep] * frozen_uocc[irrep];
130
ir_npairs[irrep] += ras_opi[rasj][irrep] * vir[irrep];
134
for (irrep=0; irrep<nirreps; irrep++)
135
ir_npairs[irrep] += fzv[irrep] * cor[irrep];
138
for (rasj=0; rasj<num_ras; rasj++)
139
for (irrep=0; irrep<nirreps; irrep++)
140
ir_npairs[irrep] += ras_opi[rasj][irrep] * fzv[irrep];
143
for (irrep=0; irrep<nirreps; irrep++)
144
ir_npairs[irrep] += fzv[irrep] * vir[irrep];
82
148
for (irrep=0; irrep<nirreps; irrep++)
86
152
printf("(IndepPairs): Constructor called but no pairs!!\n");
87
153
fprintf(stderr, "(IndepPairs): Constructor called but no pairs!!\n");
93
map_pair_ir = new int[npairs];
94
map_pair_rel = new int[npairs];
96
ir_p = new int*[nirreps];
97
ir_q = new int*[nirreps];
98
ir_p_rel = new int*[nirreps];
99
ir_q_rel = new int*[nirreps];
100
ir_map_pair = new int*[nirreps];
102
for (irrep=0; irrep<nirreps; irrep++) {
103
i = ir_npairs[irrep];
105
ir_p[irrep] = new int[i];
106
ir_q[irrep] = new int[i];
107
ir_p_rel[irrep] = new int[i];
108
ir_q_rel[irrep] = new int[i];
109
ir_map_pair[irrep] = new int[i];
112
ir_cnt = new int[nirreps];
113
for (irrep=0; irrep<nirreps; irrep++) ir_cnt[irrep] = 0;
116
// Now put everything in the proper arrays
118
// Independent pairs for fzc with rasj
119
for (rasj=0; rasj<num_ras; rasj++) {
120
for (irrep=0; irrep<nirreps; irrep++) {
121
ir_count = ir_cnt[irrep];
122
for (i=0; i<ras_opi[rasj][irrep]; i++) {
123
for (j=0; j<frozen_docc[irrep]; j++) {
124
p[count] = ras_orbs[rasj][irrep][i];
125
q[count] = fzc_orbs[irrep][j];
126
map_pair_ir[count] = irrep;
127
map_pair_rel[count] = ir_count;
128
ir_p[irrep][ir_count] = p[count];
129
ir_q[irrep][ir_count] = q[count];
130
ir_p_rel[irrep][ir_count] = ci2relpitz[p[count]];
131
ir_q_rel[irrep][ir_count] = ci2relpitz[q[count]];
132
ir_map_pair[irrep][ir_count] = count;
137
ir_cnt[irrep] = ir_count;
142
// Independent pairs for rasi with rasj
144
for (rasj=0; rasj<num_ras; rasj++) {
145
for (rasi=rasj+1; rasi<num_ras; rasi++) {
146
for (irrep=0; irrep<nirreps; irrep++) {
147
ir_count = ir_cnt[irrep];
148
for (j=0; j<ras_opi[rasj][irrep]; j++) {
149
for (i=0; i<ras_opi[rasi][irrep]; i++) {
150
p[count] = ras_orbs[rasi][irrep][i];
151
q[count] = ras_orbs[rasj][irrep][j];
152
map_pair_ir[count] = irrep;
153
map_pair_rel[count] = ir_count;
154
ir_p[irrep][ir_count] = p[count];
155
ir_q[irrep][ir_count] = q[count];
156
ir_p_rel[irrep][ir_count] = ci2relpitz[p[count]];
157
ir_q_rel[irrep][ir_count] = ci2relpitz[q[count]];
158
ir_map_pair[irrep][ir_count] = count;
163
ir_cnt[irrep] = ir_count;
169
// Independent pairs for fzv with rasj
170
for (rasj=0; rasj<num_ras; rasj++) {
171
for (irrep=0; irrep<nirreps; irrep++) {
172
ir_count = ir_cnt[irrep];
173
for (j=0; j<ras_opi[rasj][irrep]; j++) {
174
for (i=0; i<frozen_uocc[irrep]; i++) {
175
p[count] = fzv_orbs[irrep][i];
176
q[count] = ras_orbs[rasj][irrep][j];
177
map_pair_ir[count] = irrep;
178
map_pair_rel[count] = ir_count;
179
ir_p[irrep][ir_count] = p[count];
180
ir_q[irrep][ir_count] = q[count];
181
ir_p_rel[irrep][ir_count] = ci2relpitz[p[count]];
182
ir_q_rel[irrep][ir_count] = ci2relpitz[q[count]];
183
ir_map_pair[irrep][ir_count] = count;
188
ir_cnt[irrep] = ir_count;
192
// Independent pairs for fzc with fzv
193
for (irrep=0; irrep<nirreps; irrep++) {
194
ir_count = ir_cnt[irrep];
195
for (i=0; i<frozen_uocc[irrep]; i++) {
196
for (j=0; j<frozen_docc[irrep]; j++) {
197
p[count] = fzv_orbs[irrep][i];
198
q[count] = fzc_orbs[irrep][j];
199
map_pair_ir[count] = irrep;
200
map_pair_rel[count] = ir_count;
201
ir_p[irrep][ir_count] = p[count];
202
ir_q[irrep][ir_count] = q[count];
203
ir_p_rel[irrep][ir_count] = ci2relpitz[p[count]];
204
ir_q_rel[irrep][ir_count] = ci2relpitz[q[count]];
205
ir_map_pair[irrep][ir_count] = count;
210
ir_cnt[irrep] = ir_count;
214
if (count != npairs) {
215
printf("(IndepPairs::set): mismatch in counted pairs!\n");
216
fprintf(stderr, "(IndepPairs::set): mismatch in counted pairs!\n");
157
// Start making the pairs --- first, allocate the arrays
160
map_pair_ir = new int[npairs];
161
map_pair_rel = new int[npairs];
163
ir_p = new int*[nirreps];
164
ir_q = new int*[nirreps];
165
ir_p_rel = new int*[nirreps];
166
ir_q_rel = new int*[nirreps];
167
ir_map_pair = new int*[nirreps];
169
for (irrep=0; irrep<nirreps; irrep++) {
170
i = ir_npairs[irrep];
172
ir_p[irrep] = new int[i];
173
ir_q[irrep] = new int[i];
174
ir_p_rel[irrep] = new int[i];
175
ir_q_rel[irrep] = new int[i];
176
ir_map_pair[irrep] = new int[i];
179
ir_cnt = new int[nirreps];
180
for (irrep=0; irrep<nirreps; irrep++) ir_cnt[irrep] = 0;
183
// Now put everything in the proper arrays
188
set_part(count, ir_cnt, cor, fzc, cor_orbs, fzc_orbs, ci2relpitz);
191
for (rasj=0; rasj<num_ras; rasj++) {
192
set_part(count, ir_cnt, ras_opi[rasj], fzc, ras_orbs[rasj], fzc_orbs,
197
set_part(count, ir_cnt, vir, fzc, vir_orbs, fzc_orbs, ci2relpitz);
200
set_part(count, ir_cnt, fzv, fzc, fzv_orbs, fzc_orbs, ci2relpitz);
205
for (rasj=0; rasj<num_ras; rasj++) {
206
set_part(count, ir_cnt, ras_opi[rasj], cor, ras_orbs[rasj], cor_orbs,
211
set_part(count, ir_cnt, vir, cor, vir_orbs, cor_orbs, ci2relpitz);
215
set_part(count, ir_cnt, fzv, cor, fzv_orbs, cor_orbs, ci2relpitz);
218
if (!ignore_ras_ras) {
219
for (rasj=0; rasj<num_ras; rasj++) {
220
for (rasi=rasj+1; rasi<num_ras; rasi++) {
221
set_part(count, ir_cnt, ras_opi[rasi], ras_opi[rasj],
222
ras_orbs[rasi], ras_orbs[rasj], ci2relpitz);
228
for (rasj=0; rasj<num_ras; rasj++) {
229
set_part(count, ir_cnt, vir, ras_opi[rasj], vir_orbs, ras_orbs[rasj],
235
for (rasj=0; rasj<num_ras; rasj++) {
236
set_part(count, ir_cnt, fzv, ras_opi[rasj], fzv_orbs, ras_orbs[rasj],
243
set_part(count, ir_cnt, fzv, vir, fzv_orbs, vir_orbs, ci2relpitz);
246
if (count != npairs) {
247
printf("(IndepPairs::set): mismatch in counted pairs!\n");
248
fprintf(stderr, "(IndepPairs::set): mismatch in counted pairs!\n");
258
** This function does the dirty work in setting up the independent pair
261
** \param count = number of independent pairs so far
262
** \param ir_cnt = count per irrep
263
** \param num_orbs_i = number of orbitals per irrep, pair i
264
** \param num_orbs_j = number of orbitals per irrep, pair j
265
** \param orbs_i = orbital number for [irrep][cnt], pair i
266
** \param orbs_j = orbital number for [irrep][cnt], pair j
267
** \param ci2relpitz = map CI orbital to relative Pitzer numbering
269
void IndepPairs::set_part(int &count, int *ir_cnt,
270
int *num_orbs_i, int *num_orbs_j, int **orbs_i, int **orbs_j,
276
for (irrep=0; irrep<nirreps; irrep++) {
277
ir_count = ir_cnt[irrep];
278
for (i=0; i<num_orbs_i[irrep]; i++) {
279
for (j=0; j<num_orbs_j[irrep]; j++) {
280
p[count] = orbs_i[irrep][i];
281
q[count] = orbs_j[irrep][j];
282
map_pair_ir[count] = irrep;
283
map_pair_rel[count] = ir_count;
284
ir_p[irrep][ir_count] = p[count];
285
ir_q[irrep][ir_count] = q[count];
286
ir_p_rel[irrep][ir_count] = ci2relpitz[p[count]];
287
ir_q_rel[irrep][ir_count] = ci2relpitz[q[count]];
288
ir_map_pair[irrep][ir_count] = count;
293
ir_cnt[irrep] = ir_count;
225
299
IndepPairs::~IndepPairs() // Destructor