Exemple #1
0
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;
}
Exemple #3
0
StressPBCAB::Return_t
StressPBCAB::evaluate(ParticleSet& P)
{
  if (is_active)
  {
    //forces = 0.0;
    stress = evalLR(P) + evalSR(P) +myConst;
  }


  return 0.0;
}
Exemple #4
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;
}
Exemple #6
0
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;
}
Exemple #7
0
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;
}
Exemple #8
0
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;
}
Exemple #10
0
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;
}