From: <ev...@us...> - 2008-09-04 22:15:29
|
Revision: 8838 http://mpqc.svn.sourceforge.net/mpqc/?rev=8838&view=rev Author: evaleev Date: 2008-09-04 22:15:26 +0000 (Thu, 04 Sep 2008) Log Message: ----------- Corrected computation of A.Lambda term in V for projector 2. Modified Paths: -------------- branches/Libint2-branch/mpqc/src/lib/chemistry/qc/psi/psiwfn.cc Modified: branches/Libint2-branch/mpqc/src/lib/chemistry/qc/psi/psiwfn.cc =================================================================== --- branches/Libint2-branch/mpqc/src/lib/chemistry/qc/psi/psiwfn.cc 2008-09-04 22:15:04 UTC (rev 8837) +++ branches/Libint2-branch/mpqc/src/lib/chemistry/qc/psi/psiwfn.cc 2008-09-04 22:15:26 UTC (rev 8838) @@ -2949,7 +2949,15 @@ const Ref<MOIndexSpace>& f_p_A2 = r12eval_->F_p_A(spin2); Ref<SCMatrixKit> localkit = new LocalSCMatrixKit; - RefSCMatrix rbar = localkit->matrix(r12eval_->dim_GG(pairspin),r12eval_->dim_gg(pairspin)); + RefSCMatrix A = localkit->matrix(r12eval_->dim_GG(pairspin),r12eval_->dim_gg(pairspin)); + A.assign(0.0); + + const bool antisymmetrize = pairspin!=AlphaBeta; + const bool part1_equiv_part2 = (GG1_space == GG2_space && orbs1 == orbs2); + + // + // ij|A|kl = ij|f12|kl_f, symmetrized if part1_equiv_part2 + // { std::vector< Ref<TwoBodyMOIntsTransform> > tforms; { @@ -2960,11 +2968,17 @@ intdescr[0]=tforms[0]->intdescr(); r12eval_->compute_tbint_tensor<ManyBodyTensors::I_to_T,true,false>( - rbar,r12eval_->corrfactor()->tbint_type_f12(), + A,r12eval_->corrfactor()->tbint_type_f12(), GG1_space,orbs1,GG2_space,f_p_A2, - pairspin!=AlphaBeta,tforms,intdescr); + antisymmetrize,tforms,intdescr); } - if(pairspin==AlphaBeta) { + if (part1_equiv_part2) { + // no need to symmetrize if computing antisymmetric matrix -- compute_tbint_tensor takes care of that + if (!antisymmetrize) + symmetrize<false>(A,A,GG1_space,orbs1); + A.scale(2.0); + } + else { std::vector< Ref<TwoBodyMOIntsTransform> > tforms; { NewTransformCreator tform_creator(r12eval_,GG1_space,f_p_A1,GG2_space,orbs2,true); @@ -2973,13 +2987,13 @@ std::vector< Ref<TwoBodyIntDescr> > intdescr(1); intdescr[0]=tforms[0]->intdescr(); r12eval_->compute_tbint_tensor<ManyBodyTensors::I_to_T,true,false>( - rbar,r12eval_->corrfactor()->tbint_type_f12(), + A,r12eval_->corrfactor()->tbint_type_f12(), GG1_space,f_p_A1,GG2_space,orbs2, - pairspin!=AlphaBeta,tforms,intdescr); + antisymmetrize,tforms,intdescr); } const RefSymmSCMatrix lambda = lambda_so(pairspin); - const RefSCMatrix V_term2 = rbar * lambda; + const RefSCMatrix V_term2 = A * lambda; const RefSCMatrix V_intermed = r12eval_->V(pairspin); V_intermed.print("V"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |