(git:ed6f26b)
Loading...
Searching...
No Matches
ewald_methods_tb.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2025 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Calculation of Ewald contributions in DFTB
10!> \author JGH
11! **************************************************************************************************
13 USE cell_types, ONLY: cell_type
14 USE dgs, ONLY: dg_sum_patch,&
19 USE ewald_pw_types, ONLY: ewald_pw_get,&
21 USE kinds, ONLY: dp
22 USE mathconstants, ONLY: fourpi,&
24 USE message_passing, ONLY: mp_comm_type,&
27 USE pme_tools, ONLY: get_center,&
30 USE pw_grids, ONLY: get_pw_grid_info
31 USE pw_methods, ONLY: pw_integral_a2b,&
39 USE pw_types, ONLY: pw_c1d_gs_type,&
55 USE spme, ONLY: get_patch
57 USE virial_types, ONLY: virial_type
58#include "./base/base_uses.f90"
59
60 IMPLICIT NONE
61
62 PRIVATE
63
64 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ewald_methods_tb'
65
67
68CONTAINS
69
70! **************************************************************************************************
71!> \brief ...
72!> \param ewald_env ...
73!> \param ewald_pw ...
74!> \param particle_set ...
75!> \param box ...
76!> \param gmcharge ...
77!> \param mcharge ...
78!> \param calculate_forces ...
79!> \param virial ...
80!> \param use_virial ...
81! **************************************************************************************************
82 SUBROUTINE tb_spme_evaluate(ewald_env, ewald_pw, particle_set, box, &
83 gmcharge, mcharge, calculate_forces, virial, use_virial)
84
85 TYPE(ewald_environment_type), POINTER :: ewald_env
86 TYPE(ewald_pw_type), POINTER :: ewald_pw
87 TYPE(particle_type), DIMENSION(:), INTENT(IN) :: particle_set
88 TYPE(cell_type), POINTER :: box
89 REAL(kind=dp), DIMENSION(:, :), INTENT(inout) :: gmcharge
90 REAL(kind=dp), DIMENSION(:), INTENT(in) :: mcharge
91 LOGICAL, INTENT(in) :: calculate_forces
92 TYPE(virial_type), POINTER :: virial
93 LOGICAL, INTENT(in) :: use_virial
94
95 CHARACTER(len=*), PARAMETER :: routinen = 'tb_spme_evaluate'
96
97 INTEGER :: handle, i, ipart, j, n, npart, o_spline, &
98 p1
99 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: center
100 INTEGER, DIMENSION(3) :: npts
101 REAL(kind=dp) :: alpha, dvols, fat(3), ffa, fint, vgc
102 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: delta
103 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rhos
104 REAL(kind=dp), DIMENSION(3, 3) :: f_stress, h_stress
105 TYPE(greens_fn_type), POINTER :: green
106 TYPE(mp_comm_type) :: group
107 TYPE(mp_para_env_type), POINTER :: para_env
108 TYPE(pw_c1d_gs_type), DIMENSION(3) :: dphi_g
109 TYPE(pw_c1d_gs_type), POINTER :: phi_g, rhob_g
110 TYPE(pw_grid_type), POINTER :: grid_spme
111 TYPE(pw_poisson_type), POINTER :: poisson_env
112 TYPE(pw_pool_type), POINTER :: pw_pool
113 TYPE(pw_r3d_rs_type), POINTER :: rhob_r
114 TYPE(realspace_grid_desc_type), POINTER :: rs_desc
115 TYPE(realspace_grid_type) :: rden, rpot
116 TYPE(realspace_grid_type), ALLOCATABLE, &
117 DIMENSION(:) :: drpot
118
119 CALL timeset(routinen, handle)
120 !-------------- INITIALISATION ---------------------
121 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group, &
122 para_env=para_env)
123 NULLIFY (green, poisson_env, pw_pool)
124 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
125 poisson_env=poisson_env)
126 CALL pw_poisson_rebuild(poisson_env)
127 green => poisson_env%green_fft
128 grid_spme => pw_pool%pw_grid
129
130 CALL get_pw_grid_info(grid_spme, dvol=dvols, npts=npts)
131
132 npart = SIZE(particle_set)
133
134 n = o_spline
135 ALLOCATE (rhos(n, n, n))
136
137 CALL rs_grid_create(rden, rs_desc)
138 CALL rs_grid_set_box(grid_spme, rs=rden)
139 CALL rs_grid_zero(rden)
140
141 ALLOCATE (center(3, npart), delta(3, npart))
142 CALL get_center(particle_set, box, center, delta, npts, n)
143
144 !-------------- DENSITY CALCULATION ----------------
145 ipart = 0
146 DO
147 CALL set_list(particle_set, npart, center, p1, rden, ipart)
148 IF (p1 == 0) EXIT
149
150 ! calculate function on small boxes
151 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
152 is_shell=.false., unit_charge=.true.)
153 rhos(:, :, :) = rhos(:, :, :)*mcharge(p1)
154
155 ! add boxes to real space grid (big box)
156 CALL dg_sum_patch(rden, rhos, center(:, p1))
157 END DO
158
159 NULLIFY (rhob_r)
160 ALLOCATE (rhob_r)
161 CALL pw_pool%create_pw(rhob_r)
162
163 CALL transfer_rs2pw(rden, rhob_r)
164
165 ! transform density to G space and add charge function
166 NULLIFY (rhob_g)
167 ALLOCATE (rhob_g)
168 CALL pw_pool%create_pw(rhob_g)
169 CALL pw_transfer(rhob_r, rhob_g)
170 ! update charge function
171 CALL pw_multiply_with(rhob_g, green%p3m_charge)
172
173 !-------------- ELECTROSTATIC CALCULATION -----------
174
175 ! allocate intermediate arrays
176 DO i = 1, 3
177 CALL pw_pool%create_pw(dphi_g(i))
178 END DO
179 NULLIFY (phi_g)
180 ALLOCATE (phi_g)
181 CALL pw_pool%create_pw(phi_g)
182 IF (use_virial) THEN
183 CALL pw_poisson_solve(poisson_env, rhob_g, vgc, phi_g, dphi_g, h_stress=h_stress)
184 ELSE
185 CALL pw_poisson_solve(poisson_env, rhob_g, vgc, phi_g, dphi_g)
186 END IF
187
188 CALL rs_grid_create(rpot, rs_desc)
189 CALL rs_grid_set_box(grid_spme, rs=rpot)
190
191 CALL pw_pool%give_back_pw(rhob_g)
192 DEALLOCATE (rhob_g)
193
194 CALL rs_grid_zero(rpot)
195 CALL pw_multiply_with(phi_g, green%p3m_charge)
196 CALL pw_transfer(phi_g, rhob_r)
197 CALL pw_pool%give_back_pw(phi_g)
198 DEALLOCATE (phi_g)
199 CALL transfer_pw2rs(rpot, rhob_r)
200
201 !---------- END OF ELECTROSTATIC CALCULATION --------
202
203 !------------- STRESS TENSOR CALCULATION ------------
204
205 IF (use_virial) THEN
206 DO i = 1, 3
207 DO j = i, 3
208 f_stress(i, j) = pw_integral_a2b(dphi_g(i), dphi_g(j))
209 f_stress(j, i) = f_stress(i, j)
210 END DO
211 END DO
212 ffa = (1.0_dp/fourpi)*(0.5_dp/alpha)**2
213 virial%pv_virial = virial%pv_virial - (ffa*f_stress - h_stress)/real(para_env%num_pe, dp)
214 END IF
215
216 !--------END OF STRESS TENSOR CALCULATION -----------
217
218 IF (calculate_forces) THEN
219 ! move derivative of potential to real space grid and
220 ! multiply by charge function in g-space
221 ALLOCATE (drpot(3))
222 DO i = 1, 3
223 CALL rs_grid_create(drpot(i), rs_desc)
224 CALL rs_grid_set_box(grid_spme, rs=drpot(i))
225 CALL pw_multiply_with(dphi_g(i), green%p3m_charge)
226 CALL pw_transfer(dphi_g(i), rhob_r)
227 CALL pw_pool%give_back_pw(dphi_g(i))
228 CALL transfer_pw2rs(drpot(i), rhob_r)
229 END DO
230 ELSE
231 DO i = 1, 3
232 CALL pw_pool%give_back_pw(dphi_g(i))
233 END DO
234 END IF
235 CALL pw_pool%give_back_pw(rhob_r)
236 DEALLOCATE (rhob_r)
237
238 !----------------- FORCE CALCULATION ----------------
239
240 ipart = 0
241 DO
242
243 CALL set_list(particle_set, npart, center, p1, rden, ipart)
244 IF (p1 == 0) EXIT
245
246 ! calculate function on small boxes
247 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
248 is_shell=.false., unit_charge=.true.)
249
250 CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fint)
251 gmcharge(p1, 1) = gmcharge(p1, 1) + fint*dvols
252
253 IF (calculate_forces) THEN
254 CALL dg_sum_patch_force_3d(drpot, rhos, center(:, p1), fat)
255 gmcharge(p1, 2) = gmcharge(p1, 2) - fat(1)*dvols
256 gmcharge(p1, 3) = gmcharge(p1, 3) - fat(2)*dvols
257 gmcharge(p1, 4) = gmcharge(p1, 4) - fat(3)*dvols
258 END IF
259
260 END DO
261
262 !--------------END OF FORCE CALCULATION -------------
263
264 !------------------CLEANING UP ----------------------
265
266 CALL rs_grid_release(rden)
267 CALL rs_grid_release(rpot)
268 IF (calculate_forces) THEN
269 DO i = 1, 3
270 CALL rs_grid_release(drpot(i))
271 END DO
272 DEALLOCATE (drpot)
273 END IF
274 DEALLOCATE (rhos)
275 DEALLOCATE (center, delta)
276
277 CALL timestop(handle)
278
279 END SUBROUTINE tb_spme_evaluate
280
281! **************************************************************************************************
282!> \brief ...
283!> \param gmcharge ...
284!> \param mcharge ...
285!> \param alpha ...
286!> \param n_list ...
287!> \param virial ...
288!> \param use_virial ...
289! **************************************************************************************************
290 SUBROUTINE tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, use_virial)
291
292 REAL(kind=dp), DIMENSION(:, :), INTENT(inout) :: gmcharge
293 REAL(kind=dp), DIMENSION(:), INTENT(in) :: mcharge
294 REAL(kind=dp), INTENT(in) :: alpha
295 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
296 POINTER :: n_list
297 TYPE(virial_type), POINTER :: virial
298 LOGICAL, INTENT(IN) :: use_virial
299
300 CHARACTER(LEN=*), PARAMETER :: routinen = 'tb_ewald_overlap'
301
302 INTEGER :: handle, i, iatom, jatom, nmat
303 REAL(kind=dp) :: dfr, dr, fr, pfr, rij(3)
305 DIMENSION(:), POINTER :: nl_iterator
306
307 CALL timeset(routinen, handle)
308
309 nmat = SIZE(gmcharge, 2)
310
311 CALL neighbor_list_iterator_create(nl_iterator, n_list)
312 DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
313 CALL get_iterator_info(nl_iterator, iatom=iatom, jatom=jatom, r=rij)
314
315 dr = sqrt(sum(rij(:)**2))
316 IF (dr > 1.e-10) THEN
317 fr = erfc(alpha*dr)/dr
318 gmcharge(iatom, 1) = gmcharge(iatom, 1) + mcharge(jatom)*fr
319 gmcharge(jatom, 1) = gmcharge(jatom, 1) + mcharge(iatom)*fr
320 IF (nmat > 1) THEN
321 dfr = -2._dp*alpha*exp(-alpha*alpha*dr*dr)*oorootpi/dr - fr/dr
322 dfr = -dfr/dr
323 DO i = 2, nmat
324 gmcharge(iatom, i) = gmcharge(iatom, i) - rij(i - 1)*mcharge(jatom)*dfr
325 gmcharge(jatom, i) = gmcharge(jatom, i) + rij(i - 1)*mcharge(iatom)*dfr
326 END DO
327 END IF
328 IF (use_virial) THEN
329 IF (iatom == jatom) THEN
330 pfr = -0.5_dp*dfr*mcharge(iatom)*mcharge(jatom)
331 ELSE
332 pfr = -dfr*mcharge(iatom)*mcharge(jatom)
333 END IF
334 CALL virial_pair_force(virial%pv_virial, -pfr, rij, rij)
335 END IF
336 END IF
337
338 END DO
339 CALL neighbor_list_iterator_release(nl_iterator)
340
341 CALL timestop(handle)
342
343 END SUBROUTINE tb_ewald_overlap
344
345! **************************************************************************************************
346!> \brief ...
347!> \param ewald_env ...
348!> \param ewald_pw ...
349!> \param particle_set ...
350!> \param box ...
351!> \param gmcharge ...
352!> \param mcharge ...
353! **************************************************************************************************
354 SUBROUTINE tb_spme_zforce(ewald_env, ewald_pw, particle_set, box, gmcharge, mcharge)
355
356 TYPE(ewald_environment_type), POINTER :: ewald_env
357 TYPE(ewald_pw_type), POINTER :: ewald_pw
358 TYPE(particle_type), DIMENSION(:), INTENT(IN) :: particle_set
359 TYPE(cell_type), POINTER :: box
360 REAL(kind=dp), DIMENSION(:, :), INTENT(inout) :: gmcharge
361 REAL(kind=dp), DIMENSION(:), INTENT(in) :: mcharge
362
363 CHARACTER(len=*), PARAMETER :: routinen = 'tb_spme_zforce'
364
365 INTEGER :: handle, i, ipart, n, npart, o_spline, p1
366 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: center
367 INTEGER, DIMENSION(3) :: npts
368 REAL(kind=dp) :: alpha, dvols, fat(3), fint, vgc
369 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: delta
370 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rhos
371 TYPE(greens_fn_type), POINTER :: green
372 TYPE(mp_comm_type) :: group
373 TYPE(mp_para_env_type), POINTER :: para_env
374 TYPE(pw_c1d_gs_type), DIMENSION(3) :: dphi_g
375 TYPE(pw_c1d_gs_type), POINTER :: phi_g, rhob_g
376 TYPE(pw_grid_type), POINTER :: grid_spme
377 TYPE(pw_poisson_type), POINTER :: poisson_env
378 TYPE(pw_pool_type), POINTER :: pw_pool
379 TYPE(pw_r3d_rs_type), POINTER :: rhob_r
380 TYPE(realspace_grid_desc_type), POINTER :: rs_desc
381 TYPE(realspace_grid_type) :: rden, rpot
382 TYPE(realspace_grid_type), DIMENSION(3) :: drpot
383
384 CALL timeset(routinen, handle)
385 !-------------- INITIALISATION ---------------------
386 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group, &
387 para_env=para_env)
388 NULLIFY (green, poisson_env, pw_pool)
389 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
390 poisson_env=poisson_env)
391 CALL pw_poisson_rebuild(poisson_env)
392 green => poisson_env%green_fft
393 grid_spme => pw_pool%pw_grid
394
395 CALL get_pw_grid_info(grid_spme, dvol=dvols, npts=npts)
396
397 npart = SIZE(particle_set)
398
399 n = o_spline
400 ALLOCATE (rhos(n, n, n))
401
402 CALL rs_grid_create(rden, rs_desc)
403 CALL rs_grid_set_box(grid_spme, rs=rden)
404 CALL rs_grid_zero(rden)
405
406 ALLOCATE (center(3, npart), delta(3, npart))
407 CALL get_center(particle_set, box, center, delta, npts, n)
408
409 !-------------- DENSITY CALCULATION ----------------
410 ipart = 0
411 DO
412 CALL set_list(particle_set, npart, center, p1, rden, ipart)
413 IF (p1 == 0) EXIT
414
415 ! calculate function on small boxes
416 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
417 is_shell=.false., unit_charge=.true.)
418 rhos(:, :, :) = rhos(:, :, :)*mcharge(p1)
419
420 ! add boxes to real space grid (big box)
421 CALL dg_sum_patch(rden, rhos, center(:, p1))
422 END DO
423
424 NULLIFY (rhob_r)
425 ALLOCATE (rhob_r)
426 CALL pw_pool%create_pw(rhob_r)
427
428 CALL transfer_rs2pw(rden, rhob_r)
429
430 ! transform density to G space and add charge function
431 NULLIFY (rhob_g)
432 ALLOCATE (rhob_g)
433 CALL pw_pool%create_pw(rhob_g)
434 CALL pw_transfer(rhob_r, rhob_g)
435 ! update charge function
436 CALL pw_multiply_with(rhob_g, green%p3m_charge)
437
438 !-------------- ELECTROSTATIC CALCULATION -----------
439
440 ! allocate intermediate arrays
441 DO i = 1, 3
442 CALL pw_pool%create_pw(dphi_g(i))
443 END DO
444 NULLIFY (phi_g)
445 ALLOCATE (phi_g)
446 CALL pw_pool%create_pw(phi_g)
447 CALL pw_poisson_solve(poisson_env, rhob_g, vgc, phi_g, dphi_g)
448
449 CALL rs_grid_create(rpot, rs_desc)
450 CALL rs_grid_set_box(grid_spme, rs=rpot)
451
452 CALL pw_pool%give_back_pw(rhob_g)
453 DEALLOCATE (rhob_g)
454
455 CALL rs_grid_zero(rpot)
456 CALL pw_multiply_with(phi_g, green%p3m_charge)
457 CALL pw_transfer(phi_g, rhob_r)
458 CALL pw_pool%give_back_pw(phi_g)
459 DEALLOCATE (phi_g)
460 CALL transfer_pw2rs(rpot, rhob_r)
461
462 !---------- END OF ELECTROSTATIC CALCULATION --------
463
464 ! move derivative of potential to real space grid and
465 ! multiply by charge function in g-space
466 DO i = 1, 3
467 CALL rs_grid_create(drpot(i), rs_desc)
468 CALL rs_grid_set_box(grid_spme, rs=drpot(i))
469 CALL pw_multiply_with(dphi_g(i), green%p3m_charge)
470 CALL pw_transfer(dphi_g(i), rhob_r)
471 CALL pw_pool%give_back_pw(dphi_g(i))
472 CALL transfer_pw2rs(drpot(i), rhob_r)
473 END DO
474 CALL pw_pool%give_back_pw(rhob_r)
475 DEALLOCATE (rhob_r)
476
477 !----------------- FORCE CALCULATION ----------------
478
479 ipart = 0
480 DO
481
482 CALL set_list(particle_set, npart, center, p1, rden, ipart)
483 IF (p1 == 0) EXIT
484
485 ! calculate function on small boxes
486 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
487 is_shell=.false., unit_charge=.true.)
488
489 CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fint)
490 gmcharge(p1, 1) = gmcharge(p1, 1) + fint*dvols
491
492 CALL dg_sum_patch_force_3d(drpot, rhos, center(:, p1), fat)
493 gmcharge(p1, 2) = gmcharge(p1, 2) - fat(1)*dvols
494 gmcharge(p1, 3) = gmcharge(p1, 3) - fat(2)*dvols
495 gmcharge(p1, 4) = gmcharge(p1, 4) - fat(3)*dvols
496
497 END DO
498
499 !--------------END OF FORCE CALCULATION -------------
500
501 !------------------CLEANING UP ----------------------
502
503 CALL rs_grid_release(rden)
504 CALL rs_grid_release(rpot)
505 DO i = 1, 3
506 CALL rs_grid_release(drpot(i))
507 END DO
508 DEALLOCATE (rhos)
509 DEALLOCATE (center, delta)
510
511 CALL timestop(handle)
512
513 END SUBROUTINE tb_spme_zforce
514
515END MODULE ewald_methods_tb
516
Handles all functions related to the CELL.
Definition cell_types.F:15
Definition dgs.F:13
subroutine, public ewald_env_get(ewald_env, ewald_type, alpha, eps_pol, epsilon, gmax, ns_max, o_spline, group, para_env, poisson_section, precs, rcut, do_multipoles, max_multipole, do_ipol, max_ipol_iter, interaction_cutoffs, cell_hmat)
Purpose: Get the EWALD environment.
Calculation of Ewald contributions in DFTB.
subroutine, public tb_spme_zforce(ewald_env, ewald_pw, particle_set, box, gmcharge, mcharge)
...
subroutine, public tb_ewald_overlap(gmcharge, mcharge, alpha, n_list, virial, use_virial)
...
subroutine, public tb_spme_evaluate(ewald_env, ewald_pw, particle_set, box, gmcharge, mcharge, calculate_forces, virial, use_virial)
...
subroutine, public ewald_pw_get(ewald_pw, pw_big_pool, pw_small_pool, rs_desc, poisson_env, dg)
get the ewald_pw environment to the correct program.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
Definition of mathematical constants and functions.
real(kind=dp), parameter, public oorootpi
real(kind=dp), parameter, public fourpi
Interface to the message passing library MPI.
Define the data structure for the particle information.
Tools common both to PME and SPME.
Definition pme_tools.F:15
subroutine, public get_center(part, box, center, delta, npts, n)
...
Definition pme_tools.F:131
subroutine, public set_list(part, npart, center, p1, rs, ipart, core_center)
...
Definition pme_tools.F:46
This module defines the grid data type and some basic operations on it.
Definition pw_grids.F:36
subroutine, public get_pw_grid_info(pw_grid, id_nr, mode, vol, dvol, npts, ngpts, ngpts_cut, dr, cutoff, orthorhombic, gvectors, gsquare)
Access to information stored in the pw_grid_type.
Definition pw_grids.F:185
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
subroutine, public rs_grid_create(rs, desc)
...
subroutine, public transfer_pw2rs(rs, pw)
...
subroutine, public rs_grid_set_box(pw_grid, rs)
Set box matrix info for real space grid This is needed for variable cell simulations.
subroutine, public transfer_rs2pw(rs, pw)
...
subroutine, public rs_grid_release(rs_grid)
releases the given rs grid (see doc/ReferenceCounting.html)
subroutine, public rs_grid_zero(rs)
Initialize grid to zero.
Calculate the electrostatic energy by the Smooth Particle Ewald method.
Definition spme.F:14
pure subroutine, public virial_pair_force(pv_virial, f0, force, rab)
Computes the contribution to the stress tensor from two-body pair-wise forces.
Type defining parameters related to the simulation cell.
Definition cell_types.F:55
stores all the informations relevant to an mpi environment
contains all the informations needed by the fft based poisson solvers
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...