Esempio n. 1
0
void initializePositionsFCC(Molecule** molecules)
{
    int M=1;
    int n,x,y,z,k;
    n=0;
    
    while(4*M*M*M < N)
        ++M;

    double a = L/M;
    std::cout << "M: " << M << std::endl;
    std::cout << "a: " << a << std::endl;
    double xCell[4] = {0.25,0.75,0.75,0.25};
    double yCell[4] = {0.25,0.75,0.25,0.75};
    double zCell[4] = {0.25,0.25,0.75,0.75};
    
    for(x=0;x<M;x++)
        for(y=0;y<M;y++)
            for(z=0;z<M;z++)
                for(k=0;k<4;k++)
                    if(n<N)
                    {
                        molecules[n]->setPosition((x + xCell[k])*a,(y + yCell[k])*a,(z + zCell[k])*a);
                        n++;
                    }
    double* muTemp = dipole(molecules[1]);
    mu2 = dot(muTemp,muTemp);
    std::cout << "Mu**2 (1): " << mu2 << std::endl;
    muTemp = dipole(molecules[100]);
    mu2 = dot(muTemp,muTemp);
    std::cout << "Mu**2 (100): " << mu2 << std::endl;
}
LocalCorePolPotential::Return_t
LocalCorePolPotential::evaluate(ParticleSet& P)
{
  if(FirstTime)
  {
    //index for attribute charge
    SpeciesSet& Species(IonConfig.getSpeciesSet());
    int iz = Species.addAttribute("charge");
    //calculate the Core-Core Dipole matrix
    for(int iat=0; iat<nCenters; iat++)
    {
      for(int nn=d_ii->M[iat]; nn<d_ii->M[iat+1]; nn++)
      {
        int jat(d_ii->J[nn]);
        RealType rinv3 = std::pow(d_ii->rinv(nn),3);//(1/R_{JI}^3) R_{JI} = R_J-R_I
        PosType dipole(rinv3*d_ii->dr(nn));//(\vec{R_{JI}}/R_{JI}^3)
        //Sign and the charge of the paired ion are taken into account here
        CoreCoreDipole[iat] -= dipole*Species(iz,IonConfig.GroupID[jat]);
        CoreCoreDipole[jat] += dipole*Species(iz,IonConfig.GroupID[iat]);
      }
    }
    RealType corecore(0.0);
    for(int iat=0; iat<nCenters; iat++)
    {
      //app_log() << "Checking CPP = " << Centers[iat] << endl;
      if(Centers[iat])
        corecore+= Centers[iat]->C*dot(CoreCoreDipole[iat],CoreCoreDipole[iat]);
    }
//      LOGMSG("Core-Core Dipole = " << corecore);
    FirstTime=false;
  }
  //calculate the Electron-Core Dipole matrix
  //CoreElDipole=0.0;
  RealType e = 0.0;
  for(int iat=0; iat<nCenters; iat++)
  {
    if(Centers[iat])
    {
      PosType cc(CoreCoreDipole[iat]);
      for(int nn=d_ie->M[iat]; nn<d_ie->M[iat+1]; nn++)
      {
        int eid(d_ie->J[nn]);
        RealType rinv3 = std::pow(d_ie->rinv(nn),3);//(1/r^3)
        PosType dipole = rinv3*d_ie->dr(nn);//(\vec{r}/r^3)
        //cc +=  dipole*fcpp(d_ie->r(nn)*r_binv);
        cc += dipole*((*Centers[iat])(d_ie->r(nn)));
      }
      e += Centers[iat]->C*dot(cc,cc);
    }
  }
  return Value=e;
}