void Slat_Jastrow::getForceBias(Wavefunction_data * wfdata, int e, Wf_return & bias) { assert(bias.amp.GetDim(0) >= nfunc_); assert(bias.amp.GetDim(1) >= 4); Slat_Jastrow_data * dataptr; recast(wfdata, dataptr); assert(dataptr != NULL); Wf_return slat_bias(nfunc_,4); Wf_return jast_bias(nfunc_,4); slater_wf->getForceBias(dataptr->slater, e, slat_bias); jastrow_wf->getForceBias(dataptr->jastrow, e, jast_bias); for(int i=0; i< nfunc_; i++) { //cout << "value slat " << slat_bias(i,0)*exp(slat_bias(i,1) ) << endl; //cout << "value jast " << jast_bias(i,0)*exp(jast_bias(i,1) ) << endl; bias.phase(i,0)=slat_bias.phase(i,0)+jast_bias.phase(i,0); bias.amp(i,0)=slat_bias.amp(i,0)+jast_bias.amp(i,0); //cout << "force bias " << bias(0) << endl; for(int d=1; d<4; d++) { bias.amp(i,d)=slat_bias.amp(i,d)+jast_bias.amp(i,d); bias.phase(i,d)=slat_bias.phase(i,d)+jast_bias.phase(i,d); bias.cvals(i,d)=slat_bias.cvals(i,d)+jast_bias.cvals(i,d); } } }
// JK: complex wavefunctions still behave weird, let's try to rewrite even // this one, not touching cvals now, though // The most important is setting is_complex, but I do differ at other places // too. void Slat_Jastrow::getLap(Wavefunction_data * wfdata, int e, Wf_return & lap) { //cout << "getLap\n"; assert(lap.amp.GetDim(0) >= nfunc_); assert(lap.amp.GetDim(1) >= 5); Slat_Jastrow_data * dataptr; recast(wfdata, dataptr); assert(dataptr != NULL); Wf_return slat_lap(nfunc_,5); Wf_return jast_lap(nfunc_,5); slater_wf->getLap(dataptr->slater, e, slat_lap); jastrow_wf->getLap(dataptr->jastrow, e, jast_lap); if ( slat_lap.is_complex==1 || jast_lap.is_complex==1 ) lap.is_complex=1; for(int i=0; i< nfunc_; i++) { lap.phase(i,0)=slat_lap.phase(i,0)+jast_lap.phase(i,0); lap.amp(i,0)=slat_lap.amp(i,0)+jast_lap.amp(i,0); doublevar dotproduct=0; dcomplex dot(0.0, 0.0); for(int d=1; d<4; d++) { lap.amp(i,d)=slat_lap.amp(i,d)+jast_lap.amp(i,d); lap.phase(i,d)=slat_lap.phase(i,d)+jast_lap.phase(i,d); dotproduct+=slat_lap.amp(i,d)*jast_lap.amp(i,d); lap.cvals(i,d)=slat_lap.cvals(i,d)+jast_lap.cvals(i,d); dot+=slat_lap.cvals(i,d)*jast_lap.cvals(i,d); } lap.amp(i,4)=slat_lap.amp(i,4)+jast_lap.amp(i,4) +2*dotproduct; lap.phase(i,4)=slat_lap.phase(i,4)+jast_lap.phase(i,4); lap.cvals(i,4)=slat_lap.cvals(i,4)+jast_lap.cvals(i,4) +2.0*dot; } }