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

📄 tform.cc

📁 大型并行量子化学软件;支持密度泛函(DFT)。可以进行各种量子化学计算。支持CHARMM并行计算。非常具有应用价值。
💻 CC
字号:
//// tformv3.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.//#if defined(__GNUC__)#pragma implementation#endif#include <stdlib.h>#include <string.h>#include <math.h>#include <util/misc/formio.h>#include <chemistry/qc/basis/integral.h>#include <chemistry/qc/cints/macros.h>#include <chemistry/qc/cints/tform.h>#include <chemistry/qc/cints/int1e.h>#include <chemistry/qc/cints/int2e.h>using namespace std;using namespace sc;inline int max(int a,int b) { return (a > b) ? a : b;}inline void fail(){  ExEnv::errn() << scprintf("failing module:\n%s",__FILE__) << endl;  abort();}static void transform1e_1(SphericalTransformIter&, double*, double*, int);static void transform1e_2(SphericalTransformIter&, double*, double*, int, int);static void transform1e_vec_2(const int, SphericalTransformIter&, double*, double*, int, int);static void transform2e_1(SphericalTransformIter&, double*, double*, int);static void transform2e_2(SphericalTransformIter&, double*, double*, int, int, int);static void transform2e_3(SphericalTransformIter&, double*, double*, int, int, int);static void transform2e_4(SphericalTransformIter&, double*, double*, int, int);void Int1eCints::transform_contrquartets_(double * source_ints_buf, double *target_ints_buf){  double *source1, *target1;  double *source2, *target2;  double *source = source_ints_buf;  double *target = target_ints_buf;  double *tmpbuf = tformbuf_;  for (int gc1=0; gc1<int_shell1_->ncontraction(); gc1++) {    int am1 = int_shell1_->am(gc1);    int is_pure1 = int_shell1_->is_pure(gc1) ? 1 : 0;    int ncart1 = int_shell1_->ncartesian(gc1);    int nbf1 = int_shell1_->nfunction(gc1);    int target_bf2_offset = 0;    for (int gc2=0; gc2<int_shell2_->ncontraction(); gc2++) {      int am2 = int_shell2_->am(gc2);      int is_pure2 = int_shell2_->is_pure(gc2) ? 1 : 0;      int ncart2 = int_shell2_->ncartesian(gc2);      int nbf2 = int_shell2_->nfunction(gc2);            int transform_index = 2*is_pure1 + is_pure2;      switch (transform_index) {      case 0:	break;      case 1:	source2 = source;	target2 = target;	break;	      case 2:	source1 = source;	target1 = target;	break;      case 3:	source2 = source;	target2 = tmpbuf;	source1 = tmpbuf;	target1 = target;	break;      }      if (is_pure2) {	SphericalTransformIter stiter(integral_->spherical_transform(am2));	transform1e_2(stiter,source2, target2, ncart1,ncart2);      }      if (is_pure1) {	SphericalTransformIter stiter(integral_->spherical_transform(am1));	transform1e_1(stiter,source1, target1, nbf2);      }            source += (ncart1*ncart2);      target += (nbf1*nbf2);    }  }}void Int1eCints::transform_contrquartets_vec_(const int ntypes, double * source_ints_buf, double *target_ints_buf){  double *source1, *target1;  double *source2, *target2;  double *source = source_ints_buf;  double *target = target_ints_buf;  double *tmpbuf = tformbuf_;  for (int gc1=0; gc1<int_shell1_->ncontraction(); gc1++) {    int am1 = int_shell1_->am(gc1);    int is_pure1 = int_shell1_->is_pure(gc1) ? 1 : 0;    int ncart1 = int_shell1_->ncartesian(gc1);    int nbf1 = int_shell1_->nfunction(gc1);    int target_bf2_offset = 0;    for (int gc2=0; gc2<int_shell2_->ncontraction(); gc2++) {      int am2 = int_shell2_->am(gc2);      int is_pure2 = int_shell2_->is_pure(gc2) ? 1 : 0;      int ncart2 = int_shell2_->ncartesian(gc2);      int nbf2 = int_shell2_->nfunction(gc2);            int transform_index = 2*is_pure1 + is_pure2;      switch (transform_index) {      case 0:	break;      case 1:	source2 = source;	target2 = target;	break;	      case 2:	source1 = source;	target1 = target;	break;      case 3:	source2 = source;	target2 = tmpbuf;	source1 = tmpbuf;	target1 = target;	break;      }      if (is_pure2) {	SphericalTransformIter stiter(integral_->spherical_transform(am2));	transform1e_vec_2(ntypes, stiter, source2, target2, ncart1,ncart2);      }      if (is_pure1) {	SphericalTransformIter stiter(integral_->spherical_transform(am1));	transform1e_1(stiter, source1, target1, nbf2*ntypes);      }            source += (ntypes*ncart1*ncart2);      target += (ntypes*nbf1*nbf2);    }  }}void Int2eCints::transform_contrquartets_(double * source_ints_buf, double *target_ints_buf){  double *source1, *target1;  double *source2, *target2;  double *source3, *target3;  double *source4, *target4;  double *source = source_ints_buf;  double *target = target_ints_buf;  double *tmpbuf = tformbuf_;  for (int gc1=0; gc1<int_shell1_->ncontraction(); gc1++) {    int am1 = int_shell1_->am(gc1);    int is_pure1 = int_shell1_->is_pure(gc1) ? 1 : 0;    int ncart1 = int_shell1_->ncartesian(gc1);    int nbf1 = int_shell1_->nfunction(gc1);    int target_bf2_offset = 0;    for (int gc2=0; gc2<int_shell2_->ncontraction(); gc2++) {      int am2 = int_shell2_->am(gc2);      int is_pure2 = int_shell2_->is_pure(gc2) ? 1 : 0;      int ncart2 = int_shell2_->ncartesian(gc2);      int nbf2 = int_shell2_->nfunction(gc2);            int target_bf3_offset = 0;      for (int gc3=0; gc3<int_shell3_->ncontraction(); gc3++) {	int am3 = int_shell3_->am(gc3);	int is_pure3 = int_shell3_->is_pure(gc3) ? 1 : 0;	int ncart3 = int_shell3_->ncartesian(gc3);	int nbf3 = int_shell3_->nfunction(gc3);		int target_bf4_offset = 0;	for (int gc4=0; gc4<int_shell4_->ncontraction(); gc4++) {	  int am4 = int_shell4_->am(gc4);	  int is_pure4 = int_shell4_->is_pure(gc4) ? 1 : 0;	  int ncart4 = int_shell4_->ncartesian(gc4);	  int nbf4 = int_shell4_->nfunction(gc4);	  int transform_index = 8*is_pure1 + 4*is_pure2 + 2*is_pure3 + is_pure4;	  switch (transform_index) {	    case 0:	      break;	    case 1:	      source4 = source;	      target4 = target;	      break;	    case 2:	      source3 = source;	      target3 = target;	      break;	    case 3:	      source4 = source;	      target4 = tmpbuf;	      source3 = tmpbuf;	      target3 = target;	      break;	      	    case 4:	      source2 = source;	      target2 = target;	      break;	    case 5:	      source4 = source;	      target4 = tmpbuf;	      source2 = tmpbuf;	      target2 = target;	      break;	    case 6:	      source3 = source;	      target3 = tmpbuf;	      source2 = tmpbuf;	      target2 = target;	      break;	    	    case 7:	      source4 = source;	      target4 = tmpbuf;	      source3 = tmpbuf;	      target3 = source;	      source2 = source;	      target2 = target;	      break;	    case 8:	      source1 = source;	      target1 = target;	      break;	      	    case 9:	      source4 = source;	      target4 = tmpbuf;	      source1 = tmpbuf;	      target1 = target;	      break;	    case 10:	      source3 = source;	      target3 = tmpbuf;	      source1 = tmpbuf;	      target1 = target;	      break;	    case 11:	      source4 = source;	      target4 = tmpbuf;	      source3 = tmpbuf;	      target3 = source;	      source1 = source;	      target1 = target;	      break;	      	    case 12:	      source2 = source;	      target2 = tmpbuf;	      source1 = tmpbuf;	      target1 = target;	      break;	    case 13:	      source4 = source;	      target4 = tmpbuf;	      source2 = tmpbuf;	      target2 = source;	      source1 = source;	      target1 = target;	      break;	    case 14:	      source3 = source;	      target3 = tmpbuf;	      source2 = tmpbuf;	      target2 = source;	      source1 = source;	      target1 = target;	      break;	    	    case 15:	      source4 = source;	      target4 = tmpbuf;	      source3 = tmpbuf;	      target3 = source;	      source2 = source;	      target2 = tmpbuf;	      source1 = tmpbuf;	      target1 = target;	      break;	  }	  if (is_pure4) {	    SphericalTransformIter stiter(integral_->spherical_transform(am4));	    transform2e_4(stiter, source4, target4, ncart1*ncart2*ncart3,ncart4);	  }	  if (is_pure3) {	    SphericalTransformIter stiter(integral_->spherical_transform(am3));	    transform2e_3(stiter,source3, target3, ncart1*ncart2,ncart3,nbf4);	  }	  if (is_pure2) {	    SphericalTransformIter stiter(integral_->spherical_transform(am2));	    transform2e_2(stiter,source2, target2, ncart1,ncart2,nbf3*nbf4);	  }	  if (is_pure1) {	    SphericalTransformIter stiter(integral_->spherical_transform(am1));	    transform2e_1(stiter,source1, target1, nbf2*nbf3*nbf4);	  }	  	  source += (ncart1*ncart2*ncart3*ncart4);	  target += (nbf1*nbf2*nbf3*nbf4);	}      }    }  }}static void transform1e_1(SphericalTransformIter& sti, double *s, double *t, int nl){  memset(t,0,sti.n()*nl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex()*nl;    double *tptr = t + sti.pureindex()*nl;    double coef = sti.coef();    for(int l=0; l<nl; l++)      *(tptr++) += coef * *(sptr++);  }}static void transform1e_2(SphericalTransformIter& sti, double *s, double *t, int nk, int nl){  const int sl = nl;  const int tl = sti.n();  memset(t,0,nk*tl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex();    double *tptr = t + sti.pureindex();    double coef = sti.coef();    for(int k=0; k<nk; k++,sptr+=sl,tptr+=tl) {	*(tptr) += coef * *(sptr);    }  }}static void transform1e_vec_2(const int ntypes, SphericalTransformIter& sti, double *s, double *t, int nk, int nl){  const int sl = nl*ntypes;  const int tl = sti.n()*ntypes;  memset(t,0,nk*tl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex()*ntypes;    double *tptr = t + sti.pureindex()*ntypes;    double coef = sti.coef();    for(int k=0; k<nk; k++,sptr+=sl,tptr+=tl) {      for(int type=0; type<ntypes; type++)	tptr[type] += coef * sptr[type];    }  }}static void transform2e_1(SphericalTransformIter& sti, double *s, double *t, int njkl){  memset(t,0,sti.n()*njkl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex()*njkl;    double *tptr = t + sti.pureindex()*njkl;    double coef = sti.coef();    for(int jkl=0; jkl<njkl; jkl++)      *(tptr++) += coef * *(sptr++);  }}static void transform2e_2(SphericalTransformIter& sti, double *s, double *t, int ni, int nj, int nkl){  int sj = sti.n();  const int sjkl = nj*nkl;  const int tjkl = sj*nkl;  memset(t,0,ni*tjkl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex()*nkl;    double *tptr = t + sti.pureindex()*nkl;    double coef = sti.coef();    for(int i=0; i<ni; i++,sptr+=sjkl,tptr+=tjkl) {      for(int kl=0; kl<nkl; kl++)	tptr[kl] += coef * sptr[kl];    }  }}static void transform2e_3(SphericalTransformIter& sti, double *s, double *t, int nij, int nk, int nl){  int sk = sti.n();  const int skl = nk*nl;  const int tkl = sk*nl;  memset(t,0,nij*tkl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex()*nl;    double *tptr = t + sti.pureindex()*nl;    double coef = sti.coef();    for(int ij=0; ij<nij; ij++,sptr+=skl,tptr+=tkl) {      for(int l=0; l<nl; l++)	tptr[l] += coef * sptr[l];    }  }}static void transform2e_4(SphericalTransformIter& sti, double *s, double *t, int nijk, int nl){  const int sl = nl;  const int tl = sti.n();  memset(t,0,nijk*tl*sizeof(double));  for (sti.begin(); sti.ready(); sti.next()) {    double *sptr = s + sti.cartindex();    double *tptr = t + sti.pureindex();    double coef = sti.coef();    for(int ijk=0; ijk<nijk; ijk++,sptr+=sl,tptr+=tl) {	*(tptr) += coef * *(sptr);    }  }}/////////////////////////////////////////////////////////////////////////////// Local Variables:// mode: c++// c-file-style: "CLJ-CONDENSED"// End:

⌨️ 快捷键说明

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