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_mbptr12_vxbevalinfo_h
00033 #define _chemistry_qc_mbptr12_vxbevalinfo_h
00034
00035 #include <string>
00036 #include <util/misc/string.h>
00037 #include <util/ref/ref.h>
00038 #include <math/scmat/abstract.h>
00039 #include <util/group/memory.h>
00040 #include <chemistry/molecule/energy.h>
00041 #include <chemistry/qc/scf/scf.h>
00042 #include <chemistry/qc/mbptr12/r12technology.h>
00043 #include <chemistry/qc/mbptr12/linearr12.h>
00044 #include <chemistry/qc/mbptr12/ansatz.h>
00045 #include <chemistry/qc/mbptr12/orbitalspace.h>
00046 #include <chemistry/qc/mbptr12/transform_factory.h>
00047 #include <chemistry/qc/mbptr12/singlerefinfo.h>
00048 #include <chemistry/qc/mbptr12/moints_runtime.h>
00049 #include <chemistry/qc/mbptr12/fockbuild_runtime.h>
00050
00051 namespace sc {
00052
00053 class MBPT2_R12;
00054
00058 class R12IntEvalInfo : virtual public SavableState {
00059
00060
00061 static const int USE_NEW_ORBITALSPACE_KEYS = 1;
00062
00063 public:
00064
00066 typedef MOIntsTransformFactory::StoreMethod StoreMethod;
00067
00069 typedef struct {
00070
00071
00072 Ref<OrbitalSpace> vir_sb_;
00073 Ref<OrbitalSpace> vir_;
00074 Ref<OrbitalSpace> vir_act_;
00075
00076 Ref<OrbitalSpace> ri_;
00077
00078 void init(const Ref<SingleRefInfo>& refinfo, const SpinCase1& spincase);
00079
00080 void init(const Ref<SingleRefInfo>& refinfo, const SpinCase1& spincase, const Ref<OrbitalSpace>& vbs);
00081 } SpinSpaces;
00082
00083 private:
00084
00086 Wavefunction* wfn_;
00087 Ref<R12Technology> r12tech_;
00088 Ref<GaussianBasisSet> bs_aux_;
00089 Ref<GaussianBasisSet> bs_vir_;
00090 Ref<GaussianBasisSet> bs_ri_;
00091 Ref<SCMatrixKit> matrixkit_;
00092 Ref<MessageGrp> msg_;
00093 Ref<MemoryGrp> mem_;
00094 Ref<ThreadGrp> thr_;
00095
00096 size_t memory_;
00097 bool dynamic_;
00098 double print_percent_;
00099 int debug_;
00100
00101 bool spinadapted_;
00102 StoreMethod::type ints_method_;
00103 std::string ints_file_;
00104
00105 int nlindep_aux_;
00106 int nlindep_vir_;
00107 int nlindep_ri_;
00108
00110 Ref<OrbitalSpace> abs_space_;
00111 Ref<OrbitalSpace> ribs_space_;
00112 SpinSpaces vir_spaces_[NSpinCases1];
00113 Ref<OrbitalSpace> vir_act_;
00114 Ref<OrbitalSpace> vir_;
00115 Ref<OrbitalSpace> vir_sb_;
00117 Ref<SingleRefInfo> refinfo_;
00118
00120 Ref<MOIntsTransformFactory> tfactory_;
00122 Ref<MOIntsRuntime> moints_runtime_;
00124 Ref<FockBuildRuntime> fockbuild_runtime_;
00125
00127 bool initialized_;
00128
00129
00130 void construct_ri_basis_(bool safe);
00131 void construct_ri_basis_ks_(bool safe);
00132 void construct_ri_basis_ksplus_(bool safe);
00133 void construct_ri_basis_ev_(bool safe);
00134 void construct_ri_basis_evplus_(bool safe);
00135
00136 void construct_ortho_comp_svd_();
00137
00138 bool abs_spans_obs_();
00139
00140 void construct_orthog_aux_();
00141
00142 void construct_orthog_vir_();
00143
00144 void construct_orthog_ri_();
00145
00146 void throw_if_spin_polarized() const;
00147
00148 public:
00149 R12IntEvalInfo(StateIn&);
00191 R12IntEvalInfo(const Ref<KeyVal>& keyval,
00192 Wavefunction* wfn,
00193 const Ref<SCF>& ref,
00194 unsigned int nfzc,
00195 unsigned int nfzv,
00196 bool spinadapted,
00197 bool deflayed_initialization = false);
00198 ~R12IntEvalInfo();
00199
00200 void save_data_state(StateOut&);
00202 void initialize();
00203
00205 void set_dynamic(bool dynamic) { dynamic_ = dynamic; };
00207 void set_print_percent(double print_percent) { print_percent_ = print_percent; };
00209 void set_debug_level(int debug) { debug_ = debug; };
00212 void set_ints_method(const StoreMethod::type method) { ints_method_ = method; };
00215 void set_ints_file(const std::string& filename) { ints_file_ = filename; };
00218 void set_memory(const size_t nbytes);
00219
00220 Wavefunction* wfn() const { return wfn_; }
00221 Ref<R12Technology> r12tech() const { return r12tech_; }
00222
00223 Ref<Integral> integral() const { return wfn()->integral(); };
00225 Ref<GaussianBasisSet> basis() const { return refinfo()->ref()->basis(); };
00227 Ref<GaussianBasisSet> basis_vir() const { return bs_vir_; };
00229 Ref<GaussianBasisSet> basis_ri() const { return bs_ri_; };
00230 Ref<SCMatrixKit> matrixkit() const { return matrixkit_; };
00231 Ref<MemoryGrp> mem() const { return mem_;};
00232 Ref<MessageGrp> msg() const { return msg_;};
00233 Ref<ThreadGrp> thr() const { return thr_;};
00234
00235 bool dynamic() const { return dynamic_; };
00236 double print_percent() const { return print_percent_; };
00237 int debug_level() const { return debug_; };
00238 const StoreMethod::type ints_method() const { return ints_method_; };
00239 const std::string& ints_file() const;
00240 const size_t memory() const { return memory_; };
00241
00242 int nvir() const { return vir_->rank();};
00243 int nvir_act() const { return vir_act_->rank();};
00244
00245 const Ref<LinearR12::CorrelationFactor>& corrfactor() const { return r12tech()->corrfactor(); }
00246 LinearR12::StandardApproximation stdapprox() const { return r12tech()->stdapprox(); }
00247 const Ref<LinearR12Ansatz>& ansatz() const { return r12tech()->ansatz(); }
00248 LinearR12::ABSMethod abs_method() const { return r12tech()->abs_method(); }
00250 bool bc() const;
00251 bool gbc() const { return r12tech()->gbc(); }
00252 bool ebc() const { return r12tech()->ebc(); }
00253 bool spinadapted() const { return spinadapted_; }
00254 unsigned int maxnabs() const { return r12tech()->maxnabs(); }
00255 bool omit_P() const { return r12tech()->omit_P(); }
00256 bool safety_check() const { return r12tech()->safety_check(); }
00257 const LinearR12::PositiveDefiniteB& posdef_B() const { return r12tech()->posdef_B(); }
00258
00260 const Ref<OrbitalSpace>& vir() const { throw_if_spin_polarized(); return vir_; };
00262 const Ref<OrbitalSpace>& vir_sb() const { throw_if_spin_polarized(); return vir_sb_; };
00264 const Ref<OrbitalSpace>& vir_act() const { throw_if_spin_polarized(); return vir_act_; };
00266 const Ref<OrbitalSpace>& vir(const SpinCase1& S) const { return vir_spaces_[S].vir_; };
00268 const Ref<OrbitalSpace>& vir_sb(const SpinCase1& S) const { return vir_spaces_[S].vir_sb_; };
00270 const Ref<OrbitalSpace>& vir_act(const SpinCase1& S) const { return vir_spaces_[S].vir_act_; };
00271
00273 void vir(const SpinCase1& S, const Ref<OrbitalSpace>& space);
00274 void vir_sb(const SpinCase1& S, const Ref<OrbitalSpace>& space);
00275 void vir_act(const SpinCase1& S, const Ref<OrbitalSpace>& space);
00276
00278 const Ref<OrbitalSpace>& abs_space() const { return abs_space_; };
00280 const Ref<OrbitalSpace>& ribs_space() const { return ribs_space_; };
00285 const Ref<OrbitalSpace>& ribs_space(const SpinCase1& S) const;
00287 const Ref<MOIntsTransformFactory>& tfactory() const { return tfactory_; };
00289 const Ref<MOIntsRuntime>& moints_runtime() const { return moints_runtime_; };
00291 const Ref<FockBuildRuntime>& fockbuild_runtime() const { return fockbuild_runtime_; };
00293 const Ref<SingleRefInfo>& refinfo() const;
00294
00297 static Ref<OrbitalSpace> orthogonalize(const std::string& id, const std::string& name, const Ref<GaussianBasisSet>& bs,
00298 const Ref<Integral>& integral, OverlapOrthog::OrthogMethod orthog_method, double lindep_tol,
00299 int& nlindep);
00300
00304 static Ref<OrbitalSpace> gen_project(const Ref<OrbitalSpace>& space1, const Ref<OrbitalSpace>& space2,
00305 const std::string& id, const std::string& name, double lindep_tol);
00309 static Ref<OrbitalSpace> orthog_comp(const Ref<OrbitalSpace>& space1, const Ref<OrbitalSpace>& space2,
00310 const std::string& id, const std::string& name, double lindep_tol);
00311
00313 static void compute_overlap_ints(const Ref<OrbitalSpace>& space1,
00314 const Ref<OrbitalSpace>& space2,
00315 RefSCMatrix& S);
00317 static void compute_multipole_ints(const Ref<OrbitalSpace>& space1,
00318 const Ref<OrbitalSpace>& space2,
00319 RefSCMatrix& MX,
00320 RefSCMatrix& MY,
00321 RefSCMatrix& MZ,
00322 RefSCMatrix& MXX,
00323 RefSCMatrix& MYY,
00324 RefSCMatrix& MZZ);
00325
00326 void print(std::ostream& o) const;
00327 };
00328
00329 }
00330
00331 #endif
00332
00333
00334
00335
00336
00337
00338