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
00108 enum tbint_type { eri=0, r12=1, r12t1=2, r12t2=3};
00109
00114
virtual const double *
buffer(tbint_type type = eri)
const;
00115
00118
virtual void compute_shell(
int,
int,
int,
int) = 0;
00119
00122
virtual int log2_shell_bound(
int= -1,
int= -1,
int= -1,
int= -1) = 0;
00123
00127 int redundant()
const {
return redundant_; }
00128
void set_redundant(
int i) { redundant_ = i; }
00130
00132
virtual void set_integral_storage(size_t storage);
00133
00135 Integral *
integral()
const {
return integral_; }
00136
00137 };
00138
00139
00140
00141
class ShellQuartetIter {
00142
protected:
00143
const double * buf;
00144
double scale_;
00145
00146
int redund_;
00147
00148
int e12;
00149
int e34;
00150
int e13e24;
00151
00152
int index;
00153
00154
int istart;
00155
int jstart;
00156
int kstart;
00157
int lstart;
00158
00159
int iend;
00160
int jend;
00161
int kend;
00162
int lend;
00163
00164
int icur;
00165
int jcur;
00166
int kcur;
00167
int lcur;
00168
00169
int i_;
00170
int j_;
00171
int k_;
00172
int l_;
00173
00174
public:
00175 ShellQuartetIter();
00176
virtual ~ShellQuartetIter();
00177
00178
virtual void init(
const double *,
00179
int,
int,
int,
int,
00180
int,
int,
int,
int,
00181
int,
int,
int,
int,
00182
double,
int);
00183
00184
virtual void start();
00185
virtual void next();
00186
00187
int ready()
const {
return icur < iend; }
00188
00189
int i()
const {
return i_; }
00190
int j()
const {
return j_; }
00191
int k()
const {
return k_; }
00192
int l()
const {
return l_; }
00193
00194
int nint()
const {
return iend*jend*kend*lend; }
00195
00196
double val()
const {
return buf[index]*scale_; }
00197 };
00198
00199
class TwoBodyIntIter {
00200
protected:
00201 Ref<TwoBodyInt> tbi;
00202 ShellQuartetIter sqi;
00203
00204
int iend;
00205
00206
int icur;
00207
int jcur;
00208
int kcur;
00209
int lcur;
00210
00211
public:
00212 TwoBodyIntIter();
00213 TwoBodyIntIter(
const Ref<TwoBodyInt>&);
00214
00215
virtual ~TwoBodyIntIter();
00216
00217
virtual void start();
00218
virtual void next();
00219
00220
int ready()
const {
return (icur < iend); }
00221
00222
int ishell()
const {
return icur; }
00223
int jshell()
const {
return jcur; }
00224
int kshell()
const {
return kcur; }
00225
int lshell()
const {
return lcur; }
00226
00227
virtual double scale() const;
00228
00229 ShellQuartetIter& current_quartet();
00230 };
00231
00232
00233
00237 class
TwoBodyDerivInt : public
RefCount {
00238
protected:
00239
00240
Integral *integral_;
00241
00242
Ref<GaussianBasisSet> bs1_;
00243
Ref<GaussianBasisSet> bs2_;
00244
Ref<GaussianBasisSet> bs3_;
00245
Ref<GaussianBasisSet> bs4_;
00246
00247
double *buffer_;
00248
00249
TwoBodyDerivInt(
Integral* integral,
00250
const Ref<GaussianBasisSet>&b1,
00251
const Ref<GaussianBasisSet>&b2,
00252
const Ref<GaussianBasisSet>&b3,
00253
const Ref<GaussianBasisSet>&b4);
00254
public:
00255
virtual ~
TwoBodyDerivInt();
00256
00258
int nbasis()
const;
00259
00261
00262
int nbasis1()
const;
00263
int nbasis2()
const;
00264
int nbasis3()
const;
00265
int nbasis4()
const;
00267
00269
int nshell()
const;
00270
00272
00273
int nshell1()
const;
00274
int nshell2()
const;
00275
int nshell3()
const;
00276
int nshell4()
const;
00278
00280
Ref<GaussianBasisSet> basis();
00281
00283
00284
Ref<GaussianBasisSet> basis1();
00285
Ref<GaussianBasisSet> basis2();
00286
Ref<GaussianBasisSet> basis3();
00287
Ref<GaussianBasisSet> basis4();
00289
00293
const double * buffer()
const;
00294
00297
virtual void compute_shell(
int,
int,
int,
int,
DerivCenters&) = 0;
00298
00301
virtual int log2_shell_bound(
int= -1,
int= -1,
int= -1,
int= -1) = 0;
00302 };
00303
00304 }
00305
00306
#endif
00307
00308
00309
00310
00311