build2e.cc

来自「大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CH」· CC 代码 · 共 1,562 行 · 第 1/4 页

CC
1,562
字号
  size34m1 = INT_NCART_DEC(am34,size34);  // Some local intermediates  double half_ooze = 0.5 * build.int_v_ooze;  double zeta34_ooze = build.int_v_zeta34 * build.int_v_ooze;  double W0_m_p120 = build.int_v_W0 - build.int_v_p120;  double p120_m_r10 = build.int_v_p120 - build.int_v_r10;  double oo2zeta12 = build.int_v_oo2zeta12;  double p121_m_r11 = build.int_v_p121 - build.int_v_r11;  double W1_m_p121 = build.int_v_W1 - build.int_v_p121;  double p122_m_r12 = build.int_v_p122 - build.int_v_r12;  double W2_m_p122 = build.int_v_W2 - build.int_v_p122;  stack_alignment_check(&half_ooze, "buildprim_1: half_ooze");  for (int am12=amin; am12<=amax; am12++) {    /* Construct the needed intermediate integrals. */    double ***vlist0 = build.int_v_list(am12);    double **vlist00 = vlist0[am34];    I00 = vlist00[m];    I10 = vlist10[m];    I11 = vlist10[m+1];    //I00 = build.int_v_list(am12,am34,m);    //I10 = build.int_v_list(am12-1,am34,m);    //I11 = build.int_v_list(am12-1,am34,m+1);    if (am34) {      I31 = vlist11[m+1];      //I31 = build.int_v_list(am12 - 1, am34 - 1, m + 1);      vlist11 = vlist0[am34-1];      }    if (am12>1) {      I20 = vlist20[m];      I21 = vlist20[m+1];      //I20 = build.int_v_list(am12 - 2, am34, m);      //I21 = build.int_v_list(am12 - 2, am34, m + 1);      }    vlist20 = vlist10;    vlist10 = vlist00;    /* Construct the new integrals. */    cartindex12 = 0;    cartindex1234 = 0;    // the i12==0, k12==0, j12=am12 case (build on y)    i12 = 0;    j12 = am12;    k12 = 0;    int i12y1 = 0;  //= INT_CARTINDEX(am12-1,i12,j12-1);    int i12y1s34 = i12y1*size34;    int i12y1s34m1 = i12y1*size34m1;    double *I10i = &I10[i12y1s34];    double *I11i = &I11[i12y1s34];    double *restrictxx I00i = &I00[cartindex1234];    if (j12==1) {      for (cartindex34=0; cartindex34<size34; cartindex34++) {        I00i[cartindex34]          = I10i[cartindex34] * p121_m_r11          + I11i[cartindex34] * W1_m_p121;        }      }    else { // j12 > 1      int i12y2s34 = 0; // = INT_CARTINDEX(am12-2,i12,j12-2)*size34;      double *I20i = &I20[i12y2s34];      double *I21i = &I21[i12y2s34];      for (cartindex34=0; cartindex34<size34; cartindex34++) {        I00i[cartindex34]          = I10i[cartindex34] * p121_m_r11          + I11i[cartindex34] * W1_m_p121          + (j12 - 1) * oo2zeta12 * (I20i[cartindex34]                                     - I21i[cartindex34] * zeta34_ooze);        }      }    if (am34) {      double *I31i = &I31[i12y1s34m1];      cartindex34 = 0;      for (i34=0; i34<=am34; i34++) {        //note: k34 < am34-i34 instead of <= am34-i34, so j34 > 0        int i34y1 = cartindex34-i34;//=INT_CARTINDEX(am34-1,i34,j34-1)        j34 = am34 - i34;        double j34_half_ooze = j34 * half_ooze;        for (k34=0; k34<am34-i34; k34++) {          I00i[cartindex34] +=  j34_half_ooze * I31i[i34y1];          j34_half_ooze -= half_ooze;          i34y1++;          /* cartindex34 == INT_CARTINDEX(am34,i34,j34) */          cartindex34++;          }        // increment cartindex34 here since the last k was skipped        cartindex34++;        }      }    cartindex12++;    cartindex1234+=size34;    // the i12==0, j12==am12-1, k12==1 case (build on z)    i12 = 0;    j12 = am12 - 1;    k12 = 1;    int i12z1 = 0;//= INT_CARTINDEX(am12-1,i12,j12);    int i12z1s34 = i12z1*size34;    int i12z1s34m1 = i12z1*size34m1;    I10i = &I10[i12z1s34];    I11i = &I11[i12z1s34];    I00i = &I00[cartindex1234];    for (cartindex34=0; cartindex34<size34; cartindex34++) {      I00i[cartindex34]        = I10i[cartindex34] * p122_m_r12        + I11i[cartindex34] * W2_m_p122;      }    if (am34) {      double *I31i = &I31[i12z1s34m1];      cartindex34 = 0;      for (i34=0; i34<=am34; i34++) {        // skip k34 == 0        cartindex34++;        int i34z1 = cartindex34-i34-1;//=INT_CARTINDEX(am34-1,i34,j34)        double k34_half_ooze = half_ooze;        for (k34=1; k34<=am34-i34; k34++) {          I00i[cartindex34] += k34_half_ooze * I31i[i34z1];          k34_half_ooze += half_ooze;          i34z1++;          cartindex34++;          }        }      }    cartindex12++;    cartindex1234+=size34;    // the i12==0, j12==am12-k12, k12>1 case (build on z)    double k12m1_oo2zeta12 = oo2zeta12;    for (k12=2; k12<=am12-i12; k12++) {      j12 = am12 - k12;      i12z1 = cartindex12-i12-1;//=INT_CARTINDEX(am12-1,i12,j12);      i12z1s34 = i12z1*size34;      i12z1s34m1 = i12z1*size34m1;      int i12z2s34 = (cartindex12-i12-i12-2)*size34;      //=INT_CARTINDEX(am12-2,i12,j12)*size34;      I10i = &I10[i12z1s34];      I11i = &I11[i12z1s34];      double *I20i = &I20[i12z2s34];      double *I21i = &I21[i12z2s34];      I00i = &I00[cartindex1234];      for (cartindex34=0; cartindex34<size34; cartindex34++) {        I00i[cartindex34]          = I10i[cartindex34] * p122_m_r12          + I11i[cartindex34] * W2_m_p122          + k12m1_oo2zeta12 * (I20i[cartindex34]                               - I21i[cartindex34] * zeta34_ooze);        }      if (am34) {        double *I31i = &I31[i12z1s34m1];        cartindex34 = 0;        for (i34=0; i34<=am34; i34++) {          // skip k34 == 0          cartindex34++;          int i34z1 = cartindex34-i34-1;//=INT_CARTINDEX(am34-1,i34,j34)          double k34_half_ooze = half_ooze;          for (k34=1; k34<=am34-i34; k34++) {            I00i[cartindex34]              +=  k34_half_ooze * I31i[i34z1];            k34_half_ooze += half_ooze;            i34z1++;            cartindex34++;            }          }        }      cartindex12++;      cartindex1234+=size34;      k12m1_oo2zeta12 += oo2zeta12;      }    // the i12==1 case (build on x)    i12 = 1;    int i12x1 = cartindex12-am12-1;//=INT_CARTINDEX(am12-1,i12-1,am12-i12)    int i12x1s34 = i12x1*size34;    int i12x1s34m1 = i12x1*size34m1;    I00i = &I00[cartindex1234];    I10i = &I10[i12x1s34];    I11i = &I11[i12x1s34];    //for (k12=0; k12<=am12-i12; k12++)    int k12_cartindex34;    int nk12_size34 = am12*size34;    for (k12_cartindex34=0; k12_cartindex34<nk12_size34; k12_cartindex34++) {      *I00i++ = *I10i++ * p120_m_r10 + *I11i++ * W0_m_p120;      }    I00i = &I00[cartindex1234];    if (am34) {      double *I31i = &I31[i12x1s34m1];      for (k12=0; k12<am12; k12++) {        // skip over i34==0        double *I00is=&I00i[am34+1];        double i34_half_ooze = half_ooze;        for (i34=1; i34<=am34; i34++) {          for (k34=i34; k34<=am34; k34++) { // index_k34 = true_k34 + i34            *I00is++ +=  i34_half_ooze * *I31i++;            }          i34_half_ooze += half_ooze;          }        I00i += size34;        }      }    cartindex12 += am12;    cartindex1234 += am12*size34;    // the i12>1 case (build on x)    if (am12<2) continue;    double i12m1_oo2zeta12 = oo2zeta12;    i12x1 = cartindex12-am12-1;    i12x1s34 = i12x1*size34;    i12x1s34m1 = i12x1*size34m1;    int i12x2s34 = (cartindex12-am12-am12-1)*size34;    I10i = &I10[i12x1s34];    I11i = &I11[i12x1s34];    double *I20i = &I20[i12x2s34];    double *I21i = &I21[i12x2s34];    I00i = &I00[cartindex1234];    for (i12=2; i12<=am12; i12++) {      int sizek12_size34 = (am12-i12+1)*size34;      int k12_c34;      for (k12_c34=0; k12_c34<sizek12_size34; k12_c34++) {        *I00i++          = *I10i++ * p120_m_r10          + *I11i++ * W0_m_p120          + i12m1_oo2zeta12 * (*I20i++                               - *I21i++                               * zeta34_ooze);        }      i12m1_oo2zeta12 += oo2zeta12;      }    if (am34) {      double *I31i = &I31[i12x1s34m1];      I00i = &I00[cartindex1234];      for (i12=2; i12<=am12; i12++) {        for (k12=0; k12<=am12-i12; k12++) {          // skip over i34==0          double *I00is=&I00i[am34+1];          double i34_half_ooze = half_ooze;          for (i34=1; i34<=am34; i34++) {            for (k34=0; k34<=am34-i34; k34++) {              *I00is++ += i34_half_ooze * *I31i++;              }            i34_half_ooze += half_ooze;            }          I00i += size34;          }        }      }    }}voidInt2eV3::blockbuildprim_3(int bmin,int bmax,int m){  double *I00;  double *I10; /* = [a0|c0](m) */  double *I11; /* = [a0|c0](m+1) */  double *I20; /* = [a0|c-1 0](m) */  double *I21; /* = [a0|c-1 0](m+1) */  int ci34m1,ci34m2;  int size34,size34m1,size34m2;  int i34, k34;  // These temporaries point to subblocks within the integrals arrays.  double *I10o,*I11o,*I20o,*I21o;  double ***vlist0;  double **vlist01;  double **vlist02;  vlist0 = build.int_v_list(0);  vlist01 = vlist0[bmin-1];  if (bmin>1) {    vlist02 = vlist0[bmin-2];    }  for (int am34=bmin; am34<=bmax; am34++) {    /* Construct the needed intermediate integrals. */    double **vlist00 = vlist0[am34];    I00 = vlist00[m];    I10 = vlist01[m];    I11 = vlist01[m+1];    //I00 = build.int_v_list(0, am34, m);    //I10 = build.int_v_list(0, am34 - 1, m);    //I11 = build.int_v_list(0, am34 - 1, m + 1);    if (am34>1) {      I20 = vlist02[m];      I21 = vlist02[m+1];      //I20 = build.int_v_list(0, am34 - 2, m);      //I21 = build.int_v_list(0, am34 - 2, m + 1);      }    vlist02 = vlist01;    vlist01 = vlist00;    /* The size of the group of primitives with ang. mom. = am34 - 1 */    size34 = INT_NCART_NN(am34);    size34m1 = INT_NCART_DEC(am34,size34);    size34m2 = INT_NCART(am34-2);    // Useful constants    double p340_m_r30 = build.int_v_p340 - build.int_v_r30;    double W0_m_p340 = build.int_v_W0 - build.int_v_p340;    double p341_m_r31 = build.int_v_p341 - build.int_v_r31;    double W1_m_p341 = build.int_v_W1 - build.int_v_p341;    double p342_m_r32 = build.int_v_p342 - build.int_v_r32;    double W2_m_p342 = build.int_v_W2 - build.int_v_p342;    double oo2zeta34 = build.int_v_oo2zeta34;    double zeta12_ooze = build.int_v_zeta12 * build.int_v_ooze;    stack_alignment_check(&p340_m_r30, "buildprim_3: p340_m_r30");    /* Construct the new integrals. */    double *restrictxx I00o = I00; // points the current target integral    I10o = I10;    I11o = I11;    //int cartindex34 = 0;    // i34 == 0, k34 == 0, j34 = am34    /* ------------------ Build from the y position. */    /* I10 I11 and I21 */    *I00o = *I10o * p341_m_r31 + *I11o * W1_m_p341;    if (am34>1) {      I20o = I20;      I21o = I21;      *I00o += (am34 - 1) * oo2zeta34 * (*I20o                                         - *I21o * zeta12_ooze);      }    //cartindex34++;    // i34 == 0, k34 >= 1    // loop over a portion of the l=am34-1 integrals    I00o = &I00o[1];    for (ci34m1=0; ci34m1<am34; ci34m1++) {      /* ------------------ Build from the z position. */      //note: ci34m1 = cartindex34 - i34 - 1;//=INT_CARTINDEX(am34-1,i34,j34)      /* I10 and I11 */      I00o[ci34m1] = I10o[ci34m1] * p342_m_r32 + I11o[ci34m1] * W2_m_p342;      }    // skip over i34 == 0, k34 == 1    //cartindex34++;    // i34 == 0, k34 > 1    I00o = &I00o[1];    // loop over a portion of the l=am34-2 integrals    double k34m1_oo2zeta34 = oo2zeta34;    for (ci34m2=0; ci34m2<am34-1; ci34m2++) {      //note: k34 = 2+ci34m2      /* ------------------ Build from the z position. */      /* I20 and I21 */      I00o[ci34m2]        +=  k34m1_oo2zeta34 * (I20o[ci34m2] - I21o[ci34m2] * zeta12_ooze);      k34m1_oo2zeta34 += oo2zeta34;      }    //cartindex34+=am34-1;    // i34 >= 1    I00o = &I00o[am34-1];    //note: ci34m1 = INT_CARTINDEX(am34-1,i34-1,j34)    for (ci34m1=0; ci34m1<size34m1; ci34m1++) {      /* I10 and I11 contrib */      /* ------------------ Build from the x position. */      I00o[ci34m1] = I10o[ci34m1] * p340_m_r30 + I11o[ci34m1] * W0_m_p340;      }    // skip past i34 == 1    //cartindex34 += am34;    // i34 > 1    I00o = &I00o[am34];    //note: ci34m2=INT_CARTINDEX(am34-2,i34-2,j34)    ci34m2=0;    double i34m1_oo2zeta34 = oo2zeta34;    for (i34=2; i34<=am34; i34++) {      for (k34=0; k34<=am34-i34; k34++) {        /* I20 and I21 contrib */        /* ------------------ Build from the x position. */        I00o[ci34m2]          +=  i34m1_oo2zeta34 * (I20o[ci34m2] - I21o[ci34m2] * zeta12_ooze);        ci34m2++;        }      i34m1_oo2zeta34 += oo2zeta34;      }    //cartindex34 += size34m2;    I00o = &I00o[size34m2];    }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ-CONDENSED"// End:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?