⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 obosrr.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// obosrr.cc//// Copyright (C) 2001 Edward Valeev//// Author: Edward Valeev <edward.valeev@chemistry.gatech.edu>// Maintainer: EV//// This file is part of the SC Toolkit.//// The SC Toolkit is free software; you can redistribute it and/or modify// it under the terms of the GNU Library General Public License as published by// the Free Software Foundation; either version 2, or (at your option)// any later version.//// The SC Toolkit is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the// GNU Library General Public License for more details.//// You should have received a copy of the GNU Library General Public License// along with the SC Toolkit; see the file COPYING.LIB.  If not, write to// the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.//// The U.S. Government is granted a limited license as per AL 91-7.//#ifdef __GNUG__#pragma implementation#endif#include <chemistry/qc/cints/int1e.h>#include <chemistry/qc/intv3/fjt.h>using namespace std;using namespace sc;inline void fail(){  ExEnv::errn() << scprintf("failing module:\n%s",__FILE__) << endl;  abort();}/* Recurrence relation are from the Obara-Saika paper - pp. 3971-3972 */void Int1eCints::AI_OSrecurs_(double ***AI0, double PA[3], double PB[3],			      double PC[3], double gamma, int iang, int jang){  int a,b,m;  int izm = 1;  int iym = iang + 1;  int ixm = iym * iym;  int jzm = 1;  int jym = jang + 1;  int jxm = jym * jym;  int ix,iy,iz,jx,jy,jz;  int iind,jind;  double pp = 1/(2*gamma);  int mmax = iang+jang;  double tmp = sqrt(gamma)*M_2_SQRTPI;  double u = gamma*(PC[0]*PC[0] + PC[1]*PC[1] + PC[2]*PC[2]);  double *F = Fm_Eval_->values(mmax,u);	/* Computing starting integrals for recursion */  for(m=0;m<=mmax;m++)    AI0[0][0][m] = tmp*F[m];	/* Upward recursion in j with i=0 */    for(b=1;b<=jang;b++)    for(jx=0;jx<=b;jx++)    for(jy=0;jy<=b-jx;jy++) {      jz = b-jx-jy;      jind = jx*jxm+jy*jym+jz*jzm;      if (jz > 0) {        for(m=0;m<=mmax-b;m++)	/* Electrostatic potential integrals */          AI0[0][jind][m] = PB[2]*AI0[0][jind-jzm][m] -                             PC[2]*AI0[0][jind-jzm][m+1];	if (jz > 1) {          for(m=0;m<=mmax-b;m++)            AI0[0][jind][m] += pp*(jz-1)*(AI0[0][jind-2*jzm][m] -                                          AI0[0][jind-2*jzm][m+1]);        }      }      else       if (jy > 0) {        for(m=0;m<=mmax-b;m++)          AI0[0][jind][m] = PB[1]*AI0[0][jind-jym][m] -                            PC[1]*AI0[0][jind-jym][m+1];        if (jy > 1) {          for(m=0;m<=mmax-b;m++)              AI0[0][jind][m] += pp*(jy-1)*(AI0[0][jind-2*jym][m] -                                          AI0[0][jind-2*jym][m+1]);        }      }      else      if (jx > 0) {        for(m=0;m<=mmax-b;m++)          AI0[0][jind][m] = PB[0]*AI0[0][jind-jxm][m] -                            PC[0]*AI0[0][jind-jxm][m+1];        if (jx > 1) {          for(m=0;m<=mmax-b;m++)              AI0[0][jind][m] += pp*(jx-1)*(AI0[0][jind-2*jxm][m] -                                          AI0[0][jind-2*jxm][m+1]);        }      }      else	fail();    }   /* The following fragment cannot be vectorized easily, I guess :-) */	/* Upward recursion in i with all possible j's */  for(b=0;b<=jang;b++)    for(jx=0;jx<=b;jx++)    for(jy=0;jy<=b-jx;jy++) {    jz = b-jx-jy;    jind = jx*jxm + jy*jym + jz*jzm;    for(a=1;a<=iang;a++)      for(ix=0;ix<=a;ix++)      for(iy=0;iy<=a-ix;iy++) {        iz = a-ix-iy;        iind = ix*ixm + iy*iym + iz*izm;        if (iz > 0) {          for(m=0;m<=mmax-a-b;m++)            AI0[iind][jind][m] = PA[2]*AI0[iind-izm][jind][m] -                                  PC[2]*AI0[iind-izm][jind][m+1];          if (iz > 1) {            for(m=0;m<=mmax-a-b;m++)              AI0[iind][jind][m] += pp*(iz-1)*               (AI0[iind-2*izm][jind][m] - AI0[iind-2*izm][jind][m+1]);          }          if (jz > 0) {            for(m=0;m<=mmax-a-b;m++)              AI0[iind][jind][m] += pp*jz*               (AI0[iind-izm][jind-jzm][m] - AI0[iind-izm][jind-jzm][m+1]);          }        }        else	if (iy > 0) {          for(m=0;m<=mmax-a-b;m++)            AI0[iind][jind][m] = PA[1]*AI0[iind-iym][jind][m] -                                 PC[1]*AI0[iind-iym][jind][m+1];	  if (iy > 1) {            for(m=0;m<=mmax-a-b;m++)              AI0[iind][jind][m] += pp*(iy-1)*              (AI0[iind-2*iym][jind][m] - AI0[iind-2*iym][jind][m+1]);          }	  if (jy > 0) {            for(m=0;m<=mmax-a-b;m++)              AI0[iind][jind][m] += pp*jy*               (AI0[iind-iym][jind-jym][m] - AI0[iind-iym][jind-jym][m+1]);          }        }        else	if (ix > 0) {          for(m=0;m<=mmax-a-b;m++)            AI0[iind][jind][m] = PA[0]*AI0[iind-ixm][jind][m] -                                 PC[0]*AI0[iind-ixm][jind][m+1];          if (ix > 1) {            for(m=0;m<=mmax-a-b;m++)              AI0[iind][jind][m] += pp*(ix-1)*               (AI0[iind-2*ixm][jind][m] - AI0[iind-2*ixm][jind][m+1]);          }          if (jx > 0) {            for(m=0;m<=mmax-a-b;m++)              AI0[iind][jind][m] += pp*jx*               (AI0[iind-ixm][jind-jxm][m] - AI0[iind-ixm][jind-jxm][m+1]);            }        }        else	  fail();      }    }  return;}void Int1eCints::OI_OSrecurs_(double **OIX, double **OIY, double **OIZ, double PA[3], double PB[3],			      double gamma, int lmaxi, int lmaxj){  int i,j,k;  double pp = 1/(2*gamma);  OIX[0][0] = OIY[0][0] = OIZ[0][0] = 1.0;	/* Upward recursion in j for i=0 */  OIX[0][1] = PB[0];  OIY[0][1] = PB[1];  OIZ[0][1] = PB[2];  for(j=1;j<lmaxj;j++) {    OIX[0][j+1] = PB[0]*OIX[0][j];    OIY[0][j+1] = PB[1]*OIY[0][j];    OIZ[0][j+1] = PB[2]*OIZ[0][j];    OIX[0][j+1] += j*pp*OIX[0][j-1];    OIY[0][j+1] += j*pp*OIY[0][j-1];    OIZ[0][j+1] += j*pp*OIZ[0][j-1];  }	/* Upward recursion in i for all j's */  OIX[1][0] = PA[0];  OIY[1][0] = PA[1];  OIZ[1][0] = PA[2];  for(j=1;j<=lmaxj;j++) {    OIX[1][j] = PA[0]*OIX[0][j];    OIY[1][j] = PA[1]*OIY[0][j];    OIZ[1][j] = PA[2]*OIZ[0][j];    OIX[1][j] += j*pp*OIX[0][j-1];    OIY[1][j] += j*pp*OIY[0][j-1];    OIZ[1][j] += j*pp*OIZ[0][j-1];  }  for(i=1;i<lmaxi;i++) {    OIX[i+1][0] = PA[0]*OIX[i][0];    OIY[i+1][0] = PA[1]*OIY[i][0];    OIZ[i+1][0] = PA[2]*OIZ[i][0];    OIX[i+1][0] += i*pp*OIX[i-1][0];    OIY[i+1][0] += i*pp*OIY[i-1][0];    OIZ[i+1][0] += i*pp*OIZ[i-1][0];    for(j=1;j<=lmaxj;j++) {      OIX[i+1][j] = PA[0]*OIX[i][j];      OIY[i+1][j] = PA[1]*OIY[i][j];      OIZ[i+1][j] = PA[2]*OIZ[i][j];      OIX[i+1][j] += i*pp*OIX[i-1][j];      OIY[i+1][j] += i*pp*OIY[i-1][j];      OIZ[i+1][j] += i*pp*OIZ[i-1][j];      OIX[i+1][j] += j*pp*OIX[i][j-1];      OIY[i+1][j] += j*pp*OIY[i][j-1];      OIZ[i+1][j] += j*pp*OIZ[i][j-1];    }  }  return;}

⌨️ 快捷键说明

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