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_cca_int_intcca_h
00029 #define _chemistry_cca_int_intcca_h
00030
00031 #include <gov_cca.hxx>
00032 #include <chemistry/qc/basis/integral.h>
00033 #include <Chemistry_QC_GaussianBasis_IntegralEvaluatorFactoryInterface.hxx>
00034 #include <ChemistryCXX_Molecule.hxx>
00035 #include <Chemistry_QC_GaussianBasis_DerivCentersInterface.hxx>
00036 #include <chemistry/molecule/molecule.h>
00037 #include <chemistry/qc/basis/transform.h>
00038 #include <chemistry/qc/basis/cartiter.h>
00039 #include "obintcca.h"
00040 #include "tbintcca.h"
00041
00042 namespace sc {
00043
00046 class IntegralCCA : public Integral {
00047
00048 private:
00049
00050
00051
00052
00053
00054 class onebody_generator {
00055
00056 private:
00057
00058 Integral* integral_;
00059 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface factory_;
00060 bool reorder_;
00061 Ref<GaussianBasisSet> bs1_, bs2_;
00062
00063 public:
00064
00065 onebody_generator( ) { }
00066
00067 onebody_generator(
00068 Integral* integral,
00069 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface fac,
00070 bool reorder ):
00071 integral_(integral), factory_(fac), reorder_(reorder)
00072 { }
00073
00074 void set_basis( Ref<GaussianBasisSet> bs1,
00075 Ref<GaussianBasisSet> bs2 )
00076 { bs1_ = bs1, bs2_ = bs2; }
00077
00078 Ref<OneBodyIntCCA> generate(
00079 Chemistry::QC::GaussianBasis::CompositeDescrInterface cdesc )
00080 {
00081 Ref<OneBodyIntCCA> eval;
00082 eval = new OneBodyIntCCA( integral_, bs1_, bs2_,
00083 factory_, cdesc, reorder_ );
00084 return eval;
00085 }
00086
00087 };
00088
00089
00090
00091 class onebody_deriv_generator {
00092
00093 private:
00094
00095 Integral* integral_;
00096 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface factory_;
00097 bool reorder_;
00098 Ref<GaussianBasisSet> bs1_, bs2_;
00099
00100 public:
00101
00102 onebody_deriv_generator( ) { }
00103
00104 onebody_deriv_generator(
00105 Integral* integral,
00106 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface fac,
00107 bool reorder ):
00108 integral_(integral), factory_(fac), reorder_(reorder)
00109 { }
00110
00111 void set_basis( Ref<GaussianBasisSet> bs1,
00112 Ref<GaussianBasisSet> bs2 )
00113 { bs1_ = bs1, bs2_ = bs2; }
00114
00115 Ref<OneBodyDerivIntCCA> generate(
00116 Chemistry::QC::GaussianBasis::CompositeDescrInterface cdesc )
00117 {
00118 Ref<OneBodyDerivIntCCA> eval;
00119 eval = new OneBodyDerivIntCCA( integral_, bs1_, bs2_,
00120 factory_, cdesc, reorder_ );
00121 return eval;
00122 }
00123
00124 };
00125
00126
00127
00128 class twobody_generator {
00129
00130 private:
00131
00132 Ref<GaussianBasisSet> bs1_, bs2_, bs3_, bs4_;
00133 Integral* integral_;
00134 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface factory_;
00135
00136 public:
00137
00138 twobody_generator( ) { }
00139
00140 twobody_generator(
00141 Integral* integral,
00142 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface fac ):
00143 integral_(integral), factory_(fac)
00144 { }
00145
00146 void set_basis( Ref<GaussianBasisSet> bs1,
00147 Ref<GaussianBasisSet> bs2,
00148 Ref<GaussianBasisSet> bs3,
00149 Ref<GaussianBasisSet> bs4 )
00150 { bs1_ = bs1; bs2_ = bs2; bs3_ = bs3; bs4_ = bs4; }
00151
00152 Ref<TwoBodyIntCCA> generate(
00153 Chemistry::QC::GaussianBasis::CompositeDescrInterface cdesc )
00154 {
00155 Ref<TwoBodyIntCCA> eval;
00156 eval = new TwoBodyIntCCA( integral_, bs1_, bs2_, bs3_, bs4_,
00157 factory_, cdesc );
00158 return eval;
00159 }
00160
00161 };
00162
00163
00164
00165 class twobody_deriv_generator {
00166
00167 private:
00168
00169 Ref<GaussianBasisSet> bs1_, bs2_, bs3_, bs4_;
00170 Integral* integral_;
00171 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface factory_;
00172
00173 public:
00174
00175 twobody_deriv_generator( ) { }
00176
00177 twobody_deriv_generator(
00178 Integral* integral,
00179 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface fac ):
00180 integral_(integral), factory_(fac)
00181 { }
00182
00183 void set_basis( Ref<GaussianBasisSet> bs1,
00184 Ref<GaussianBasisSet> bs2,
00185 Ref<GaussianBasisSet> bs3,
00186 Ref<GaussianBasisSet> bs4 )
00187 { bs1_ = bs1; bs2_ = bs2; bs3_ = bs3; bs4_ = bs4; }
00188
00189 Ref<TwoBodyDerivIntCCA> generate(
00190 Chemistry::QC::GaussianBasis::CompositeDescrInterface cdesc )
00191 {
00192 Ref<TwoBodyDerivIntCCA> eval;
00193 eval = new TwoBodyDerivIntCCA( integral_, bs1_, bs2_, bs3_, bs4_,
00194 factory_, cdesc );
00195 return eval;
00196 }
00197
00198 };
00199
00200
00201
00202
00203
00204 template< typename eval_type, typename generator_type >
00205 class sc_eval_factory {
00206
00207 private:
00208
00209 generator_type generator_;
00210
00211 public:
00212
00213 sc_eval_factory() { }
00214
00215 sc_eval_factory( generator_type generator ):
00216 generator_(generator)
00217 { }
00218
00219 Ref<eval_type> operator() (
00220 Chemistry::QC::GaussianBasis::CompositeDescrInterface cdesc )
00221 {
00222 return generator_.generate( cdesc );
00223 }
00224
00225 };
00226
00227
00228
00229 int maxl_;
00230 bool intv3_order_;
00231 bool use_superfac_;
00232 gov::cca::ComponentID fac_id_;
00233 gov::cca::ConnectionID fac_con_;
00234 Ref<Molecule> sc_molecule_;
00235 ChemistryCXX::Molecule molecule_;
00236 std::vector<Chemistry::QC::GaussianBasis::DerivCentersInterface> cca_dcs_;
00237 std::vector<Chemistry::QC::GaussianBasis::DescrInterface> descs_;
00238 std::string buffer_;
00239 std::string default_subfactory_;
00240 Chemistry::QC::GaussianBasis::IntegralEvaluatorFactoryInterface eval_factory_;
00241 Chemistry::QC::GaussianBasis::CompositeDescrInterface eval_req_;
00242
00243 sidl::array<std::string> types_;
00244 sidl::array<std::string> derivs_;
00245 sidl::array<std::string> sfacs_;
00246 std::vector<std::string> std_types_;
00247 std::vector<std::string> std_derivs_;
00248 std::vector<std::string> std_sfacs_;
00249
00250 onebody_generator obgen_;
00251 onebody_deriv_generator obdgen_;
00252 twobody_generator tbgen_;
00253 twobody_deriv_generator tbdgen_;
00254 sc_eval_factory<OneBodyInt,onebody_generator> get_onebody;
00255 sc_eval_factory<OneBodyDerivInt,onebody_deriv_generator> get_onebody_deriv;
00256 sc_eval_factory<TwoBodyInt,twobody_generator> get_twobody;
00257 sc_eval_factory<TwoBodyDerivInt,twobody_deriv_generator> get_twobody_deriv;
00258
00259 SphericalTransform ***st_;
00260 ISphericalTransform ***ist_;
00261
00262 void init_factory();
00263 void init_generators();
00264 void free_transforms();
00265 void initialize_transforms();
00266 void free_transformsV3();
00267 void initialize_transformsV3();
00268 CartesianIter* new_cartesian_iterV3(int l);
00269 RedundantCartesianIter* new_redundant_cartesian_iterV3(int l);
00270 RedundantCartesianSubIter* new_redundant_cartesian_sub_iterV3(int l);
00271 SphericalTransformIter* new_spherical_transform_iterV3(int l, int inv, int subl);
00272 const SphericalTransform* spherical_transformV3(int l, int inv, int subl);
00273
00274 public:
00275
00295 IntegralCCA(const Ref<KeyVal>&);
00296
00297 IntegralCCA( const Ref<GaussianBasisSet> &b1,
00298 const Ref<GaussianBasisSet> &b2,
00299 const Ref<GaussianBasisSet> &b3,
00300 const Ref<GaussianBasisSet> &b4,
00301 std::string default_sf,
00302 bool use_superfac,
00303 sidl::array<std::string> types,
00304 sidl::array<std::string> derivs,
00305 sidl::array<std::string> sfacs,
00306 bool intv3_order
00307 );
00308
00309 IntegralCCA(StateIn&);
00310
00311 ~IntegralCCA();
00312
00313 void save_data_state(StateOut&);
00314
00315 Integral* clone();
00316
00317 void set_storage(size_t i)
00318 {
00319 storage_=i;
00320 eval_factory_.set_storage( storage_ );
00321 };
00322
00323 CartesianIter * new_cartesian_iter(int);
00324 RedundantCartesianIter * new_redundant_cartesian_iter(int);
00325 RedundantCartesianSubIter * new_redundant_cartesian_sub_iter(int);
00326 SphericalTransformIter * new_spherical_transform_iter(int l,
00327 int inv=0,
00328 int subl=-1);
00329 const SphericalTransform * spherical_transform(int l,
00330 int inv=0, int subl=-1);
00331
00332 Ref<OneBodyInt> overlap();
00333
00334 Ref<OneBodyInt> p_dot_nuclear_p();
00335
00336 Ref<OneBodyInt> p_cross_nuclear_p();
00337
00338 Ref<OneBodyInt> kinetic();
00339
00340 Ref<OneBodyInt> point_charge(const Ref<PointChargeData>& =0);
00341
00342 Ref<OneBodyInt> nuclear();
00343
00344 Ref<OneBodyInt> p4();
00345
00346 Ref<OneBodyInt> hcore();
00347
00348 Ref<OneBodyInt> efield_dot_vector(const Ref<EfieldDotVectorData>& =0);
00349
00350 Ref<OneBodyInt> dipole(const Ref<DipoleData>& =0);
00351
00352 Ref<OneBodyInt> quadrupole(const Ref<DipoleData>& =0);
00353
00354 Ref<OneBodyDerivInt> overlap_deriv();
00355
00356 Ref<OneBodyDerivInt> kinetic_deriv();
00357
00358 Ref<OneBodyDerivInt> nuclear_deriv();
00359
00360 Ref<OneBodyDerivInt> hcore_deriv();
00361
00362 Ref<TwoBodyInt> electron_repulsion();
00363
00364 Ref<TwoBodyDerivInt> electron_repulsion_deriv();
00365
00366 Ref<TwoBodyInt> grt();
00367
00369 Ref<TwoBodyInt> g12nc();
00370
00371 void set_basis(const Ref<GaussianBasisSet> &b1,
00372 const Ref<GaussianBasisSet> &b2 = 0,
00373 const Ref<GaussianBasisSet> &b3 = 0,
00374 const Ref<GaussianBasisSet> &b4 = 0);
00375
00376 Integral::CartesianOrdering cartesian_ordering() const;
00377
00378 };
00379
00380 }
00381
00382 #endif
00383
00384
00385
00386
00387