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)); }
void GUI::Manager::draw() { for (std::vector<Widget*>::iterator it = _widget.begin(); it != _widget.end(); it++) { (*it)->draw (GBox(), res); } }
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; }
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()); }