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_basis_integral_h
00029 #define _chemistry_qc_basis_integral_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <stddef.h>
00036
00037 #include <util/state/state.h>
00038 #include <util/group/message.h>
00039 #include <chemistry/qc/basis/basis.h>
00040 #include <chemistry/qc/basis/obint.h>
00041 #include <chemistry/qc/basis/tbint.h>
00042 #include <chemistry/qc/basis/intparams.h>
00043
00044 namespace sc {
00045
00046 class SymmetryOperation;
00047 class RefSymmSCMatrix;
00048 class ShellRotation;
00049 class CartesianIter;
00050 class RedundantCartesianIter;
00051 class RedundantCartesianSubIter;
00052 class SphericalTransformIter;
00053 class SphericalTransform;
00054 class PointBag_double;
00055 class PetiteList;
00056
00059 class Integral : public SavableState {
00060 protected:
00063 Integral(const Ref<GaussianBasisSet> &b1,
00064 const Ref<GaussianBasisSet> &b2,
00065 const Ref<GaussianBasisSet> &b3,
00066 const Ref<GaussianBasisSet> &b4);
00067 Ref<GaussianBasisSet> bs1_;
00068 Ref<GaussianBasisSet> bs2_;
00069 Ref<GaussianBasisSet> bs3_;
00070 Ref<GaussianBasisSet> bs4_;
00071
00072 typedef enum {
00073 MPQCSolidHarmonicsOrdering,
00074 CCASolidHarmonicsOrdering
00075 } SolidHarmonicsOrdering;
00076 SolidHarmonicsOrdering sharmorder_;
00077
00078
00079
00080 size_t storage_;
00081 size_t storage_used_;
00082
00083 Ref<MessageGrp> grp_;
00084 private:
00089 static const SolidHarmonicsOrdering default_sharmorder_ = CCASolidHarmonicsOrdering;
00090
00091 public:
00093 Integral(StateIn&);
00095 Integral(const Ref<KeyVal>&);
00096
00097 virtual ~Integral();
00098
00099 void save_data_state(StateOut&);
00100
00108 static Integral* initial_integral(int &argc, char **argv);
00110 static void set_default_integral(const Ref<Integral>&);
00112 static Integral* get_default_integral();
00114 virtual Integral* clone() =0;
00115
00118 virtual int equiv(const Ref<Integral> &);
00120 typedef enum {
00121 IntV3CartesianOrdering,
00122 CCACartesianOrdering
00123 } CartesianOrdering;
00125 virtual CartesianOrdering cartesian_ordering() const =0;
00126
00128 virtual void set_storage(size_t i) { storage_=i; };
00130 size_t storage_used() { return storage_used_; }
00132 size_t storage_unused();
00135 virtual size_t storage_required_eri(const Ref<GaussianBasisSet> &b1,
00136 const Ref<GaussianBasisSet> &b2 = 0,
00137 const Ref<GaussianBasisSet> &b3 = 0,
00138 const Ref<GaussianBasisSet> &b4 = 0);
00141 virtual size_t storage_required_grt(const Ref<GaussianBasisSet> &b1,
00142 const Ref<GaussianBasisSet> &b2 = 0,
00143 const Ref<GaussianBasisSet> &b3 = 0,
00144 const Ref<GaussianBasisSet> &b4 = 0);
00147 virtual size_t storage_required_g12(const Ref<GaussianBasisSet> &b1,
00148 const Ref<GaussianBasisSet> &b2 = 0,
00149 const Ref<GaussianBasisSet> &b3 = 0,
00150 const Ref<GaussianBasisSet> &b4 = 0);
00153 virtual size_t storage_required_g12nc(const Ref<GaussianBasisSet> &b1,
00154 const Ref<GaussianBasisSet> &b2 = 0,
00155 const Ref<GaussianBasisSet> &b3 = 0,
00156 const Ref<GaussianBasisSet> &b4 = 0);
00159 virtual size_t storage_required_g12dkh(const Ref<GaussianBasisSet> &b1,
00160 const Ref<GaussianBasisSet> &b2 = 0,
00161 const Ref<GaussianBasisSet> &b3 = 0,
00162 const Ref<GaussianBasisSet> &b4 = 0);
00165 virtual size_t storage_required_geng12(const Ref<GaussianBasisSet> &b1,
00166 const Ref<GaussianBasisSet> &b2 = 0,
00167 const Ref<GaussianBasisSet> &b3 = 0,
00168 const Ref<GaussianBasisSet> &b4 = 0);
00171 virtual size_t storage_required_eri_deriv(const Ref<GaussianBasisSet> &b1,
00172 const Ref<GaussianBasisSet> &b2 = 0,
00173 const Ref<GaussianBasisSet> &b3 = 0,
00174 const Ref<GaussianBasisSet> &b4 = 0);
00175
00178 void adjust_storage(ptrdiff_t s) { storage_used_ += s; }
00179
00181 Ref<PetiteList> petite_list();
00183 Ref<PetiteList> petite_list(const Ref<GaussianBasisSet>&);
00186 ShellRotation shell_rotation(int am, SymmetryOperation&, int pure=0);
00187
00189 virtual void set_basis(const Ref<GaussianBasisSet> &b1,
00190 const Ref<GaussianBasisSet> &b2 = 0,
00191 const Ref<GaussianBasisSet> &b3 = 0,
00192 const Ref<GaussianBasisSet> &b4 = 0);
00193
00194
00195
00196
00199 virtual CartesianIter * new_cartesian_iter(int) =0;
00202 virtual RedundantCartesianIter * new_redundant_cartesian_iter(int) =0;
00205 virtual RedundantCartesianSubIter*
00206 new_redundant_cartesian_sub_iter(int) =0;
00209 virtual SphericalTransformIter *
00210 new_spherical_transform_iter(int l,
00211 int inv=0, int subl=-1) =0;
00214 virtual const SphericalTransform *
00215 spherical_transform(int l,
00216 int inv=0, int subl=-1) =0;
00217
00219 virtual Ref<OneBodyInt> overlap() =0;
00220
00222 virtual Ref<OneBodyInt> kinetic() =0;
00223
00226 virtual Ref<OneBodyInt> point_charge(const Ref<PointChargeData>&) =0;
00227
00230 virtual Ref<OneBodyOneCenterInt> point_charge1(const Ref<PointChargeData>&);
00231
00236 virtual Ref<OneBodyInt> nuclear() = 0;
00237
00240 virtual Ref<OneBodyInt> p_dot_nuclear_p();
00241
00246 virtual Ref<OneBodyInt> p_cross_nuclear_p();
00247
00249 virtual Ref<OneBodyInt> p4() =0;
00250
00252 virtual Ref<OneBodyInt> hcore() = 0;
00253
00256 virtual Ref<OneBodyInt> efield_dot_vector(const Ref<EfieldDotVectorData>&) =0;
00257
00260 virtual Ref<OneBodyInt> dipole(const Ref<DipoleData>&) =0;
00261
00264 virtual Ref<OneBodyInt> quadrupole(const Ref<DipoleData>&) =0;
00265
00267 virtual Ref<OneBodyDerivInt> overlap_deriv() =0;
00268
00270 virtual Ref<OneBodyDerivInt> kinetic_deriv() =0;
00271
00273 virtual Ref<OneBodyDerivInt> nuclear_deriv() =0;
00274
00276 virtual Ref<OneBodyDerivInt> hcore_deriv() =0;
00277
00281 virtual Ref<TwoBodyThreeCenterInt> electron_repulsion3();
00282
00285 virtual Ref<TwoBodyThreeCenterDerivInt> electron_repulsion3_deriv();
00286
00289 virtual Ref<TwoBodyTwoCenterInt> electron_repulsion2();
00290
00293 virtual Ref<TwoBodyTwoCenterDerivInt> electron_repulsion2_deriv();
00294
00297 virtual Ref<TwoBodyInt> electron_repulsion();
00298
00300 virtual Ref<TwoBodyDerivInt> electron_repulsion_deriv();
00301
00310 virtual Ref<TwoBodyInt> grt();
00311
00316 virtual Ref<TwoBodyInt> g12(const Ref<IntParamsG12>&);
00317
00323 virtual Ref<TwoBodyInt> g12nc(const Ref<IntParamsG12>&);
00324
00329 virtual Ref<TwoBodyInt> g12dkh(const Ref<IntParamsG12>&);
00330
00335 virtual Ref<TwoBodyInt> geng12(const Ref<IntParamsGenG12>&);
00336
00338 Ref<MessageGrp> messagegrp() { return grp_; }
00339 };
00340
00341 }
00342
00343 #endif
00344
00345
00346
00347
00348