Exemple #1
0
void
MPC::compute_g_G(double &g_0, vector<double> &g_G, int N)
{
  double L = PtclRef->Lattice.WignerSeitzRadius;
  double Linv = 1.0/L;
  double Linv3 = Linv*Linv*Linv;
  // create an FFTW plan
  Array<complex<double>,3> rBox(N,N,N);
  Array<complex<double>,3> GBox(N,N,N);
  // app_log() << "Doing " << N << " x " << N << " x " << N << " FFT.\n";
  //create BC handler
  DTD_BConds<double,3,SUPERCELL_BULK> mybc(PtclRef->Lattice);
  // Fill the real-space array with f(r)
  double Ninv = 1.0/(double)N;
  TinyVector<double,3> u, r;
  for (int ix=0; ix<N; ix++)
  {
    u[0] = Ninv*ix;
    for (int iy=0; iy<N; iy++)
    {
      u[1] = Ninv*iy;
      for (int iz=0; iz<N; iz++)
      {
        u[2] = Ninv*iz;
        r = PtclRef->Lattice.toCart (u);
        //DTD_BConds<double,3,SUPERCELL_BULK>::apply (PtclRef->Lattice, r);
        //double rmag = std::sqrt(dot(r,r));
        double rmag = std::sqrt(mybc.apply_bc(r));
        if (rmag < L)
          rBox(ix,iy,iz) = -0.5*rmag*rmag*Linv3 + 1.5*Linv;
        else
          rBox(ix,iy,iz) = 1.0/rmag;
      }
    }
  }
  fftw_plan fft = fftw_plan_dft_3d
                  (N, N, N, (fftw_complex*)rBox.data(),
                   (fftw_complex*) GBox.data(), 1, FFTW_ESTIMATE);
  fftw_execute (fft);
  fftw_destroy_plan (fft);
  // Now, copy data into output, and add on analytic part
  double norm = Ninv*Ninv*Ninv;
  int numG = Gints.size();
  for (int iG=0; iG < numG; iG++)
  {
    TinyVector<int,OHMMS_DIM> gint = Gints[iG];
    for (int j=0; j<OHMMS_DIM; j++)
      gint[j] = (gint[j] + N)%N;
    g_G[iG] = norm * real(GBox(gint[0], gint[1], gint[2]));
  }
  g_0 = norm * real(GBox(0,0,0));
}
Exemple #2
0
void GUI::Manager::draw()
{
	for (std::vector<Widget*>::iterator it = _widget.begin(); it != _widget.end(); it++)
	{
		(*it)->draw (GBox(), res);
	}
}
Exemple #3
0
GUI::Input* GUI::Manager::getInput (ALLEGRO_EVENT& ev, ALLEGRO_EVENT_QUEUE* eq)
{
	for (std::vector<Widget*>::iterator it = _widget.begin(); it != _widget.end(); it++)
	{
		Input* in = (*it)->getInput (GBox(), res, ev, eq);
		if (in)
		{
			if (in->valid())
			{
				return in;
			}
			else
			{
				delete in;
				in = NULL;
			}
		}
	}
	return NULL;
}
Exemple #4
0
void
MPC::init_spline()
{
  Array<complex<double>,3> rBox(SplineDim[0], SplineDim[1], SplineDim[2]),
        GBox(SplineDim[0], SplineDim[1], SplineDim[2]);
  Array<double,3> splineData(SplineDim[0], SplineDim[1], SplineDim[2]);
  GBox = complex<double>();
  Vconst = 0.0;
  // Now fill in elements of GBox
  double vol = PtclRef->Lattice.Volume;
  double volInv = 1.0/vol;
  for (int iG=0; iG < Gvecs.size(); iG++)
  {
    TinyVector<int,OHMMS_DIM> gint = Gints[iG];
    PosType G = Gvecs[iG];
    double G2 = dot(G,G);
    TinyVector<int,OHMMS_DIM> index;
    for (int j=0; j<OHMMS_DIM; j++)
      index[j] = (gint[j] + SplineDim[j]) % SplineDim[j];
    if (!(index[0]==0 && index[1]==0 && index[2]==0))
    {
      GBox(index[0], index[1], index[2]) = vol *
                                           Rho_G[iG] * (4.0*M_PI*volInv/G2 - f_G[iG]);
      Vconst -= 0.5 * vol * vol * norm(Rho_G[iG])
                * (4.0*M_PI*volInv/G2 - f_G[iG]);
    }
  }
  // G=0 component calculated seperately
  GBox(0,0,0) = -vol * f_0 * Rho_G[0];
  Vconst += 0.5 * vol * vol * f_0 * norm(Rho_G[0]);
  app_log() << "  Constant potential = " << Vconst << endl;
  fftw_plan fft = fftw_plan_dft_3d
                  (SplineDim[0], SplineDim[1], SplineDim[2], (fftw_complex*)GBox.data(),
                   (fftw_complex*) rBox.data(), -1, FFTW_ESTIMATE);
  fftw_execute (fft);
  fftw_destroy_plan (fft);
  for (int i0=0; i0<SplineDim[0]; i0++)
    for (int i1=0; i1<SplineDim[1]; i1++)
      for (int i2=0; i2<SplineDim[2]; i2++)
        splineData(i0, i1, i2) = real(rBox(i0,i1,i2));
  BCtype_d bc0, bc1, bc2;
  Ugrid grid0, grid1, grid2;
  grid0.start=0.0;
  grid0.end=1.0;
  grid0.num = SplineDim[0];
  grid1.start=0.0;
  grid1.end=1.0;
  grid1.num = SplineDim[1];
  grid2.start=0.0;
  grid2.end=1.0;
  grid2.num = SplineDim[2];
  bc0.lCode = bc0.rCode = PERIODIC;
  bc1.lCode = bc1.rCode = PERIODIC;
  bc2.lCode = bc2.rCode = PERIODIC;
  VlongSpline = create_UBspline_3d_d (grid0, grid1, grid2, bc0, bc1, bc2,
                                      splineData.data());
//     grid0.num = PtclRef->Density_r.size(0);
//     grid1.num = PtclRef->Density_r.size(1);
//     grid2.num = PtclRef->Density_r.size(2);
//     DensitySpline = create_UBspline_3d_d (grid0, grid1, grid2, bc0, bc1, bc2,
// 					  PtclRef->Density_r.data());
}