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