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_tbint_h
00029 #define _chemistry_qc_basis_tbint_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <util/ref/ref.h>
00036 #include <util/group/message.h>
00037 #include <chemistry/qc/basis/gaussbas.h>
00038 #include <chemistry/qc/basis/dercent.h>
00039
00040 namespace sc {
00041
00042
00043
00044 class Integral;
00045
00049 class TwoBodyInt : public RefCount {
00050 protected:
00051
00052 Integral *integral_;
00053
00054 Ref<GaussianBasisSet> bs1_;
00055 Ref<GaussianBasisSet> bs2_;
00056 Ref<GaussianBasisSet> bs3_;
00057 Ref<GaussianBasisSet> bs4_;
00058
00059 double *buffer_;
00060
00061 int redundant_;
00062
00063 TwoBodyInt(Integral *integral,
00064 const Ref<GaussianBasisSet>&bs1,
00065 const Ref<GaussianBasisSet>&bs2,
00066 const Ref<GaussianBasisSet>&bs3,
00067 const Ref<GaussianBasisSet>&bs4);
00068 public:
00069 virtual ~TwoBodyInt();
00070
00072 int nbasis() const;
00073
00075
00076 int nbasis1() const;
00077 int nbasis2() const;
00078 int nbasis3() const;
00079 int nbasis4() const;
00081
00083 int nshell() const;
00084
00086
00087 int nshell1() const;
00088 int nshell2() const;
00089 int nshell3() const;
00090 int nshell4() const;
00092
00094 Ref<GaussianBasisSet> basis();
00095
00097
00098 Ref<GaussianBasisSet> basis1();
00099 Ref<GaussianBasisSet> basis2();
00100 Ref<GaussianBasisSet> basis3();
00101 Ref<GaussianBasisSet> basis4();
00103
00107 const double * buffer() const;
00108
00111 virtual void compute_shell(int,int,int,int) = 0;
00112
00115 virtual int log2_shell_bound(int= -1,int= -1,int= -1,int= -1) = 0;
00116
00120 int redundant() const { return redundant_; }
00121 void set_redundant(int i) { redundant_ = i; }
00123
00125 virtual void set_integral_storage(size_t storage);
00126
00128 Integral *integral() const { return integral_; }
00129 };
00130
00131
00132
00133
00134
00135 class ShellQuartetIter {
00136 protected:
00137 const double * buf;
00138 double scale_;
00139
00140 int redund_;
00141
00142 int e12;
00143 int e34;
00144 int e13e24;
00145
00146 int index;
00147
00148 int istart;
00149 int jstart;
00150 int kstart;
00151 int lstart;
00152
00153 int iend;
00154 int jend;
00155 int kend;
00156 int lend;
00157
00158 int icur;
00159 int jcur;
00160 int kcur;
00161 int lcur;
00162
00163 int i_;
00164 int j_;
00165 int k_;
00166 int l_;
00167
00168 public:
00169 ShellQuartetIter();
00170 virtual ~ShellQuartetIter();
00171
00172 virtual void init(const double *,
00173 int, int, int, int,
00174 int, int, int, int,
00175 int, int, int, int,
00176 double, int);
00177
00178 virtual void start();
00179 virtual void next();
00180
00181 int ready() const { return icur < iend; }
00182
00183 int i() const { return i_; }
00184 int j() const { return j_; }
00185 int k() const { return k_; }
00186 int l() const { return l_; }
00187
00188 int nint() const { return iend*jend*kend*lend; }
00189
00190 double val() const { return buf[index]*scale_; }
00191 };
00192
00193 class TwoBodyIntIter {
00194 protected:
00195 Ref<TwoBodyInt> tbi;
00196 ShellQuartetIter sqi;
00197
00198 int iend;
00199
00200 int icur;
00201 int jcur;
00202 int kcur;
00203 int lcur;
00204
00205 public:
00206 TwoBodyIntIter();
00207 TwoBodyIntIter(const Ref<TwoBodyInt>&);
00208
00209 virtual ~TwoBodyIntIter();
00210
00211 virtual void start();
00212 virtual void next();
00213
00214 int ready() const { return (icur < iend); }
00215
00216 int ishell() const { return icur; }
00217 int jshell() const { return jcur; }
00218 int kshell() const { return kcur; }
00219 int lshell() const { return lcur; }
00220
00221 virtual double scale() const;
00222
00223 ShellQuartetIter& current_quartet();
00224 };
00225
00226
00227
00231 class TwoBodyDerivInt : public RefCount {
00232 protected:
00233
00234 Integral *integral_;
00235
00236 Ref<GaussianBasisSet> bs1_;
00237 Ref<GaussianBasisSet> bs2_;
00238 Ref<GaussianBasisSet> bs3_;
00239 Ref<GaussianBasisSet> bs4_;
00240
00241 double *buffer_;
00242
00243 TwoBodyDerivInt(Integral* integral,
00244 const Ref<GaussianBasisSet>&b1,
00245 const Ref<GaussianBasisSet>&b2,
00246 const Ref<GaussianBasisSet>&b3,
00247 const Ref<GaussianBasisSet>&b4);
00248 public:
00249 virtual ~TwoBodyDerivInt();
00250
00252 int nbasis() const;
00253
00255
00256 int nbasis1() const;
00257 int nbasis2() const;
00258 int nbasis3() const;
00259 int nbasis4() const;
00261
00263 int nshell() const;
00264
00266
00267 int nshell1() const;
00268 int nshell2() const;
00269 int nshell3() const;
00270 int nshell4() const;
00272
00274 Ref<GaussianBasisSet> basis();
00275
00277
00278 Ref<GaussianBasisSet> basis1();
00279 Ref<GaussianBasisSet> basis2();
00280 Ref<GaussianBasisSet> basis3();
00281 Ref<GaussianBasisSet> basis4();
00283
00287 const double * buffer() const;
00288
00291 virtual void compute_shell(int,int,int,int,DerivCenters&) = 0;
00292
00295 virtual int log2_shell_bound(int= -1,int= -1,int= -1,int= -1) = 0;
00296 };
00297
00298 }
00299
00300 #endif
00301
00302
00303
00304
00305