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 #ifdef __GNUG__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _chemistry_qc_mbptr12_linearr12_h
00033 #define _chemistry_qc_mbptr12_linearr12_h
00034
00035 #include <string>
00036 #include <chemistry/qc/basis/integral.h>
00037 #include <chemistry/qc/basis/intdescr.h>
00038 #include <chemistry/qc/basis/tbint.h>
00039
00040 namespace sc {
00041 namespace LinearR12 {
00042
00050 enum Projector {Projector_0 = 0,
00051 Projector_1 = 1,
00052 Projector_2 = 2,
00053 Projector_3 = 3};
00054 enum StandardApproximation {
00055
00056 StdApprox_Ap = 1,
00057 StdApprox_App = 2,
00058 StdApprox_B = 3,
00059 StdApprox_C = 4};
00060 enum ABSMethod {ABS_ABS = 0,
00061 ABS_ABSPlus = 1,
00062 ABS_CABS = 2,
00063 ABS_CABSPlus = 3};
00064
00065 enum OrbitalProduct {
00066 OrbProd_ij = 0,
00067 OrbProd_pq = 1
00068 };
00069
00070 enum PositiveDefiniteB {
00071 PositiveDefiniteB_no = 0,
00072 PositiveDefiniteB_yes = 1,
00073 PositiveDefiniteB_weak = 2
00074 };
00075
00076 enum GeminalAmplitudeAnsatz {
00077 GeminalAmplitudeAnsatz_fullopt = 0,
00078 GeminalAmplitudeAnsatz_fixed = 1,
00079 GeminalAmplitudeAnsatz_scaledfixed = 2
00080 };
00081
00082 class GeminalDescriptor : public RefCount {
00083 private:
00084 std::string type_;
00090 std::vector<std::string> params_;
00091 public:
00092 GeminalDescriptor();
00093 ~GeminalDescriptor(){}
00094 GeminalDescriptor(const std::string& type, const std::vector<std::string> ¶ms);
00095 GeminalDescriptor(const GeminalDescriptor& source);
00096 std::string type() const;
00097 std::vector<std::string> params() const;
00098 void print(std::ostream &o=ExEnv::out0());
00099 };
00100
00101 bool invalid(const Ref<GeminalDescriptor>& gdesc);
00102 bool R12(const Ref<GeminalDescriptor>& gdesc);
00103 bool STG(const Ref<GeminalDescriptor>& gdesc);
00104 bool G12(const Ref<GeminalDescriptor>& gdesc);
00106 double single_slater_exponent(const Ref<GeminalDescriptor>& gdesc);
00107
00108
00113 class CorrelationFactor : public RefCount {
00114 public:
00116
00117
00119
00120
00121 CorrelationFactor(const std::string& label, const Ref<GeminalDescriptor> &geminaldescriptor);
00122 CorrelationFactor();
00123 virtual ~CorrelationFactor();
00124
00125
00126 virtual bool equiv(const Ref<CorrelationFactor>& cf) const =0;
00127
00129 const std::string& label() const;
00131 virtual unsigned int nfunctions() const;
00133 virtual unsigned int nprimitives(unsigned int c) const;
00134
00136 virtual double value(unsigned int c, double r12) const =0;
00138 virtual double value(unsigned int c, double r12, double r1, double r2) const;
00139
00143 virtual Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int f) const;
00147 virtual Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int fbra, unsigned int fket) const;
00149 virtual unsigned int max_num_tbint_types() const =0;
00150
00151
00152
00153
00154
00156 virtual TwoBodyInt::tbint_type tbint_type_eri() const;
00158 virtual TwoBodyInt::tbint_type tbint_type_f12() const;
00160 virtual TwoBodyInt::tbint_type tbint_type_t1f12() const;
00162 virtual TwoBodyInt::tbint_type tbint_type_t2f12() const;
00164 virtual TwoBodyInt::tbint_type tbint_type_f12eri() const;
00166 virtual TwoBodyInt::tbint_type tbint_type_f12f12() const;
00168 virtual TwoBodyInt::tbint_type tbint_type_f12t1f12() const;
00171 virtual TwoBodyInt::tbint_type tbint_type_f12f12_anti() const;
00172
00174 void print(std::ostream& os = ExEnv::out0()) const;
00175 Ref<GeminalDescriptor> geminaldescriptor();
00176
00177 protected:
00178 std::string label_;
00179 Ref<GeminalDescriptor> geminaldescriptor_;
00180
00182 virtual void print_params(std::ostream& os, unsigned int f) const;
00183
00184 };
00185
00187 class NullCorrelationFactor : public CorrelationFactor {
00188 public:
00189 NullCorrelationFactor();
00190
00192 bool equiv(const Ref<CorrelationFactor>& cf) const;
00194 unsigned int max_num_tbint_types() const { return 1; }
00196 double value(unsigned int c, double r12) const;
00197 };
00198
00200 class R12CorrelationFactor : public CorrelationFactor {
00201 public:
00202 R12CorrelationFactor();
00203
00205 bool equiv(const Ref<CorrelationFactor>& cf) const;
00207 unsigned int max_num_tbint_types() const { return 4; }
00209 TwoBodyInt::tbint_type tbint_type_f12() const;
00211 TwoBodyInt::tbint_type tbint_type_t1f12() const;
00213 TwoBodyInt::tbint_type tbint_type_t2f12() const;
00215 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int f) const;
00217 double value(unsigned int c, double r12) const;
00218 };
00219
00221 template <class IntParam>
00222 struct CorrParamCompare {
00223 typedef typename IntParam::PrimitiveGeminal PrimitiveGeminal;
00224 typedef typename IntParam::ContractedGeminal ContractedGeminal;
00225 typedef std::vector<ContractedGeminal> ContractedGeminals;
00226
00227
00228 static double epsilon;
00229 static bool equiv(const ContractedGeminals& A, const ContractedGeminals& B);
00230
00231 private:
00232 static bool equiv(const PrimitiveGeminal& A, const PrimitiveGeminal& B);
00233 };
00234 template <class IntParam> double CorrParamCompare<IntParam>::epsilon(1e-6);
00235
00238 class G12CorrelationFactor : public CorrelationFactor {
00239 public:
00241 typedef IntParamsG12::PrimitiveGeminal PrimitiveGeminal;
00242 typedef IntParamsG12::ContractedGeminal ContractedGeminal;
00244 typedef std::vector<ContractedGeminal> CorrelationParameters;
00245
00246 G12CorrelationFactor(const CorrelationParameters& params, const Ref<GeminalDescriptor> &geminaldescriptor = 0);
00247
00249 bool equiv(const Ref<CorrelationFactor>& cf) const;
00251 unsigned int nfunctions() const;
00253 const ContractedGeminal& function(unsigned int c) const;
00255 unsigned int nprimitives(unsigned int c) const;
00257 const PrimitiveGeminal& primitive(unsigned int c, unsigned int p) const;
00259 unsigned int max_num_tbint_types() const { return 6; }
00261 TwoBodyInt::tbint_type tbint_type_f12() const;
00263 TwoBodyInt::tbint_type tbint_type_f12eri() const;
00265 TwoBodyInt::tbint_type tbint_type_t1f12() const;
00267 TwoBodyInt::tbint_type tbint_type_t2f12() const;
00269 TwoBodyInt::tbint_type tbint_type_f12f12() const;
00271 TwoBodyInt::tbint_type tbint_type_f12t1f12() const;
00273 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int f) const;
00275 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int fbra, unsigned int fket) const;
00277 double value(unsigned int c, double r12) const;
00278
00279 private:
00280 CorrelationParameters params_;
00281
00283 void print_params(std::ostream& os, unsigned int f) const;
00284
00285 };
00286
00289 class G12NCCorrelationFactor : public CorrelationFactor {
00290 public:
00292 typedef IntParamsG12::PrimitiveGeminal PrimitiveGeminal;
00293 typedef IntParamsG12::ContractedGeminal ContractedGeminal;
00295 typedef std::vector<ContractedGeminal> CorrelationParameters;
00296
00297 G12NCCorrelationFactor(const CorrelationParameters& params, const Ref<GeminalDescriptor> &geminaldescriptor = 0);
00298
00300 bool equiv(const Ref<CorrelationFactor>& cf) const;
00302 unsigned int nfunctions() const;
00304 const ContractedGeminal& function(unsigned int c) const;
00306 unsigned int nprimitives(unsigned int c) const;
00308 const PrimitiveGeminal& primitive(unsigned int c, unsigned int p) const;
00310 unsigned int max_num_tbint_types() const { return 6; }
00312 TwoBodyInt::tbint_type tbint_type_f12() const;
00314 TwoBodyInt::tbint_type tbint_type_f12eri() const;
00316 TwoBodyInt::tbint_type tbint_type_f12f12() const;
00318 TwoBodyInt::tbint_type tbint_type_f12t1f12() const;
00320 TwoBodyInt::tbint_type tbint_type_f12f12_anti() const;
00322 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int f) const;
00324 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int fbra, unsigned int fket) const;
00326 double value(unsigned int c, double r12) const;
00327
00328 static ContractedGeminal product(const ContractedGeminal& A,
00329 const ContractedGeminal& B);
00330
00331 private:
00332 CorrelationParameters params_;
00333
00335 void print_params(std::ostream& os, unsigned int f) const;
00336
00337 };
00338
00340 class GenG12CorrelationFactor : public CorrelationFactor {
00341 public:
00343 typedef IntParamsGenG12::PrimitiveGeminal PrimitiveGeminal;
00344 typedef IntParamsGenG12::ContractedGeminal ContractedGeminal;
00346 typedef std::vector<ContractedGeminal> CorrelationParameters;
00347
00348 GenG12CorrelationFactor(const CorrelationParameters& params);
00349
00351 bool equiv(const Ref<CorrelationFactor>& cf) const;
00353 unsigned int nfunctions() const;
00355 const ContractedGeminal& function(unsigned int c) const;
00357 unsigned int nprimitives(unsigned int c) const;
00359 const PrimitiveGeminal& primitive(unsigned int c, unsigned int p) const;
00361 unsigned int max_num_tbint_types() const { return 4; }
00363 TwoBodyInt::tbint_type tbint_type_f12() const;
00365 TwoBodyInt::tbint_type tbint_type_f12eri() const;
00367 TwoBodyInt::tbint_type tbint_type_f12f12() const;
00369 TwoBodyInt::tbint_type tbint_type_f12t1f12() const;
00371 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int f) const;
00373 Ref<TwoBodyIntDescr> tbintdescr(const Ref<Integral>& IF, unsigned int fbra, unsigned int fket) const;
00375 double value(unsigned int c, double r12) const;
00377 double value(unsigned int c, double r12, double r1, double r2) const;
00378
00379 private:
00380 CorrelationParameters params_;
00381
00383 void print_params(std::ostream& os, unsigned int f) const;
00384
00385 };
00386
00387 class GeminalDescriptorFactory : public RefCount {
00388 private:
00389 const char* invalid_id_;
00390 const char* r12_id_;
00391 const char* stg_id_;
00392 const char* g12_id_;
00393 public:
00394 GeminalDescriptorFactory();
00395 Ref<GeminalDescriptor> null_geminal();
00396 Ref<GeminalDescriptor> r12_geminal();
00397 Ref<GeminalDescriptor> slater_geminal(double gamma);
00398 Ref<GeminalDescriptor> slater_geminal(const std::vector<double> &gamma);
00399 Ref<GeminalDescriptor> gaussian_geminal(double gamma);
00400 Ref<GeminalDescriptor> contracted_gaussian_geminal(const std::vector<double> &coeff,
00401 const std::vector<double> &gamma);
00402 Ref<GeminalDescriptor> gaussian_geminal(const LinearR12::G12CorrelationFactor::CorrelationParameters &corrparams);
00403 };
00404
00406 template <class CorrFactor, class Fitter>
00407 Ref<CorrelationFactor> stg_to_g12(const Fitter& fitter, double gamma, int k=0);
00408
00410 Ref<CorrelationFactor> ang_to_geng12(double alpha);
00411
00413 template <class Fitter>
00414 Ref<CorrelationFactor> angstg_to_geng12(const Fitter& fitter, double alpha, double gamma, int k=0);
00415
00417 template <class Fitter>
00418 Ref<CorrelationFactor> angplusstg_to_geng12(const Fitter& fitter, double alpha, double gamma, int k=0);
00419
00421 template <class CF> Ref<CF> direct_product(const Ref<CF>& A, const Ref<CF>& B);
00422
00423 }
00424
00425 }
00426
00427 #endif
00428
00429
00430
00431
00432
00433
00434