00001
00008 #include <stdio.h>
00009 #include <stdlib.h>
00010 #include <math.h>
00011 #include <libciomr/libciomr.h>
00012 #include <libiwl/iwl.h>
00013 #include <libqt/qt.h>
00014 #include <libdpd/dpd.h>
00015
00016 namespace psi { namespace ccenergy {
00017
00018 int AO_contribute(struct iwlbuf *InBuf, dpdbuf4 *tau1_AO, dpdbuf4 *tau2_AO)
00019 {
00020 int idx, p, q, r, s;
00021 double value;
00022 Value *valptr;
00023 Label *lblptr;
00024 int Gp, Gq, Gr, Gs, Gpr, Gps, Gqr, Gqs, Grp, Gsp, Grq, Gsq;
00025 int pr, ps, qr, qs, rp, rq, sp, sq, pq, rs;
00026 int count=0;
00027
00028 lblptr = InBuf->labels;
00029 valptr = InBuf->values;
00030
00031 for(idx=4*InBuf->idx; InBuf->idx < InBuf->inbuf; InBuf->idx++) {
00032 p = abs((int) lblptr[idx++]);
00033 q = (int) lblptr[idx++];
00034 r = (int) lblptr[idx++];
00035 s = (int) lblptr[idx++];
00036
00037 value = (double) valptr[InBuf->idx];
00038
00039
00040
00041
00042 count++;
00043
00044 Gp = tau1_AO->params->psym[p];
00045 Gq = tau1_AO->params->psym[q];
00046 Gr = tau1_AO->params->psym[r];
00047 Gs = tau1_AO->params->psym[s];
00048
00049 Gpr = Grp = Gp^Gr;
00050 Gps = Gsp = Gp^Gs;
00051 Gqr = Grq = Gq^Gr;
00052 Gqs = Gsq = Gq^Gs;
00053
00054 pq = tau1_AO->params->rowidx[p][q];
00055 rs = tau1_AO->params->rowidx[r][s];
00056
00057 pr = tau1_AO->params->rowidx[p][r];
00058 rp = tau1_AO->params->rowidx[r][p];
00059 ps = tau1_AO->params->rowidx[p][s];
00060 sp = tau1_AO->params->rowidx[s][p];
00061 qr = tau1_AO->params->rowidx[q][r];
00062 rq = tau1_AO->params->rowidx[r][q];
00063 qs = tau1_AO->params->rowidx[q][s];
00064 sq = tau1_AO->params->rowidx[s][q];
00065
00066
00067 if(tau1_AO->params->coltot[Gpr])
00068 C_DAXPY(tau1_AO->params->coltot[Gpr], value, tau1_AO->matrix[Gpr][qs], 1,
00069 tau2_AO->matrix[Gpr][pr], 1);
00070
00071 if(p!=q && r!=s && pq != rs) {
00072
00073
00074 if(tau1_AO->params->coltot[Gps])
00075 C_DAXPY(tau1_AO->params->coltot[Gps], value, tau1_AO->matrix[Gps][qr], 1,
00076 tau2_AO->matrix[Gps][ps], 1);
00077
00078
00079 if(tau1_AO->params->coltot[Gqr])
00080 C_DAXPY(tau1_AO->params->coltot[Gqr], value, tau1_AO->matrix[Gqr][ps], 1,
00081 tau2_AO->matrix[Gqr][qr], 1);
00082
00083
00084 if(tau1_AO->params->coltot[Gqs])
00085 C_DAXPY(tau1_AO->params->coltot[Gqs], value, tau1_AO->matrix[Gqs][pr], 1,
00086 tau2_AO->matrix[Gqs][qs], 1);
00087
00088
00089 if(tau1_AO->params->coltot[Grp])
00090 C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
00091 tau2_AO->matrix[Grp][rp], 1);
00092
00093
00094 if(tau1_AO->params->coltot[Gsp])
00095 C_DAXPY(tau1_AO->params->coltot[Gsp], value, tau1_AO->matrix[Gsp][rq], 1,
00096 tau2_AO->matrix[Gsp][sp], 1);
00097
00098
00099 if(tau1_AO->params->coltot[Grq])
00100 C_DAXPY(tau1_AO->params->coltot[Grq], value, tau1_AO->matrix[Grq][sp], 1,
00101 tau2_AO->matrix[Grq][rq], 1);
00102
00103
00104 if(tau1_AO->params->coltot[Gsq])
00105 C_DAXPY(tau1_AO->params->coltot[Gsq], value, tau1_AO->matrix[Gsq][rp], 1,
00106 tau2_AO->matrix[Gsq][sq],1 );
00107
00108 }
00109 else if(p!=q && r!=s && pq==rs) {
00110
00111
00112 if(tau1_AO->params->coltot[Gps])
00113 C_DAXPY(tau1_AO->params->coltot[Gps], value, tau1_AO->matrix[Gps][qr], 1,
00114 tau2_AO->matrix[Gps][ps], 1);
00115
00116
00117 if(tau1_AO->params->coltot[Gqr])
00118 C_DAXPY(tau1_AO->params->coltot[Gqr], value, tau1_AO->matrix[Gqr][ps], 1,
00119 tau2_AO->matrix[Gqr][qr], 1);
00120
00121
00122 if(tau1_AO->params->coltot[Gqs])
00123 C_DAXPY(tau1_AO->params->coltot[Gqs], value, tau1_AO->matrix[Gqs][pr], 1,
00124 tau2_AO->matrix[Gqs][qs], 1);
00125
00126 }
00127 else if(p!=q && r==s) {
00128
00129
00130 if(tau1_AO->params->coltot[Gqr])
00131 C_DAXPY(tau1_AO->params->coltot[Gqr], value, tau1_AO->matrix[Gqr][ps], 1,
00132 tau2_AO->matrix[Gqr][qr], 1);
00133
00134
00135 if(tau1_AO->params->coltot[Grp])
00136 C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
00137 tau2_AO->matrix[Grp][rp], 1);
00138
00139
00140 if(tau1_AO->params->coltot[Grq])
00141 C_DAXPY(tau1_AO->params->coltot[Grq], value, tau1_AO->matrix[Grq][sp], 1,
00142 tau2_AO->matrix[Grq][rq], 1);
00143
00144 }
00145
00146 else if(p==q && r!=s) {
00147
00148
00149 if(tau1_AO->params->coltot[Gps])
00150 C_DAXPY(tau1_AO->params->coltot[Gps], value, tau1_AO->matrix[Gps][qr], 1,
00151 tau2_AO->matrix[Gps][ps], 1);
00152
00153
00154 if(tau1_AO->params->coltot[Grp])
00155 C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
00156 tau2_AO->matrix[Grp][rp], 1);
00157
00158
00159 if(tau1_AO->params->coltot[Gsp])
00160 C_DAXPY(tau1_AO->params->coltot[Gsp], value, tau1_AO->matrix[Gsp][rq], 1,
00161 tau2_AO->matrix[Gsp][sp], 1);
00162
00163 }
00164
00165 else if(p==q && r==s && pq != rs) {
00166
00167
00168 if(tau1_AO->params->coltot[Grp])
00169 C_DAXPY(tau1_AO->params->coltot[Grp], value, tau1_AO->matrix[Grp][sq], 1,
00170 tau2_AO->matrix[Grp][rp], 1);
00171
00172 }
00173 }
00174
00175 return count;
00176 }
00177
00178 }}