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: virtual public SavableState
00146 {
00147 private:
00148 friend class GaussianBasisSetSum;
00149
00150
00151 std::string name_;
00152
00153 std::string label_;
00154 GaussianShell** shell_;
00155 std::vector<int> shell_to_function_;
00156 std::vector<int> function_to_shell_;
00157
00158 Ref<Molecule> molecule_;
00159
00160 Ref<SCMatrixKit> matrixkit_;
00161 Ref<SCMatrixKit> so_matrixkit_;
00162 RefSCDimension basisdim_;
00163
00164 int ncenter_;
00165
00166 std::vector<int> shell_to_center_;
00167 std::vector<int> shell_to_primitive_;
00168 std::vector<int> center_to_shell_;
00169 std::vector<int> center_to_nshell_;
00170 std::vector<int> center_to_nbasis_;
00171
00172 int nshell_;
00173 int nbasis_;
00174 int nprim_;
00175 bool has_pure_;
00176
00177 GaussianBasisSet(const char* name, const char* label, const Ref<Molecule>& molecule,
00178 const Ref<SCMatrixKit>& matrixkit,
00179 const RefSCDimension& basisdim,
00180 const int ncenter, const int nshell,
00181 GaussianShell** shell,
00182 const std::vector<int>& center_to_nshell);
00183
00184
00185 int count_shells_(Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname, BasisFileSet& bases,
00186 int havepure, int pure, bool missing_ok);
00187
00188 void get_shells_(int& ishell, Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname, BasisFileSet& bases,
00189 int havepure, int pure, bool missing_ok);
00190
00191 int count_even_temp_shells_(Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname,
00192 int havepure, int pure);
00193
00194 void get_even_temp_shells_(int& ishell, Ref<KeyVal>& keyval, const char* elemname, const char* sbasisname,
00195 int havepure, int pure);
00196
00197 void recursively_get_shell(int&,Ref<KeyVal>&,
00198 const char*,const char*,BasisFileSet&,
00199 int,int,int,bool missing_ok);
00200
00201 void init(Ref<Molecule>&,Ref<KeyVal>&,
00202 BasisFileSet&,
00203 int have_userkeyval,
00204 int pure);
00205 void init2(int skip_ghosts=0,bool include_q=0);
00206
00207 protected:
00210 GaussianBasisSet();
00211 GaussianBasisSet(const GaussianBasisSet&);
00212 virtual void set_matrixkit(const Ref<SCMatrixKit>&);
00213
00218 void init(char *name,
00219 char *label,
00220 const Ref<Molecule> &molecule,
00221 const Ref<SCMatrixKit> &matrixkit,
00222 const Ref<SCMatrixKit> &so_matrixkit,
00223 GaussianShell **shell,
00224 const std::vector<int> shell_to_center);
00225
00226 public:
00228 class ValueData {
00229 protected:
00230 CartesianIter **civec_;
00231 SphericalTransformIter **sivec_;
00232 int maxam_;
00233 public:
00234 ValueData(const Ref<GaussianBasisSet> &, const Ref<Integral> &);
00235 ~ValueData();
00236 CartesianIter **civec() { return civec_; }
00237 SphericalTransformIter **sivec() { return sivec_; }
00238 };
00239
00241 enum UnitType {Unit};
00242
00398 GaussianBasisSet(const Ref<KeyVal>&);
00403 GaussianBasisSet(UnitType);
00404 GaussianBasisSet(StateIn&);
00405 virtual ~GaussianBasisSet();
00406
00408 Ref<GaussianBasisSet> operator+(const Ref<GaussianBasisSet>& B);
00409
00410 void save_data_state(StateOut&);
00411
00413 const char* name() const { return name_.c_str(); }
00417 const char* label() const { if (!name_.empty()) return name_.c_str(); else return label_.c_str(); }
00418
00420 Ref<Molecule> molecule() const { return molecule_; }
00422 Ref<SCMatrixKit> matrixkit() { return matrixkit_; }
00424 Ref<SCMatrixKit> so_matrixkit() { return so_matrixkit_; }
00426 RefSCDimension basisdim() { return basisdim_; }
00427
00429 int ncenter() const;
00431 int nshell() const { return nshell_; }
00433 int nshell_on_center(int icenter) const;
00436 int shell_on_center(int icenter, int shell) const;
00438 int shell_to_center(int ishell) const { return shell_to_center_[ishell]; }
00440 int shell_to_primitive(int ishell) const {return shell_to_primitive_[ishell]; }
00442 int nbasis() const { return nbasis_; }
00444 int nbasis_on_center(int icenter) const;
00446 int nprimitive() const { return nprim_; }
00448 int has_pure() const { return has_pure_; }
00449
00451 int max_nfunction_in_shell() const;
00454 int max_ncartesian_in_shell(int aminc=0) const;
00456 int max_nprimitive_in_shell() const;
00458 int max_angular_momentum() const;
00460 int max_ncontraction() const;
00463 int max_am_for_contraction(int con) const;
00465 int max_cartesian() const;
00466
00468 int shell_to_function(int i) const { return shell_to_function_[i]; }
00470 int function_to_shell(int i) const;
00471
00473 const GaussianShell& operator()(int i) const { return *shell_[i]; }
00475 GaussianShell& operator()(int i) { return *shell_[i]; }
00477 const GaussianShell& operator[](int i) const { return *shell_[i]; }
00479 GaussianShell& operator[](int i) { return *shell_[i]; }
00481 const GaussianShell& shell(int i) const { return *shell_[i]; }
00483 GaussianShell& shell(int i) { return *shell_[i]; }
00484
00486 const GaussianShell& operator()(int icenter,int ishell) const;
00488 GaussianShell& operator()(int icenter,int ishell);
00490 const GaussianShell& shell(int i,int j) const { return operator()(i,j); }
00492 GaussianShell& shell(int i,int j) { return operator()(i,j); }
00493
00496 double r(int icenter,int xyz) const;
00497
00500 int values(const SCVector3& r, ValueData *, double* basis_values) const;
00505 int grad_values(const SCVector3& r, ValueData *,
00506 double*g_values,double* basis_values=0) const;
00511 int hessian_values(const SCVector3& r, ValueData *, double *h_values,
00512 double*g_values=0,double* basis_values=0) const;
00515 int shell_values(const SCVector3& r, int sh,
00516 ValueData *, double* basis_values) const;
00520 int grad_shell_values(const SCVector3& r, int sh,
00521 ValueData *,
00522 double*g_values, double* basis_values=0) const;
00526 int hessian_shell_values(const SCVector3& r, int sh,
00527 ValueData *, double *h_values,
00528 double*g_values=0,double* basis_values=0) const;
00529
00531 int equiv(const Ref<GaussianBasisSet> &b);
00532
00534 void print_brief(std::ostream& =ExEnv::out0()) const;
00536 void print(std::ostream& =ExEnv::out0()) const;
00537 };
00538
00540 Ref<GaussianBasisSet>
00541 operator+(const Ref<GaussianBasisSet>& A, const Ref<GaussianBasisSet>& B);
00542
00544 int
00545 ishell_on_center(int icenter, const Ref<GaussianBasisSet>& bs,
00546 const GaussianShell& A);
00547
00555 class GaussianBasisSetSum : virtual public SavableState {
00556 public:
00557 GaussianBasisSetSum(const Ref<GaussianBasisSet>& bs1,
00558 const Ref<GaussianBasisSet>& bs2);
00559 GaussianBasisSetSum(StateIn&);
00560 virtual ~GaussianBasisSetSum();
00561
00562 void save_data_state(StateOut&);
00563
00565 const Ref<GaussianBasisSet>& bs1() const;
00567 const Ref<GaussianBasisSet>& bs2() const;
00569 const Ref<GaussianBasisSet>& bs12() const;
00570
00571
00573 int shell_to_basis(int s) const;
00575 int function_to_basis(int f) const;
00577 int shell12_to_shell(int s12) const;
00579 int function12_to_function(int f12) const;
00584 int nfblock() const;
00586 int fblock_to_function(int b) const;
00588 int fblock_size(int b) const;
00589
00590 private:
00591 Ref<GaussianBasisSet> bs1_;
00592 Ref<GaussianBasisSet> bs2_;
00593 Ref<GaussianBasisSet> bs12_;
00594
00596
00599 std::vector<int> shell_to_basis_;
00601 std::vector<int> function_to_basis_;
00603 std::vector<int> shell12_to_shell_;
00605 std::vector<int> function12_to_function_;
00607 std::vector<int> fblock_to_function_;
00609 std::vector<int> fblock_size_;
00610
00612 void sum(const Ref<GaussianBasisSet>& A,
00613 const Ref<GaussianBasisSet>& B);
00614
00615 };
00616
00618 Ref<GaussianBasisSet>
00619 operator+(const Ref<GaussianBasisSet>& A, const Ref<GaussianBasisSet>& B);
00620
00621 }
00622
00623 #endif
00624
00625
00626
00627
00628