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 #include <chemistry/qc/basis/inttypedescr.h>
00040
00041 namespace sc {
00042
00043
00044
00045 class Integral;
00046
00050 class TwoBodyInt : public RefCount {
00051
00052 private:
00053 double *log2_to_double_;
00054
00055 protected:
00056
00057 Integral *integral_;
00058
00059 Ref<GaussianBasisSet> bs1_;
00060 Ref<GaussianBasisSet> bs2_;
00061 Ref<GaussianBasisSet> bs3_;
00062 Ref<GaussianBasisSet> bs4_;
00063
00064 double *buffer_;
00065
00066 int redundant_;
00067
00068 TwoBodyInt(Integral *integral,
00069 const Ref<GaussianBasisSet>&bs1,
00070 const Ref<GaussianBasisSet>&bs2,
00071 const Ref<GaussianBasisSet>&bs3,
00072 const Ref<GaussianBasisSet>&bs4);
00073 public:
00074 virtual ~TwoBodyInt();
00075
00077 int nbasis() const;
00078
00080 int nbasis1() const;
00082 int nbasis2() const;
00084 int nbasis3() const;
00086 int nbasis4() const;
00087
00089 int nshell() const;
00090
00092 int nshell1() const;
00094 int nshell2() const;
00096 int nshell3() const;
00098 int nshell4() const;
00099
00101 Ref<GaussianBasisSet> basis();
00102
00104 Ref<GaussianBasisSet> basis1();
00106 Ref<GaussianBasisSet> basis2();
00108 Ref<GaussianBasisSet> basis3();
00110 Ref<GaussianBasisSet> basis4();
00111
00124 enum tbint_type { eri =0, r12 =1, r12t1 =2, r12t2 =3,
00125 r12_0_g12 =4, r12_m1_g12 =5, t1g12 =6, t2g12 =7,
00126 g12t1g12 =8, g12p4g12_m_g12t1g12t1 =9, anti_g12g12 =10,
00127 r12_0_gg12 =11, r12_m1_gg12 =12, gg12t1gg12 =13};
00129 static const int max_num_tbint_types = 14;
00131 virtual unsigned int num_tbint_types() const =0;
00133 virtual unsigned int inttype(tbint_type t) const =0;
00135 virtual TwoBodyInt::tbint_type inttype(unsigned int t) const =0;
00137 static const Ref<TwoBodyIntTypeDescr>& inttypedescr(tbint_type t);
00138
00143 virtual const double * buffer(tbint_type type = eri) const;
00144
00148 virtual void compute_shell(int,int,int,int) = 0;
00149
00156 std::pair<std::map<tbint_type,const double*>,unsigned long[4]>
00157 compute_shell_arrays(int,int,int,int);
00158
00162 virtual int log2_shell_bound(int= -1,int= -1,int= -1,int= -1) = 0;
00163
00167 double shell_bound(int= -1,int= -1,int= -1,int= -1);
00168
00171 virtual int redundant() const { return redundant_; }
00173 virtual void set_redundant(int i) { redundant_ = i; }
00174
00176 virtual void set_integral_storage(size_t storage);
00177
00179 Integral *integral() const { return integral_; }
00180
00181 };
00182
00183
00184
00188 class TwoBodyThreeCenterInt : public RefCount {
00189
00190 private:
00191 double *log2_to_double_;
00192
00193 protected:
00194
00195 Integral *integral_;
00196
00197 Ref<GaussianBasisSet> bs1_;
00198 Ref<GaussianBasisSet> bs2_;
00199 Ref<GaussianBasisSet> bs3_;
00200
00201 double *buffer_;
00202
00203 int redundant_;
00204
00205 TwoBodyThreeCenterInt(Integral *integral,
00206 const Ref<GaussianBasisSet>&bs1,
00207 const Ref<GaussianBasisSet>&bs2,
00208 const Ref<GaussianBasisSet>&bs3);
00209 public:
00210 virtual ~TwoBodyThreeCenterInt();
00211
00213 int nbasis() const;
00214
00216 int nbasis1() const;
00218 int nbasis2() const;
00220 int nbasis3() const;
00221
00223 int nshell() const;
00224
00226 int nshell1() const;
00228 int nshell2() const;
00230 int nshell3() const;
00231
00233 Ref<GaussianBasisSet> basis();
00234
00236 Ref<GaussianBasisSet> basis1();
00238 Ref<GaussianBasisSet> basis2();
00240 Ref<GaussianBasisSet> basis3();
00241
00243 typedef TwoBodyInt::tbint_type tbint_type;
00245 static const int max_num_tbint_types = TwoBodyInt::max_num_tbint_types;
00246
00251 virtual const double * buffer(tbint_type type = TwoBodyInt::eri) const;
00252
00256 virtual void compute_shell(int,int,int) = 0;
00257
00261 virtual int log2_shell_bound(int= -1,int= -1,int= -1) = 0;
00262
00266 double shell_bound(int= -1,int= -1,int= -1);
00267
00270 int redundant() const { return redundant_; }
00272 void set_redundant(int i) { redundant_ = i; }
00273
00275 virtual void set_integral_storage(size_t storage);
00276
00278 Integral *integral() const { return integral_; }
00279
00280 };
00281
00282
00283
00288 class TwoBodyTwoCenterInt : public RefCount {
00289
00290 private:
00291 double *log2_to_double_;
00292
00293 protected:
00294
00295 Integral *integral_;
00296
00297 Ref<GaussianBasisSet> bs1_;
00298 Ref<GaussianBasisSet> bs2_;
00299
00300 double *buffer_;
00301
00302 int redundant_;
00303
00304 TwoBodyTwoCenterInt(Integral *integral,
00305 const Ref<GaussianBasisSet>&bs1,
00306 const Ref<GaussianBasisSet>&bs2);
00307 public:
00308 virtual ~TwoBodyTwoCenterInt();
00309
00311 int nbasis() const;
00312
00314 int nbasis1() const;
00316 int nbasis2() const;
00317
00319 int nshell() const;
00320
00322 int nshell1() const;
00324 int nshell2() const;
00325
00327 Ref<GaussianBasisSet> basis();
00328
00330 Ref<GaussianBasisSet> basis1();
00332 Ref<GaussianBasisSet> basis2();
00333
00335 typedef TwoBodyInt::tbint_type tbint_type;
00337 static const int max_num_tbint_types = TwoBodyInt::max_num_tbint_types;
00338
00343 virtual const double * buffer(tbint_type type = TwoBodyInt::eri) const;
00344
00348 virtual void compute_shell(int,int) = 0;
00349
00353 virtual int log2_shell_bound(int= -1,int= -1) = 0;
00354
00358 double shell_bound(int= -1,int= -1);
00359
00362 int redundant() const { return redundant_; }
00364 void set_redundant(int i) { redundant_ = i; }
00365
00367 virtual void set_integral_storage(size_t storage);
00368
00370 Integral *integral() const { return integral_; }
00371
00372 };
00373
00374
00375
00376 class ShellQuartetIter {
00377 protected:
00378 const double * buf;
00379 double scale_;
00380
00381 int redund_;
00382
00383 int e12;
00384 int e34;
00385 int e13e24;
00386
00387 int index;
00388
00389 int istart;
00390 int jstart;
00391 int kstart;
00392 int lstart;
00393
00394 int iend;
00395 int jend;
00396 int kend;
00397 int lend;
00398
00399 int icur;
00400 int jcur;
00401 int kcur;
00402 int lcur;
00403
00404 int i_;
00405 int j_;
00406 int k_;
00407 int l_;
00408
00409 public:
00410 ShellQuartetIter();
00411 virtual ~ShellQuartetIter();
00412
00413 virtual void init(const double *,
00414 int, int, int, int,
00415 int, int, int, int,
00416 int, int, int, int,
00417 double, int);
00418
00419 virtual void start();
00420 virtual void next();
00421
00422 int ready() const { return icur < iend; }
00423
00424 int i() const { return i_; }
00425 int j() const { return j_; }
00426 int k() const { return k_; }
00427 int l() const { return l_; }
00428
00429 int nint() const { return iend*jend*kend*lend; }
00430
00431 double val() const { return buf[index]*scale_; }
00432 };
00433
00434 class TwoBodyIntIter {
00435 protected:
00436 Ref<TwoBodyInt> tbi;
00437 ShellQuartetIter sqi;
00438
00439 int iend;
00440
00441 int icur;
00442 int jcur;
00443 int kcur;
00444 int lcur;
00445
00446 public:
00447 TwoBodyIntIter();
00448 TwoBodyIntIter(const Ref<TwoBodyInt>&);
00449
00450 virtual ~TwoBodyIntIter();
00451
00452 virtual void start();
00453 virtual void next();
00454
00455 int ready() const { return (icur < iend); }
00456
00457 int ishell() const { return icur; }
00458 int jshell() const { return jcur; }
00459 int kshell() const { return kcur; }
00460 int lshell() const { return lcur; }
00461
00462 virtual double scale() const;
00463
00464 ShellQuartetIter& current_quartet();
00465 };
00466
00467
00468
00472 class TwoBodyDerivInt : public RefCount {
00473
00474 private:
00475 double *log2_to_double_;
00476
00477 protected:
00478
00479 Integral *integral_;
00480
00481 Ref<GaussianBasisSet> bs1_;
00482 Ref<GaussianBasisSet> bs2_;
00483 Ref<GaussianBasisSet> bs3_;
00484 Ref<GaussianBasisSet> bs4_;
00485
00486 double *buffer_;
00487
00488 TwoBodyDerivInt(Integral* integral,
00489 const Ref<GaussianBasisSet>&b1,
00490 const Ref<GaussianBasisSet>&b2,
00491 const Ref<GaussianBasisSet>&b3,
00492 const Ref<GaussianBasisSet>&b4);
00493 public:
00494 virtual ~TwoBodyDerivInt();
00495
00497 int nbasis() const;
00498
00500 int nbasis1() const;
00502 int nbasis2() const;
00504 int nbasis3() const;
00506 int nbasis4() const;
00507
00509 int nshell() const;
00510
00512 int nshell1() const;
00514 int nshell2() const;
00516 int nshell3() const;
00518 int nshell4() const;
00519
00521 Ref<GaussianBasisSet> basis();
00522
00524 Ref<GaussianBasisSet> basis1();
00526 Ref<GaussianBasisSet> basis2();
00528 Ref<GaussianBasisSet> basis3();
00530 Ref<GaussianBasisSet> basis4();
00531
00535 const double * buffer() const;
00536
00539 virtual void compute_shell(int,int,int,int,DerivCenters&) = 0;
00540
00543 virtual int log2_shell_bound(int= -1,int= -1,int= -1,int= -1) = 0;
00544
00547 double shell_bound(int= -1,int= -1,int= -1,int= -1);
00548 };
00549
00550
00551
00555 class TwoBodyThreeCenterDerivInt : public RefCount {
00556
00557 private:
00558 double *log2_to_double_;
00559
00560 protected:
00561
00562 Integral *integral_;
00563
00564 Ref<GaussianBasisSet> bs1_;
00565 Ref<GaussianBasisSet> bs2_;
00566 Ref<GaussianBasisSet> bs3_;
00567
00568 double *buffer_;
00569
00570 TwoBodyThreeCenterDerivInt(Integral* integral,
00571 const Ref<GaussianBasisSet>&b1,
00572 const Ref<GaussianBasisSet>&b2,
00573 const Ref<GaussianBasisSet>&b3);
00574 public:
00575 virtual ~TwoBodyThreeCenterDerivInt();
00576
00578 int nbasis() const;
00579
00581 int nbasis1() const;
00583 int nbasis2() const;
00585 int nbasis3() const;
00586
00588 int nshell() const;
00589
00591 int nshell1() const;
00593 int nshell2() const;
00595 int nshell3() const;
00596
00598 Ref<GaussianBasisSet> basis();
00599
00601 Ref<GaussianBasisSet> basis1();
00603 Ref<GaussianBasisSet> basis2();
00605 Ref<GaussianBasisSet> basis3();
00606
00610 const double * buffer() const;
00611
00614 virtual void compute_shell(int,int,int,DerivCenters&) = 0;
00615
00618 virtual int log2_shell_bound(int= -1,int= -1,int= -1) = 0;
00619
00622 double shell_bound(int= -1,int= -1,int= -1);
00623
00624 };
00625
00626
00627
00631 class TwoBodyTwoCenterDerivInt : public RefCount {
00632
00633 private:
00634 double *log2_to_double_;
00635
00636 protected:
00637
00638 Integral *integral_;
00639
00640 Ref<GaussianBasisSet> bs1_;
00641 Ref<GaussianBasisSet> bs2_;
00642
00643 double *buffer_;
00644
00645 TwoBodyTwoCenterDerivInt(Integral* integral,
00646 const Ref<GaussianBasisSet>&b1,
00647 const Ref<GaussianBasisSet>&b2);
00648 public:
00649 virtual ~TwoBodyTwoCenterDerivInt();
00650
00652 int nbasis() const;
00653
00655 int nbasis1() const;
00657 int nbasis2() const;
00658
00660 int nshell() const;
00661
00663 int nshell1() const;
00665 int nshell2() const;
00666
00668 Ref<GaussianBasisSet> basis();
00669
00671 Ref<GaussianBasisSet> basis1();
00673 Ref<GaussianBasisSet> basis2();
00674
00678 const double * buffer() const;
00679
00682 virtual void compute_shell(int,int,DerivCenters&) = 0;
00683
00686 virtual int log2_shell_bound(int= -1,int= -1) = 0;
00687
00690 double shell_bound(int= -1,int= -1);
00691
00692 };
00693
00694 }
00695
00696 #endif
00697
00698
00699
00700
00701