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 #include <util/ref/ref.h>
00033 #include <chemistry/qc/mbptr12/vxb_eval_info.h>
00034 #include <chemistry/qc/mbptr12/linearr12.h>
00035 #include <chemistry/qc/mbptr12/twoparticlecontraction.h>
00036 #include <chemistry/qc/mbptr12/spin.h>
00037
00038 #ifndef _chemistry_qc_mbptr12_r12inteval_h
00039 #define _chemistry_qc_mbptr12_r12inteval_h
00040
00041 namespace sc {
00042
00043 class TwoBodyMOIntsTransform;
00044 class R12IntsAcc;
00045 class F12Amplitudes;
00046
00051 class R12IntEval : virtual public SavableState {
00052 private:
00053
00054 static const bool USE_FOCKBUILD = true;
00055
00056 bool evaluated_;
00057
00058
00059 Ref<R12IntEvalInfo> r12info_;
00060
00061 RefSCMatrix V_[NSpinCases2];
00062 RefSCMatrix X_[NSpinCases2];
00063
00064
00065 RefSCMatrix B_[NSpinCases2];
00066 RefSCMatrix BB_[NSpinCases2];
00067 RefSCMatrix A_[NSpinCases2];
00068
00069 RefSCVector emp2pair_[NSpinCases2];
00070 RefSCDimension dim_oo_[NSpinCases2];
00071 RefSCDimension dim_vv_[NSpinCases2];
00073 RefSCDimension dim_aa_[NSpinCases2];
00074 RefSCDimension dim_f12_[NSpinCases2];
00075 RefSCDimension dim_xy_[NSpinCases2];
00076
00077 Ref<F12Amplitudes> Amps_;
00078 RefSCDimension dim_ij_s_, dim_ij_t_;
00079 double emp2_singles_;
00080 int debug_;
00081
00082
00083 typedef std::map<std::string, Ref<TwoBodyMOIntsTransform> > TformMap;
00084 TformMap tform_map_;
00085
00087 void spinadapt_mospace_labels(SpinCase1 spin, std::string& id, std::string& name) const;
00088
00090 void form_canonvir_space_();
00091
00094 void f_bra_ket(SpinCase1 spin,
00095 bool make_F,
00096 bool make_hJ,
00097 bool make_K,
00098 Ref<OrbitalSpace>& F,
00099 Ref<OrbitalSpace>& hJ,
00100 Ref<OrbitalSpace>& K,
00101 const Ref<OrbitalSpace>& extspace,
00102 const Ref<OrbitalSpace>& intspace
00103 );
00104 Ref<OrbitalSpace> hj_i_p_[NSpinCases1];
00105 Ref<OrbitalSpace> hj_i_A_[NSpinCases1];
00106 Ref<OrbitalSpace> hj_i_P_[NSpinCases1];
00107 Ref<OrbitalSpace> hj_i_m_[NSpinCases1];
00108 Ref<OrbitalSpace> hj_i_a_[NSpinCases1];
00109 Ref<OrbitalSpace> hj_p_p_[NSpinCases1];
00110 Ref<OrbitalSpace> hj_p_A_[NSpinCases1];
00111 Ref<OrbitalSpace> hj_p_P_[NSpinCases1];
00112 Ref<OrbitalSpace> hj_P_P_[NSpinCases1];
00113 Ref<OrbitalSpace> hj_p_m_[NSpinCases1];
00114 Ref<OrbitalSpace> hj_p_a_[NSpinCases1];
00115 Ref<OrbitalSpace> K_i_p_[NSpinCases1];
00116 Ref<OrbitalSpace> K_i_m_[NSpinCases1];
00117 Ref<OrbitalSpace> K_i_a_[NSpinCases1];
00118 Ref<OrbitalSpace> K_i_A_[NSpinCases1];
00119 Ref<OrbitalSpace> K_i_P_[NSpinCases1];
00120 Ref<OrbitalSpace> K_m_a_[NSpinCases1];
00121 Ref<OrbitalSpace> K_a_a_[NSpinCases1];
00122 Ref<OrbitalSpace> K_a_p_[NSpinCases1];
00123 Ref<OrbitalSpace> K_a_P_[NSpinCases1];
00124 Ref<OrbitalSpace> K_p_p_[NSpinCases1];
00125 Ref<OrbitalSpace> K_p_m_[NSpinCases1];
00126 Ref<OrbitalSpace> K_p_a_[NSpinCases1];
00127 Ref<OrbitalSpace> K_p_A_[NSpinCases1];
00128 Ref<OrbitalSpace> K_p_P_[NSpinCases1];
00129 Ref<OrbitalSpace> K_A_P_[NSpinCases1];
00130 Ref<OrbitalSpace> K_P_P_[NSpinCases1];
00131 Ref<OrbitalSpace> F_P_P_[NSpinCases1];
00132 Ref<OrbitalSpace> F_p_A_[NSpinCases1];
00133 Ref<OrbitalSpace> F_p_p_[NSpinCases1];
00134 Ref<OrbitalSpace> F_p_m_[NSpinCases1];
00135 Ref<OrbitalSpace> F_p_a_[NSpinCases1];
00136 Ref<OrbitalSpace> F_m_m_[NSpinCases1];
00137 Ref<OrbitalSpace> F_m_a_[NSpinCases1];
00138 Ref<OrbitalSpace> F_m_P_[NSpinCases1];
00139 Ref<OrbitalSpace> F_m_A_[NSpinCases1];
00140 Ref<OrbitalSpace> F_i_A_[NSpinCases1];
00141 Ref<OrbitalSpace> F_i_m_[NSpinCases1];
00142 Ref<OrbitalSpace> F_i_a_[NSpinCases1];
00143 Ref<OrbitalSpace> F_i_p_[NSpinCases1];
00144 Ref<OrbitalSpace> F_a_a_[NSpinCases1];
00145 Ref<OrbitalSpace> F_a_A_[NSpinCases1];
00146
00148 void init_tforms_();
00150 void init_intermeds_();
00152 void init_intermeds_r12_();
00154 void init_intermeds_g12_();
00156 void r2_contrib_to_X_new_();
00158 RefSCMatrix compute_I_(const Ref<OrbitalSpace>& space1,
00159 const Ref<OrbitalSpace>& space2,
00160 const Ref<OrbitalSpace>& space3,
00161 const Ref<OrbitalSpace>& space4);
00163 RefSCMatrix compute_r2_(const Ref<OrbitalSpace>& space1,
00164 const Ref<OrbitalSpace>& space2,
00165 const Ref<OrbitalSpace>& space3,
00166 const Ref<OrbitalSpace>& space4);
00170 RefSCMatrix Delta_DKH_(const Ref<OrbitalSpace>& bra_space,
00171 const Ref<OrbitalSpace>& ket_space,
00172 SpinCase1 S = Alpha);
00173
00174
00175 RefSymmSCMatrix hcore_plus_massvelocity_(const Ref<GaussianBasisSet> &bas,
00176 const Ref<GaussianBasisSet> &p_bas,
00177 bool include_T = true,
00178 bool include_V = true,
00179 bool include_MV = true);
00180
00181
00182 RefSymmSCMatrix pauli(const Ref<GaussianBasisSet> &bas,
00183 const Ref<GaussianBasisSet> &pbas = 0,
00184 const bool momentum=false);
00185 RefSymmSCMatrix pauli_realspace(const Ref<GaussianBasisSet> &bas);
00186 RefSymmSCMatrix pauli_momentumspace(const Ref<GaussianBasisSet> &bas,
00187 const Ref<GaussianBasisSet> &p_bas);
00189 RefSCMatrix coulomb_(const Ref<OrbitalSpace>& occ_space, const Ref<OrbitalSpace>& bra_space,
00190 const Ref<OrbitalSpace>& ket_space);
00192 RefSCMatrix exchange_(const Ref<OrbitalSpace>& occ_space, const Ref<OrbitalSpace>& bra_space,
00193 const Ref<OrbitalSpace>& ket_space);
00194
00196 void checkpoint_() const;
00197
00199 void contrib_to_VXB_a_();
00201 void contrib_to_VXB_a_vbsneqobs_();
00202
00204 void compute_mp2_pair_energies_(RefSCVector& emp2pair,
00205 SpinCase2 S,
00206 const Ref<OrbitalSpace>& space1,
00207 const Ref<OrbitalSpace>& space2,
00208 const Ref<OrbitalSpace>& space3,
00209 const Ref<OrbitalSpace>& space4,
00210 const std::string& tform_key);
00211
00217 void compute_A_direct_(RefSCMatrix& A,
00218 const Ref<OrbitalSpace>& space1,
00219 const Ref<OrbitalSpace>& space2,
00220 const Ref<OrbitalSpace>& space3,
00221 const Ref<OrbitalSpace>& space4,
00222 const Ref<OrbitalSpace>& rispace2,
00223 const Ref<OrbitalSpace>& rispace4,
00224 bool antisymmetrize);
00225
00233 template <typename DataProcess, bool CorrFactorInBra, bool CorrFactorInKet>
00234 void compute_tbint_tensor(RefSCMatrix& T,
00235 TwoBodyInt::tbint_type tbint_type,
00236 const Ref<OrbitalSpace>& space1,
00237 const Ref<OrbitalSpace>& space2,
00238 const Ref<OrbitalSpace>& space3,
00239 const Ref<OrbitalSpace>& space4,
00240 bool antisymmetrize,
00241 const std::vector<std::string>& tform_keys);
00242
00256 template <typename DataProcessBra,
00257 typename DataProcessKet,
00258 typename DataProcessBraKet,
00259 bool CorrFactorInBra,
00260 bool CorrFactorInKet,
00261 bool CorrFactorInInt>
00262 void contract_tbint_tensor(
00263 RefSCMatrix& T,
00264 TwoBodyInt::tbint_type tbint_type_bra,
00265 TwoBodyInt::tbint_type tbint_type_ket,
00266 const Ref<OrbitalSpace>& space1_bra,
00267 const Ref<OrbitalSpace>& space2_bra,
00268 const Ref<OrbitalSpace>& space1_intb,
00269 const Ref<OrbitalSpace>& space2_intb,
00270 const Ref<OrbitalSpace>& space1_ket,
00271 const Ref<OrbitalSpace>& space2_ket,
00272 const Ref<OrbitalSpace>& space1_intk,
00273 const Ref<OrbitalSpace>& space2_intk,
00274 const Ref<LinearR12::TwoParticleContraction>& tpcontract,
00275 bool antisymmetrize,
00276 const std::vector<std::string>& tformkeys_bra,
00277 const std::vector<std::string>& tformkeys_ket);
00278
00290 void compute_X_(RefSCMatrix& X,
00291 SpinCase2 sc2,
00292 const Ref<OrbitalSpace>& bra1,
00293 const Ref<OrbitalSpace>& bra2,
00294 const Ref<OrbitalSpace>& ket1,
00295 const Ref<OrbitalSpace>& ket2,
00296 bool F2_only = false);
00305 void compute_FxF_(RefSCMatrix& FxF,
00306 SpinCase2 sc2,
00307 const Ref<OrbitalSpace>& bra1,
00308 const Ref<OrbitalSpace>& bra2,
00309 const Ref<OrbitalSpace>& ket1,
00310 const Ref<OrbitalSpace>& ket2,
00311 const Ref<OrbitalSpace>& int1,
00312 const Ref<OrbitalSpace>& int2,
00313 const Ref<OrbitalSpace>& intk1,
00314 const Ref<OrbitalSpace>& intk2,
00315 const Ref<OrbitalSpace>& intkx1,
00316 const Ref<OrbitalSpace>& intkx2
00317 );
00318
00320 void AT2_contrib_to_V_();
00321
00323 void AF12_contrib_to_B_();
00324
00326 void compute_B_gbc_();
00327
00329 void compute_B_bc_();
00330
00332 void compute_BB_();
00333
00335 void compute_BC_();
00336
00338 void compute_BApp_();
00339
00341 void compute_B_DKH_();
00342
00344 void compute_singles_emp2_();
00345
00348 void compute_R_vbsneqobs_(const Ref<TwoBodyMOIntsTransform>& ipjq_tform,
00349 RefSCMatrix& Raa, RefSCMatrix& Rab);
00350
00352 void compute_amps_();
00353
00359 void globally_sum_scmatrix_(RefSCMatrix& A, bool to_all_tasks = false, bool to_average = false);
00360
00366 void globally_sum_scvector_(RefSCVector& A, bool to_all_tasks = false, bool to_average = false);
00367
00372 void globally_sum_intermeds_(bool to_all_tasks = false);
00373
00374 public:
00375 R12IntEval(StateIn&);
00377 R12IntEval(const Ref<R12IntEvalInfo>& info);
00378
00379
00380
00381 ~R12IntEval();
00382
00383 void save_data_state(StateOut&);
00384 virtual void obsolete();
00385
00386 void set_debug(int debug);
00387 void set_dynamic(bool dynamic);
00388 void set_print_percent(double print_percent);
00389 void set_memory(size_t nbytes);
00390
00392 int dk() const;
00393
00394 const Ref<LinearR12::CorrelationFactor>& corrfactor() const { return r12info()->corrfactor(); }
00395 LinearR12::ABSMethod abs_method() const { return r12info()->abs_method(); }
00396 const Ref<LinearR12Ansatz>& ansatz() const { return r12info()->ansatz(); }
00397 bool spin_polarized() const { return r12info()->refinfo()->spin_polarized(); }
00398 bool gbc() const { return r12info()->gbc(); }
00399 bool ebc() const { return r12info()->ebc(); }
00400 LinearR12::StandardApproximation stdapprox() const { return r12info()->stdapprox(); }
00401 bool omit_P() const { return r12info()->omit_P(); }
00402
00403 const Ref<R12IntEvalInfo>& r12info() const;
00404
00405 RefSCDimension dim_oo_s() const;
00406 RefSCDimension dim_oo_t() const;
00408 RefSCDimension dim_oo(SpinCase2 S) const;
00410 RefSCDimension dim_vv(SpinCase2 S) const;
00412 RefSCDimension dim_aa(SpinCase2 S) const;
00414 RefSCDimension dim_f12(SpinCase2 S) const;
00416 RefSCDimension dim_xy(SpinCase2 S) const;
00418 int nspincases1() const { return ::sc::nspincases1(spin_polarized()); }
00420 int nspincases2() const { return ::sc::nspincases2(spin_polarized()); }
00421
00423 virtual void compute();
00424
00426 Ref<F12Amplitudes> amps();
00427
00429 const RefSCMatrix& V(SpinCase2 S);
00431 RefSymmSCMatrix X(SpinCase2 S);
00433 RefSymmSCMatrix B(SpinCase2 S);
00435 RefSymmSCMatrix BB(SpinCase2 S);
00437 const RefSCMatrix& A(SpinCase2 S);
00439 const RefSCMatrix& T2(SpinCase2 S);
00441 const RefSCMatrix& F12(SpinCase2 S);
00442
00444 RefSCMatrix V(SpinCase2 spincase2,
00445 const Ref<OrbitalSpace>& p,
00446 const Ref<OrbitalSpace>& q);
00448 RefSymmSCMatrix P(SpinCase2 S);
00449
00451 double emp2_singles();
00453 const RefSCVector& emp2(SpinCase2 S);
00455 const RefDiagSCMatrix& evals(SpinCase1 S) const;
00456
00458 RefDiagSCMatrix evals() const;
00460 RefDiagSCMatrix evals_a() const;
00462 RefDiagSCMatrix evals_b() const;
00463
00465 const Ref<OrbitalSpace>& occ_act(SpinCase1 S) const;
00467 const Ref<OrbitalSpace>& occ(SpinCase1 S) const;
00469 const Ref<OrbitalSpace>& vir_act(SpinCase1 S) const;
00471 const Ref<OrbitalSpace>& vir(SpinCase1 S) const;
00473 const Ref<OrbitalSpace>& xspace(SpinCase1 S) const;
00474
00476 const Ref<OrbitalSpace>& hj_x_P(SpinCase1 S);
00478 const Ref<OrbitalSpace>& hj_x_A(SpinCase1 S);
00480 const Ref<OrbitalSpace>& hj_x_p(SpinCase1 S);
00482 const Ref<OrbitalSpace>& hj_x_m(SpinCase1 S);
00484 const Ref<OrbitalSpace>& hj_x_a(SpinCase1 S);
00486 const Ref<OrbitalSpace>& hj_i_P(SpinCase1 S);
00488 const Ref<OrbitalSpace>& hj_i_A(SpinCase1 S);
00490 const Ref<OrbitalSpace>& hj_i_p(SpinCase1 S);
00492 const Ref<OrbitalSpace>& hj_i_m(SpinCase1 S);
00494 const Ref<OrbitalSpace>& hj_i_a(SpinCase1 S);
00496 const Ref<OrbitalSpace>& hj_p_P(SpinCase1 S);
00498 const Ref<OrbitalSpace>& hj_p_A(SpinCase1 S);
00500 const Ref<OrbitalSpace>& hj_p_p(SpinCase1 S);
00502 const Ref<OrbitalSpace>& hj_p_m(SpinCase1 S);
00504 const Ref<OrbitalSpace>& hj_p_a(SpinCase1 S);
00506 const Ref<OrbitalSpace>& K_x_P(SpinCase1 S);
00508 const Ref<OrbitalSpace>& K_x_A(SpinCase1 S);
00510 const Ref<OrbitalSpace>& K_x_p(SpinCase1 S);
00512 const Ref<OrbitalSpace>& K_x_m(SpinCase1 S);
00514 const Ref<OrbitalSpace>& K_x_a(SpinCase1 S);
00516 const Ref<OrbitalSpace>& K_i_P(SpinCase1 S);
00518 const Ref<OrbitalSpace>& K_i_A(SpinCase1 S);
00520 const Ref<OrbitalSpace>& K_i_p(SpinCase1 S);
00522 const Ref<OrbitalSpace>& K_i_m(SpinCase1 S);
00524 const Ref<OrbitalSpace>& K_i_a(SpinCase1 S);
00526 const Ref<OrbitalSpace>& K_m_a(SpinCase1 S);
00528 const Ref<OrbitalSpace>& K_a_a(SpinCase1 S);
00530 const Ref<OrbitalSpace>& K_a_p(SpinCase1 S);
00532 const Ref<OrbitalSpace>& K_a_P(SpinCase1 S);
00534 const Ref<OrbitalSpace>& K_p_P(SpinCase1 S);
00536 const Ref<OrbitalSpace>& K_p_A(SpinCase1 S);
00538 const Ref<OrbitalSpace>& K_p_p(SpinCase1 S);
00540 const Ref<OrbitalSpace>& K_p_m(SpinCase1 S);
00542 const Ref<OrbitalSpace>& K_p_a(SpinCase1 S);
00544 const Ref<OrbitalSpace>& K_A_P(SpinCase1 S);
00546 const Ref<OrbitalSpace>& K_P_P(SpinCase1 S);
00548 const Ref<OrbitalSpace>& F_x_P(SpinCase1 S);
00550 const Ref<OrbitalSpace>& F_x_A(SpinCase1 S);
00552 const Ref<OrbitalSpace>& F_x_p(SpinCase1 S);
00554 const Ref<OrbitalSpace>& F_x_m(SpinCase1 S);
00556 const Ref<OrbitalSpace>& F_x_a(SpinCase1 S);
00558 const Ref<OrbitalSpace>& F_i_P(SpinCase1 S);
00560 const Ref<OrbitalSpace>& F_i_A(SpinCase1 S);
00562 const Ref<OrbitalSpace>& F_i_p(SpinCase1 S);
00564 const Ref<OrbitalSpace>& F_i_m(SpinCase1 S);
00566 const Ref<OrbitalSpace>& F_i_a(SpinCase1 S);
00568 const Ref<OrbitalSpace>& F_m_m(SpinCase1 S);
00570 const Ref<OrbitalSpace>& F_m_a(SpinCase1 S);
00572 const Ref<OrbitalSpace>& F_m_P(SpinCase1 S);
00574 const Ref<OrbitalSpace>& F_m_A(SpinCase1 S);
00576 const Ref<OrbitalSpace>& F_a_a(SpinCase1 S);
00578 const Ref<OrbitalSpace>& F_a_A(SpinCase1 S);
00580 const Ref<OrbitalSpace>& F_p_P(SpinCase1 S);
00582 const Ref<OrbitalSpace>& F_p_A(SpinCase1 S);
00584 const Ref<OrbitalSpace>& F_p_p(SpinCase1 S);
00586 const Ref<OrbitalSpace>& F_p_m(SpinCase1 S);
00588 const Ref<OrbitalSpace>& F_p_a(SpinCase1 S);
00590 const Ref<OrbitalSpace>& F_P_P(SpinCase1 S);
00591
00594 Ref<TwoBodyMOIntsTransform> get_tform_(const std::string&) const;
00596 void add_tform(const std::string& label,
00597 const Ref<TwoBodyMOIntsTransform>& T);
00599 std::string transform_label(const Ref<OrbitalSpace>& space1,
00600 const Ref<OrbitalSpace>& space2,
00601 const Ref<OrbitalSpace>& space3,
00602 const Ref<OrbitalSpace>& space4,
00603 const std::string& operator_label = std::string()) const;
00605 std::string transform_label(const Ref<OrbitalSpace>& space1,
00606 const Ref<OrbitalSpace>& space2,
00607 const Ref<OrbitalSpace>& space3,
00608 const Ref<OrbitalSpace>& space4,
00609 unsigned int f12,
00610 const std::string& operator_label = std::string()) const;
00612 std::string transform_label(const Ref<OrbitalSpace>& space1,
00613 const Ref<OrbitalSpace>& space2,
00614 const Ref<OrbitalSpace>& space3,
00615 const Ref<OrbitalSpace>& space4,
00616 unsigned int f12_left,
00617 unsigned int f12_right,
00618 const std::string& operator_label = std::string()) const;
00619
00624 void compute_T2_(RefSCMatrix& T2,
00625 const Ref<OrbitalSpace>& space1,
00626 const Ref<OrbitalSpace>& space2,
00627 const Ref<OrbitalSpace>& space3,
00628 const Ref<OrbitalSpace>& space4,
00629 bool antisymmetrize,
00630 const std::string& tform_key);
00636 void compute_F12_(RefSCMatrix& F12,
00637 const Ref<OrbitalSpace>& space1,
00638 const Ref<OrbitalSpace>& space2,
00639 const Ref<OrbitalSpace>& space3,
00640 const Ref<OrbitalSpace>& space4,
00641 bool antisymmetrize,
00642 const std::vector<std::string>& transform_keys);
00643
00648 RefSCMatrix fock(const Ref<OrbitalSpace>& bra_space,
00649 const Ref<OrbitalSpace>& ket_space, SpinCase1 S = Alpha,
00650 double scale_J = 1.0, double scale_K = 1.0, double scale_H = 1.0);
00651
00652 };
00653
00654 class TransformNotFound: public ProgrammingError {
00655 public:
00656 TransformNotFound(const char *description=0, const char *file=0, int line=0) : ProgrammingError(description,file,line) {}
00657 };
00658
00659 }
00660
00661 #endif
00662
00663
00664
00665
00666
00667
00668