RNDiracDeterminantBase::ValueType RNDiracDeterminantBase::alternateRatio(ParticleSet& P) { //returns psi_T/psi_G for (int i=0, iat=FirstIndex; i<NumPtcls; i++, iat++) { P.G(iat) += myG_alternate(iat) - myG(iat); P.L(iat) += myL_alternate(iat) - myL(iat); } RealType sgn = std::cos(alternatePhaseValue); return sgn*std::exp(alternateLogValue-LogValue); }
void ThreeBodyGeminal::evaluateLogAndStore(ParticleSet& P) { GeminalBasis->evaluateForWalkerMove(P); MatrixOperators::product(GeminalBasis->Y, Lambda, V); Y=GeminalBasis->Y; dY=GeminalBasis->dY; d2Y=GeminalBasis->d2Y; Uk=0.0; LogValue=RealType(); for(int i=0; i< NumPtcls-1; i++) { const RealType* restrict yptr=GeminalBasis->Y[i]; for(int j=i+1; j<NumPtcls; j++) { RealType x= simd::dot(V[j],yptr,BasisSize); LogValue += x; Uk[i]+= x; Uk[j]+= x; } } for(int i=0; i<NumPtcls; i++) { const PosType* restrict dptr=GeminalBasis->dY[i]; const RealType* restrict d2ptr=GeminalBasis->d2Y[i]; const RealType* restrict vptr=V[0]; BasisSetType::GradType grad(0.0); BasisSetType::ValueType lap(0.0); for(int j=0; j<NumPtcls; j++, vptr+=BasisSize) { if(j==i) { dUk(i,j) = 0.0; d2Uk(i,j)= 0.0; } else { grad+= (dUk(i,j) = simd::dot(vptr,dptr,BasisSize)); lap += (d2Uk(i,j)= simd::dot(vptr,d2ptr,BasisSize)); } } P.G(i)+=grad; P.L(i)+=lap; } }