![]()
|
clhftmpl.h00001 00002 #include <util/misc/exenv.h> 00003 00004 #undef SCF_CHECK_BOUNDS 00005 00006 #ifdef SCF_CHECK_BOUNDS 00007 #define CHECK(ival,pval,ij,kl,con) check(ival,pval,ij,kl,con) 00008 #else 00009 #define CHECK(ival,pval,ij,kl,con) 00010 #endif 00011 00012 namespace sc { 00013 00014 class LocalCLHFContribution { 00015 private: 00016 double * const gmat; 00017 double * const pmat; 00018 00019 double ibound_; 00020 double pbound_; 00021 00022 public: 00023 LocalCLHFContribution(double *g, double *p) : gmat(g), pmat(p) {} 00024 ~LocalCLHFContribution() {} 00025 00026 void set_bound(double i, double p) { ibound_ = i; pbound_ = p; } 00027 void check(double ival, double pval, int ij, int kl, const char *contrib) 00028 { 00029 int bad = 0; 00030 if ( 1.000001 * ibound_ < (ival > 0 ? ival : -ival)) { 00031 ExEnv::errn() << "BAD INTEGRAL BOUND" << std::endl; 00032 ExEnv::errn() << " bound = " << ibound_ << std::endl; 00033 ExEnv::errn() << " value = " << ival << std::endl; 00034 bad = 1; 00035 } 00036 if ( 1.000001 * pbound_ < (pval > 0 ? pval : -pval)) { 00037 ExEnv::errn() << "BAD DENSITY BOUND" << std::endl; 00038 ExEnv::errn() << " bound = " << pbound_ << std::endl; 00039 ExEnv::errn() << " value = " << pval << std::endl; 00040 bad = 1; 00041 } 00042 if (bad) { 00043 ExEnv::errn() << " ij = " << ij << std::endl; 00044 ExEnv::errn() << " kl = " << kl << std::endl; 00045 ExEnv::errn() << " cont = " << contrib << std::endl; 00046 abort(); 00047 } 00048 } 00049 00050 inline void cont1(int ij, int kl, double val) { 00051 gmat[ij] += val*pmat[kl]; CHECK(val,pmat[kl],ij,kl,"cont1a"); 00052 gmat[kl] += val*pmat[ij]; CHECK(val,pmat[ij],ij,kl,"cont1b"); 00053 } 00054 00055 inline void cont2(int ij, int kl, double val) { 00056 val *= -0.25; 00057 gmat[ij] += val*pmat[kl]; CHECK(4*val,0.25*pmat[kl],ij,kl,"cont2a"); 00058 gmat[kl] += val*pmat[ij]; CHECK(4*val,0.25*pmat[ij],ij,kl,"cont2b"); 00059 } 00060 00061 inline void cont3(int ij, int kl, double val) { 00062 val *= -0.5; 00063 gmat[ij] += val*pmat[kl]; CHECK(2*val,0.5*pmat[kl],ij,kl,"cont3a"); 00064 gmat[kl] += val*pmat[ij]; CHECK(2*val,0.5*pmat[ij],ij,kl,"cont3b"); 00065 } 00066 00067 inline void cont4(int ij, int kl, double val) { 00068 val *= 0.75; 00069 gmat[ij] += val*pmat[kl]; CHECK(4./3.*val,0.75*pmat[kl],ij,kl,"cont4a"); 00070 gmat[kl] += val*pmat[ij]; CHECK(4./3.*val,0.75*pmat[ij],ij,kl,"cont4b"); 00071 } 00072 00073 inline void cont5(int ij, int kl, double val) { 00074 val *= 0.5; 00075 gmat[ij] += val*pmat[kl]; CHECK(2*val,0.5*pmat[kl],ij,kl,"cont5a"); 00076 gmat[kl] += val*pmat[ij]; CHECK(2*val,0.5*pmat[ij],ij,kl,"cont5b"); 00077 } 00078 }; 00079 00080 class LocalCLHFEnergyContribution { 00081 private: 00082 double * const pmat; 00083 00084 public: 00085 double ec; 00086 double ex; 00087 00088 void set_bound(double,double) {} 00089 00090 LocalCLHFEnergyContribution(double *p) : pmat(p) { 00091 ec=ex=0; 00092 } 00093 ~LocalCLHFEnergyContribution() {} 00094 00095 inline void cont1(int ij, int kl, double val) { 00096 ec += val*pmat[ij]*pmat[kl]; 00097 } 00098 00099 inline void cont2(int ij, int kl, double val) { 00100 ex -= 0.25*val*pmat[ij]*pmat[kl]; 00101 } 00102 00103 inline void cont3(int ij, int kl, double val) { 00104 ex -= 0.5*val*pmat[ij]*pmat[kl]; 00105 } 00106 00107 inline void cont4(int ij, int kl, double val) { 00108 ec += val*pmat[ij]*pmat[kl]; 00109 ex -= 0.25*val*pmat[ij]*pmat[kl]; 00110 } 00111 00112 inline void cont5(int ij, int kl, double val) { 00113 ec += val*pmat[ij]*pmat[kl]; 00114 ex -= 0.5*val*pmat[ij]*pmat[kl]; 00115 } 00116 }; 00117 00118 class LocalCLHFGradContribution { 00119 private: 00120 double * const pmat; 00121 00122 public: 00123 LocalCLHFGradContribution(double *p) : pmat(p) {} 00124 ~LocalCLHFGradContribution() {} 00125 00126 inline double cont1(int ij, int kl) { 00127 return pmat[ij]*pmat[kl]; 00128 } 00129 00130 inline double cont2(int ij, int kl) { 00131 return pmat[ij]*pmat[kl]; 00132 } 00133 }; 00134 00135 } Generated at Fri Jan 10 08:14:08 2003 for MPQC 2.1.3 using the documentation package Doxygen 1.2.14. |