MPC::Return_t MPC::evaluate (ParticleSet& P) { //if (FirstTime || P.tag() == PtclRef->tag()) Value = evalSR(P) + evalLR(P) + Vconst; return Value; }
CoulombPBCAATemp::Return_t CoulombPBCAATemp::evaluate(ParticleSet& P) { if(is_active) Value = evalLR(P)+evalSR(P)+myConst; return Value; }
StressPBCAB::Return_t StressPBCAB::evaluate(ParticleSet& P) { if (is_active) { //forces = 0.0; stress = evalLR(P) + evalSR(P) +myConst; } return 0.0; }
StressPBCAA::Return_t StressPBCAA::evaluate(ParticleSet& P) { if(is_active) { // if(tracing_particle_quantities) // Value = spevaluate(P); stress = evalLR(P)+evalSR(P)+myConst; } // return Value; return 0.0; }
CoulombPBCABTemp::Return_t CoulombPBCABTemp::evaluate(ParticleSet& P) { if (ComputeForces) { forces = 0.0; Value = evalLRwithForces(P) + evalSRwithForces(P) +myConst; } else Value = evalLR(P) + evalSR(P) +myConst; return Value; }
StressPBCAA::StressPBCAA(ParticleSet& ref, bool active) : AA(0), myGrid(0), rVs(0), FirstTime(true), myConst(0.0), ForceBase(ref,ref), Ps(ref), is_active(active) { ReportEngine PRE("StressPBCAA","StressPBCAA"); //save source tag SourceID=ref.tag(); //create a distance table: just to get the table name DistanceTableData *d_aa = DistanceTable::add(ref); PtclRefName=d_aa->Name; initBreakup(ref); prefix="S_"+PtclRefName; app_log() << " Maximum K shell " << AA->MaxKshell << endl; app_log() << " Number of k vectors " << AA->Fk.size() << endl; if(!is_active) { d_aa->evaluate(ref); update_source(ref); app_log()<<"Evaluating Stress SymTensor::Long Range\n"; sLR=evalLR(ref); app_log()<<"Short Range...\n"; sSR=evalSR(ref); stress=sLR+sSR+myConst; //RealType eL(0.0), eS(0.0); //if (computeForces) //{ // forces = 0.0; // eS=evalSRwithForces(ref); // // 1.3978248322 // eL=evalLRwithForces(ref); // // 2.130267378 //} //else //{ // eL=evalLR(ref); // eS=evalSR(ref); //} //NewValue=Value = eL+eS+myConst; //app_log() << " Fixed Coulomb potential for " << ref.getName(); //app_log() << "\n e-e Madelung Const. =" << MC0 // << "\n Vtot =" << Value << endl; } app_log() << " Stress SymTensor components for " << ref.getName(); app_log() << "\n e-e Madelung Const. =\n" << MC0 << "\n Stot =\n" << stress << "\n S_SR =\n" << sSR << "\n S_LR =\n" << sLR << "\n S_Const =\n" << myConst<<endl; }
CoulombPBCAB::Return_t CoulombPBCAB::evaluate(ParticleSet& P) { if (ComputeForces) { forces = 0.0; Value = evalLRwithForces(P) + evalSRwithForces(P) +myConst; } else if(tracing_particle_quantities) Value = spevaluate(P); else Value = evalLR(P) + evalSR(P) +myConst; return Value; }
CoulombPBCAB::Return_t CoulombPBCAB::evalLRwithForces(ParticleSet& P) { const StructFact& RhoKA(*(PtclA.SK)); const StructFact& RhoKB(*(P.SK)); vector<TinyVector<RealType,DIM> > grad(PtclA.getTotalNum()); for(int j=0; j<NumSpeciesB; j++) { for (int iat=0; iat<grad.size(); iat++) grad[iat] = TinyVector<RealType,DIM>(0.0, 0.0, 0.0); AB->evaluateGrad(PtclA, P, j, Zat, grad); for (int iat=0; iat<grad.size(); iat++) forces[iat] += Qspec[j]*grad[iat]; } // electron species return evalLR(P); }
CoulombPBCAATemp::Return_t CoulombPBCAATemp::evaluateForPbyP(ParticleSet& P) { if(is_active) { SR2=0.0; Return_t res=myConst; const DistanceTableData *d_aa = P.DistTables[0]; for(int iat=0; iat<NumCenters; iat++) { Return_t z=0.5*Zat[iat]; for(int nn=d_aa->M[iat],jat=iat+1; nn<d_aa->M[iat+1]; ++nn,++jat) { Return_t e=z*Zat[jat]*d_aa->rinv(nn)*rVs->splint(d_aa->r(nn)); SR2(iat,jat)=e; SR2(jat,iat)=e; res+=e+e; } } return res+evalLR(P); } else return Value; }
CoulombPBCAB::Return_t CoulombPBCAB::spevaluate(ParticleSet& P) { RealType Vsr = 0.0; RealType Vlr = 0.0; RealType& Vc = myConst; Array<RealType,1>& Ve_samp = *Ve_sample; Array<RealType,1>& Vi_samp = *Vi_sample; Ve_samp = 0.0; Vi_samp = 0.0; { //SR const DistanceTableData &d_ab(*P.DistTables[myTableIndex]); RealType pairpot; RealType z; //Loop over distinct eln-ion pairs for(int iat=0; iat<NptclA; iat++) { z = .5*Zat[iat]; RadFunctorType* rVs=Vat[iat]; for(int nn=d_ab.M[iat], jat=0; nn<d_ab.M[iat+1]; ++nn,++jat) { pairpot = z*Qat[jat]*d_ab.rinv(nn)*rVs->splint(d_ab.r(nn)); Vi_samp(iat)+=pairpot; Ve_samp(jat)+=pairpot; Vsr+=pairpot; } } Vsr *= 2.0; } { //LR const StructFact& RhoKA(*(PtclA.SK)); const StructFact& RhoKB(*(P.SK)); if(RhoKA.SuperCellEnum==SUPERCELL_SLAB) { APP_ABORT("CoulombPBCAB::spevaluate single particle traces have not been implemented for slab geometry"); } else { //jtk mark: needs optimizations for USE_REAL_STRUCT_FACTOR // will likely require new function definitions RealType v1; //single particle energy RealType q; for(int i=0; i<P.getTotalNum(); ++i) { q=.5*Qat[i]; v1=0.0; for(int s=0; s<NumSpeciesA; s++) #if defined(USE_REAL_STRUCT_FACTOR) v1+=Zspec[s]*q*AB->evaluate(RhoKA.KLists.kshell,RhoKA.rhok_r[s],RhoKA.rhok_i[s],RhoKB.eikr_r[i],RhoKB.eikr_i[i]); #else v1+=Zspec[s]*q*AB->evaluate(RhoKA.KLists.kshell,RhoKA.rhok[s],RhoKB.eikr[i]); #endif Ve_samp(i)+=v1; Vlr+=v1; } for(int i=0; i<PtclA.getTotalNum(); ++i) { q=.5*Zat[i]; v1=0.0; for(int s=0; s<NumSpeciesB; s++) #if defined(USE_REAL_STRUCT_FACTOR) v1+=Qspec[s]*q*AB->evaluate(RhoKB.KLists.kshell,RhoKB.rhok_r[s],RhoKB.rhok_i[s],RhoKA.eikr_r[i],RhoKA.eikr_i[i]); #else v1+=Qspec[s]*q*AB->evaluate(RhoKB.KLists.kshell,RhoKB.rhok[s],RhoKA.eikr[i]); #endif Vi_samp(i)+=v1; Vlr+=v1; } } } for(int i=0; i<Ve_samp.size(); ++i) Ve_samp(i)+=Ve_const(i); for(int i=0; i<Vi_samp.size(); ++i) Vi_samp(i)+=Vi_const(i); Value = Vsr + Vlr + Vc; #if defined(TRACE_CHECK) RealType Vlrnow = evalLR(P); RealType Vsrnow = evalSR(P); RealType Vcnow = myConst; RealType Vnow = Vlrnow+Vsrnow+Vcnow; RealType Vesum = Ve_samp.sum(); RealType Vecsum = Ve_const.sum(); RealType Visum = Vi_samp.sum(); RealType Vicsum = Vi_const.sum(); RealType Vsum = Vesum+Visum; RealType Vcsum = Vecsum+Vicsum; RealType Vsrold = evalSR_old(P); RealType Vlrold = evalLR_old(P); RealType Vcold = evalConsts_old(false); RealType Vcorig = evalConsts_orig(false); if(abs(Vsum-Vnow)>TraceManager::trace_tol) { app_log()<<"accumtest: CoulombPBCAA::evaluate()"<<endl; app_log()<<"accumtest: tot:"<< Vnow <<endl; app_log()<<"accumtest: sum:"<< Vsum <<endl; APP_ABORT("Trace check failed"); } if(abs(Vcsum-Vcnow)>TraceManager::trace_tol) { app_log()<<"accumtest: CoulombPBCAA::evalConsts()"<<endl; app_log()<<"accumtest: tot:"<< Vcnow <<endl; app_log()<<"accumtest: sum:"<< Vcsum <<endl; APP_ABORT("Trace check failed"); } if(abs(Vesum-Visum)>TraceManager::trace_tol) { app_log()<<"sharetest: CoulombPBCAB::evaluate()"<<endl; app_log()<<"sharetest: e share:"<< Vesum <<endl; app_log()<<"sharetest: i share:"<< Visum <<endl; } if(abs(Vecsum-Vicsum)>TraceManager::trace_tol) { app_log()<<"sharetest: CoulombPBCAB::evalConsts()"<<endl; app_log()<<"sharetest: e share:"<< Vecsum <<endl; app_log()<<"sharetest: i share:"<< Vicsum <<endl; } if(abs(Vsrold-Vsrnow)>TraceManager::trace_tol) { app_log()<<"versiontest: CoulombPBCAA::evalSR()"<<endl; app_log()<<"versiontest: old:"<< Vsrold <<endl; app_log()<<"versiontest: mod:"<< Vsrnow <<endl; APP_ABORT("Trace check failed"); } if(abs(Vlrold-Vlrnow)>TraceManager::trace_tol) { app_log()<<"versiontest: CoulombPBCAA::evalLR()"<<endl; app_log()<<"versiontest: old:"<< Vlrold <<endl; app_log()<<"versiontest: mod:"<< Vlrnow <<endl; APP_ABORT("Trace check failed"); } if(abs(Vcold-Vcorig)>TraceManager::trace_tol || abs(Vcnow-Vcorig)>TraceManager::trace_tol ) { app_log()<<"versiontest: CoulombPBCAA::evalConsts()"<<endl; app_log()<<"versiontest: old:"<< Vcold <<endl; app_log()<<"versiontest: orig:"<< Vcorig <<endl; app_log()<<"versiontest: mod:"<< Vcnow <<endl; APP_ABORT("Trace check failed"); } #endif return Value; }