AO_contribute.cc

Go to the documentation of this file.
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     if(fabs(value) > 1e-8)
00040         fprintf(stdout, "%d %d %d %d %20.14f\n", p, q, r, s, value);
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     /* (pq|rs) */
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       /* (pq|sr) */
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       /* (qp|rs) */
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       /* (qp|sr) */
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       /* (rs|pq) */
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       /* (sr|pq) */
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       /* (rs|qp) */
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       /* (sr|qp) */
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       /* (pq|sr) */
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       /* (qp|rs) */
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       /* (qp|sr) */
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       /* (qp|rs) */
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       /* (rs|pq) */
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       /* (rs|qp) */
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       /* (pq|sr) */
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       /* (rs|pq) */
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       /* (sr|pq) */
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       /* (rs|pq) */
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 }} // namespace psi::ccenergy

Generated on Wed Feb 13 16:35:39 2008 for PSI by  doxygen 1.5.4