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_int1e_h
00033 #define _chemistry_qc_cints_int1e_h
00034
00035 #include <util/ref/ref.h>
00036 #include <chemistry/qc/basis/basis.h>
00037 #include <chemistry/qc/basis/obint.h>
00038 #include <chemistry/qc/intv3/fjt.h>
00039
00040 namespace sc {
00041
00042 class Integral;
00043
00046 class Int1eCints: public RefCount {
00047 protected:
00048 Integral *integral_;
00049
00050 Ref<GaussianBasisSet> bs1_;
00051 Ref<GaussianBasisSet> bs2_;
00052
00053
00054 Ref<DipoleData> multipole_origin_;
00055 Ref<EfieldDotVectorData> EdotV_origin_;
00056 Ref<PointChargeData> Q_origin_;
00057
00058 bool need_overlap_;
00059 bool need_coulomb_;
00060
00061 int ntypes_;
00062
00063
00064 double *target_ints_buffer_;
00065 int max_doublet_size_;
00066
00067
00068 double *cart_ints_;
00069 double *sphharm_ints_;
00070 double *tformbuf_;
00071 int max_cart_doublet_size_;
00072
00073
00074 double *prim_ints_;
00075 double *contr_doublets_;
00076 double *shell_doublet_;
00077
00078
00079 GaussianShell *int_shell1_;
00080 GaussianShell *int_shell2_;
00081 struct {
00082 double A[3], B[3];
00083 double AB2;
00084 int gc1, gc2;
00085 int p1, p2;
00086 int am;
00087 } doublet_info_;
00088
00089 double **OIX_, **OIY_, **OIZ_;
00090
00091
00092
00093 double ***AI0_;
00094 int indmax_;
00095
00096 void AI_OSrecurs_(double ***AI0, double PA[3], double PB[3],
00097 double PC[3], double gamma, int iang, int jang);
00098 void OI_OSrecurs_(double **OIX, double **OIY, double **OIZ, double PA[3], double PB[3],
00099 double gamma, int lmaxi, int lmaxj);
00100 Ref<FJT> Fm_Eval_;
00101
00102
00103 void compute_doublet_info_(int, int);
00104 void zero_buffers_();
00105 void transform_contrquartets_(double *, double *);
00106 void sort_contrdoublets_to_shelldoublet_(double *, double *);
00107
00108 void zero_buffers_vec_(const int);
00109 void transform_contrquartets_vec_(const int, double *, double *);
00110 void sort_contrdoublets_to_shelldoublet_vec_(const int, double *, double *);
00111
00112 void overlap_full_general_();
00113 void overlap_sameam_general_();
00114 void kinetic_full_general_();
00115 void kinetic_sameam_general_();
00116 void nuclear_full_general_();
00117 void nuclear_sameam_general_();
00118 void hcore_full_general_();
00119 void hcore_sameam_general_();
00120 void edipole_full_general_();
00121 void equadrupole_full_general_();
00122
00123
00124 double **init_block_(int, int);
00125 void free_block_(double **);
00126 double ***init_box_(int, int, int);
00127 void free_box_(double ***);
00128
00129 public:
00130 Int1eCints(Integral *,
00131 const Ref<GaussianBasisSet>&,
00132 const Ref<GaussianBasisSet>&,
00133 int order, bool need_overlap, bool need_coulomb, int ntypes);
00134 ~Int1eCints();
00135
00136 void set_multipole_origin(const Ref<DipoleData>&);
00137 void set_EdotV_origin(const Ref<EfieldDotVectorData>&);
00138 void set_Q_origin(const Ref<PointChargeData>&);
00139 Ref<DipoleData> multipole_origin();
00140 Ref<EfieldDotVectorData> EdotV_origin();
00141 Ref<PointChargeData> Q_origin();
00142
00143 double *buffer() { return target_ints_buffer_; }
00144 Ref<GaussianBasisSet> basis() { if (bs1_==bs2_) return bs1_; return 0; }
00145 Ref<GaussianBasisSet> basis1() { return bs1_; }
00146 Ref<GaussianBasisSet> basis2() { return bs2_; }
00147
00148 void kinetic(int ish, int jsh);
00149 void nuclear(int ish, int jsh);
00150 void overlap(int ish, int jsh);
00151 void hcore(int ish, int jsh);
00152 void edipole(int ish, int jsh);
00153 void equadrupole(int ish, int jsh);
00154 };
00155
00156 }
00157
00158 #endif
00159
00160
00161
00162
00163