1 2 namespace sc { 3 4 class LocalUHFContribution { 5 private: 6 double * const gmata; 7 double * const gmatb; 8 double * const pmata; 9 double * const pmatb; 10 11 public: LocalUHFContribution(double * ga,double * pa,double * gb,double * pb)12 LocalUHFContribution(double *ga, double *pa, double *gb, double *pb) : 13 gmata(ga), gmatb(gb), pmata(pa), pmatb(pb) {} ~LocalUHFContribution()14 ~LocalUHFContribution() {} 15 set_bound(double,double)16 void set_bound(double,double) {}; 17 cont1(int ij,int kl,double val)18 inline void cont1(int ij, int kl, double val) { 19 gmata[ij] += val*(pmata[kl]+pmatb[kl]); 20 gmata[kl] += val*(pmata[ij]+pmatb[ij]); 21 22 gmatb[ij] += val*(pmata[kl]+pmatb[kl]); 23 gmatb[kl] += val*(pmata[ij]+pmatb[ij]); 24 } 25 cont2(int ij,int kl,double val)26 inline void cont2(int ij, int kl, double val) { 27 val *= 0.5; 28 gmata[ij] -= val*pmata[kl]; 29 gmata[kl] -= val*pmata[ij]; 30 31 gmatb[ij] -= val*pmatb[kl]; 32 gmatb[kl] -= val*pmatb[ij]; 33 } 34 cont3(int ij,int kl,double val)35 inline void cont3(int ij, int kl, double val) { 36 gmata[ij] -= val*pmata[kl]; 37 gmata[kl] -= val*pmata[ij]; 38 39 gmatb[ij] -= val*pmatb[kl]; 40 gmatb[kl] -= val*pmatb[ij]; 41 } 42 cont4(int ij,int kl,double val)43 inline void cont4(int ij, int kl, double val) { 44 cont1(ij,kl,val); 45 cont2(ij,kl,val); 46 } 47 cont5(int ij,int kl,double val)48 inline void cont5(int ij, int kl, double val) { 49 cont1(ij,kl,val); 50 cont3(ij,kl,val); 51 } 52 }; 53 54 class LocalUHFEnergyContribution { 55 private: 56 double * const pmata; 57 double * const pmatb; 58 59 public: 60 double ec; 61 double ex; 62 LocalUHFEnergyContribution(double * a,double * b)63 LocalUHFEnergyContribution(double *a, double *b) : pmata(a), pmatb(b) { 64 ec=ex=0; 65 } 66 ~LocalUHFEnergyContribution()67 ~LocalUHFEnergyContribution() {} 68 set_bound(double,double)69 void set_bound(double,double) {}; 70 cont1(int ij,int kl,double val)71 inline void cont1(int ij, int kl, double val) { 72 ec += val*(pmata[ij]+pmatb[ij])*(pmata[kl]+pmatb[kl]); 73 } 74 cont2(int ij,int kl,double val)75 inline void cont2(int ij, int kl, double val) { 76 ex -= 0.5*val*(pmata[ij]*pmata[kl]+pmatb[ij]*pmatb[kl]); 77 } 78 cont3(int ij,int kl,double val)79 inline void cont3(int ij, int kl, double val) { 80 ex -= val*(pmata[ij]*pmata[kl]+pmatb[ij]*pmatb[kl]); 81 } 82 cont4(int ij,int kl,double val)83 inline void cont4(int ij, int kl, double val) { 84 cont1(ij,kl,val); 85 cont2(ij,kl,val); 86 } 87 cont5(int ij,int kl,double val)88 inline void cont5(int ij, int kl, double val) { 89 cont1(ij,kl,val); 90 cont3(ij,kl,val); 91 } 92 }; 93 94 class LocalUHFGradContribution { 95 private: 96 double * const pmata; 97 double * const pmatb; 98 99 public: LocalUHFGradContribution(double * a,double * b)100 LocalUHFGradContribution(double *a, double *b) : pmata(a), pmatb(b) {} ~LocalUHFGradContribution()101 ~LocalUHFGradContribution() {} 102 cont1(int ij,int kl)103 inline double cont1(int ij, int kl) { 104 return (pmata[ij]*pmata[kl])+(pmatb[ij]*pmatb[kl]) + 105 (pmata[ij]*pmatb[kl])+(pmatb[ij]*pmata[kl]); 106 } 107 cont2(int ij,int kl)108 inline double cont2(int ij, int kl) { 109 return 2*((pmata[ij]*pmata[kl])+(pmatb[ij]*pmatb[kl])); 110 } 111 }; 112 113 } 114