00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef _chemistry_qc_mbptr12_linearr12timpl_h
00029 #define _chemistry_qc_mbptr12_linearr12timpl_h
00030
00031 #include <cmath>
00032 #include <algorithm>
00033 #include <chemistry/qc/mbptr12/gaussianfit.h>
00034 #include <chemistry/qc/mbptr12/linearr12.h>
00035
00036 namespace sc {
00037
00038 namespace LinearR12 {
00039
00040 template<class CF>
00041 Ref<CF> direct_product(const Ref<CF>& A, const Ref<CF>& B) {
00042 const unsigned int nf_A = A->nfunctions();
00043 const unsigned int nf_B = B->nfunctions();
00044 typedef typename CF::CorrelationParameters CorrParams;
00045 CorrParams corrparams;
00046 for(int f=0; f<nf_A; ++f) {
00047 for(int g=0; g<nf_B; ++g) {
00048 corrparams.push_back( CF::product(A->function(f),B->function(g)) );
00049 }
00050 }
00051 return new CF(corrparams);
00052 }
00053
00054 template <class CorrFactor, class Fitter>
00055 Ref<CorrelationFactor> stg_to_g12(const Fitter& fitter, double gamma, int k) {
00056
00057 using sc::mbptr12::Slater1D;
00058 typedef typename Fitter::Gaussians Gaussians;
00059 Slater1D stg(gamma,k);
00060 Gaussians gtgs = fitter(stg);
00061
00062
00063 typedef IntParamsG12::PrimitiveGeminal PrimitiveGeminal;
00064 typedef IntParamsG12::ContractedGeminal ContractedGeminal;
00065 ContractedGeminal geminal;
00066 typedef typename Gaussians::const_iterator citer;
00067 for(citer g=gtgs.begin(); g!=gtgs.end(); ++g) {
00068 geminal.push_back(*g);
00069 }
00070 std::vector<ContractedGeminal> geminals(1,geminal);
00071
00072 Ref<CorrelationFactor> cf = new CorrFactor(geminals);
00073 return cf;
00074 }
00075
00076 template <class Fitter>
00077 Ref<CorrelationFactor> angstg_to_geng12(const Fitter& fitter, double alpha, double gamma, int k) {
00078
00079 const double halfalpha = alpha/2.0;
00080
00081 using sc::mbptr12::Slater1D;
00082 typedef typename Fitter::Gaussians Gaussians;
00083 Slater1D stg(gamma,k);
00084 Gaussians gtgs = fitter(stg);
00085
00086
00087 typedef IntParamsGenG12::PrimitiveGeminal PrimitiveGeminal;
00088 typedef IntParamsGenG12::ContractedGeminal ContractedGeminal;
00089 ContractedGeminal geminal;
00090 typedef typename Gaussians::const_iterator citer;
00091 for(citer g=gtgs.begin(); g!=gtgs.end(); ++g) {
00092 const double alpha_i = halfalpha;
00093 const double gamma_i = (*g).first - halfalpha;
00094 const double C_i = (*g).second;
00095
00096 PrimitiveGeminal i = std::make_pair(std::make_pair(alpha_i,gamma_i),C_i);
00097 geminal.push_back(i);
00098 }
00099 std::vector<ContractedGeminal> geminals(1,geminal);
00100
00101 Ref<CorrelationFactor> cf = new GenG12CorrelationFactor(geminals);
00102 return cf;
00103 }
00104
00105 template <class Fitter>
00106 Ref<CorrelationFactor> angplusstg_to_geng12(const Fitter& fitter, double alpha, double gamma, int k) {
00107
00108 const double halfalpha = alpha/2.0;
00109
00110 using sc::mbptr12::Slater1D;
00111 typedef typename Fitter::Gaussians Gaussians;
00112 Slater1D stg(gamma,k);
00113 Gaussians gtgs = fitter(stg);
00114
00115
00116 typedef IntParamsGenG12::PrimitiveGeminal PrimitiveGeminal;
00117 typedef IntParamsGenG12::ContractedGeminal ContractedGeminal;
00118 ContractedGeminal geminal_stg;
00119 ContractedGeminal geminal_ang;
00120
00121
00122 typedef typename Gaussians::const_iterator citer;
00123 for(citer g=gtgs.begin(); g!=gtgs.end(); ++g) {
00124 const double gamma_i = (*g).first;
00125 const double C_i = (*g).second;
00126
00127 PrimitiveGeminal i = std::make_pair(std::make_pair(0.0,gamma_i),C_i);
00128 geminal_stg.push_back(i);
00129 }
00130
00131 geminal_ang.push_back(std::make_pair(std::make_pair(halfalpha,-halfalpha),1.0));
00132
00133 std::vector<ContractedGeminal> geminals;
00134 geminals.push_back(geminal_stg);
00135 geminals.push_back(geminal_ang);
00136
00137 Ref<CorrelationFactor> cf = new GenG12CorrelationFactor(geminals);
00138 return cf;
00139 }
00140
00141 template <class IntParam>
00142 bool
00143 CorrParamCompare<IntParam>::equiv(const ContractedGeminals& A, const ContractedGeminals& B)
00144 {
00145 unsigned int nf = A.size();
00146 if (nf != B.size()) return false;
00147
00148 for(unsigned int f=0; f<nf; ++f) {
00149 const ContractedGeminal& Af = A[f];
00150 const ContractedGeminal& Bf = B[f];
00151 unsigned int np = Af.size();
00152 if (np != Bf.size()) return false;
00153 for(unsigned int p=0; p<np; ++p) {
00154 if (!equiv(Af[p],Bf[p])) return false;
00155 }
00156 }
00157
00158 return true;
00159 }
00160
00161 };
00162
00163 };
00164
00165 #endif // include guards
00166
00168
00169
00170
00171
00172