tbint.h

00001 //
00002 // tbint.h
00003 //
00004 // Copyright (C) 1996 Limit Point Systems, Inc.
00005 //
00006 // Author: Edward Seidl <seidl@janed.com>
00007 // Maintainer: LPS
00008 //
00009 // This file is part of the SC Toolkit.
00010 //
00011 // The SC Toolkit is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Library General Public License as published by
00013 // the Free Software Foundation; either version 2, or (at your option)
00014 // any later version.
00015 //
00016 // The SC Toolkit is distributed in the hope that it will be useful,
00017 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00019 // GNU Library General Public License for more details.
00020 //
00021 // You should have received a copy of the GNU Library General Public License
00022 // along with the SC Toolkit; see the file COPYING.LIB.  If not, write to
00023 // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
00024 //
00025 // The U.S. Government is granted a limited license as per AL 91-7.
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     // this is who created me
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     // this is who created me
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     // this is who created me
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     // this is who created me
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     // this is who created me
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     // this is who created me
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 // Local Variables:
00678 // mode: c++
00679 // c-file-style: "ETS"
00680 // End:

Generated at Wed Sep 5 14:02:30 2007 for MPQC 3.0.0-alpha using the documentation package Doxygen 1.5.2.
These pages are hosted on SourceForge.net