@@ -241,6 +241,89 @@ void optLatSetup(std::shared_ptr<Vtx::Vortex> centre, const double* V,
241241 par.store (" V_opt" ,v_opt);
242242}
243243
244+ double energy_calc (Grid &par, double2 * wfc){
245+ double * K = par.dsval (" K_gpu" );
246+ double * V = par.dsval (" V_gpu" );
247+
248+ dim3 grid = par.grid ;
249+ dim3 threads = par.threads ;
250+
251+ int xDim = par.ival (" xDim" );
252+ int yDim = par.ival (" yDim" );
253+ int zDim = par.ival (" zDim" );
254+ int gsize = xDim*yDim*zDim;
255+
256+ double dx = par.dval (" dx" );
257+ double dy = par.dval (" dy" );
258+ double dz = par.dval (" dz" );
259+ double dg = dx*dy*dz;
260+
261+ cufftHandle plan;
262+
263+ if (par.ival (" dimnum" ) == 1 ){
264+ plan = par.ival (" plan_1d" );
265+ }
266+ if (par.ival (" dimnum" ) == 2 ){
267+ plan = par.ival (" plan_2d" );
268+ }
269+ if (par.ival (" dimnum" ) == 3 ){
270+ plan = par.ival (" plan_3d" );
271+ }
272+
273+ double renorm_factor = 1.0 /pow (gsize,0.5 );
274+
275+ double2 *wfc_c, *wfc_k;
276+ double2 *energy_r, *energy_k;
277+ double *energy;
278+
279+ cudaMalloc ((void **) &wfc_c, sizeof (double2 )*gsize);
280+ cudaMalloc ((void **) &wfc_k, sizeof (double2 )*gsize);
281+ cudaMalloc ((void **) &energy_r, sizeof (double2 )*gsize);
282+ cudaMalloc ((void **) &energy_k, sizeof (double2 )*gsize);
283+
284+ cudaMalloc ((void **) &energy, sizeof (double )*gsize);
285+
286+ // Finding conjugate
287+ vecConjugate<<<grid, threads>>> (wfc, wfc_c);
288+
289+ // Momentum-space energy
290+ cufftExecZ2Z (plan, wfc, wfc_k, CUFFT_FORWARD);
291+ scalarMult<<<grid, threads>>> (wfc_k, renorm_factor, wfc_k);
292+
293+ vecMult<<<grid, threads>>> (wfc_k, K, energy_k);
294+
295+ cufftExecZ2Z (plan, energy_k, energy_k, CUFFT_INVERSE);
296+ scalarMult<<<grid, threads>>> (energy_k, renorm_factor, energy_k);
297+
298+ cMult<<<grid, threads>>> (wfc_c, energy_k, energy_k);
299+
300+ // Position-space energy
301+ vecMult<<<grid, threads>>> (wfc, V, energy_r);
302+ cMult<<<grid, threads>>> (wfc_c, energy_r, energy_r);
303+
304+ complexAbsSum<<<grid, threads>>> (energy_r, energy_k, energy);
305+
306+ double *energy_cpu;
307+ energy_cpu = (double *)malloc (sizeof (double )*gsize);
308+
309+ cudaMemcpy (energy_cpu, energy, sizeof (double )*gsize,
310+ cudaMemcpyDeviceToHost);
311+
312+ double sum = 0 ;
313+ for (int i = 0 ; i < gsize; ++i){
314+ sum += energy_cpu[i]*dg;
315+ }
316+
317+ free (energy_cpu);
318+ cudaFree (energy_r);
319+ cudaFree (energy_k);
320+ cudaFree (energy);
321+ cudaFree (wfc_c);
322+ cudaFree (wfc_k);
323+
324+ return sum;
325+ }
326+
244327/* *
245328** Calculates energy and angular momentum of current state.
246329** Implementation not fully finished.
0 commit comments