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 #ifdef __GNUG__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _chemistry_qc_cints_eri_h
00033 #define _chemistry_qc_cints_eri_h
00034
00035 #include <limits.h>
00036
00037 #include <util/ref/ref.h>
00038 #include <chemistry/qc/basis/basis.h>
00039 #include <chemistry/qc/cints/shellpairs.h>
00040 #include <chemistry/qc/intv3/fjt.h>
00041 #include <chemistry/qc/cints/int2e.h>
00042 extern "C" {
00043 #include <libint/libint.h>
00044 }
00045
00046 namespace sc {
00047
00048 class Integral;
00049
00051 class EriCints: public Int2eCints {
00052 private:
00053
00054
00055 double *target_ints_buffer_;
00056
00057
00058 double *cart_ints_;
00059 double *sphharm_ints_;
00060 double *perm_ints_;
00061
00062
00063 double *prim_ints_;
00064 double *contr_quartets_;
00065 double *shell_quartet_;
00066
00067
00068 Ref<ShellPairsCints> shell_pairs12_;
00069 Ref<ShellPairsCints> shell_pairs34_;
00070
00071
00072 struct {
00073 int p12, p34, p13p24;
00074 ShellPairCints *shell_pair12, *shell_pair34;
00075
00076 int *op1, *op2, *op3, *op4;
00078 double A[3], B[3], C[3], D[3];
00079 double AB2, CD2;
00080 int gc1, gc2, gc3, gc4;
00081 int p1, p2, p3, p4;
00082 int am;
00083 } quartet_info_;
00084 void eri_quartet_data_(prim_data *Data, double scale);
00085
00086 Libint_t Libint_;
00087 Ref<FJT> Fm_Eval_;
00088
00089 public:
00090 EriCints(Integral *,
00091 const Ref<GaussianBasisSet>&,
00092 const Ref<GaussianBasisSet>&,
00093 const Ref<GaussianBasisSet>&,
00094 const Ref<GaussianBasisSet>&,
00095 size_t storage);
00096 ~EriCints();
00097
00098 double *buffer(TwoBodyInt::tbint_type te_type) const {
00099 if (te_type == TwoBodyInt::eri) return target_ints_buffer_;
00100 else return 0;
00101 }
00102
00103 static size_t storage_required(const Ref<GaussianBasisSet>& b1,
00104 const Ref<GaussianBasisSet>& b2 = 0,
00105 const Ref<GaussianBasisSet>& b3 = 0,
00106 const Ref<GaussianBasisSet>& b4 = 0);
00107
00108
00109 void compute_quartet(int*, int*, int*, int*);
00110 };
00111
00112 #include <chemistry/qc/cints/eri_quartet_data.h>
00113
00114
00115
00116 class LibintStaticInterface {
00117 bool ready;
00118
00119 public:
00120 LibintStaticInterface() { init_libint_base(); ready = true; }
00121 ~LibintStaticInterface() { ready = false; }
00122 };
00123
00124 }
00125
00126 #endif
00127
00128
00129
00130
00131