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_gaussbas_h
00029 #define _chemistry_qc_basis_gaussbas_h
00030
00031 #ifdef __GNUC__
00032 #pragma interface
00033 #endif
00034
00035 #include <vector>
00036 #include <iostream>
00037
00038 #include <util/state/state.h>
00039 #include <util/keyval/keyval.h>
00040 #include <math/scmat/matrix.h>
00041 #include <math/scmat/vector3.h>
00042 #include <chemistry/molecule/molecule.h>
00043
00044 namespace sc {
00045
00046 class GaussianShell;
00047 class BasisFileSet;
00048 class Integral;
00049
00050 class CartesianIter;
00051 class SphericalTransformIter;
00052
00145 class GaussianBasisSet: public SavableState
00146 {
00147 private:
00148
00149 char* name_;
00150
00151 char* label_;
00152 GaussianShell** shell_;
00153 std::vector<int> shell_to_function_;
00154 std::vector<int> function_to_shell_;
00155
00156 Ref<Molecule> molecule_;
00157
00158 Ref<SCMatrixKit> matrixkit_;
00159 Ref<SCMatrixKit> so_matrixkit_;
00160 RefSCDimension basisdim_;
00161
00162 int ncenter_;
00163
00164 std::vector<int> shell_to_center_;
00165 std::vector<int> shell_to_primitive_;
00166 std::vector<int> center_to_shell_;
00167 std::vector<int> center_to_nshell_;
00168 std::vector<int> center_to_nbasis_;
00169
00170 int nshell_;
00171 int nbasis_;
00172 int nprim_;
00173 bool has_pure_;
00174
00175 GaussianBasisSet(const char* name, const char* label, const Ref<Molecule>& molecule,
00176 const Ref<SCMatrixKit>& matrixkit,
00177 const RefSCDimension& basisdim,
00178 const int ncenter, const int nshell,
00179 GaussianShell** shell,
00180 const std::vector<int>& center_to_nshell);
00181
00182
00183 int count_shells_(Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname, BasisFileSet& bases,
00184 int havepure, int pure, bool missing_ok);
00185
00186 void get_shells_(int& ishell, Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname, BasisFileSet& bases,
00187 int havepure, int pure, bool missing_ok);
00188
00189 int count_even_temp_shells_(Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname,
00190 int havepure, int pure);
00191
00192 void get_even_temp_shells_(int& ishell, Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname,
00193 int havepure, int pure);
00194
00195 void recursively_get_shell(int&,Ref<KeyVal>&,
00196 const char*,const char*,BasisFileSet&,
00197 int,int,int,bool missing_ok);
00198
00199 void init(Ref<Molecule>&,Ref<KeyVal>&,
00200 BasisFileSet&,
00201 int have_userkeyval,
00202 int pure);
00203 void init2(int skip_ghosts=0,bool include_q=0);
00204
00205 protected:
00206 GaussianBasisSet(const GaussianBasisSet&);
00207 virtual void set_matrixkit(const Ref<SCMatrixKit>&);
00208
00209 public:
00211 class ValueData {
00212 protected:
00213 CartesianIter **civec_;
00214 SphericalTransformIter **sivec_;
00215 int maxam_;
00216 public:
00217 ValueData(const Ref<GaussianBasisSet> &, const Ref<Integral> &);
00218 ~ValueData();
00219 CartesianIter **civec() { return civec_; }
00220 SphericalTransformIter **sivec() { return sivec_; }
00221 };
00222
00224 enum UnitType {Unit};
00225
00381 GaussianBasisSet(const Ref<KeyVal>&);
00386 GaussianBasisSet(UnitType);
00387 GaussianBasisSet(StateIn&);
00388 virtual ~GaussianBasisSet();
00389
00394 Ref<GaussianBasisSet> operator+(const Ref<GaussianBasisSet>& B);
00395
00396 void save_data_state(StateOut&);
00397
00399 const char* name() const { return name_; }
00403 const char* label() const { if (name()) { return name(); } else { return label_; } }
00404
00406 Ref<Molecule> molecule() const { return molecule_; }
00408 Ref<SCMatrixKit> matrixkit() { return matrixkit_; }
00410 Ref<SCMatrixKit> so_matrixkit() { return so_matrixkit_; }
00412 RefSCDimension basisdim() { return basisdim_; }
00413
00415 int ncenter() const;
00417 int nshell() const { return nshell_; }
00419 int nshell_on_center(int icenter) const;
00422 int shell_on_center(int icenter, int shell) const;
00424 int shell_to_center(int ishell) const { return shell_to_center_[ishell]; }
00426 int shell_to_primitive(int ishell) const {return shell_to_primitive_[ishell]; }
00428 int nbasis() const { return nbasis_; }
00430 int nbasis_on_center(int icenter) const;
00432 int nprimitive() const { return nprim_; }
00434 int has_pure() const { return has_pure_; }
00435
00437 int max_nfunction_in_shell() const;
00440 int max_ncartesian_in_shell(int aminc=0) const;
00442 int max_nprimitive_in_shell() const;
00444 int max_angular_momentum() const;
00446 int max_ncontraction() const;
00449 int max_am_for_contraction(int con) const;
00451 int max_cartesian() const;
00452
00454 int shell_to_function(int i) const { return shell_to_function_[i]; }
00456 int function_to_shell(int i) const;
00457
00459 const GaussianShell& operator()(int i) const { return *shell_[i]; }
00461 GaussianShell& operator()(int i) { return *shell_[i]; }
00463 const GaussianShell& operator[](int i) const { return *shell_[i]; }
00465 GaussianShell& operator[](int i) { return *shell_[i]; }
00467 const GaussianShell& shell(int i) const { return *shell_[i]; }
00469 GaussianShell& shell(int i) { return *shell_[i]; }
00470
00472 const GaussianShell& operator()(int icenter,int ishell) const;
00474 GaussianShell& operator()(int icenter,int ishell);
00476 const GaussianShell& shell(int i,int j) const { return operator()(i,j); }
00478 GaussianShell& shell(int i,int j) { return operator()(i,j); }
00479
00482 double r(int icenter,int xyz) const;
00483
00486 int values(const SCVector3& r, ValueData *, double* basis_values) const;
00491 int grad_values(const SCVector3& r, ValueData *,
00492 double*g_values,double* basis_values=0) const;
00497 int hessian_values(const SCVector3& r, ValueData *, double *h_values,
00498 double*g_values=0,double* basis_values=0) const;
00501 int shell_values(const SCVector3& r, int sh,
00502 ValueData *, double* basis_values) const;
00506 int grad_shell_values(const SCVector3& r, int sh,
00507 ValueData *,
00508 double*g_values, double* basis_values=0) const;
00512 int hessian_shell_values(const SCVector3& r, int sh,
00513 ValueData *, double *h_values,
00514 double*g_values=0,double* basis_values=0) const;
00515
00517 int equiv(const Ref<GaussianBasisSet> &b);
00518
00520 void print_brief(std::ostream& =ExEnv::out0()) const;
00522 void print(std::ostream& =ExEnv::out0()) const;
00523 };
00524
00525 }
00526
00527 #endif
00528
00529
00530
00531
00532