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
00051 private:
00052 double *log2_to_double_;
00053
00054 protected:
00055
00056 Integral *integral_;
00057
00058 Ref<GaussianBasisSet> bs1_;
00059 Ref<GaussianBasisSet> bs2_;
00060 Ref<GaussianBasisSet> bs3_;
00061 Ref<GaussianBasisSet> bs4_;
00062
00063 double *buffer_;
00064
00065 int redundant_;
00066
00067 TwoBodyInt(Integral *integral,
00068 const Ref<GaussianBasisSet>&bs1,
00069 const Ref<GaussianBasisSet>&bs2,
00070 const Ref<GaussianBasisSet>&bs3,
00071 const Ref<GaussianBasisSet>&bs4);
00072 public:
00073 virtual ~TwoBodyInt();
00074
00076 int nbasis() const;
00077
00079 int nbasis1() const;
00081 int nbasis2() const;
00083 int nbasis3() const;
00085 int nbasis4() const;
00086
00088 int nshell() const;
00089
00091 int nshell1() const;
00093 int nshell2() const;
00095 int nshell3() const;
00097 int nshell4() const;
00098
00100 Ref<GaussianBasisSet> basis();
00101
00103 Ref<GaussianBasisSet> basis1();
00105 Ref<GaussianBasisSet> basis2();
00107 Ref<GaussianBasisSet> basis3();
00109 Ref<GaussianBasisSet> basis4();
00110
00115 enum tbint_type { eri=0, r12=1, r12t1=2, r12t2=3, r12_0_g12 = 1, r12_m1_g12 = 2, t1g12 = 3, t2g12 = 4, g12t1g12 = 5};
00117 static const int max_num_tbint_types = 12;
00119 virtual unsigned int num_tbint_types() const =0;
00120
00125 virtual const double * buffer(tbint_type type = eri) const;
00126
00130 virtual void compute_shell(int,int,int,int) = 0;
00131
00135 virtual int log2_shell_bound(int= -1,int= -1,int= -1,int= -1) = 0;
00136
00140 double shell_bound(int= -1,int= -1,int= -1,int= -1);
00141
00144 virtual int redundant() const { return redundant_; }
00146 virtual void set_redundant(int i) { redundant_ = i; }
00147
00149 virtual void set_integral_storage(size_t storage);
00150
00152 Integral *integral() const { return integral_; }
00153
00154 };
00155
00156
00157
00161 class TwoBodyThreeCenterInt : public RefCount {
00162
00163 private:
00164 double *log2_to_double_;
00165
00166 protected:
00167
00168 Integral *integral_;
00169
00170 Ref<GaussianBasisSet> bs1_;
00171 Ref<GaussianBasisSet> bs2_;
00172 Ref<GaussianBasisSet> bs3_;
00173
00174 double *buffer_;
00175
00176 int redundant_;
00177
00178 TwoBodyThreeCenterInt(Integral *integral,
00179 const Ref<GaussianBasisSet>&bs1,
00180 const Ref<GaussianBasisSet>&bs2,
00181 const Ref<GaussianBasisSet>&bs3);
00182 public:
00183 virtual ~TwoBodyThreeCenterInt();
00184
00186 int nbasis() const;
00187
00189 int nbasis1() const;
00191 int nbasis2() const;
00193 int nbasis3() const;
00194
00196 int nshell() const;
00197
00199 int nshell1() const;
00201 int nshell2() const;
00203 int nshell3() const;
00204
00206 Ref<GaussianBasisSet> basis();
00207
00209 Ref<GaussianBasisSet> basis1();
00211 Ref<GaussianBasisSet> basis2();
00213 Ref<GaussianBasisSet> basis3();
00214
00219 enum tbint_type { eri=0, r12=1, r12t1=2, r12t2=3};
00221 static const int num_tbint_types = 4;
00222
00227 virtual const double * buffer(tbint_type type = eri) const;
00228
00232 virtual void compute_shell(int,int,int) = 0;
00233
00237 virtual int log2_shell_bound(int= -1,int= -1,int= -1) = 0;
00238
00242 double shell_bound(int= -1,int= -1,int= -1);
00243
00246 int redundant() const { return redundant_; }
00248 void set_redundant(int i) { redundant_ = i; }
00249
00251 virtual void set_integral_storage(size_t storage);
00252
00254 Integral *integral() const { return integral_; }
00255
00256 };
00257
00258
00259
00264 class TwoBodyTwoCenterInt : public RefCount {
00265
00266 private:
00267 double *log2_to_double_;
00268
00269 protected:
00270
00271 Integral *integral_;
00272
00273 Ref<GaussianBasisSet> bs1_;
00274 Ref<GaussianBasisSet> bs2_;
00275
00276 double *buffer_;
00277
00278 int redundant_;
00279
00280 TwoBodyTwoCenterInt(Integral *integral,
00281 const Ref<GaussianBasisSet>&bs1,
00282 const Ref<GaussianBasisSet>&bs2);
00283 public:
00284 virtual ~TwoBodyTwoCenterInt();
00285
00287 int nbasis() const;
00288
00290 int nbasis1() const;
00292 int nbasis2() const;
00293
00295 int nshell() const;
00296
00298 int nshell1() const;
00300 int nshell2() const;
00301
00303 Ref<GaussianBasisSet> basis();
00304
00306 Ref<GaussianBasisSet> basis1();
00308 Ref<GaussianBasisSet> basis2();
00309
00314 enum tbint_type { eri=0, r12=1, r12t1=2, r12t2=3};
00316 static const int num_tbint_types = 4;
00317
00322 virtual const double * buffer(tbint_type type = eri) const;
00323
00327 virtual void compute_shell(int,int) = 0;
00328
00332 virtual int log2_shell_bound(int= -1,int= -1) = 0;
00333
00337 double shell_bound(int= -1,int= -1);
00338
00341 int redundant() const { return redundant_; }
00343 void set_redundant(int i) { redundant_ = i; }
00344
00346 virtual void set_integral_storage(size_t storage);
00347
00349 Integral *integral() const { return integral_; }
00350
00351 };
00352
00353
00354
00355 class ShellQuartetIter {
00356 protected:
00357 const double * buf;
00358 double scale_;
00359
00360 int redund_;
00361
00362 int e12;
00363 int e34;
00364 int e13e24;
00365
00366 int index;
00367
00368 int istart;
00369 int jstart;
00370 int kstart;
00371 int lstart;
00372
00373 int iend;
00374 int jend;
00375 int kend;
00376 int lend;
00377
00378 int icur;
00379 int jcur;
00380 int kcur;
00381 int lcur;
00382
00383 int i_;
00384 int j_;
00385 int k_;
00386 int l_;
00387
00388 public:
00389 ShellQuartetIter();
00390 virtual ~ShellQuartetIter();
00391
00392 virtual void init(const double *,
00393 int, int, int, int,
00394 int, int, int, int,
00395 int, int, int, int,
00396 double, int);
00397
00398 virtual void start();
00399 virtual void next();
00400
00401 int ready() const { return icur < iend; }
00402
00403 int i() const { return i_; }
00404 int j() const { return j_; }
00405 int k() const { return k_; }
00406 int l() const { return l_; }
00407
00408 int nint() const { return iend*jend*kend*lend; }
00409
00410 double val() const { return buf[index]*scale_; }
00411 };
00412
00413 class TwoBodyIntIter {
00414 protected:
00415 Ref<TwoBodyInt> tbi;
00416 ShellQuartetIter sqi;
00417
00418 int iend;
00419
00420 int icur;
00421 int jcur;
00422 int kcur;
00423 int lcur;
00424
00425 public:
00426 TwoBodyIntIter();
00427 TwoBodyIntIter(const Ref<TwoBodyInt>&);
00428
00429 virtual ~TwoBodyIntIter();
00430
00431 virtual void start();
00432 virtual void next();
00433
00434 int ready() const { return (icur < iend); }
00435
00436 int ishell() const { return icur; }
00437 int jshell() const { return jcur; }
00438 int kshell() const { return kcur; }
00439 int lshell() const { return lcur; }
00440
00441 virtual double scale() const;
00442
00443 ShellQuartetIter& current_quartet();
00444 };
00445
00446
00447
00451 class TwoBodyDerivInt : public RefCount {
00452
00453 private:
00454 double *log2_to_double_;
00455
00456 protected:
00457
00458 Integral *integral_;
00459
00460 Ref<GaussianBasisSet> bs1_;
00461 Ref<GaussianBasisSet> bs2_;
00462 Ref<GaussianBasisSet> bs3_;
00463 Ref<GaussianBasisSet> bs4_;
00464
00465 double *buffer_;
00466
00467 TwoBodyDerivInt(Integral* integral,
00468 const Ref<GaussianBasisSet>&b1,
00469 const Ref<GaussianBasisSet>&b2,
00470 const Ref<GaussianBasisSet>&b3,
00471 const Ref<GaussianBasisSet>&b4);
00472 public:
00473 virtual ~TwoBodyDerivInt();
00474
00476 int nbasis() const;
00477
00479 int nbasis1() const;
00481 int nbasis2() const;
00483 int nbasis3() const;
00485 int nbasis4() const;
00486
00488 int nshell() const;
00489
00491 int nshell1() const;
00493 int nshell2() const;
00495 int nshell3() const;
00497 int nshell4() const;
00498
00500 Ref<GaussianBasisSet> basis();
00501
00503 Ref<GaussianBasisSet> basis1();
00505 Ref<GaussianBasisSet> basis2();
00507 Ref<GaussianBasisSet> basis3();
00509 Ref<GaussianBasisSet> basis4();
00510
00514 const double * buffer() const;
00515
00518 virtual void compute_shell(int,int,int,int,DerivCenters&) = 0;
00519
00522 virtual int log2_shell_bound(int= -1,int= -1,int= -1,int= -1) = 0;
00523
00526 double shell_bound(int= -1,int= -1,int= -1,int= -1);
00527 };
00528
00529
00530
00534 class TwoBodyThreeCenterDerivInt : public RefCount {
00535
00536 private:
00537 double *log2_to_double_;
00538
00539 protected:
00540
00541 Integral *integral_;
00542
00543 Ref<GaussianBasisSet> bs1_;
00544 Ref<GaussianBasisSet> bs2_;
00545 Ref<GaussianBasisSet> bs3_;
00546
00547 double *buffer_;
00548
00549 TwoBodyThreeCenterDerivInt(Integral* integral,
00550 const Ref<GaussianBasisSet>&b1,
00551 const Ref<GaussianBasisSet>&b2,
00552 const Ref<GaussianBasisSet>&b3);
00553 public:
00554 virtual ~TwoBodyThreeCenterDerivInt();
00555
00557 int nbasis() const;
00558
00560 int nbasis1() const;
00562 int nbasis2() const;
00564 int nbasis3() const;
00565
00567 int nshell() const;
00568
00570 int nshell1() const;
00572 int nshell2() const;
00574 int nshell3() const;
00575
00577 Ref<GaussianBasisSet> basis();
00578
00580 Ref<GaussianBasisSet> basis1();
00582 Ref<GaussianBasisSet> basis2();
00584 Ref<GaussianBasisSet> basis3();
00585
00589 const double * buffer() const;
00590
00593 virtual void compute_shell(int,int,int,DerivCenters&) = 0;
00594
00597 virtual int log2_shell_bound(int= -1,int= -1,int= -1) = 0;
00598
00601 double shell_bound(int= -1,int= -1,int= -1);
00602
00603 };
00604
00605
00606
00610 class TwoBodyTwoCenterDerivInt : public RefCount {
00611
00612 private:
00613 double *log2_to_double_;
00614
00615 protected:
00616
00617 Integral *integral_;
00618
00619 Ref<GaussianBasisSet> bs1_;
00620 Ref<GaussianBasisSet> bs2_;
00621
00622 double *buffer_;
00623
00624 TwoBodyTwoCenterDerivInt(Integral* integral,
00625 const Ref<GaussianBasisSet>&b1,
00626 const Ref<GaussianBasisSet>&b2);
00627 public:
00628 virtual ~TwoBodyTwoCenterDerivInt();
00629
00631 int nbasis() const;
00632
00634 int nbasis1() const;
00636 int nbasis2() const;
00637
00639 int nshell() const;
00640
00642 int nshell1() const;
00644 int nshell2() const;
00645
00647 Ref<GaussianBasisSet> basis();
00648
00650 Ref<GaussianBasisSet> basis1();
00652 Ref<GaussianBasisSet> basis2();
00653
00657 const double * buffer() const;
00658
00661 virtual void compute_shell(int,int,DerivCenters&) = 0;
00662
00665 virtual int log2_shell_bound(int= -1,int= -1) = 0;
00666
00669 double shell_bound(int= -1,int= -1);
00670
00671 };
00672
00673 }
00674
00675 #endif
00676
00677
00678
00679
00680