(git:06f838d)
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-2026 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 ! The potential update above adds both sides of the pair before the
330 ! final 0.5 energy prefactor is applied. Self-image pairs therefore
331 ! need the same virial prefactor as interatomic pairs.
332 pfr = -dfr*mcharge(iatom)*mcharge(jatom)
333 CALL virial_pair_force(virial%pv_virial, -pfr, rij, rij)
334 END IF
335 END IF
336
337 END DO
338 CALL neighbor_list_iterator_release(nl_iterator)
339
340 CALL timestop(handle)
341
342 END SUBROUTINE tb_ewald_overlap
343
344! **************************************************************************************************
345!> \brief ...
346!> \param ewald_env ...
347!> \param ewald_pw ...
348!> \param particle_set ...
349!> \param box ...
350!> \param gmcharge ...
351!> \param mcharge ...
352! **************************************************************************************************
353 SUBROUTINE tb_spme_zforce(ewald_env, ewald_pw, particle_set, box, gmcharge, mcharge)
354
355 TYPE(ewald_environment_type), POINTER :: ewald_env
356 TYPE(ewald_pw_type), POINTER :: ewald_pw
357 TYPE(particle_type), DIMENSION(:), INTENT(IN) :: particle_set
358 TYPE(cell_type), POINTER :: box
359 REAL(kind=dp), DIMENSION(:, :), INTENT(inout) :: gmcharge
360 REAL(kind=dp), DIMENSION(:), INTENT(in) :: mcharge
361
362 CHARACTER(len=*), PARAMETER :: routinen = 'tb_spme_zforce'
363
364 INTEGER :: handle, i, ipart, n, npart, o_spline, p1
365 INTEGER, ALLOCATABLE, DIMENSION(:, :) :: center
366 INTEGER, DIMENSION(3) :: npts
367 REAL(kind=dp) :: alpha, dvols, fat(3), fint, vgc
368 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: delta
369 REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rhos
370 TYPE(greens_fn_type), POINTER :: green
371 TYPE(mp_comm_type) :: group
372 TYPE(mp_para_env_type), POINTER :: para_env
373 TYPE(pw_c1d_gs_type), DIMENSION(3) :: dphi_g
374 TYPE(pw_c1d_gs_type), POINTER :: phi_g, rhob_g
375 TYPE(pw_grid_type), POINTER :: grid_spme
376 TYPE(pw_poisson_type), POINTER :: poisson_env
377 TYPE(pw_pool_type), POINTER :: pw_pool
378 TYPE(pw_r3d_rs_type), POINTER :: rhob_r
379 TYPE(realspace_grid_desc_type), POINTER :: rs_desc
380 TYPE(realspace_grid_type) :: rden, rpot
381 TYPE(realspace_grid_type), DIMENSION(3) :: drpot
382
383 CALL timeset(routinen, handle)
384 !-------------- INITIALISATION ---------------------
385 CALL ewald_env_get(ewald_env, alpha=alpha, o_spline=o_spline, group=group, &
386 para_env=para_env)
387 NULLIFY (green, poisson_env, pw_pool)
388 CALL ewald_pw_get(ewald_pw, pw_big_pool=pw_pool, rs_desc=rs_desc, &
389 poisson_env=poisson_env)
390 CALL pw_poisson_rebuild(poisson_env)
391 green => poisson_env%green_fft
392 grid_spme => pw_pool%pw_grid
393
394 CALL get_pw_grid_info(grid_spme, dvol=dvols, npts=npts)
395
396 npart = SIZE(particle_set)
397
398 n = o_spline
399 ALLOCATE (rhos(n, n, n))
400
401 CALL rs_grid_create(rden, rs_desc)
402 CALL rs_grid_set_box(grid_spme, rs=rden)
403 CALL rs_grid_zero(rden)
404
405 ALLOCATE (center(3, npart), delta(3, npart))
406 CALL get_center(particle_set, box, center, delta, npts, n)
407
408 !-------------- DENSITY CALCULATION ----------------
409 ipart = 0
410 DO
411 CALL set_list(particle_set, npart, center, p1, rden, ipart)
412 IF (p1 == 0) EXIT
413
414 ! calculate function on small boxes
415 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
416 is_shell=.false., unit_charge=.true.)
417 rhos(:, :, :) = rhos(:, :, :)*mcharge(p1)
418
419 ! add boxes to real space grid (big box)
420 CALL dg_sum_patch(rden, rhos, center(:, p1))
421 END DO
422
423 NULLIFY (rhob_r)
424 ALLOCATE (rhob_r)
425 CALL pw_pool%create_pw(rhob_r)
426
427 CALL transfer_rs2pw(rden, rhob_r)
428
429 ! transform density to G space and add charge function
430 NULLIFY (rhob_g)
431 ALLOCATE (rhob_g)
432 CALL pw_pool%create_pw(rhob_g)
433 CALL pw_transfer(rhob_r, rhob_g)
434 ! update charge function
435 CALL pw_multiply_with(rhob_g, green%p3m_charge)
436
437 !-------------- ELECTROSTATIC CALCULATION -----------
438
439 ! allocate intermediate arrays
440 DO i = 1, 3
441 CALL pw_pool%create_pw(dphi_g(i))
442 END DO
443 NULLIFY (phi_g)
444 ALLOCATE (phi_g)
445 CALL pw_pool%create_pw(phi_g)
446 CALL pw_poisson_solve(poisson_env, rhob_g, vgc, phi_g, dphi_g)
447
448 CALL rs_grid_create(rpot, rs_desc)
449 CALL rs_grid_set_box(grid_spme, rs=rpot)
450
451 CALL pw_pool%give_back_pw(rhob_g)
452 DEALLOCATE (rhob_g)
453
454 CALL rs_grid_zero(rpot)
455 CALL pw_multiply_with(phi_g, green%p3m_charge)
456 CALL pw_transfer(phi_g, rhob_r)
457 CALL pw_pool%give_back_pw(phi_g)
458 DEALLOCATE (phi_g)
459 CALL transfer_pw2rs(rpot, rhob_r)
460
461 !---------- END OF ELECTROSTATIC CALCULATION --------
462
463 ! move derivative of potential to real space grid and
464 ! multiply by charge function in g-space
465 DO i = 1, 3
466 CALL rs_grid_create(drpot(i), rs_desc)
467 CALL rs_grid_set_box(grid_spme, rs=drpot(i))
468 CALL pw_multiply_with(dphi_g(i), green%p3m_charge)
469 CALL pw_transfer(dphi_g(i), rhob_r)
470 CALL pw_pool%give_back_pw(dphi_g(i))
471 CALL transfer_pw2rs(drpot(i), rhob_r)
472 END DO
473 CALL pw_pool%give_back_pw(rhob_r)
474 DEALLOCATE (rhob_r)
475
476 !----------------- FORCE CALCULATION ----------------
477
478 ipart = 0
479 DO
480
481 CALL set_list(particle_set, npart, center, p1, rden, ipart)
482 IF (p1 == 0) EXIT
483
484 ! calculate function on small boxes
485 CALL get_patch(particle_set, delta, green, p1, rhos, is_core=.false., &
486 is_shell=.false., unit_charge=.true.)
487
488 CALL dg_sum_patch_force_1d(rpot, rhos, center(:, p1), fint)
489 gmcharge(p1, 1) = gmcharge(p1, 1) + fint*dvols
490
491 CALL dg_sum_patch_force_3d(drpot, rhos, center(:, p1), fat)
492 gmcharge(p1, 2) = gmcharge(p1, 2) - fat(1)*dvols
493 gmcharge(p1, 3) = gmcharge(p1, 3) - fat(2)*dvols
494 gmcharge(p1, 4) = gmcharge(p1, 4) - fat(3)*dvols
495
496 END DO
497
498 !--------------END OF FORCE CALCULATION -------------
499
500 !------------------CLEANING UP ----------------------
501
502 CALL rs_grid_release(rden)
503 CALL rs_grid_release(rpot)
504 DO i = 1, 3
505 CALL rs_grid_release(drpot(i))
506 END DO
507 DEALLOCATE (rhos)
508 DEALLOCATE (center, delta)
509
510 CALL timestop(handle)
511
512 END SUBROUTINE tb_spme_zforce
513
514END MODULE ewald_methods_tb
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:60
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 ...