(git:0de0cc2)
pw_poisson_methods.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \par History
10 !> 09.2005 created [fawzi]
11 !> \author fawzi
12 ! **************************************************************************************************
14 
15  USE cp_log_handling, ONLY: cp_to_string
16  USE dielectric_methods, ONLY: dielectric_compute
17  USE kinds, ONLY: dp
18  USE mathconstants, ONLY: fourpi
19  USE mt_util, ONLY: mt0d, &
20  mt1d, &
21  mt2d
27  USE ps_implicit_types, ONLY: mixed_bc, &
29  neumann_bc, &
35  USE ps_wavelet_types, ONLY: wavelet0d, &
36  wavelet1d, &
37  wavelet2d, &
38  wavelet3d, &
39  ps_wavelet_type
40  USE pw_grid_types, ONLY: pw_grid_type
41  USE pw_grids, ONLY: pw_grid_compare, &
44  USE pw_methods, ONLY: pw_copy, &
45  pw_derive, &
46  pw_integral_ab, &
47  pw_transfer, pw_multiply_with
48  USE pw_poisson_types, ONLY: &
52  pw_poisson_parameter_type, pw_poisson_periodic, pw_poisson_type, pw_poisson_wavelet
53  USE pw_pool_types, ONLY: pw_pool_p_type, &
54  pw_pool_type, &
55  pw_pools_copy, &
57  USE pw_types, ONLY: &
58  pw_r3d_rs_type, pw_c1d_gs_type, pw_r3d_rs_type
59 #include "../base/base_uses.f90"
60 
61  IMPLICIT NONE
62  PRIVATE
63 
64  LOGICAL, PRIVATE, PARAMETER :: debug_this_module = .true.
65  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pw_poisson_methods'
66 
67  PUBLIC :: pw_poisson_rebuild, &
68  pw_poisson_solve, pw_poisson_set
69 
70  INTEGER, PARAMETER :: use_rs_grid = 0, &
71  use_gs_grid = 1
72 
73  INTERFACE pw_poisson_rebuild
74  MODULE PROCEDURE pw_poisson_rebuild_nodens
75  MODULE PROCEDURE pw_poisson_rebuild_c1d_gs, pw_poisson_rebuild_r3d_rs
76  END INTERFACE
77 
78  INTERFACE pw_poisson_solve
79  MODULE PROCEDURE pw_poisson_solve_nov_nodv_r3d_rs
80  MODULE PROCEDURE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs
81  MODULE PROCEDURE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs
82  MODULE PROCEDURE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs
83  MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs
84  MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs
85  MODULE PROCEDURE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs
86  MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs
87  MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs
88  MODULE PROCEDURE pw_poisson_solve_nov_nodv_c1d_gs
89  MODULE PROCEDURE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs
90  MODULE PROCEDURE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs
91  MODULE PROCEDURE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs
92  MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs
93  MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs
94  MODULE PROCEDURE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs
95  MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs
96  MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs
97  END INTERFACE
98 
99 CONTAINS
100 
101 ! **************************************************************************************************
102 !> \brief removes all the object created from the parameters pw_pools and cell
103 !> and used to solve the poisson equation like the green function and
104 !> all the things allocated in pw_poisson_rebuild
105 !> \param poisson_env ...
106 !> \par History
107 !> none
108 ! **************************************************************************************************
109  SUBROUTINE pw_poisson_cleanup(poisson_env)
110  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
111 
112  TYPE(pw_pool_type), POINTER :: pw_pool
113 
114  NULLIFY (pw_pool)
115  IF (ASSOCIATED(poisson_env%pw_pools)) THEN
116  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
117  END IF
118  IF (ASSOCIATED(poisson_env%green_fft)) THEN
119  CALL pw_green_release(poisson_env%green_fft, pw_pool=pw_pool)
120  DEALLOCATE (poisson_env%green_fft)
121  END IF
122  poisson_env%rebuild = .true.
123 
124  END SUBROUTINE pw_poisson_cleanup
125 
126 ! **************************************************************************************************
127 !> \brief checks if pw_poisson_rebuild has to be called and calls it if needed
128 !> \param poisson_env the object to be checked
129 !> \author fawzi
130 ! **************************************************************************************************
131  SUBROUTINE pw_poisson_check(poisson_env)
132  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
133 
134  LOGICAL :: rebuild
135  TYPE(greens_fn_type), POINTER :: green
136  TYPE(ps_wavelet_type), POINTER :: wavelet
137 
138  cpassert(ASSOCIATED(poisson_env%pw_pools))
139  cpassert(poisson_env%pw_level >= lbound(poisson_env%pw_pools, 1))
140  cpassert(poisson_env%pw_level <= ubound(poisson_env%pw_pools, 1))
141  green => poisson_env%green_fft
142  wavelet => poisson_env%wavelet
143  rebuild = poisson_env%rebuild
144  rebuild = rebuild .OR. (poisson_env%method /= poisson_env%parameters%solver) &
145  .OR. .NOT. ASSOCIATED(green)
146  poisson_env%method = poisson_env%parameters%solver
147 
148  IF (poisson_env%method == pw_poisson_wavelet) THEN
149  poisson_env%used_grid = use_rs_grid
150  ELSE
151  poisson_env%used_grid = use_gs_grid
152  END IF
153  IF (.NOT. rebuild) THEN
154  IF (poisson_env%parameters%ewald_type == do_ewald_spme) THEN
155  rebuild = (poisson_env%parameters%ewald_alpha /= green%p3m_alpha) .OR. rebuild
156  rebuild = (poisson_env%parameters%ewald_o_spline /= green%p3m_order) .OR. rebuild
157  END IF
158  SELECT CASE (poisson_env%method)
159  CASE (pw_poisson_analytic)
160  SELECT CASE (green%method)
162  CASE default
163  rebuild = .true.
164  END SELECT
165  CASE (pw_poisson_mt)
166  SELECT CASE (green%method)
167  CASE (mt0d, mt1d, mt2d)
168  CASE default
169  rebuild = .true.
170  END SELECT
171  rebuild = (poisson_env%parameters%mt_alpha /= green%mt_alpha) .OR. rebuild
172  CASE (pw_poisson_wavelet)
173  rebuild = (poisson_env%parameters%wavelet_scf_type /= wavelet%itype_scf) .OR. rebuild
174  CASE default
175  cpabort("")
176  END SELECT
177  END IF
178  IF (rebuild) THEN
179  poisson_env%rebuild = .true.
180  CALL pw_poisson_cleanup(poisson_env)
181  END IF
182  END SUBROUTINE pw_poisson_check
183 
184 ! **************************************************************************************************
185 !> \brief rebuilds all the internal values needed to use the poisson solver
186 !> \param poisson_env the environment to rebuild
187 !> \param density ...
188 !> \author fawzi
189 !> \note
190 !> rebuilds if poisson_env%rebuild is true
191 ! **************************************************************************************************
192  SUBROUTINE pw_poisson_rebuild_nodens(poisson_env)
193  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
194 
195  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_rebuild'
196 
197  INTEGER :: handle
198 
199  CALL timeset(routinen, handle)
200 
201  cpassert(ASSOCIATED(poisson_env%pw_pools))
202 
203  IF (poisson_env%rebuild) THEN
204  CALL pw_poisson_cleanup(poisson_env)
205  SELECT CASE (poisson_env%parameters%solver)
207  ALLOCATE (poisson_env%green_fft)
208  CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
209  pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
210  poisson_params=poisson_env%parameters, &
211  mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
212  dct_pw_grid=poisson_env%dct_pw_grid)
213  CASE (pw_poisson_wavelet)
214  cpabort("Wavelet solver requires a density!")
215  CASE (pw_poisson_implicit)
216  ALLOCATE (poisson_env%green_fft)
217  CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
218  pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
219  poisson_params=poisson_env%parameters, &
220  mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
221  dct_pw_grid=poisson_env%dct_pw_grid)
222  CALL ps_implicit_create(poisson_env%pw_pools(poisson_env%pw_level)%pool, &
223  poisson_env%parameters, &
224  poisson_env%dct_pw_grid, &
225  poisson_env%green_fft, poisson_env%implicit_env)
226  CASE (pw_poisson_none)
227  CASE default
228  cpabort("Unknown Poisson solver")
229  END SELECT
230  poisson_env%rebuild = .false.
231  END IF
232 
233  CALL timestop(handle)
234 
235  END SUBROUTINE pw_poisson_rebuild_nodens
236 
237 ! **************************************************************************************************
238 !> \brief rebuilds all the internal values needed to use the poisson solver
239 !> \param poisson_env the environment to rebuild
240 !> \param density ...
241 !> \author fawzi
242 !> \note
243 !> rebuilds if poisson_env%rebuild is true
244 ! **************************************************************************************************
245  SUBROUTINE pw_poisson_rebuild_r3d_rs (poisson_env, density)
246  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
247  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
248 
249  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_rebuild'
250 
251  INTEGER :: handle
252 
253  CALL timeset(routinen, handle)
254 
255  cpassert(ASSOCIATED(poisson_env%pw_pools))
256 
257  IF (poisson_env%rebuild) THEN
258  CALL pw_poisson_cleanup(poisson_env)
259  SELECT CASE (poisson_env%parameters%solver)
261  ALLOCATE (poisson_env%green_fft)
262  CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
263  pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
264  poisson_params=poisson_env%parameters, &
265  mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
266  dct_pw_grid=poisson_env%dct_pw_grid)
267  CASE (pw_poisson_wavelet)
268  cpassert(ASSOCIATED(density%pw_grid))
269  CALL ps_wavelet_create(poisson_env%parameters, poisson_env%wavelet, &
270  density%pw_grid)
271  CASE (pw_poisson_implicit)
272  ALLOCATE (poisson_env%green_fft)
273  CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
274  pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
275  poisson_params=poisson_env%parameters, &
276  mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
277  dct_pw_grid=poisson_env%dct_pw_grid)
278  CALL ps_implicit_create(poisson_env%pw_pools(poisson_env%pw_level)%pool, &
279  poisson_env%parameters, &
280  poisson_env%dct_pw_grid, &
281  poisson_env%green_fft, poisson_env%implicit_env)
282  CASE (pw_poisson_none)
283  CASE default
284  cpabort("Unknown Poisson solver")
285  END SELECT
286  poisson_env%rebuild = .false.
287  END IF
288 
289  CALL timestop(handle)
290 
291  END SUBROUTINE pw_poisson_rebuild_r3d_rs
292 ! **************************************************************************************************
293 !> \brief rebuilds all the internal values needed to use the poisson solver
294 !> \param poisson_env the environment to rebuild
295 !> \param density ...
296 !> \author fawzi
297 !> \note
298 !> rebuilds if poisson_env%rebuild is true
299 ! **************************************************************************************************
300  SUBROUTINE pw_poisson_rebuild_c1d_gs (poisson_env, density)
301  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
302  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
303 
304  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_rebuild'
305 
306  INTEGER :: handle
307 
308  CALL timeset(routinen, handle)
309 
310  cpassert(ASSOCIATED(poisson_env%pw_pools))
311 
312  IF (poisson_env%rebuild) THEN
313  CALL pw_poisson_cleanup(poisson_env)
314  SELECT CASE (poisson_env%parameters%solver)
316  ALLOCATE (poisson_env%green_fft)
317  CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
318  pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
319  poisson_params=poisson_env%parameters, &
320  mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
321  dct_pw_grid=poisson_env%dct_pw_grid)
322  CASE (pw_poisson_wavelet)
323  cpassert(ASSOCIATED(density%pw_grid))
324  CALL ps_wavelet_create(poisson_env%parameters, poisson_env%wavelet, &
325  density%pw_grid)
326  CASE (pw_poisson_implicit)
327  ALLOCATE (poisson_env%green_fft)
328  CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
329  pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
330  poisson_params=poisson_env%parameters, &
331  mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
332  dct_pw_grid=poisson_env%dct_pw_grid)
333  CALL ps_implicit_create(poisson_env%pw_pools(poisson_env%pw_level)%pool, &
334  poisson_env%parameters, &
335  poisson_env%dct_pw_grid, &
336  poisson_env%green_fft, poisson_env%implicit_env)
337  CASE (pw_poisson_none)
338  CASE default
339  cpabort("Unknown Poisson solver")
340  END SELECT
341  poisson_env%rebuild = .false.
342  END IF
343 
344  CALL timestop(handle)
345 
346  END SUBROUTINE pw_poisson_rebuild_c1d_gs
347 
348 ! **************************************************************************************************
349 !> \brief Solve Poisson equation in a plane wave basis set
350 !> Obtains electrostatic potential and its derivatives with respect to r
351 !> from the density
352 !> \param poisson_env ...
353 !> \param density ...
354 !> \param ehartree ...
355 !> \param h_stress ...
356 !> \param rho_core ...
357 !> \param greenfn ...
358 !> \param aux_density Hartree energy and stress tensor between 2 different densities
359 !> \par History
360 !> JGH (13-Mar-2001) : completely revised
361 !> \author apsi
362 ! **************************************************************************************************
363  SUBROUTINE pw_poisson_solve_nov_nodv_r3d_rs (poisson_env, density, ehartree, &
364  h_stress, rho_core, greenfn, aux_density)
365 
366  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
367  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
368  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
369  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
370  OPTIONAL :: h_stress
371  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
372  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
373 
374  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
375 
376  INTEGER :: handle
377  LOGICAL :: has_dielectric
378  TYPE(pw_grid_type), POINTER :: pw_grid
379  TYPE(pw_pool_type), POINTER :: pw_pool
380  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
381  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
382 
383  CALL timeset(routinen, handle)
384 
385  CALL pw_poisson_rebuild(poisson_env, density)
386 
387  has_dielectric = poisson_env%parameters%has_dielectric
388 
389  ! point pw
390  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
391  pw_grid => pw_pool%pw_grid
392  ! density in G space
393  CALL pw_pool%create_pw(rhog)
394  IF (PRESENT(aux_density)) THEN
395  CALL pw_pool%create_pw(rhog_aux)
396  END IF
397 
398  SELECT CASE (poisson_env%used_grid)
399  CASE (use_gs_grid)
400 
401  SELECT CASE (poisson_env%green_fft%method)
403 
404  CALL pw_transfer(density, rhog)
405  IF (PRESENT(aux_density)) THEN
406  CALL pw_transfer(aux_density, rhog_aux)
407  END IF
408  IF (PRESENT(ehartree)) THEN
409  CALL pw_pool%create_pw(tmpg)
410  CALL pw_copy(rhog, tmpg)
411  END IF
412  IF (PRESENT(greenfn)) THEN
413  influence_fn = greenfn
414  ELSE
415  influence_fn = poisson_env%green_fft%influence_fn
416  END IF
417  CALL pw_multiply_with(rhog, influence_fn)
418  IF (PRESENT(aux_density)) THEN
419  CALL pw_multiply_with(rhog_aux, influence_fn)
420  END IF
421  IF (PRESENT(ehartree)) THEN
422  IF (PRESENT(aux_density)) THEN
423  ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
424  ELSE
425  ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
426  END IF
427  CALL pw_pool%give_back_pw(tmpg)
428  END IF
429 
430  CASE (ps_implicit)
431 
432  IF (PRESENT(h_stress)) THEN
433  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
434  END IF
435 
436  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
437  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
439  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
440  poisson_env%diel_rs_grid, &
441  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
442  density, rho_core=rho_core)
443  CASE (neumann_bc, mixed_bc)
444  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
445  poisson_env%diel_rs_grid, &
446  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
447  poisson_env%dct_pw_grid, &
448  poisson_env%parameters%ps_implicit_params%neumann_directions, &
449  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
450  poisson_env%implicit_env%dct_env%dests_expand, &
451  poisson_env%implicit_env%dct_env%srcs_expand, &
452  poisson_env%implicit_env%dct_env%flipg_stat, &
453  poisson_env%implicit_env%dct_env%bounds_shftd, &
454  density, rho_core=rho_core)
455  END SELECT
456  END IF
457 
458  CALL pw_pool%create_pw(rhor)
459  CALL pw_pool%create_pw(vhartree_rs)
460  CALL pw_transfer(density, rhor)
461 
462  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
463  CASE (periodic_bc)
464  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
465  ehartree=ehartree)
466  CASE (neumann_bc)
467  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
468  ehartree=ehartree)
469  CASE (mixed_periodic_bc)
470  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
471  electric_enthalpy=ehartree)
472  CASE (mixed_bc)
473  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
474  electric_enthalpy=ehartree)
475  END SELECT
476 
477  IF (PRESENT(aux_density)) THEN
478  CALL pw_transfer(aux_density, rhor)
479  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
480  END IF
481 
482  CALL pw_pool%give_back_pw(rhor)
483  CALL pw_pool%give_back_pw(vhartree_rs)
484 
485  CASE DEFAULT
486  CALL cp_abort(__location__, &
487  "unknown poisson method "// &
488  cp_to_string(poisson_env%green_fft%method))
489  END SELECT
490 
491  CASE (use_rs_grid)
492 
493  CALL pw_pool%create_pw(rhor)
494  CALL pw_transfer(density, rhor)
495  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
496  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
497  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
498  IF (PRESENT(ehartree)) THEN
499  IF (PRESENT(aux_density)) THEN
500  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
501  ELSE
502  ehartree = 0.5_dp*pw_integral_ab(density, rhor)
503  END IF
504  END IF
505  IF (PRESENT(h_stress)) THEN
506  CALL pw_transfer(rhor, rhog)
507  IF (PRESENT(aux_density)) THEN
508  CALL pw_transfer(aux_density, rhor)
509  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
510  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
511  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
512  CALL pw_transfer(rhor, rhog_aux)
513  END IF
514  END IF
515  CALL pw_pool%give_back_pw(rhor)
516 
517  END SELECT
518 
519  IF (PRESENT(aux_density)) THEN
520  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
521  ELSE
522  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
523  END IF
524 
525  CALL pw_pool%give_back_pw(rhog)
526  IF (PRESENT(aux_density)) THEN
527  CALL pw_pool%give_back_pw(rhog_aux)
528  END IF
529 
530  CALL timestop(handle)
531 
532  END SUBROUTINE pw_poisson_solve_nov_nodv_r3d_rs
533 ! **************************************************************************************************
534 !> \brief Solve Poisson equation in a plane wave basis set
535 !> Obtains electrostatic potential and its derivatives with respect to r
536 !> from the density
537 !> \param poisson_env ...
538 !> \param density ...
539 !> \param ehartree ...
540 !> \param h_stress ...
541 !> \param rho_core ...
542 !> \param greenfn ...
543 !> \param aux_density Hartree energy and stress tensor between 2 different densities
544 !> \par History
545 !> JGH (13-Mar-2001) : completely revised
546 !> \author apsi
547 ! **************************************************************************************************
548  SUBROUTINE pw_poisson_solve_nov_nodv_c1d_gs (poisson_env, density, ehartree, &
549  h_stress, rho_core, greenfn, aux_density)
550 
551  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
552  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
553  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
554  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
555  OPTIONAL :: h_stress
556  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
557  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
558 
559  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
560 
561  INTEGER :: handle
562  LOGICAL :: has_dielectric
563  TYPE(pw_grid_type), POINTER :: pw_grid
564  TYPE(pw_pool_type), POINTER :: pw_pool
565  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
566  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
567 
568  CALL timeset(routinen, handle)
569 
570  CALL pw_poisson_rebuild(poisson_env, density)
571 
572  has_dielectric = poisson_env%parameters%has_dielectric
573 
574  ! point pw
575  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
576  pw_grid => pw_pool%pw_grid
577  ! density in G space
578  CALL pw_pool%create_pw(rhog)
579  IF (PRESENT(aux_density)) THEN
580  CALL pw_pool%create_pw(rhog_aux)
581  END IF
582 
583  SELECT CASE (poisson_env%used_grid)
584  CASE (use_gs_grid)
585 
586  SELECT CASE (poisson_env%green_fft%method)
588 
589  CALL pw_transfer(density, rhog)
590  IF (PRESENT(aux_density)) THEN
591  CALL pw_transfer(aux_density, rhog_aux)
592  END IF
593  IF (PRESENT(ehartree)) THEN
594  CALL pw_pool%create_pw(tmpg)
595  CALL pw_copy(rhog, tmpg)
596  END IF
597  IF (PRESENT(greenfn)) THEN
598  influence_fn = greenfn
599  ELSE
600  influence_fn = poisson_env%green_fft%influence_fn
601  END IF
602  CALL pw_multiply_with(rhog, influence_fn)
603  IF (PRESENT(aux_density)) THEN
604  CALL pw_multiply_with(rhog_aux, influence_fn)
605  END IF
606  IF (PRESENT(ehartree)) THEN
607  IF (PRESENT(aux_density)) THEN
608  ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
609  ELSE
610  ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
611  END IF
612  CALL pw_pool%give_back_pw(tmpg)
613  END IF
614 
615  CASE (ps_implicit)
616 
617  IF (PRESENT(h_stress)) THEN
618  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
619  END IF
620 
621  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
622  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
624  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
625  poisson_env%diel_rs_grid, &
626  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
627  density, rho_core=rho_core)
628  CASE (neumann_bc, mixed_bc)
629  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
630  poisson_env%diel_rs_grid, &
631  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
632  poisson_env%dct_pw_grid, &
633  poisson_env%parameters%ps_implicit_params%neumann_directions, &
634  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
635  poisson_env%implicit_env%dct_env%dests_expand, &
636  poisson_env%implicit_env%dct_env%srcs_expand, &
637  poisson_env%implicit_env%dct_env%flipg_stat, &
638  poisson_env%implicit_env%dct_env%bounds_shftd, &
639  density, rho_core=rho_core)
640  END SELECT
641  END IF
642 
643  CALL pw_pool%create_pw(rhor)
644  CALL pw_pool%create_pw(vhartree_rs)
645  CALL pw_transfer(density, rhor)
646 
647  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
648  CASE (periodic_bc)
649  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
650  ehartree=ehartree)
651  CASE (neumann_bc)
652  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
653  ehartree=ehartree)
654  CASE (mixed_periodic_bc)
655  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
656  electric_enthalpy=ehartree)
657  CASE (mixed_bc)
658  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
659  electric_enthalpy=ehartree)
660  END SELECT
661 
662  IF (PRESENT(aux_density)) THEN
663  CALL pw_transfer(aux_density, rhor)
664  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
665  END IF
666 
667  CALL pw_pool%give_back_pw(rhor)
668  CALL pw_pool%give_back_pw(vhartree_rs)
669 
670  CASE DEFAULT
671  CALL cp_abort(__location__, &
672  "unknown poisson method "// &
673  cp_to_string(poisson_env%green_fft%method))
674  END SELECT
675 
676  CASE (use_rs_grid)
677 
678  CALL pw_pool%create_pw(rhor)
679  CALL pw_transfer(density, rhor)
680  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
681  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
682  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
683  IF (PRESENT(ehartree)) THEN
684  IF (PRESENT(aux_density)) THEN
685  IF (.NOT. PRESENT(h_stress)) CALL pw_pool%create_pw(rhog)
686  CALL pw_transfer(rhor, rhog)
687  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
688  IF (.NOT. PRESENT(h_stress)) CALL pw_pool%give_back_pw(rhog)
689  ELSE
690  IF (.NOT. PRESENT(h_stress)) CALL pw_pool%create_pw(rhog)
691  CALL pw_transfer(rhor, rhog)
692  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
693  IF (.NOT. PRESENT(h_stress)) CALL pw_pool%give_back_pw(rhog)
694  END IF
695  END IF
696  IF (PRESENT(h_stress)) THEN
697  CALL pw_transfer(rhor, rhog)
698  IF (PRESENT(aux_density)) THEN
699  CALL pw_transfer(aux_density, rhor)
700  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
701  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
702  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
703  CALL pw_transfer(rhor, rhog_aux)
704  END IF
705  END IF
706  CALL pw_pool%give_back_pw(rhor)
707 
708  END SELECT
709 
710  IF (PRESENT(aux_density)) THEN
711  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
712  ELSE
713  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
714  END IF
715 
716  CALL pw_pool%give_back_pw(rhog)
717  IF (PRESENT(aux_density)) THEN
718  CALL pw_pool%give_back_pw(rhog_aux)
719  END IF
720 
721  CALL timestop(handle)
722 
723  END SUBROUTINE pw_poisson_solve_nov_nodv_c1d_gs
724 
725 ! **************************************************************************************************
726 !> \brief Solve Poisson equation in a plane wave basis set
727 !> Obtains electrostatic potential and its derivatives with respect to r
728 !> from the density
729 !> \param poisson_env ...
730 !> \param density ...
731 !> \param ehartree ...
732 !> \param vhartree ...
733 !> \param h_stress ...
734 !> \param rho_core ...
735 !> \param greenfn ...
736 !> \param aux_density Hartree energy and stress tensor between 2 different densities
737 !> \par History
738 !> JGH (13-Mar-2001) : completely revised
739 !> \author apsi
740 ! **************************************************************************************************
741  SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
742  h_stress, rho_core, greenfn, aux_density)
743 
744  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
745  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
746  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
747  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: vhartree
748  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
749  OPTIONAL :: h_stress
750  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
751  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
752 
753  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
754 
755  INTEGER :: handle
756  LOGICAL :: has_dielectric
757  TYPE(pw_grid_type), POINTER :: pw_grid
758  TYPE(pw_pool_type), POINTER :: pw_pool
759  TYPE(pw_r3d_rs_type) :: &
760  rhor, vhartree_rs
761  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
762 
763  CALL timeset(routinen, handle)
764 
765  CALL pw_poisson_rebuild(poisson_env, density)
766 
767  has_dielectric = poisson_env%parameters%has_dielectric
768 
769  ! point pw
770  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
771  pw_grid => pw_pool%pw_grid
772  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
773  cpabort("vhartree has a different grid than the poisson solver")
774  ! density in G space
775  CALL pw_pool%create_pw(rhog)
776  IF (PRESENT(aux_density)) THEN
777  CALL pw_pool%create_pw(rhog_aux)
778  END IF
779 
780  SELECT CASE (poisson_env%used_grid)
781  CASE (use_gs_grid)
782 
783  SELECT CASE (poisson_env%green_fft%method)
785 
786  CALL pw_transfer(density, rhog)
787  IF (PRESENT(aux_density)) THEN
788  CALL pw_transfer(aux_density, rhog_aux)
789  END IF
790  IF (PRESENT(greenfn)) THEN
791  influence_fn = greenfn
792  ELSE
793  influence_fn = poisson_env%green_fft%influence_fn
794  END IF
795  CALL pw_multiply_with(rhog, influence_fn)
796  IF (PRESENT(aux_density)) THEN
797  CALL pw_multiply_with(rhog_aux, influence_fn)
798  END IF
799  CALL pw_transfer(rhog, vhartree)
800  IF (PRESENT(ehartree)) THEN
801  IF (PRESENT(aux_density)) THEN
802  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
803  ELSE
804  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
805  END IF
806  END IF
807 
808  CASE (ps_implicit)
809  IF (PRESENT(h_stress)) THEN
810  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
811  END IF
812 
813  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
814  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
816  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
817  poisson_env%diel_rs_grid, &
818  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
819  density, rho_core=rho_core)
820  CASE (neumann_bc, mixed_bc)
821  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
822  poisson_env%diel_rs_grid, &
823  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
824  poisson_env%dct_pw_grid, &
825  poisson_env%parameters%ps_implicit_params%neumann_directions, &
826  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
827  poisson_env%implicit_env%dct_env%dests_expand, &
828  poisson_env%implicit_env%dct_env%srcs_expand, &
829  poisson_env%implicit_env%dct_env%flipg_stat, &
830  poisson_env%implicit_env%dct_env%bounds_shftd, &
831  density, rho_core=rho_core)
832  END SELECT
833  END IF
834 
835  CALL pw_pool%create_pw(rhor)
836  CALL pw_pool%create_pw(vhartree_rs)
837  CALL pw_transfer(density, rhor)
838 
839  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
840  CASE (periodic_bc)
841  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
842  ehartree=ehartree)
843  CASE (neumann_bc)
844  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
845  ehartree=ehartree)
846  CASE (mixed_periodic_bc)
847  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
848  electric_enthalpy=ehartree)
849  CASE (mixed_bc)
850  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
851  electric_enthalpy=ehartree)
852  END SELECT
853 
854  IF (PRESENT(aux_density)) THEN
855  CALL pw_transfer(aux_density, rhor)
856  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
857  END IF
858 
859  CALL pw_transfer(vhartree_rs, vhartree)
860 
861  CALL pw_pool%give_back_pw(rhor)
862  CALL pw_pool%give_back_pw(vhartree_rs)
863 
864  CASE DEFAULT
865  CALL cp_abort(__location__, &
866  "unknown poisson method "// &
867  cp_to_string(poisson_env%green_fft%method))
868  END SELECT
869 
870  CASE (use_rs_grid)
871 
872  CALL pw_pool%create_pw(rhor)
873  CALL pw_transfer(density, rhor)
874  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
875  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
876  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
877  CALL pw_transfer(rhor, vhartree)
878  IF (PRESENT(ehartree)) THEN
879  IF (PRESENT(aux_density)) THEN
880  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
881  ELSE
882  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
883  END IF
884  END IF
885  IF (PRESENT(h_stress)) THEN
886  CALL pw_transfer(rhor, rhog)
887  IF (PRESENT(aux_density)) THEN
888  CALL pw_transfer(aux_density, rhor)
889  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
890  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
891  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
892  CALL pw_transfer(rhor, rhog_aux)
893  END IF
894  END IF
895  CALL pw_pool%give_back_pw(rhor)
896 
897  END SELECT
898 
899  IF (PRESENT(aux_density)) THEN
900  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
901  ELSE
902  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
903  END IF
904 
905  CALL pw_pool%give_back_pw(rhog)
906  IF (PRESENT(aux_density)) THEN
907  CALL pw_pool%give_back_pw(rhog_aux)
908  END IF
909 
910  CALL timestop(handle)
911 
912  END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs
913 ! **************************************************************************************************
914 !> \brief Solve Poisson equation in a plane wave basis set
915 !> Obtains electrostatic potential and its derivatives with respect to r
916 !> from the density
917 !> \param poisson_env ...
918 !> \param density ...
919 !> \param ehartree ...
920 !> \param vhartree ...
921 !> \param h_stress ...
922 !> \param rho_core ...
923 !> \param greenfn ...
924 !> \param aux_density Hartree energy and stress tensor between 2 different densities
925 !> \par History
926 !> JGH (13-Mar-2001) : completely revised
927 !> \author apsi
928 ! **************************************************************************************************
929  SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
930  h_stress, rho_core, greenfn, aux_density)
931 
932  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
933  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
934  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
935  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: vhartree
936  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
937  OPTIONAL :: h_stress
938  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
939  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
940 
941  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
942 
943  INTEGER :: handle
944  LOGICAL :: has_dielectric
945  TYPE(pw_grid_type), POINTER :: pw_grid
946  TYPE(pw_pool_type), POINTER :: pw_pool
947  TYPE(pw_r3d_rs_type) :: &
948  rhor, vhartree_rs
949  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
950 
951  CALL timeset(routinen, handle)
952 
953  CALL pw_poisson_rebuild(poisson_env, density)
954 
955  has_dielectric = poisson_env%parameters%has_dielectric
956 
957  ! point pw
958  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
959  pw_grid => pw_pool%pw_grid
960  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
961  cpabort("vhartree has a different grid than the poisson solver")
962  ! density in G space
963  CALL pw_pool%create_pw(rhog)
964  IF (PRESENT(aux_density)) THEN
965  CALL pw_pool%create_pw(rhog_aux)
966  END IF
967 
968  SELECT CASE (poisson_env%used_grid)
969  CASE (use_gs_grid)
970 
971  SELECT CASE (poisson_env%green_fft%method)
973 
974  CALL pw_transfer(density, rhog)
975  IF (PRESENT(aux_density)) THEN
976  CALL pw_transfer(aux_density, rhog_aux)
977  END IF
978  IF (PRESENT(greenfn)) THEN
979  influence_fn = greenfn
980  ELSE
981  influence_fn = poisson_env%green_fft%influence_fn
982  END IF
983  CALL pw_multiply_with(rhog, influence_fn)
984  IF (PRESENT(aux_density)) THEN
985  CALL pw_multiply_with(rhog_aux, influence_fn)
986  END IF
987  CALL pw_transfer(rhog, vhartree)
988  IF (PRESENT(ehartree)) THEN
989  IF (PRESENT(aux_density)) THEN
990  CALL pw_transfer(aux_density, rhog)
991  ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
992  ELSE
993  CALL pw_transfer(density, rhog)
994  ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
995  END IF
996  END IF
997 
998  CASE (ps_implicit)
999  IF (PRESENT(h_stress)) THEN
1000  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
1001  END IF
1002 
1003  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
1004  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1006  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1007  poisson_env%diel_rs_grid, &
1008  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1009  density, rho_core=rho_core)
1010  CASE (neumann_bc, mixed_bc)
1011  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1012  poisson_env%diel_rs_grid, &
1013  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1014  poisson_env%dct_pw_grid, &
1015  poisson_env%parameters%ps_implicit_params%neumann_directions, &
1016  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1017  poisson_env%implicit_env%dct_env%dests_expand, &
1018  poisson_env%implicit_env%dct_env%srcs_expand, &
1019  poisson_env%implicit_env%dct_env%flipg_stat, &
1020  poisson_env%implicit_env%dct_env%bounds_shftd, &
1021  density, rho_core=rho_core)
1022  END SELECT
1023  END IF
1024 
1025  CALL pw_pool%create_pw(rhor)
1026  CALL pw_pool%create_pw(vhartree_rs)
1027  CALL pw_transfer(density, rhor)
1028 
1029  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1030  CASE (periodic_bc)
1031  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
1032  ehartree=ehartree)
1033  CASE (neumann_bc)
1034  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
1035  ehartree=ehartree)
1036  CASE (mixed_periodic_bc)
1037  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
1038  electric_enthalpy=ehartree)
1039  CASE (mixed_bc)
1040  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
1041  electric_enthalpy=ehartree)
1042  END SELECT
1043 
1044  IF (PRESENT(aux_density)) THEN
1045  CALL pw_transfer(aux_density, rhor)
1046  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1047  END IF
1048 
1049  CALL pw_transfer(vhartree_rs, vhartree)
1050 
1051  CALL pw_pool%give_back_pw(rhor)
1052  CALL pw_pool%give_back_pw(vhartree_rs)
1053 
1054  CASE DEFAULT
1055  CALL cp_abort(__location__, &
1056  "unknown poisson method "// &
1057  cp_to_string(poisson_env%green_fft%method))
1058  END SELECT
1059 
1060  CASE (use_rs_grid)
1061 
1062  CALL pw_pool%create_pw(rhor)
1063  CALL pw_transfer(density, rhor)
1064  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1065  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1066  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1067  CALL pw_transfer(rhor, vhartree)
1068  IF (PRESENT(ehartree)) THEN
1069  IF (PRESENT(aux_density)) THEN
1070  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
1071  ELSE
1072  ehartree = 0.5_dp*pw_integral_ab(density, rhor)
1073  END IF
1074  END IF
1075  IF (PRESENT(h_stress)) THEN
1076  CALL pw_transfer(rhor, rhog)
1077  IF (PRESENT(aux_density)) THEN
1078  CALL pw_transfer(aux_density, rhor)
1079  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1080  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1081  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1082  CALL pw_transfer(rhor, rhog_aux)
1083  END IF
1084  END IF
1085  CALL pw_pool%give_back_pw(rhor)
1086 
1087  END SELECT
1088 
1089  IF (PRESENT(aux_density)) THEN
1090  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1091  ELSE
1092  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
1093  END IF
1094 
1095  CALL pw_pool%give_back_pw(rhog)
1096  IF (PRESENT(aux_density)) THEN
1097  CALL pw_pool%give_back_pw(rhog_aux)
1098  END IF
1099 
1100  CALL timestop(handle)
1101 
1102  END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs
1103 ! **************************************************************************************************
1104 !> \brief Solve Poisson equation in a plane wave basis set
1105 !> Obtains electrostatic potential and its derivatives with respect to r
1106 !> from the density
1107 !> \param poisson_env ...
1108 !> \param density ...
1109 !> \param ehartree ...
1110 !> \param vhartree ...
1111 !> \param h_stress ...
1112 !> \param rho_core ...
1113 !> \param greenfn ...
1114 !> \param aux_density Hartree energy and stress tensor between 2 different densities
1115 !> \par History
1116 !> JGH (13-Mar-2001) : completely revised
1117 !> \author apsi
1118 ! **************************************************************************************************
1119  SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
1120  h_stress, rho_core, greenfn, aux_density)
1121 
1122  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
1123  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
1124  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
1125  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: vhartree
1126  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
1127  OPTIONAL :: h_stress
1128  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
1129  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
1130 
1131  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
1132 
1133  INTEGER :: handle
1134  LOGICAL :: has_dielectric
1135  TYPE(pw_grid_type), POINTER :: pw_grid
1136  TYPE(pw_pool_type), POINTER :: pw_pool
1137  TYPE(pw_r3d_rs_type) :: &
1138  rhor, vhartree_rs
1139  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
1140 
1141  CALL timeset(routinen, handle)
1142 
1143  CALL pw_poisson_rebuild(poisson_env, density)
1144 
1145  has_dielectric = poisson_env%parameters%has_dielectric
1146 
1147  ! point pw
1148  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1149  pw_grid => pw_pool%pw_grid
1150  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
1151  cpabort("vhartree has a different grid than the poisson solver")
1152  ! density in G space
1153  CALL pw_pool%create_pw(rhog)
1154  IF (PRESENT(aux_density)) THEN
1155  CALL pw_pool%create_pw(rhog_aux)
1156  END IF
1157 
1158  SELECT CASE (poisson_env%used_grid)
1159  CASE (use_gs_grid)
1160 
1161  SELECT CASE (poisson_env%green_fft%method)
1163 
1164  CALL pw_transfer(density, rhog)
1165  IF (PRESENT(aux_density)) THEN
1166  CALL pw_transfer(aux_density, rhog_aux)
1167  END IF
1168  IF (PRESENT(greenfn)) THEN
1169  influence_fn = greenfn
1170  ELSE
1171  influence_fn = poisson_env%green_fft%influence_fn
1172  END IF
1173  CALL pw_multiply_with(rhog, influence_fn)
1174  IF (PRESENT(aux_density)) THEN
1175  CALL pw_multiply_with(rhog_aux, influence_fn)
1176  END IF
1177  CALL pw_transfer(rhog, vhartree)
1178  IF (PRESENT(ehartree)) THEN
1179  IF (PRESENT(aux_density)) THEN
1180  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
1181  ELSE
1182  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
1183  END IF
1184  END IF
1185 
1186  CASE (ps_implicit)
1187  IF (PRESENT(h_stress)) THEN
1188  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
1189  END IF
1190 
1191  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
1192  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1194  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1195  poisson_env%diel_rs_grid, &
1196  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1197  density, rho_core=rho_core)
1198  CASE (neumann_bc, mixed_bc)
1199  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1200  poisson_env%diel_rs_grid, &
1201  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1202  poisson_env%dct_pw_grid, &
1203  poisson_env%parameters%ps_implicit_params%neumann_directions, &
1204  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1205  poisson_env%implicit_env%dct_env%dests_expand, &
1206  poisson_env%implicit_env%dct_env%srcs_expand, &
1207  poisson_env%implicit_env%dct_env%flipg_stat, &
1208  poisson_env%implicit_env%dct_env%bounds_shftd, &
1209  density, rho_core=rho_core)
1210  END SELECT
1211  END IF
1212 
1213  CALL pw_pool%create_pw(rhor)
1214  CALL pw_pool%create_pw(vhartree_rs)
1215  CALL pw_transfer(density, rhor)
1216 
1217  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1218  CASE (periodic_bc)
1219  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
1220  ehartree=ehartree)
1221  CASE (neumann_bc)
1222  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
1223  ehartree=ehartree)
1224  CASE (mixed_periodic_bc)
1225  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
1226  electric_enthalpy=ehartree)
1227  CASE (mixed_bc)
1228  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
1229  electric_enthalpy=ehartree)
1230  END SELECT
1231 
1232  IF (PRESENT(aux_density)) THEN
1233  CALL pw_transfer(aux_density, rhor)
1234  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1235  END IF
1236 
1237  CALL pw_transfer(vhartree_rs, vhartree)
1238 
1239  CALL pw_pool%give_back_pw(rhor)
1240  CALL pw_pool%give_back_pw(vhartree_rs)
1241 
1242  CASE DEFAULT
1243  CALL cp_abort(__location__, &
1244  "unknown poisson method "// &
1245  cp_to_string(poisson_env%green_fft%method))
1246  END SELECT
1247 
1248  CASE (use_rs_grid)
1249 
1250  CALL pw_pool%create_pw(rhor)
1251  CALL pw_transfer(density, rhor)
1252  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1253  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1254  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1255  CALL pw_transfer(rhor, vhartree)
1256  IF (PRESENT(ehartree)) THEN
1257  IF (PRESENT(aux_density)) THEN
1258  CALL pw_transfer(vhartree, rhog)
1259  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
1260  ELSE
1261  CALL pw_transfer(vhartree, rhog)
1262  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
1263  END IF
1264  END IF
1265  IF (PRESENT(h_stress)) THEN
1266  CALL pw_transfer(rhor, rhog)
1267  IF (PRESENT(aux_density)) THEN
1268  CALL pw_transfer(aux_density, rhor)
1269  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1270  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1271  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1272  CALL pw_transfer(rhor, rhog_aux)
1273  END IF
1274  END IF
1275  CALL pw_pool%give_back_pw(rhor)
1276 
1277  END SELECT
1278 
1279  IF (PRESENT(aux_density)) THEN
1280  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1281  ELSE
1282  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1283  END IF
1284 
1285  CALL pw_pool%give_back_pw(rhog)
1286  IF (PRESENT(aux_density)) THEN
1287  CALL pw_pool%give_back_pw(rhog_aux)
1288  END IF
1289 
1290  CALL timestop(handle)
1291 
1292  END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs
1293 ! **************************************************************************************************
1294 !> \brief Solve Poisson equation in a plane wave basis set
1295 !> Obtains electrostatic potential and its derivatives with respect to r
1296 !> from the density
1297 !> \param poisson_env ...
1298 !> \param density ...
1299 !> \param ehartree ...
1300 !> \param vhartree ...
1301 !> \param h_stress ...
1302 !> \param rho_core ...
1303 !> \param greenfn ...
1304 !> \param aux_density Hartree energy and stress tensor between 2 different densities
1305 !> \par History
1306 !> JGH (13-Mar-2001) : completely revised
1307 !> \author apsi
1308 ! **************************************************************************************************
1309  SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
1310  h_stress, rho_core, greenfn, aux_density)
1311 
1312  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
1313  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
1314  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
1315  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: vhartree
1316  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
1317  OPTIONAL :: h_stress
1318  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
1319  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
1320 
1321  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
1322 
1323  INTEGER :: handle
1324  LOGICAL :: has_dielectric
1325  TYPE(pw_grid_type), POINTER :: pw_grid
1326  TYPE(pw_pool_type), POINTER :: pw_pool
1327  TYPE(pw_r3d_rs_type) :: &
1328  rhor, vhartree_rs
1329  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
1330 
1331  CALL timeset(routinen, handle)
1332 
1333  CALL pw_poisson_rebuild(poisson_env, density)
1334 
1335  has_dielectric = poisson_env%parameters%has_dielectric
1336 
1337  ! point pw
1338  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1339  pw_grid => pw_pool%pw_grid
1340  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
1341  cpabort("vhartree has a different grid than the poisson solver")
1342  ! density in G space
1343  CALL pw_pool%create_pw(rhog)
1344  IF (PRESENT(aux_density)) THEN
1345  CALL pw_pool%create_pw(rhog_aux)
1346  END IF
1347 
1348  SELECT CASE (poisson_env%used_grid)
1349  CASE (use_gs_grid)
1350 
1351  SELECT CASE (poisson_env%green_fft%method)
1353 
1354  CALL pw_transfer(density, rhog)
1355  IF (PRESENT(aux_density)) THEN
1356  CALL pw_transfer(aux_density, rhog_aux)
1357  END IF
1358  IF (PRESENT(greenfn)) THEN
1359  influence_fn = greenfn
1360  ELSE
1361  influence_fn = poisson_env%green_fft%influence_fn
1362  END IF
1363  CALL pw_multiply_with(rhog, influence_fn)
1364  IF (PRESENT(aux_density)) THEN
1365  CALL pw_multiply_with(rhog_aux, influence_fn)
1366  END IF
1367  CALL pw_transfer(rhog, vhartree)
1368  IF (PRESENT(ehartree)) THEN
1369  IF (PRESENT(aux_density)) THEN
1370  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
1371  ELSE
1372  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
1373  END IF
1374  END IF
1375 
1376  CASE (ps_implicit)
1377  IF (PRESENT(h_stress)) THEN
1378  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
1379  END IF
1380 
1381  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
1382  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1384  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1385  poisson_env%diel_rs_grid, &
1386  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1387  density, rho_core=rho_core)
1388  CASE (neumann_bc, mixed_bc)
1389  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1390  poisson_env%diel_rs_grid, &
1391  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1392  poisson_env%dct_pw_grid, &
1393  poisson_env%parameters%ps_implicit_params%neumann_directions, &
1394  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1395  poisson_env%implicit_env%dct_env%dests_expand, &
1396  poisson_env%implicit_env%dct_env%srcs_expand, &
1397  poisson_env%implicit_env%dct_env%flipg_stat, &
1398  poisson_env%implicit_env%dct_env%bounds_shftd, &
1399  density, rho_core=rho_core)
1400  END SELECT
1401  END IF
1402 
1403  CALL pw_pool%create_pw(rhor)
1404  CALL pw_pool%create_pw(vhartree_rs)
1405  CALL pw_transfer(density, rhor)
1406 
1407  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1408  CASE (periodic_bc)
1409  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
1410  ehartree=ehartree)
1411  CASE (neumann_bc)
1412  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
1413  ehartree=ehartree)
1414  CASE (mixed_periodic_bc)
1415  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
1416  electric_enthalpy=ehartree)
1417  CASE (mixed_bc)
1418  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
1419  electric_enthalpy=ehartree)
1420  END SELECT
1421 
1422  IF (PRESENT(aux_density)) THEN
1423  CALL pw_transfer(aux_density, rhor)
1424  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1425  END IF
1426 
1427  CALL pw_transfer(vhartree_rs, vhartree)
1428 
1429  CALL pw_pool%give_back_pw(rhor)
1430  CALL pw_pool%give_back_pw(vhartree_rs)
1431 
1432  CASE DEFAULT
1433  CALL cp_abort(__location__, &
1434  "unknown poisson method "// &
1435  cp_to_string(poisson_env%green_fft%method))
1436  END SELECT
1437 
1438  CASE (use_rs_grid)
1439 
1440  CALL pw_pool%create_pw(rhor)
1441  CALL pw_transfer(density, rhor)
1442  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1443  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1444  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1445  CALL pw_transfer(rhor, vhartree)
1446  IF (PRESENT(ehartree)) THEN
1447  IF (PRESENT(aux_density)) THEN
1448  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
1449  ELSE
1450  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
1451  END IF
1452  END IF
1453  IF (PRESENT(h_stress)) THEN
1454  CALL pw_transfer(rhor, rhog)
1455  IF (PRESENT(aux_density)) THEN
1456  CALL pw_transfer(aux_density, rhor)
1457  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1458  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1459  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1460  CALL pw_transfer(rhor, rhog_aux)
1461  END IF
1462  END IF
1463  CALL pw_pool%give_back_pw(rhor)
1464 
1465  END SELECT
1466 
1467  IF (PRESENT(aux_density)) THEN
1468  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1469  ELSE
1470  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1471  END IF
1472 
1473  CALL pw_pool%give_back_pw(rhog)
1474  IF (PRESENT(aux_density)) THEN
1475  CALL pw_pool%give_back_pw(rhog_aux)
1476  END IF
1477 
1478  CALL timestop(handle)
1479 
1480  END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs
1481 
1482 ! **************************************************************************************************
1483 !> \brief Solve Poisson equation in a plane wave basis set
1484 !> Obtains electrostatic potential and its derivatives with respect to r
1485 !> from the density
1486 !> \param poisson_env ...
1487 !> \param density ...
1488 !> \param ehartree ...
1489 !> \param dvhartree ...
1490 !> \param h_stress ...
1491 !> \param rho_core ...
1492 !> \param greenfn ...
1493 !> \param aux_density Hartree energy and stress tensor between 2 different densities
1494 !> \par History
1495 !> JGH (13-Mar-2001) : completely revised
1496 !> \author apsi
1497 ! **************************************************************************************************
1498  SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs (poisson_env, density, ehartree, &
1499  dvhartree, h_stress, rho_core, greenfn, aux_density)
1500 
1501  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
1502  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
1503  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
1504  TYPE(pw_r3d_rs_type), DIMENSION(3) :: dvhartree
1505  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
1506  OPTIONAL :: h_stress
1507  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
1508  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
1509 
1510  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
1511 
1512  INTEGER :: handle
1513  LOGICAL :: has_dielectric
1514  TYPE(pw_grid_type), POINTER :: pw_grid
1515  TYPE(pw_pool_type), POINTER :: pw_pool
1516  TYPE(pw_r3d_rs_type) :: &
1517  rhor, vhartree_rs
1518  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
1519 
1520  CALL timeset(routinen, handle)
1521 
1522  CALL pw_poisson_rebuild(poisson_env, density)
1523 
1524  has_dielectric = poisson_env%parameters%has_dielectric
1525 
1526  ! point pw
1527  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1528  pw_grid => pw_pool%pw_grid
1529  ! density in G space
1530  CALL pw_pool%create_pw(rhog)
1531  IF (PRESENT(aux_density)) THEN
1532  CALL pw_pool%create_pw(rhog_aux)
1533  END IF
1534 
1535  SELECT CASE (poisson_env%used_grid)
1536  CASE (use_gs_grid)
1537 
1538  SELECT CASE (poisson_env%green_fft%method)
1540 
1541  CALL pw_transfer(density, rhog)
1542  IF (PRESENT(aux_density)) THEN
1543  CALL pw_transfer(aux_density, rhog_aux)
1544  END IF
1545  IF (PRESENT(ehartree)) THEN
1546  CALL pw_pool%create_pw(tmpg)
1547  CALL pw_copy(rhog, tmpg)
1548  END IF
1549  IF (PRESENT(greenfn)) THEN
1550  influence_fn = greenfn
1551  ELSE
1552  influence_fn = poisson_env%green_fft%influence_fn
1553  END IF
1554  CALL pw_multiply_with(rhog, influence_fn)
1555  IF (PRESENT(aux_density)) THEN
1556  CALL pw_multiply_with(rhog_aux, influence_fn)
1557  rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1558  END IF
1559  IF (PRESENT(ehartree)) THEN
1560  IF (PRESENT(aux_density)) THEN
1561  ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
1562  ELSE
1563  ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
1564  END IF
1565  CALL pw_pool%give_back_pw(tmpg)
1566  END IF
1567 
1568  CASE (ps_implicit)
1569  IF (PRESENT(h_stress)) THEN
1570  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
1571  END IF
1572 
1573  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
1574  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1576  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1577  poisson_env%diel_rs_grid, &
1578  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1579  density, rho_core=rho_core)
1580  CASE (neumann_bc, mixed_bc)
1581  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1582  poisson_env%diel_rs_grid, &
1583  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1584  poisson_env%dct_pw_grid, &
1585  poisson_env%parameters%ps_implicit_params%neumann_directions, &
1586  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1587  poisson_env%implicit_env%dct_env%dests_expand, &
1588  poisson_env%implicit_env%dct_env%srcs_expand, &
1589  poisson_env%implicit_env%dct_env%flipg_stat, &
1590  poisson_env%implicit_env%dct_env%bounds_shftd, &
1591  density, rho_core=rho_core)
1592  END SELECT
1593  END IF
1594 
1595  CALL pw_pool%create_pw(rhor)
1596  CALL pw_pool%create_pw(vhartree_rs)
1597  CALL pw_transfer(density, rhor)
1598 
1599  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1600  CASE (periodic_bc)
1601  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
1602  ehartree=ehartree)
1603  CASE (neumann_bc)
1604  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
1605  ehartree=ehartree)
1606  CASE (mixed_periodic_bc)
1607  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
1608  electric_enthalpy=ehartree)
1609  CASE (mixed_bc)
1610  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
1611  electric_enthalpy=ehartree)
1612  END SELECT
1613 
1614  CALL pw_transfer(rhor, rhog)
1615 
1616  IF (PRESENT(aux_density)) THEN
1617  CALL pw_transfer(aux_density, rhor)
1618  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1619  END IF
1620 
1621  CALL pw_pool%give_back_pw(rhor)
1622  CALL pw_pool%give_back_pw(vhartree_rs)
1623 
1624  CASE DEFAULT
1625  CALL cp_abort(__location__, &
1626  "unknown poisson method "// &
1627  cp_to_string(poisson_env%green_fft%method))
1628  END SELECT
1629 
1630  CASE (use_rs_grid)
1631 
1632  CALL pw_pool%create_pw(rhor)
1633  CALL pw_transfer(density, rhor)
1634  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1635  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1636  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1637  CALL pw_transfer(rhor, rhog)
1638  IF (PRESENT(ehartree)) THEN
1639  ehartree = 0.5_dp*pw_integral_ab(density, rhor)
1640  END IF
1641  CALL pw_pool%give_back_pw(rhor)
1642 
1643  END SELECT
1644 
1645  IF (PRESENT(aux_density)) THEN
1646  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1647  ELSE
1648  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1649  END IF
1650 
1651  CALL pw_pool%give_back_pw(rhog)
1652  IF (PRESENT(aux_density)) THEN
1653  CALL pw_pool%give_back_pw(rhog_aux)
1654  END IF
1655 
1656  CALL timestop(handle)
1657 
1658  END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs
1659 ! **************************************************************************************************
1660 !> \brief Solve Poisson equation in a plane wave basis set
1661 !> Obtains electrostatic potential and its derivatives with respect to r
1662 !> from the density
1663 !> \param poisson_env ...
1664 !> \param density ...
1665 !> \param ehartree ...
1666 !> \param dvhartree ...
1667 !> \param h_stress ...
1668 !> \param rho_core ...
1669 !> \param greenfn ...
1670 !> \param aux_density Hartree energy and stress tensor between 2 different densities
1671 !> \par History
1672 !> JGH (13-Mar-2001) : completely revised
1673 !> \author apsi
1674 ! **************************************************************************************************
1675  SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs (poisson_env, density, ehartree, &
1676  dvhartree, h_stress, rho_core, greenfn, aux_density)
1677 
1678  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
1679  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
1680  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
1681  TYPE(pw_c1d_gs_type), DIMENSION(3) :: dvhartree
1682  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
1683  OPTIONAL :: h_stress
1684  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
1685  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
1686 
1687  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
1688 
1689  INTEGER :: handle
1690  LOGICAL :: has_dielectric
1691  TYPE(pw_grid_type), POINTER :: pw_grid
1692  TYPE(pw_pool_type), POINTER :: pw_pool
1693  TYPE(pw_r3d_rs_type) :: &
1694  rhor, vhartree_rs
1695  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
1696 
1697  CALL timeset(routinen, handle)
1698 
1699  CALL pw_poisson_rebuild(poisson_env, density)
1700 
1701  has_dielectric = poisson_env%parameters%has_dielectric
1702 
1703  ! point pw
1704  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1705  pw_grid => pw_pool%pw_grid
1706  ! density in G space
1707  CALL pw_pool%create_pw(rhog)
1708  IF (PRESENT(aux_density)) THEN
1709  CALL pw_pool%create_pw(rhog_aux)
1710  END IF
1711 
1712  SELECT CASE (poisson_env%used_grid)
1713  CASE (use_gs_grid)
1714 
1715  SELECT CASE (poisson_env%green_fft%method)
1717 
1718  CALL pw_transfer(density, rhog)
1719  IF (PRESENT(aux_density)) THEN
1720  CALL pw_transfer(aux_density, rhog_aux)
1721  END IF
1722  IF (PRESENT(ehartree)) THEN
1723  CALL pw_pool%create_pw(tmpg)
1724  CALL pw_copy(rhog, tmpg)
1725  END IF
1726  IF (PRESENT(greenfn)) THEN
1727  influence_fn = greenfn
1728  ELSE
1729  influence_fn = poisson_env%green_fft%influence_fn
1730  END IF
1731  CALL pw_multiply_with(rhog, influence_fn)
1732  IF (PRESENT(aux_density)) THEN
1733  CALL pw_multiply_with(rhog_aux, influence_fn)
1734  rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1735  END IF
1736  IF (PRESENT(ehartree)) THEN
1737  IF (PRESENT(aux_density)) THEN
1738  ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
1739  ELSE
1740  ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
1741  END IF
1742  CALL pw_pool%give_back_pw(tmpg)
1743  END IF
1744 
1745  CASE (ps_implicit)
1746  IF (PRESENT(h_stress)) THEN
1747  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
1748  END IF
1749 
1750  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
1751  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1753  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1754  poisson_env%diel_rs_grid, &
1755  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1756  density, rho_core=rho_core)
1757  CASE (neumann_bc, mixed_bc)
1758  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1759  poisson_env%diel_rs_grid, &
1760  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1761  poisson_env%dct_pw_grid, &
1762  poisson_env%parameters%ps_implicit_params%neumann_directions, &
1763  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1764  poisson_env%implicit_env%dct_env%dests_expand, &
1765  poisson_env%implicit_env%dct_env%srcs_expand, &
1766  poisson_env%implicit_env%dct_env%flipg_stat, &
1767  poisson_env%implicit_env%dct_env%bounds_shftd, &
1768  density, rho_core=rho_core)
1769  END SELECT
1770  END IF
1771 
1772  CALL pw_pool%create_pw(rhor)
1773  CALL pw_pool%create_pw(vhartree_rs)
1774  CALL pw_transfer(density, rhor)
1775 
1776  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1777  CASE (periodic_bc)
1778  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
1779  ehartree=ehartree)
1780  CASE (neumann_bc)
1781  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
1782  ehartree=ehartree)
1783  CASE (mixed_periodic_bc)
1784  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
1785  electric_enthalpy=ehartree)
1786  CASE (mixed_bc)
1787  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
1788  electric_enthalpy=ehartree)
1789  END SELECT
1790 
1791  CALL pw_transfer(rhor, rhog)
1792 
1793  IF (PRESENT(aux_density)) THEN
1794  CALL pw_transfer(aux_density, rhor)
1795  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1796  END IF
1797 
1798  CALL pw_pool%give_back_pw(rhor)
1799  CALL pw_pool%give_back_pw(vhartree_rs)
1800 
1801  CASE DEFAULT
1802  CALL cp_abort(__location__, &
1803  "unknown poisson method "// &
1804  cp_to_string(poisson_env%green_fft%method))
1805  END SELECT
1806 
1807  CASE (use_rs_grid)
1808 
1809  CALL pw_pool%create_pw(rhor)
1810  CALL pw_transfer(density, rhor)
1811  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1812  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1813  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1814  CALL pw_transfer(rhor, rhog)
1815  IF (PRESENT(ehartree)) THEN
1816  ehartree = 0.5_dp*pw_integral_ab(density, rhor)
1817  END IF
1818  CALL pw_pool%give_back_pw(rhor)
1819 
1820  END SELECT
1821 
1822  IF (PRESENT(aux_density)) THEN
1823  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1824  ELSE
1825  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1826  END IF
1827 
1828  CALL pw_pool%give_back_pw(rhog)
1829  IF (PRESENT(aux_density)) THEN
1830  CALL pw_pool%give_back_pw(rhog_aux)
1831  END IF
1832 
1833  CALL timestop(handle)
1834 
1835  END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs
1836 ! **************************************************************************************************
1837 !> \brief Solve Poisson equation in a plane wave basis set
1838 !> Obtains electrostatic potential and its derivatives with respect to r
1839 !> from the density
1840 !> \param poisson_env ...
1841 !> \param density ...
1842 !> \param ehartree ...
1843 !> \param dvhartree ...
1844 !> \param h_stress ...
1845 !> \param rho_core ...
1846 !> \param greenfn ...
1847 !> \param aux_density Hartree energy and stress tensor between 2 different densities
1848 !> \par History
1849 !> JGH (13-Mar-2001) : completely revised
1850 !> \author apsi
1851 ! **************************************************************************************************
1852  SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs (poisson_env, density, ehartree, &
1853  dvhartree, h_stress, rho_core, greenfn, aux_density)
1854 
1855  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
1856  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
1857  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
1858  TYPE(pw_r3d_rs_type), DIMENSION(3) :: dvhartree
1859  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
1860  OPTIONAL :: h_stress
1861  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
1862  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
1863 
1864  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
1865 
1866  INTEGER :: handle
1867  LOGICAL :: has_dielectric
1868  TYPE(pw_grid_type), POINTER :: pw_grid
1869  TYPE(pw_pool_type), POINTER :: pw_pool
1870  TYPE(pw_r3d_rs_type) :: &
1871  rhor, vhartree_rs
1872  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
1873 
1874  CALL timeset(routinen, handle)
1875 
1876  CALL pw_poisson_rebuild(poisson_env, density)
1877 
1878  has_dielectric = poisson_env%parameters%has_dielectric
1879 
1880  ! point pw
1881  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1882  pw_grid => pw_pool%pw_grid
1883  ! density in G space
1884  CALL pw_pool%create_pw(rhog)
1885  IF (PRESENT(aux_density)) THEN
1886  CALL pw_pool%create_pw(rhog_aux)
1887  END IF
1888 
1889  SELECT CASE (poisson_env%used_grid)
1890  CASE (use_gs_grid)
1891 
1892  SELECT CASE (poisson_env%green_fft%method)
1894 
1895  CALL pw_transfer(density, rhog)
1896  IF (PRESENT(aux_density)) THEN
1897  CALL pw_transfer(aux_density, rhog_aux)
1898  END IF
1899  IF (PRESENT(ehartree)) THEN
1900  CALL pw_pool%create_pw(tmpg)
1901  CALL pw_copy(rhog, tmpg)
1902  END IF
1903  IF (PRESENT(greenfn)) THEN
1904  influence_fn = greenfn
1905  ELSE
1906  influence_fn = poisson_env%green_fft%influence_fn
1907  END IF
1908  CALL pw_multiply_with(rhog, influence_fn)
1909  IF (PRESENT(aux_density)) THEN
1910  CALL pw_multiply_with(rhog_aux, influence_fn)
1911  rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1912  END IF
1913  IF (PRESENT(ehartree)) THEN
1914  IF (PRESENT(aux_density)) THEN
1915  ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
1916  ELSE
1917  ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
1918  END IF
1919  CALL pw_pool%give_back_pw(tmpg)
1920  END IF
1921 
1922  CASE (ps_implicit)
1923  IF (PRESENT(h_stress)) THEN
1924  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
1925  END IF
1926 
1927  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
1928  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1930  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1931  poisson_env%diel_rs_grid, &
1932  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1933  density, rho_core=rho_core)
1934  CASE (neumann_bc, mixed_bc)
1935  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1936  poisson_env%diel_rs_grid, &
1937  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1938  poisson_env%dct_pw_grid, &
1939  poisson_env%parameters%ps_implicit_params%neumann_directions, &
1940  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1941  poisson_env%implicit_env%dct_env%dests_expand, &
1942  poisson_env%implicit_env%dct_env%srcs_expand, &
1943  poisson_env%implicit_env%dct_env%flipg_stat, &
1944  poisson_env%implicit_env%dct_env%bounds_shftd, &
1945  density, rho_core=rho_core)
1946  END SELECT
1947  END IF
1948 
1949  CALL pw_pool%create_pw(rhor)
1950  CALL pw_pool%create_pw(vhartree_rs)
1951  CALL pw_transfer(density, rhor)
1952 
1953  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1954  CASE (periodic_bc)
1955  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
1956  ehartree=ehartree)
1957  CASE (neumann_bc)
1958  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
1959  ehartree=ehartree)
1960  CASE (mixed_periodic_bc)
1961  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
1962  electric_enthalpy=ehartree)
1963  CASE (mixed_bc)
1964  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
1965  electric_enthalpy=ehartree)
1966  END SELECT
1967 
1968  CALL pw_transfer(rhor, rhog)
1969 
1970  IF (PRESENT(aux_density)) THEN
1971  CALL pw_transfer(aux_density, rhor)
1972  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1973  END IF
1974 
1975  CALL pw_pool%give_back_pw(rhor)
1976  CALL pw_pool%give_back_pw(vhartree_rs)
1977 
1978  CASE DEFAULT
1979  CALL cp_abort(__location__, &
1980  "unknown poisson method "// &
1981  cp_to_string(poisson_env%green_fft%method))
1982  END SELECT
1983 
1984  CASE (use_rs_grid)
1985 
1986  CALL pw_pool%create_pw(rhor)
1987  CALL pw_transfer(density, rhor)
1988  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
1989  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
1990  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
1991  CALL pw_transfer(rhor, rhog)
1992  IF (PRESENT(ehartree)) THEN
1993  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
1994  END IF
1995  CALL pw_pool%give_back_pw(rhor)
1996 
1997  END SELECT
1998 
1999  IF (PRESENT(aux_density)) THEN
2000  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2001  ELSE
2002  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2003  END IF
2004 
2005  CALL pw_pool%give_back_pw(rhog)
2006  IF (PRESENT(aux_density)) THEN
2007  CALL pw_pool%give_back_pw(rhog_aux)
2008  END IF
2009 
2010  CALL timestop(handle)
2011 
2012  END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs
2013 ! **************************************************************************************************
2014 !> \brief Solve Poisson equation in a plane wave basis set
2015 !> Obtains electrostatic potential and its derivatives with respect to r
2016 !> from the density
2017 !> \param poisson_env ...
2018 !> \param density ...
2019 !> \param ehartree ...
2020 !> \param dvhartree ...
2021 !> \param h_stress ...
2022 !> \param rho_core ...
2023 !> \param greenfn ...
2024 !> \param aux_density Hartree energy and stress tensor between 2 different densities
2025 !> \par History
2026 !> JGH (13-Mar-2001) : completely revised
2027 !> \author apsi
2028 ! **************************************************************************************************
2029  SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs (poisson_env, density, ehartree, &
2030  dvhartree, h_stress, rho_core, greenfn, aux_density)
2031 
2032  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
2033  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
2034  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
2035  TYPE(pw_c1d_gs_type), DIMENSION(3) :: dvhartree
2036  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
2037  OPTIONAL :: h_stress
2038  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
2039  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
2040 
2041  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
2042 
2043  INTEGER :: handle
2044  LOGICAL :: has_dielectric
2045  TYPE(pw_grid_type), POINTER :: pw_grid
2046  TYPE(pw_pool_type), POINTER :: pw_pool
2047  TYPE(pw_r3d_rs_type) :: &
2048  rhor, vhartree_rs
2049  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
2050 
2051  CALL timeset(routinen, handle)
2052 
2053  CALL pw_poisson_rebuild(poisson_env, density)
2054 
2055  has_dielectric = poisson_env%parameters%has_dielectric
2056 
2057  ! point pw
2058  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2059  pw_grid => pw_pool%pw_grid
2060  ! density in G space
2061  CALL pw_pool%create_pw(rhog)
2062  IF (PRESENT(aux_density)) THEN
2063  CALL pw_pool%create_pw(rhog_aux)
2064  END IF
2065 
2066  SELECT CASE (poisson_env%used_grid)
2067  CASE (use_gs_grid)
2068 
2069  SELECT CASE (poisson_env%green_fft%method)
2071 
2072  CALL pw_transfer(density, rhog)
2073  IF (PRESENT(aux_density)) THEN
2074  CALL pw_transfer(aux_density, rhog_aux)
2075  END IF
2076  IF (PRESENT(ehartree)) THEN
2077  CALL pw_pool%create_pw(tmpg)
2078  CALL pw_copy(rhog, tmpg)
2079  END IF
2080  IF (PRESENT(greenfn)) THEN
2081  influence_fn = greenfn
2082  ELSE
2083  influence_fn = poisson_env%green_fft%influence_fn
2084  END IF
2085  CALL pw_multiply_with(rhog, influence_fn)
2086  IF (PRESENT(aux_density)) THEN
2087  CALL pw_multiply_with(rhog_aux, influence_fn)
2088  rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
2089  END IF
2090  IF (PRESENT(ehartree)) THEN
2091  IF (PRESENT(aux_density)) THEN
2092  ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
2093  ELSE
2094  ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
2095  END IF
2096  CALL pw_pool%give_back_pw(tmpg)
2097  END IF
2098 
2099  CASE (ps_implicit)
2100  IF (PRESENT(h_stress)) THEN
2101  cpabort("No stress tensor is implemented for the implicit Poisson solver.")
2102  END IF
2103 
2104  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
2105  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2107  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2108  poisson_env%diel_rs_grid, &
2109  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2110  density, rho_core=rho_core)
2111  CASE (neumann_bc, mixed_bc)
2112  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2113  poisson_env%diel_rs_grid, &
2114  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2115  poisson_env%dct_pw_grid, &
2116  poisson_env%parameters%ps_implicit_params%neumann_directions, &
2117  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2118  poisson_env%implicit_env%dct_env%dests_expand, &
2119  poisson_env%implicit_env%dct_env%srcs_expand, &
2120  poisson_env%implicit_env%dct_env%flipg_stat, &
2121  poisson_env%implicit_env%dct_env%bounds_shftd, &
2122  density, rho_core=rho_core)
2123  END SELECT
2124  END IF
2125 
2126  CALL pw_pool%create_pw(rhor)
2127  CALL pw_pool%create_pw(vhartree_rs)
2128  CALL pw_transfer(density, rhor)
2129 
2130  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2131  CASE (periodic_bc)
2132  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
2133  ehartree=ehartree)
2134  CASE (neumann_bc)
2135  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
2136  ehartree=ehartree)
2137  CASE (mixed_periodic_bc)
2138  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
2139  electric_enthalpy=ehartree)
2140  CASE (mixed_bc)
2141  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
2142  electric_enthalpy=ehartree)
2143  END SELECT
2144 
2145  CALL pw_transfer(rhor, rhog)
2146 
2147  IF (PRESENT(aux_density)) THEN
2148  CALL pw_transfer(aux_density, rhor)
2149  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
2150  END IF
2151 
2152  CALL pw_pool%give_back_pw(rhor)
2153  CALL pw_pool%give_back_pw(vhartree_rs)
2154 
2155  CASE DEFAULT
2156  CALL cp_abort(__location__, &
2157  "unknown poisson method "// &
2158  cp_to_string(poisson_env%green_fft%method))
2159  END SELECT
2160 
2161  CASE (use_rs_grid)
2162 
2163  CALL pw_pool%create_pw(rhor)
2164  CALL pw_transfer(density, rhor)
2165  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2166  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2167  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2168  CALL pw_transfer(rhor, rhog)
2169  IF (PRESENT(ehartree)) THEN
2170  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
2171  END IF
2172  CALL pw_pool%give_back_pw(rhor)
2173 
2174  END SELECT
2175 
2176  IF (PRESENT(aux_density)) THEN
2177  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2178  ELSE
2179  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2180  END IF
2181 
2182  CALL pw_pool%give_back_pw(rhog)
2183  IF (PRESENT(aux_density)) THEN
2184  CALL pw_pool%give_back_pw(rhog_aux)
2185  END IF
2186 
2187  CALL timestop(handle)
2188 
2189  END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs
2190 
2191 ! **************************************************************************************************
2192 !> \brief Solve Poisson equation in a plane wave basis set
2193 !> Obtains electrostatic potential and its derivatives with respect to r
2194 !> from the density
2195 !> \param poisson_env ...
2196 !> \param density ...
2197 !> \param ehartree ...
2198 !> \param vhartree ...
2199 !> \param dvhartree ...
2200 !> \param h_stress ...
2201 !> \param rho_core ...
2202 !> \param greenfn ...
2203 !> \param aux_density Hartree energy and stress tensor between 2 different densities
2204 !> \par History
2205 !> JGH (13-Mar-2001) : completely revised
2206 !> \author apsi
2207 ! **************************************************************************************************
2208  SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2209  dvhartree, h_stress, rho_core, greenfn, aux_density)
2210 
2211  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
2212  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
2213  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
2214  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: vhartree
2215  TYPE(pw_r3d_rs_type), DIMENSION(3) :: dvhartree
2216  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
2217  OPTIONAL :: h_stress
2218  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
2219  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
2220 
2221  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
2222 
2223  INTEGER :: handle
2224  LOGICAL :: has_dielectric
2225  TYPE(pw_grid_type), POINTER :: pw_grid
2226  TYPE(pw_pool_type), POINTER :: pw_pool
2227  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2228  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2229 
2230  CALL timeset(routinen, handle)
2231 
2232  CALL pw_poisson_rebuild(poisson_env, density)
2233 
2234  has_dielectric = poisson_env%parameters%has_dielectric
2235 
2236  ! point pw
2237  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2238  pw_grid => pw_pool%pw_grid
2239  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
2240  cpabort("vhartree has a different grid than the poisson solver")
2241  ! density in G space
2242  CALL pw_pool%create_pw(rhog)
2243  IF (PRESENT(aux_density)) THEN
2244  CALL pw_pool%create_pw(rhog_aux)
2245  END IF
2246 
2247  SELECT CASE (poisson_env%used_grid)
2248  CASE (use_gs_grid)
2249 
2250  SELECT CASE (poisson_env%green_fft%method)
2252 
2253  CALL pw_transfer(density, rhog)
2254  IF (PRESENT(aux_density)) THEN
2255  CALL pw_transfer(aux_density, rhog_aux)
2256  END IF
2257  IF (PRESENT(greenfn)) THEN
2258  influence_fn = greenfn
2259  ELSE
2260  influence_fn = poisson_env%green_fft%influence_fn
2261  END IF
2262  CALL pw_multiply_with(rhog, influence_fn)
2263  IF (PRESENT(aux_density)) THEN
2264  CALL pw_multiply_with(rhog_aux, influence_fn)
2265  END IF
2266  CALL pw_transfer(rhog, vhartree)
2267  IF (PRESENT(ehartree)) THEN
2268  IF (PRESENT(aux_density)) THEN
2269  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2270  ELSE
2271  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
2272  END IF
2273  END IF
2274 
2275  CASE (ps_implicit)
2276  IF (PRESENT(h_stress)) THEN
2277  CALL cp_abort(__location__, &
2278  "No stress tensor is implemented for the implicit Poisson solver.")
2279  END IF
2280 
2281  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
2282  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2284  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2285  poisson_env%diel_rs_grid, &
2286  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2287  density, rho_core=rho_core)
2288  CASE (neumann_bc, mixed_bc)
2289  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2290  poisson_env%diel_rs_grid, &
2291  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2292  poisson_env%dct_pw_grid, &
2293  poisson_env%parameters%ps_implicit_params%neumann_directions, &
2294  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2295  poisson_env%implicit_env%dct_env%dests_expand, &
2296  poisson_env%implicit_env%dct_env%srcs_expand, &
2297  poisson_env%implicit_env%dct_env%flipg_stat, &
2298  poisson_env%implicit_env%dct_env%bounds_shftd, &
2299  density, rho_core=rho_core)
2300  END SELECT
2301  END IF
2302 
2303  CALL pw_pool%create_pw(rhor)
2304  CALL pw_pool%create_pw(vhartree_rs)
2305  CALL pw_transfer(density, rhor)
2306 
2307  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2308  CASE (periodic_bc)
2309  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
2310  ehartree=ehartree)
2311  CASE (neumann_bc)
2312  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
2313  ehartree=ehartree)
2314  CASE (mixed_periodic_bc)
2315  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
2316  electric_enthalpy=ehartree)
2317  CASE (mixed_bc)
2318  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
2319  electric_enthalpy=ehartree)
2320  END SELECT
2321 
2322  CALL pw_transfer(vhartree_rs, vhartree)
2323  CALL pw_transfer(rhor, rhog)
2324 
2325  IF (PRESENT(aux_density)) THEN
2326  CALL pw_transfer(aux_density, rhor)
2327  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
2328  END IF
2329 
2330  CALL pw_pool%give_back_pw(rhor)
2331  CALL pw_pool%give_back_pw(vhartree_rs)
2332 
2333  CASE DEFAULT
2334  CALL cp_abort(__location__, &
2335  "unknown poisson method "// &
2336  cp_to_string(poisson_env%green_fft%method))
2337  END SELECT
2338 
2339  CASE (use_rs_grid)
2340 
2341  CALL pw_pool%create_pw(rhor)
2342  CALL pw_transfer(density, rhor)
2343  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2344  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2345  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2346  CALL pw_transfer(rhor, vhartree)
2347  CALL pw_transfer(rhor, rhog)
2348  IF (PRESENT(ehartree)) THEN
2349  IF (PRESENT(aux_density)) THEN
2350  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2351  ELSE
2352  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
2353  END IF
2354  END IF
2355  CALL pw_transfer(rhor, rhog)
2356  IF (PRESENT(aux_density)) THEN
2357  CALL pw_transfer(aux_density, rhor)
2358  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2359  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2360  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2361  CALL pw_transfer(rhor, rhog_aux)
2362  END IF
2363  CALL pw_pool%give_back_pw(rhor)
2364 
2365  END SELECT
2366 
2367  IF (PRESENT(aux_density)) THEN
2368  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2369  ELSE
2370  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2371  END IF
2372 
2373  CALL pw_pool%give_back_pw(rhog)
2374  IF (PRESENT(aux_density)) THEN
2375  CALL pw_pool%give_back_pw(rhog_aux)
2376  END IF
2377 
2378  CALL timestop(handle)
2379 
2380  END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs
2381 ! **************************************************************************************************
2382 !> \brief Solve Poisson equation in a plane wave basis set
2383 !> Obtains electrostatic potential and its derivatives with respect to r
2384 !> from the density
2385 !> \param poisson_env ...
2386 !> \param density ...
2387 !> \param ehartree ...
2388 !> \param vhartree ...
2389 !> \param dvhartree ...
2390 !> \param h_stress ...
2391 !> \param rho_core ...
2392 !> \param greenfn ...
2393 !> \param aux_density Hartree energy and stress tensor between 2 different densities
2394 !> \par History
2395 !> JGH (13-Mar-2001) : completely revised
2396 !> \author apsi
2397 ! **************************************************************************************************
2398  SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2399  dvhartree, h_stress, rho_core, greenfn, aux_density)
2400 
2401  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
2402  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
2403  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
2404  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: vhartree
2405  TYPE(pw_r3d_rs_type), DIMENSION(3) :: dvhartree
2406  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
2407  OPTIONAL :: h_stress
2408  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
2409  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
2410 
2411  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
2412 
2413  INTEGER :: handle
2414  LOGICAL :: has_dielectric
2415  TYPE(pw_grid_type), POINTER :: pw_grid
2416  TYPE(pw_pool_type), POINTER :: pw_pool
2417  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2418  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2419 
2420  CALL timeset(routinen, handle)
2421 
2422  CALL pw_poisson_rebuild(poisson_env, density)
2423 
2424  has_dielectric = poisson_env%parameters%has_dielectric
2425 
2426  ! point pw
2427  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2428  pw_grid => pw_pool%pw_grid
2429  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
2430  cpabort("vhartree has a different grid than the poisson solver")
2431  ! density in G space
2432  CALL pw_pool%create_pw(rhog)
2433  IF (PRESENT(aux_density)) THEN
2434  CALL pw_pool%create_pw(rhog_aux)
2435  END IF
2436 
2437  SELECT CASE (poisson_env%used_grid)
2438  CASE (use_gs_grid)
2439 
2440  SELECT CASE (poisson_env%green_fft%method)
2442 
2443  CALL pw_transfer(density, rhog)
2444  IF (PRESENT(aux_density)) THEN
2445  CALL pw_transfer(aux_density, rhog_aux)
2446  END IF
2447  IF (PRESENT(greenfn)) THEN
2448  influence_fn = greenfn
2449  ELSE
2450  influence_fn = poisson_env%green_fft%influence_fn
2451  END IF
2452  CALL pw_multiply_with(rhog, influence_fn)
2453  IF (PRESENT(aux_density)) THEN
2454  CALL pw_multiply_with(rhog_aux, influence_fn)
2455  END IF
2456  CALL pw_transfer(rhog, vhartree)
2457  IF (PRESENT(ehartree)) THEN
2458  IF (PRESENT(aux_density)) THEN
2459  CALL pw_transfer(aux_density, rhog)
2460  ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
2461  ELSE
2462  CALL pw_transfer(density, rhog)
2463  ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
2464  END IF
2465  END IF
2466 
2467  CASE (ps_implicit)
2468  IF (PRESENT(h_stress)) THEN
2469  CALL cp_abort(__location__, &
2470  "No stress tensor is implemented for the implicit Poisson solver.")
2471  END IF
2472 
2473  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
2474  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2476  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2477  poisson_env%diel_rs_grid, &
2478  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2479  density, rho_core=rho_core)
2480  CASE (neumann_bc, mixed_bc)
2481  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2482  poisson_env%diel_rs_grid, &
2483  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2484  poisson_env%dct_pw_grid, &
2485  poisson_env%parameters%ps_implicit_params%neumann_directions, &
2486  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2487  poisson_env%implicit_env%dct_env%dests_expand, &
2488  poisson_env%implicit_env%dct_env%srcs_expand, &
2489  poisson_env%implicit_env%dct_env%flipg_stat, &
2490  poisson_env%implicit_env%dct_env%bounds_shftd, &
2491  density, rho_core=rho_core)
2492  END SELECT
2493  END IF
2494 
2495  CALL pw_pool%create_pw(rhor)
2496  CALL pw_pool%create_pw(vhartree_rs)
2497  CALL pw_transfer(density, rhor)
2498 
2499  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2500  CASE (periodic_bc)
2501  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
2502  ehartree=ehartree)
2503  CASE (neumann_bc)
2504  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
2505  ehartree=ehartree)
2506  CASE (mixed_periodic_bc)
2507  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
2508  electric_enthalpy=ehartree)
2509  CASE (mixed_bc)
2510  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
2511  electric_enthalpy=ehartree)
2512  END SELECT
2513 
2514  CALL pw_transfer(vhartree_rs, vhartree)
2515  CALL pw_transfer(rhor, rhog)
2516 
2517  IF (PRESENT(aux_density)) THEN
2518  CALL pw_transfer(aux_density, rhor)
2519  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
2520  END IF
2521 
2522  CALL pw_pool%give_back_pw(rhor)
2523  CALL pw_pool%give_back_pw(vhartree_rs)
2524 
2525  CASE DEFAULT
2526  CALL cp_abort(__location__, &
2527  "unknown poisson method "// &
2528  cp_to_string(poisson_env%green_fft%method))
2529  END SELECT
2530 
2531  CASE (use_rs_grid)
2532 
2533  CALL pw_pool%create_pw(rhor)
2534  CALL pw_transfer(density, rhor)
2535  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2536  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2537  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2538  CALL pw_transfer(rhor, vhartree)
2539  CALL pw_transfer(rhor, rhog)
2540  IF (PRESENT(ehartree)) THEN
2541  IF (PRESENT(aux_density)) THEN
2542  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
2543  ELSE
2544  ehartree = 0.5_dp*pw_integral_ab(density, rhor)
2545  END IF
2546  END IF
2547  CALL pw_transfer(rhor, rhog)
2548  IF (PRESENT(aux_density)) THEN
2549  CALL pw_transfer(aux_density, rhor)
2550  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2551  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2552  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2553  CALL pw_transfer(rhor, rhog_aux)
2554  END IF
2555  CALL pw_pool%give_back_pw(rhor)
2556 
2557  END SELECT
2558 
2559  IF (PRESENT(aux_density)) THEN
2560  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2561  ELSE
2562  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2563  END IF
2564 
2565  CALL pw_pool%give_back_pw(rhog)
2566  IF (PRESENT(aux_density)) THEN
2567  CALL pw_pool%give_back_pw(rhog_aux)
2568  END IF
2569 
2570  CALL timestop(handle)
2571 
2572  END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs
2573 ! **************************************************************************************************
2574 !> \brief Solve Poisson equation in a plane wave basis set
2575 !> Obtains electrostatic potential and its derivatives with respect to r
2576 !> from the density
2577 !> \param poisson_env ...
2578 !> \param density ...
2579 !> \param ehartree ...
2580 !> \param vhartree ...
2581 !> \param dvhartree ...
2582 !> \param h_stress ...
2583 !> \param rho_core ...
2584 !> \param greenfn ...
2585 !> \param aux_density Hartree energy and stress tensor between 2 different densities
2586 !> \par History
2587 !> JGH (13-Mar-2001) : completely revised
2588 !> \author apsi
2589 ! **************************************************************************************************
2590  SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
2591  dvhartree, h_stress, rho_core, greenfn, aux_density)
2592 
2593  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
2594  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
2595  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
2596  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: vhartree
2597  TYPE(pw_c1d_gs_type), DIMENSION(3) :: dvhartree
2598  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
2599  OPTIONAL :: h_stress
2600  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
2601  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
2602 
2603  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
2604 
2605  INTEGER :: handle
2606  LOGICAL :: has_dielectric
2607  TYPE(pw_grid_type), POINTER :: pw_grid
2608  TYPE(pw_pool_type), POINTER :: pw_pool
2609  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2610  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2611 
2612  CALL timeset(routinen, handle)
2613 
2614  CALL pw_poisson_rebuild(poisson_env, density)
2615 
2616  has_dielectric = poisson_env%parameters%has_dielectric
2617 
2618  ! point pw
2619  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2620  pw_grid => pw_pool%pw_grid
2621  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
2622  cpabort("vhartree has a different grid than the poisson solver")
2623  ! density in G space
2624  CALL pw_pool%create_pw(rhog)
2625  IF (PRESENT(aux_density)) THEN
2626  CALL pw_pool%create_pw(rhog_aux)
2627  END IF
2628 
2629  SELECT CASE (poisson_env%used_grid)
2630  CASE (use_gs_grid)
2631 
2632  SELECT CASE (poisson_env%green_fft%method)
2634 
2635  CALL pw_transfer(density, rhog)
2636  IF (PRESENT(aux_density)) THEN
2637  CALL pw_transfer(aux_density, rhog_aux)
2638  END IF
2639  IF (PRESENT(greenfn)) THEN
2640  influence_fn = greenfn
2641  ELSE
2642  influence_fn = poisson_env%green_fft%influence_fn
2643  END IF
2644  CALL pw_multiply_with(rhog, influence_fn)
2645  IF (PRESENT(aux_density)) THEN
2646  CALL pw_multiply_with(rhog_aux, influence_fn)
2647  END IF
2648  CALL pw_transfer(rhog, vhartree)
2649  IF (PRESENT(ehartree)) THEN
2650  IF (PRESENT(aux_density)) THEN
2651  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2652  ELSE
2653  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
2654  END IF
2655  END IF
2656 
2657  CASE (ps_implicit)
2658  IF (PRESENT(h_stress)) THEN
2659  CALL cp_abort(__location__, &
2660  "No stress tensor is implemented for the implicit Poisson solver.")
2661  END IF
2662 
2663  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
2664  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2666  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2667  poisson_env%diel_rs_grid, &
2668  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2669  density, rho_core=rho_core)
2670  CASE (neumann_bc, mixed_bc)
2671  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2672  poisson_env%diel_rs_grid, &
2673  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2674  poisson_env%dct_pw_grid, &
2675  poisson_env%parameters%ps_implicit_params%neumann_directions, &
2676  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2677  poisson_env%implicit_env%dct_env%dests_expand, &
2678  poisson_env%implicit_env%dct_env%srcs_expand, &
2679  poisson_env%implicit_env%dct_env%flipg_stat, &
2680  poisson_env%implicit_env%dct_env%bounds_shftd, &
2681  density, rho_core=rho_core)
2682  END SELECT
2683  END IF
2684 
2685  CALL pw_pool%create_pw(rhor)
2686  CALL pw_pool%create_pw(vhartree_rs)
2687  CALL pw_transfer(density, rhor)
2688 
2689  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2690  CASE (periodic_bc)
2691  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
2692  ehartree=ehartree)
2693  CASE (neumann_bc)
2694  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
2695  ehartree=ehartree)
2696  CASE (mixed_periodic_bc)
2697  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
2698  electric_enthalpy=ehartree)
2699  CASE (mixed_bc)
2700  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
2701  electric_enthalpy=ehartree)
2702  END SELECT
2703 
2704  CALL pw_transfer(vhartree_rs, vhartree)
2705  CALL pw_transfer(rhor, rhog)
2706 
2707  IF (PRESENT(aux_density)) THEN
2708  CALL pw_transfer(aux_density, rhor)
2709  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
2710  END IF
2711 
2712  CALL pw_pool%give_back_pw(rhor)
2713  CALL pw_pool%give_back_pw(vhartree_rs)
2714 
2715  CASE DEFAULT
2716  CALL cp_abort(__location__, &
2717  "unknown poisson method "// &
2718  cp_to_string(poisson_env%green_fft%method))
2719  END SELECT
2720 
2721  CASE (use_rs_grid)
2722 
2723  CALL pw_pool%create_pw(rhor)
2724  CALL pw_transfer(density, rhor)
2725  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2726  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2727  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2728  CALL pw_transfer(rhor, vhartree)
2729  CALL pw_transfer(rhor, rhog)
2730  IF (PRESENT(ehartree)) THEN
2731  IF (PRESENT(aux_density)) THEN
2732  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2733  ELSE
2734  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
2735  END IF
2736  END IF
2737  CALL pw_transfer(rhor, rhog)
2738  IF (PRESENT(aux_density)) THEN
2739  CALL pw_transfer(aux_density, rhor)
2740  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2741  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2742  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2743  CALL pw_transfer(rhor, rhog_aux)
2744  END IF
2745  CALL pw_pool%give_back_pw(rhor)
2746 
2747  END SELECT
2748 
2749  IF (PRESENT(aux_density)) THEN
2750  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2751  ELSE
2752  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2753  END IF
2754 
2755  CALL pw_pool%give_back_pw(rhog)
2756  IF (PRESENT(aux_density)) THEN
2757  CALL pw_pool%give_back_pw(rhog_aux)
2758  END IF
2759 
2760  CALL timestop(handle)
2761 
2762  END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs
2763 ! **************************************************************************************************
2764 !> \brief Solve Poisson equation in a plane wave basis set
2765 !> Obtains electrostatic potential and its derivatives with respect to r
2766 !> from the density
2767 !> \param poisson_env ...
2768 !> \param density ...
2769 !> \param ehartree ...
2770 !> \param vhartree ...
2771 !> \param dvhartree ...
2772 !> \param h_stress ...
2773 !> \param rho_core ...
2774 !> \param greenfn ...
2775 !> \param aux_density Hartree energy and stress tensor between 2 different densities
2776 !> \par History
2777 !> JGH (13-Mar-2001) : completely revised
2778 !> \author apsi
2779 ! **************************************************************************************************
2780  SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
2781  dvhartree, h_stress, rho_core, greenfn, aux_density)
2782 
2783  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
2784  TYPE(pw_r3d_rs_type), INTENT(IN) :: density
2785  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
2786  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: vhartree
2787  TYPE(pw_c1d_gs_type), DIMENSION(3) :: dvhartree
2788  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
2789  OPTIONAL :: h_stress
2790  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
2791  TYPE(pw_r3d_rs_type), INTENT(IN), OPTIONAL :: aux_density
2792 
2793  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
2794 
2795  INTEGER :: handle
2796  LOGICAL :: has_dielectric
2797  TYPE(pw_grid_type), POINTER :: pw_grid
2798  TYPE(pw_pool_type), POINTER :: pw_pool
2799  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2800  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2801 
2802  CALL timeset(routinen, handle)
2803 
2804  CALL pw_poisson_rebuild(poisson_env, density)
2805 
2806  has_dielectric = poisson_env%parameters%has_dielectric
2807 
2808  ! point pw
2809  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2810  pw_grid => pw_pool%pw_grid
2811  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
2812  cpabort("vhartree has a different grid than the poisson solver")
2813  ! density in G space
2814  CALL pw_pool%create_pw(rhog)
2815  IF (PRESENT(aux_density)) THEN
2816  CALL pw_pool%create_pw(rhog_aux)
2817  END IF
2818 
2819  SELECT CASE (poisson_env%used_grid)
2820  CASE (use_gs_grid)
2821 
2822  SELECT CASE (poisson_env%green_fft%method)
2824 
2825  CALL pw_transfer(density, rhog)
2826  IF (PRESENT(aux_density)) THEN
2827  CALL pw_transfer(aux_density, rhog_aux)
2828  END IF
2829  IF (PRESENT(greenfn)) THEN
2830  influence_fn = greenfn
2831  ELSE
2832  influence_fn = poisson_env%green_fft%influence_fn
2833  END IF
2834  CALL pw_multiply_with(rhog, influence_fn)
2835  IF (PRESENT(aux_density)) THEN
2836  CALL pw_multiply_with(rhog_aux, influence_fn)
2837  END IF
2838  CALL pw_transfer(rhog, vhartree)
2839  IF (PRESENT(ehartree)) THEN
2840  IF (PRESENT(aux_density)) THEN
2841  CALL pw_transfer(aux_density, rhog)
2842  ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
2843  ELSE
2844  CALL pw_transfer(density, rhog)
2845  ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
2846  END IF
2847  END IF
2848 
2849  CASE (ps_implicit)
2850  IF (PRESENT(h_stress)) THEN
2851  CALL cp_abort(__location__, &
2852  "No stress tensor is implemented for the implicit Poisson solver.")
2853  END IF
2854 
2855  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
2856  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2858  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2859  poisson_env%diel_rs_grid, &
2860  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2861  density, rho_core=rho_core)
2862  CASE (neumann_bc, mixed_bc)
2863  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2864  poisson_env%diel_rs_grid, &
2865  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2866  poisson_env%dct_pw_grid, &
2867  poisson_env%parameters%ps_implicit_params%neumann_directions, &
2868  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2869  poisson_env%implicit_env%dct_env%dests_expand, &
2870  poisson_env%implicit_env%dct_env%srcs_expand, &
2871  poisson_env%implicit_env%dct_env%flipg_stat, &
2872  poisson_env%implicit_env%dct_env%bounds_shftd, &
2873  density, rho_core=rho_core)
2874  END SELECT
2875  END IF
2876 
2877  CALL pw_pool%create_pw(rhor)
2878  CALL pw_pool%create_pw(vhartree_rs)
2879  CALL pw_transfer(density, rhor)
2880 
2881  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2882  CASE (periodic_bc)
2883  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
2884  ehartree=ehartree)
2885  CASE (neumann_bc)
2886  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
2887  ehartree=ehartree)
2888  CASE (mixed_periodic_bc)
2889  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
2890  electric_enthalpy=ehartree)
2891  CASE (mixed_bc)
2892  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
2893  electric_enthalpy=ehartree)
2894  END SELECT
2895 
2896  CALL pw_transfer(vhartree_rs, vhartree)
2897  CALL pw_transfer(rhor, rhog)
2898 
2899  IF (PRESENT(aux_density)) THEN
2900  CALL pw_transfer(aux_density, rhor)
2901  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
2902  END IF
2903 
2904  CALL pw_pool%give_back_pw(rhor)
2905  CALL pw_pool%give_back_pw(vhartree_rs)
2906 
2907  CASE DEFAULT
2908  CALL cp_abort(__location__, &
2909  "unknown poisson method "// &
2910  cp_to_string(poisson_env%green_fft%method))
2911  END SELECT
2912 
2913  CASE (use_rs_grid)
2914 
2915  CALL pw_pool%create_pw(rhor)
2916  CALL pw_transfer(density, rhor)
2917  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2918  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2919  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2920  CALL pw_transfer(rhor, vhartree)
2921  CALL pw_transfer(rhor, rhog)
2922  IF (PRESENT(ehartree)) THEN
2923  IF (PRESENT(aux_density)) THEN
2924  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
2925  ELSE
2926  ehartree = 0.5_dp*pw_integral_ab(density, rhor)
2927  END IF
2928  END IF
2929  CALL pw_transfer(rhor, rhog)
2930  IF (PRESENT(aux_density)) THEN
2931  CALL pw_transfer(aux_density, rhor)
2932  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
2933  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
2934  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
2935  CALL pw_transfer(rhor, rhog_aux)
2936  END IF
2937  CALL pw_pool%give_back_pw(rhor)
2938 
2939  END SELECT
2940 
2941  IF (PRESENT(aux_density)) THEN
2942  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2943  ELSE
2944  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2945  END IF
2946 
2947  CALL pw_pool%give_back_pw(rhog)
2948  IF (PRESENT(aux_density)) THEN
2949  CALL pw_pool%give_back_pw(rhog_aux)
2950  END IF
2951 
2952  CALL timestop(handle)
2953 
2954  END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs
2955 ! **************************************************************************************************
2956 !> \brief Solve Poisson equation in a plane wave basis set
2957 !> Obtains electrostatic potential and its derivatives with respect to r
2958 !> from the density
2959 !> \param poisson_env ...
2960 !> \param density ...
2961 !> \param ehartree ...
2962 !> \param vhartree ...
2963 !> \param dvhartree ...
2964 !> \param h_stress ...
2965 !> \param rho_core ...
2966 !> \param greenfn ...
2967 !> \param aux_density Hartree energy and stress tensor between 2 different densities
2968 !> \par History
2969 !> JGH (13-Mar-2001) : completely revised
2970 !> \author apsi
2971 ! **************************************************************************************************
2972  SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2973  dvhartree, h_stress, rho_core, greenfn, aux_density)
2974 
2975  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
2976  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
2977  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
2978  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: vhartree
2979  TYPE(pw_r3d_rs_type), DIMENSION(3) :: dvhartree
2980  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
2981  OPTIONAL :: h_stress
2982  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
2983  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
2984 
2985  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
2986 
2987  INTEGER :: handle
2988  LOGICAL :: has_dielectric
2989  TYPE(pw_grid_type), POINTER :: pw_grid
2990  TYPE(pw_pool_type), POINTER :: pw_pool
2991  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2992  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2993 
2994  CALL timeset(routinen, handle)
2995 
2996  CALL pw_poisson_rebuild(poisson_env, density)
2997 
2998  has_dielectric = poisson_env%parameters%has_dielectric
2999 
3000  ! point pw
3001  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3002  pw_grid => pw_pool%pw_grid
3003  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
3004  cpabort("vhartree has a different grid than the poisson solver")
3005  ! density in G space
3006  CALL pw_pool%create_pw(rhog)
3007  IF (PRESENT(aux_density)) THEN
3008  CALL pw_pool%create_pw(rhog_aux)
3009  END IF
3010 
3011  SELECT CASE (poisson_env%used_grid)
3012  CASE (use_gs_grid)
3013 
3014  SELECT CASE (poisson_env%green_fft%method)
3016 
3017  CALL pw_transfer(density, rhog)
3018  IF (PRESENT(aux_density)) THEN
3019  CALL pw_transfer(aux_density, rhog_aux)
3020  END IF
3021  IF (PRESENT(greenfn)) THEN
3022  influence_fn = greenfn
3023  ELSE
3024  influence_fn = poisson_env%green_fft%influence_fn
3025  END IF
3026  CALL pw_multiply_with(rhog, influence_fn)
3027  IF (PRESENT(aux_density)) THEN
3028  CALL pw_multiply_with(rhog_aux, influence_fn)
3029  END IF
3030  CALL pw_transfer(rhog, vhartree)
3031  IF (PRESENT(ehartree)) THEN
3032  IF (PRESENT(aux_density)) THEN
3033  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3034  ELSE
3035  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
3036  END IF
3037  END IF
3038 
3039  CASE (ps_implicit)
3040  IF (PRESENT(h_stress)) THEN
3041  CALL cp_abort(__location__, &
3042  "No stress tensor is implemented for the implicit Poisson solver.")
3043  END IF
3044 
3045  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
3046  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3048  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3049  poisson_env%diel_rs_grid, &
3050  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3051  density, rho_core=rho_core)
3052  CASE (neumann_bc, mixed_bc)
3053  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3054  poisson_env%diel_rs_grid, &
3055  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3056  poisson_env%dct_pw_grid, &
3057  poisson_env%parameters%ps_implicit_params%neumann_directions, &
3058  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3059  poisson_env%implicit_env%dct_env%dests_expand, &
3060  poisson_env%implicit_env%dct_env%srcs_expand, &
3061  poisson_env%implicit_env%dct_env%flipg_stat, &
3062  poisson_env%implicit_env%dct_env%bounds_shftd, &
3063  density, rho_core=rho_core)
3064  END SELECT
3065  END IF
3066 
3067  CALL pw_pool%create_pw(rhor)
3068  CALL pw_pool%create_pw(vhartree_rs)
3069  CALL pw_transfer(density, rhor)
3070 
3071  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3072  CASE (periodic_bc)
3073  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
3074  ehartree=ehartree)
3075  CASE (neumann_bc)
3076  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
3077  ehartree=ehartree)
3078  CASE (mixed_periodic_bc)
3079  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
3080  electric_enthalpy=ehartree)
3081  CASE (mixed_bc)
3082  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
3083  electric_enthalpy=ehartree)
3084  END SELECT
3085 
3086  CALL pw_transfer(vhartree_rs, vhartree)
3087  CALL pw_transfer(rhor, rhog)
3088 
3089  IF (PRESENT(aux_density)) THEN
3090  CALL pw_transfer(aux_density, rhor)
3091  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
3092  END IF
3093 
3094  CALL pw_pool%give_back_pw(rhor)
3095  CALL pw_pool%give_back_pw(vhartree_rs)
3096 
3097  CASE DEFAULT
3098  CALL cp_abort(__location__, &
3099  "unknown poisson method "// &
3100  cp_to_string(poisson_env%green_fft%method))
3101  END SELECT
3102 
3103  CASE (use_rs_grid)
3104 
3105  CALL pw_pool%create_pw(rhor)
3106  CALL pw_transfer(density, rhor)
3107  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3108  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3109  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3110  CALL pw_transfer(rhor, vhartree)
3111  CALL pw_transfer(rhor, rhog)
3112  IF (PRESENT(ehartree)) THEN
3113  IF (PRESENT(aux_density)) THEN
3114  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3115  ELSE
3116  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
3117  END IF
3118  END IF
3119  CALL pw_transfer(rhor, rhog)
3120  IF (PRESENT(aux_density)) THEN
3121  CALL pw_transfer(aux_density, rhor)
3122  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3123  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3124  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3125  CALL pw_transfer(rhor, rhog_aux)
3126  END IF
3127  CALL pw_pool%give_back_pw(rhor)
3128 
3129  END SELECT
3130 
3131  IF (PRESENT(aux_density)) THEN
3132  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3133  ELSE
3134  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3135  END IF
3136 
3137  CALL pw_pool%give_back_pw(rhog)
3138  IF (PRESENT(aux_density)) THEN
3139  CALL pw_pool%give_back_pw(rhog_aux)
3140  END IF
3141 
3142  CALL timestop(handle)
3143 
3144  END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs
3145 ! **************************************************************************************************
3146 !> \brief Solve Poisson equation in a plane wave basis set
3147 !> Obtains electrostatic potential and its derivatives with respect to r
3148 !> from the density
3149 !> \param poisson_env ...
3150 !> \param density ...
3151 !> \param ehartree ...
3152 !> \param vhartree ...
3153 !> \param dvhartree ...
3154 !> \param h_stress ...
3155 !> \param rho_core ...
3156 !> \param greenfn ...
3157 !> \param aux_density Hartree energy and stress tensor between 2 different densities
3158 !> \par History
3159 !> JGH (13-Mar-2001) : completely revised
3160 !> \author apsi
3161 ! **************************************************************************************************
3162  SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
3163  dvhartree, h_stress, rho_core, greenfn, aux_density)
3164 
3165  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
3166  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
3167  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
3168  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: vhartree
3169  TYPE(pw_r3d_rs_type), DIMENSION(3) :: dvhartree
3170  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
3171  OPTIONAL :: h_stress
3172  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
3173  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
3174 
3175  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
3176 
3177  INTEGER :: handle
3178  LOGICAL :: has_dielectric
3179  TYPE(pw_grid_type), POINTER :: pw_grid
3180  TYPE(pw_pool_type), POINTER :: pw_pool
3181  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
3182  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
3183 
3184  CALL timeset(routinen, handle)
3185 
3186  CALL pw_poisson_rebuild(poisson_env, density)
3187 
3188  has_dielectric = poisson_env%parameters%has_dielectric
3189 
3190  ! point pw
3191  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3192  pw_grid => pw_pool%pw_grid
3193  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
3194  cpabort("vhartree has a different grid than the poisson solver")
3195  ! density in G space
3196  CALL pw_pool%create_pw(rhog)
3197  IF (PRESENT(aux_density)) THEN
3198  CALL pw_pool%create_pw(rhog_aux)
3199  END IF
3200 
3201  SELECT CASE (poisson_env%used_grid)
3202  CASE (use_gs_grid)
3203 
3204  SELECT CASE (poisson_env%green_fft%method)
3206 
3207  CALL pw_transfer(density, rhog)
3208  IF (PRESENT(aux_density)) THEN
3209  CALL pw_transfer(aux_density, rhog_aux)
3210  END IF
3211  IF (PRESENT(greenfn)) THEN
3212  influence_fn = greenfn
3213  ELSE
3214  influence_fn = poisson_env%green_fft%influence_fn
3215  END IF
3216  CALL pw_multiply_with(rhog, influence_fn)
3217  IF (PRESENT(aux_density)) THEN
3218  CALL pw_multiply_with(rhog_aux, influence_fn)
3219  END IF
3220  CALL pw_transfer(rhog, vhartree)
3221  IF (PRESENT(ehartree)) THEN
3222  IF (PRESENT(aux_density)) THEN
3223  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3224  ELSE
3225  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
3226  END IF
3227  END IF
3228 
3229  CASE (ps_implicit)
3230  IF (PRESENT(h_stress)) THEN
3231  CALL cp_abort(__location__, &
3232  "No stress tensor is implemented for the implicit Poisson solver.")
3233  END IF
3234 
3235  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
3236  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3238  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3239  poisson_env%diel_rs_grid, &
3240  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3241  density, rho_core=rho_core)
3242  CASE (neumann_bc, mixed_bc)
3243  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3244  poisson_env%diel_rs_grid, &
3245  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3246  poisson_env%dct_pw_grid, &
3247  poisson_env%parameters%ps_implicit_params%neumann_directions, &
3248  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3249  poisson_env%implicit_env%dct_env%dests_expand, &
3250  poisson_env%implicit_env%dct_env%srcs_expand, &
3251  poisson_env%implicit_env%dct_env%flipg_stat, &
3252  poisson_env%implicit_env%dct_env%bounds_shftd, &
3253  density, rho_core=rho_core)
3254  END SELECT
3255  END IF
3256 
3257  CALL pw_pool%create_pw(rhor)
3258  CALL pw_pool%create_pw(vhartree_rs)
3259  CALL pw_transfer(density, rhor)
3260 
3261  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3262  CASE (periodic_bc)
3263  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
3264  ehartree=ehartree)
3265  CASE (neumann_bc)
3266  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
3267  ehartree=ehartree)
3268  CASE (mixed_periodic_bc)
3269  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
3270  electric_enthalpy=ehartree)
3271  CASE (mixed_bc)
3272  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
3273  electric_enthalpy=ehartree)
3274  END SELECT
3275 
3276  CALL pw_transfer(vhartree_rs, vhartree)
3277  CALL pw_transfer(rhor, rhog)
3278 
3279  IF (PRESENT(aux_density)) THEN
3280  CALL pw_transfer(aux_density, rhor)
3281  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
3282  END IF
3283 
3284  CALL pw_pool%give_back_pw(rhor)
3285  CALL pw_pool%give_back_pw(vhartree_rs)
3286 
3287  CASE DEFAULT
3288  CALL cp_abort(__location__, &
3289  "unknown poisson method "// &
3290  cp_to_string(poisson_env%green_fft%method))
3291  END SELECT
3292 
3293  CASE (use_rs_grid)
3294 
3295  CALL pw_pool%create_pw(rhor)
3296  CALL pw_transfer(density, rhor)
3297  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3298  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3299  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3300  CALL pw_transfer(rhor, vhartree)
3301  CALL pw_transfer(rhor, rhog)
3302  IF (PRESENT(ehartree)) THEN
3303  IF (PRESENT(aux_density)) THEN
3304  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3305  ELSE
3306  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
3307  END IF
3308  END IF
3309  CALL pw_transfer(rhor, rhog)
3310  IF (PRESENT(aux_density)) THEN
3311  CALL pw_transfer(aux_density, rhor)
3312  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3313  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3314  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3315  CALL pw_transfer(rhor, rhog_aux)
3316  END IF
3317  CALL pw_pool%give_back_pw(rhor)
3318 
3319  END SELECT
3320 
3321  IF (PRESENT(aux_density)) THEN
3322  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3323  ELSE
3324  CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3325  END IF
3326 
3327  CALL pw_pool%give_back_pw(rhog)
3328  IF (PRESENT(aux_density)) THEN
3329  CALL pw_pool%give_back_pw(rhog_aux)
3330  END IF
3331 
3332  CALL timestop(handle)
3333 
3334  END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs
3335 ! **************************************************************************************************
3336 !> \brief Solve Poisson equation in a plane wave basis set
3337 !> Obtains electrostatic potential and its derivatives with respect to r
3338 !> from the density
3339 !> \param poisson_env ...
3340 !> \param density ...
3341 !> \param ehartree ...
3342 !> \param vhartree ...
3343 !> \param dvhartree ...
3344 !> \param h_stress ...
3345 !> \param rho_core ...
3346 !> \param greenfn ...
3347 !> \param aux_density Hartree energy and stress tensor between 2 different densities
3348 !> \par History
3349 !> JGH (13-Mar-2001) : completely revised
3350 !> \author apsi
3351 ! **************************************************************************************************
3352  SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
3353  dvhartree, h_stress, rho_core, greenfn, aux_density)
3354 
3355  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
3356  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
3357  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
3358  TYPE(pw_r3d_rs_type), INTENT(INOUT) :: vhartree
3359  TYPE(pw_c1d_gs_type), DIMENSION(3) :: dvhartree
3360  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
3361  OPTIONAL :: h_stress
3362  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
3363  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
3364 
3365  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
3366 
3367  INTEGER :: handle
3368  LOGICAL :: has_dielectric
3369  TYPE(pw_grid_type), POINTER :: pw_grid
3370  TYPE(pw_pool_type), POINTER :: pw_pool
3371  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
3372  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
3373 
3374  CALL timeset(routinen, handle)
3375 
3376  CALL pw_poisson_rebuild(poisson_env, density)
3377 
3378  has_dielectric = poisson_env%parameters%has_dielectric
3379 
3380  ! point pw
3381  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3382  pw_grid => pw_pool%pw_grid
3383  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
3384  cpabort("vhartree has a different grid than the poisson solver")
3385  ! density in G space
3386  CALL pw_pool%create_pw(rhog)
3387  IF (PRESENT(aux_density)) THEN
3388  CALL pw_pool%create_pw(rhog_aux)
3389  END IF
3390 
3391  SELECT CASE (poisson_env%used_grid)
3392  CASE (use_gs_grid)
3393 
3394  SELECT CASE (poisson_env%green_fft%method)
3396 
3397  CALL pw_transfer(density, rhog)
3398  IF (PRESENT(aux_density)) THEN
3399  CALL pw_transfer(aux_density, rhog_aux)
3400  END IF
3401  IF (PRESENT(greenfn)) THEN
3402  influence_fn = greenfn
3403  ELSE
3404  influence_fn = poisson_env%green_fft%influence_fn
3405  END IF
3406  CALL pw_multiply_with(rhog, influence_fn)
3407  IF (PRESENT(aux_density)) THEN
3408  CALL pw_multiply_with(rhog_aux, influence_fn)
3409  END IF
3410  CALL pw_transfer(rhog, vhartree)
3411  IF (PRESENT(ehartree)) THEN
3412  IF (PRESENT(aux_density)) THEN
3413  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3414  ELSE
3415  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
3416  END IF
3417  END IF
3418 
3419  CASE (ps_implicit)
3420  IF (PRESENT(h_stress)) THEN
3421  CALL cp_abort(__location__, &
3422  "No stress tensor is implemented for the implicit Poisson solver.")
3423  END IF
3424 
3425  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
3426  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3428  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3429  poisson_env%diel_rs_grid, &
3430  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3431  density, rho_core=rho_core)
3432  CASE (neumann_bc, mixed_bc)
3433  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3434  poisson_env%diel_rs_grid, &
3435  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3436  poisson_env%dct_pw_grid, &
3437  poisson_env%parameters%ps_implicit_params%neumann_directions, &
3438  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3439  poisson_env%implicit_env%dct_env%dests_expand, &
3440  poisson_env%implicit_env%dct_env%srcs_expand, &
3441  poisson_env%implicit_env%dct_env%flipg_stat, &
3442  poisson_env%implicit_env%dct_env%bounds_shftd, &
3443  density, rho_core=rho_core)
3444  END SELECT
3445  END IF
3446 
3447  CALL pw_pool%create_pw(rhor)
3448  CALL pw_pool%create_pw(vhartree_rs)
3449  CALL pw_transfer(density, rhor)
3450 
3451  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3452  CASE (periodic_bc)
3453  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
3454  ehartree=ehartree)
3455  CASE (neumann_bc)
3456  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
3457  ehartree=ehartree)
3458  CASE (mixed_periodic_bc)
3459  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
3460  electric_enthalpy=ehartree)
3461  CASE (mixed_bc)
3462  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
3463  electric_enthalpy=ehartree)
3464  END SELECT
3465 
3466  CALL pw_transfer(vhartree_rs, vhartree)
3467  CALL pw_transfer(rhor, rhog)
3468 
3469  IF (PRESENT(aux_density)) THEN
3470  CALL pw_transfer(aux_density, rhor)
3471  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
3472  END IF
3473 
3474  CALL pw_pool%give_back_pw(rhor)
3475  CALL pw_pool%give_back_pw(vhartree_rs)
3476 
3477  CASE DEFAULT
3478  CALL cp_abort(__location__, &
3479  "unknown poisson method "// &
3480  cp_to_string(poisson_env%green_fft%method))
3481  END SELECT
3482 
3483  CASE (use_rs_grid)
3484 
3485  CALL pw_pool%create_pw(rhor)
3486  CALL pw_transfer(density, rhor)
3487  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3488  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3489  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3490  CALL pw_transfer(rhor, vhartree)
3491  CALL pw_transfer(rhor, rhog)
3492  IF (PRESENT(ehartree)) THEN
3493  IF (PRESENT(aux_density)) THEN
3494  ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3495  ELSE
3496  ehartree = 0.5_dp*pw_integral_ab(density, rhog)
3497  END IF
3498  END IF
3499  CALL pw_transfer(rhor, rhog)
3500  IF (PRESENT(aux_density)) THEN
3501  CALL pw_transfer(aux_density, rhor)
3502  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3503  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3504  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3505  CALL pw_transfer(rhor, rhog_aux)
3506  END IF
3507  CALL pw_pool%give_back_pw(rhor)
3508 
3509  END SELECT
3510 
3511  IF (PRESENT(aux_density)) THEN
3512  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3513  ELSE
3514  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3515  END IF
3516 
3517  CALL pw_pool%give_back_pw(rhog)
3518  IF (PRESENT(aux_density)) THEN
3519  CALL pw_pool%give_back_pw(rhog_aux)
3520  END IF
3521 
3522  CALL timestop(handle)
3523 
3524  END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs
3525 ! **************************************************************************************************
3526 !> \brief Solve Poisson equation in a plane wave basis set
3527 !> Obtains electrostatic potential and its derivatives with respect to r
3528 !> from the density
3529 !> \param poisson_env ...
3530 !> \param density ...
3531 !> \param ehartree ...
3532 !> \param vhartree ...
3533 !> \param dvhartree ...
3534 !> \param h_stress ...
3535 !> \param rho_core ...
3536 !> \param greenfn ...
3537 !> \param aux_density Hartree energy and stress tensor between 2 different densities
3538 !> \par History
3539 !> JGH (13-Mar-2001) : completely revised
3540 !> \author apsi
3541 ! **************************************************************************************************
3542  SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
3543  dvhartree, h_stress, rho_core, greenfn, aux_density)
3544 
3545  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
3546  TYPE(pw_c1d_gs_type), INTENT(IN) :: density
3547  REAL(kind=dp), INTENT(out), OPTIONAL :: ehartree
3548  TYPE(pw_c1d_gs_type), INTENT(INOUT) :: vhartree
3549  TYPE(pw_c1d_gs_type), DIMENSION(3) :: dvhartree
3550  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), &
3551  OPTIONAL :: h_stress
3552  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rho_core, greenfn
3553  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: aux_density
3554 
3555  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_solve'
3556 
3557  INTEGER :: handle
3558  LOGICAL :: has_dielectric
3559  TYPE(pw_grid_type), POINTER :: pw_grid
3560  TYPE(pw_pool_type), POINTER :: pw_pool
3561  TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
3562  TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
3563 
3564  CALL timeset(routinen, handle)
3565 
3566  CALL pw_poisson_rebuild(poisson_env, density)
3567 
3568  has_dielectric = poisson_env%parameters%has_dielectric
3569 
3570  ! point pw
3571  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3572  pw_grid => pw_pool%pw_grid
3573  IF (.NOT. pw_grid_compare(pw_pool%pw_grid, vhartree%pw_grid)) &
3574  cpabort("vhartree has a different grid than the poisson solver")
3575  ! density in G space
3576  CALL pw_pool%create_pw(rhog)
3577  IF (PRESENT(aux_density)) THEN
3578  CALL pw_pool%create_pw(rhog_aux)
3579  END IF
3580 
3581  SELECT CASE (poisson_env%used_grid)
3582  CASE (use_gs_grid)
3583 
3584  SELECT CASE (poisson_env%green_fft%method)
3586 
3587  CALL pw_transfer(density, rhog)
3588  IF (PRESENT(aux_density)) THEN
3589  CALL pw_transfer(aux_density, rhog_aux)
3590  END IF
3591  IF (PRESENT(greenfn)) THEN
3592  influence_fn = greenfn
3593  ELSE
3594  influence_fn = poisson_env%green_fft%influence_fn
3595  END IF
3596  CALL pw_multiply_with(rhog, influence_fn)
3597  IF (PRESENT(aux_density)) THEN
3598  CALL pw_multiply_with(rhog_aux, influence_fn)
3599  END IF
3600  CALL pw_transfer(rhog, vhartree)
3601  IF (PRESENT(ehartree)) THEN
3602  IF (PRESENT(aux_density)) THEN
3603  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3604  ELSE
3605  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
3606  END IF
3607  END IF
3608 
3609  CASE (ps_implicit)
3610  IF (PRESENT(h_stress)) THEN
3611  CALL cp_abort(__location__, &
3612  "No stress tensor is implemented for the implicit Poisson solver.")
3613  END IF
3614 
3615  IF (has_dielectric .AND. PRESENT(rho_core)) THEN
3616  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3618  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3619  poisson_env%diel_rs_grid, &
3620  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3621  density, rho_core=rho_core)
3622  CASE (neumann_bc, mixed_bc)
3623  CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3624  poisson_env%diel_rs_grid, &
3625  poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3626  poisson_env%dct_pw_grid, &
3627  poisson_env%parameters%ps_implicit_params%neumann_directions, &
3628  poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3629  poisson_env%implicit_env%dct_env%dests_expand, &
3630  poisson_env%implicit_env%dct_env%srcs_expand, &
3631  poisson_env%implicit_env%dct_env%flipg_stat, &
3632  poisson_env%implicit_env%dct_env%bounds_shftd, &
3633  density, rho_core=rho_core)
3634  END SELECT
3635  END IF
3636 
3637  CALL pw_pool%create_pw(rhor)
3638  CALL pw_pool%create_pw(vhartree_rs)
3639  CALL pw_transfer(density, rhor)
3640 
3641  SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3642  CASE (periodic_bc)
3643  CALL implicit_poisson_solver_periodic(poisson_env, rhor, vhartree_rs, &
3644  ehartree=ehartree)
3645  CASE (neumann_bc)
3646  CALL implicit_poisson_solver_neumann(poisson_env, rhor, vhartree_rs, &
3647  ehartree=ehartree)
3648  CASE (mixed_periodic_bc)
3649  CALL implicit_poisson_solver_mixed_periodic(poisson_env, rhor, vhartree_rs, &
3650  electric_enthalpy=ehartree)
3651  CASE (mixed_bc)
3652  CALL implicit_poisson_solver_mixed(poisson_env, rhor, vhartree_rs, &
3653  electric_enthalpy=ehartree)
3654  END SELECT
3655 
3656  CALL pw_transfer(vhartree_rs, vhartree)
3657  CALL pw_transfer(rhor, rhog)
3658 
3659  IF (PRESENT(aux_density)) THEN
3660  CALL pw_transfer(aux_density, rhor)
3661  ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
3662  END IF
3663 
3664  CALL pw_pool%give_back_pw(rhor)
3665  CALL pw_pool%give_back_pw(vhartree_rs)
3666 
3667  CASE DEFAULT
3668  CALL cp_abort(__location__, &
3669  "unknown poisson method "// &
3670  cp_to_string(poisson_env%green_fft%method))
3671  END SELECT
3672 
3673  CASE (use_rs_grid)
3674 
3675  CALL pw_pool%create_pw(rhor)
3676  CALL pw_transfer(density, rhor)
3677  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3678  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3679  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3680  CALL pw_transfer(rhor, vhartree)
3681  CALL pw_transfer(rhor, rhog)
3682  IF (PRESENT(ehartree)) THEN
3683  IF (PRESENT(aux_density)) THEN
3684  ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3685  ELSE
3686  ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
3687  END IF
3688  END IF
3689  CALL pw_transfer(rhor, rhog)
3690  IF (PRESENT(aux_density)) THEN
3691  CALL pw_transfer(aux_density, rhor)
3692  CALL cp2k_distribution_to_z_slices(rhor, poisson_env%wavelet, rhor%pw_grid)
3693  CALL ps_wavelet_solve(poisson_env%wavelet, rhor%pw_grid)
3694  CALL z_slices_to_cp2k_distribution(rhor, poisson_env%wavelet, rhor%pw_grid)
3695  CALL pw_transfer(rhor, rhog_aux)
3696  END IF
3697  CALL pw_pool%give_back_pw(rhor)
3698 
3699  END SELECT
3700 
3701  IF (PRESENT(aux_density)) THEN
3702  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3703  ELSE
3704  CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3705  END IF
3706 
3707  CALL pw_pool%give_back_pw(rhog)
3708  IF (PRESENT(aux_density)) THEN
3709  CALL pw_pool%give_back_pw(rhog_aux)
3710  END IF
3711 
3712  CALL timestop(handle)
3713 
3714  END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs
3715 
3716  SUBROUTINE calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
3717  TYPE(pw_poisson_type), INTENT(IN) :: poisson_env
3718  TYPE(pw_c1d_gs_type), INTENT(IN) :: rhog
3719  REAL(KIND=dp) :: ehartree
3720  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rhog_aux
3721  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), OPTIONAL :: h_stress
3722  TYPE(pw_c1d_gs_type), DIMENSION(3), INTENT(INOUT), OPTIONAL :: dvhartree
3723 
3724  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_set'
3725 
3726  REAL(KIND=dp) :: ffa
3727  INTEGER :: alpha, beta, n(3), handle, i
3728  TYPE(pw_c1d_gs_type) :: dvg(3), dvg_aux(3)
3729  TYPE(pw_pool_type), POINTER :: pw_pool
3730 
3731  CALL timeset(routinen, handle)
3732 
3733  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3734 
3735  DO i = 1, 3
3736  CALL pw_pool%create_pw(dvg(i))
3737  n = 0
3738  n(i) = 1
3739  CALL pw_copy(rhog, dvg(i))
3740  CALL pw_derive(dvg(i), n)
3741  IF (PRESENT(rhog_aux)) THEN
3742  CALL pw_pool%create_pw(dvg_aux(i))
3743  CALL pw_copy(rhog_aux, dvg_aux(i))
3744  CALL pw_derive(dvg_aux(i), n)
3745  END IF
3746  END DO
3747  ! save the derivatives
3748  IF (PRESENT(dvhartree)) THEN
3749  DO i = 1, 3
3750  CALL pw_transfer(dvg(i), dvhartree(i))
3751  END DO
3752  END IF
3753  ! Calculate the contribution to the stress tensor this is only the contribution from
3754  ! the Greens FUNCTION and the volume factor of the plane waves
3755  IF (PRESENT(h_stress)) THEN
3756  ffa = -1.0_dp/fourpi
3757  h_stress = 0.0_dp
3758  DO alpha = 1, 3
3759  h_stress(alpha, alpha) = ehartree
3760  IF (PRESENT(rhog_aux)) THEN
3761  DO beta = alpha, 3
3762  h_stress(alpha, beta) = h_stress(alpha, beta) &
3763  + ffa*pw_integral_ab(dvg_aux(alpha), dvg(beta))
3764  h_stress(beta, alpha) = h_stress(alpha, beta)
3765  END DO
3766  ELSE
3767  DO beta = alpha, 3
3768  h_stress(alpha, beta) = h_stress(alpha, beta) &
3769  + ffa*pw_integral_ab(dvg(alpha), dvg(beta))
3770  h_stress(beta, alpha) = h_stress(alpha, beta)
3771  END DO
3772  END IF
3773  END DO
3774 
3775  ! Handle the periodicity cases for the Stress Tensor
3776  SELECT CASE (poisson_env%used_grid)
3777  CASE (use_gs_grid)
3778 
3779  ! FFT based Poisson-Solver
3780  SELECT CASE (poisson_env%green_fft%method)
3781  CASE (periodic3d, ps_implicit)
3782  ! Do Nothing
3783  CASE (analytic2d, mt2d)
3784  ! Zero the 1 non-periodic component
3785  alpha = poisson_env%green_fft%special_dimension
3786  h_stress(:, alpha) = 0.0_dp
3787  h_stress(alpha, :) = 0.0_dp
3788  cpabort("Stress Tensor not tested for 2D systems.")
3789  CASE (analytic1d, mt1d)
3790  ! Zero the 2 non-periodic components
3791  DO alpha = 1, 3
3792  DO beta = alpha, 3
3793  IF ((alpha /= poisson_env%green_fft%special_dimension) .OR. &
3794  (beta /= poisson_env%green_fft%special_dimension)) THEN
3795  h_stress(alpha, beta) = 0.0_dp
3796  h_stress(beta, alpha) = 0.0_dp
3797  END IF
3798  END DO
3799  END DO
3800  cpabort("Stress Tensor not tested for 1D systems.")
3801  CASE (analytic0d, mt0d, multipole0d)
3802  ! Zero the full stress tensor
3803  h_stress = 0.0_dp
3804  CASE DEFAULT
3805  CALL cp_abort(__location__, &
3806  "unknown poisson method"// &
3807  cp_to_string(poisson_env%green_fft%method))
3808  END SELECT
3809 
3810  CASE (use_rs_grid)
3811 
3812  ! Wavelet based Poisson-Solver
3813  SELECT CASE (poisson_env%wavelet%method)
3814  CASE (wavelet3d)
3815  ! Do Nothing
3816  CASE (wavelet2d)
3817  ! Zero the 1 non-periodic component
3818  alpha = poisson_env%wavelet%special_dimension
3819  h_stress(:, alpha) = 0.0_dp
3820  h_stress(alpha, :) = 0.0_dp
3821  cpabort("Stress Tensor not tested for 2D systems.")
3822  CASE (wavelet1d)
3823  ! Zero the 2 non-periodic components
3824  cpabort("WAVELET 1D not implemented!")
3825  CASE (wavelet0d)
3826  ! Zero the full stress tensor
3827  h_stress = 0.0_dp
3828  END SELECT
3829 
3830  END SELECT
3831  END IF
3832 
3833  DO i = 1, 3
3834  CALL pw_pool%give_back_pw(dvg(i))
3835  IF (PRESENT(rhog_aux)) THEN
3836  CALL pw_pool%give_back_pw(dvg_aux(i))
3837  END IF
3838  END DO
3839 
3840  CALL timestop(handle)
3841 
3842  END SUBROUTINE calc_stress_and_gradient_c1d_gs
3843  SUBROUTINE calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
3844  TYPE(pw_poisson_type), INTENT(IN) :: poisson_env
3845  TYPE(pw_c1d_gs_type), INTENT(IN) :: rhog
3846  REAL(KIND=dp) :: ehartree
3847  TYPE(pw_c1d_gs_type), INTENT(IN), OPTIONAL :: rhog_aux
3848  REAL(KIND=dp), DIMENSION(3, 3), INTENT(OUT), OPTIONAL :: h_stress
3849  TYPE(pw_r3d_rs_type), DIMENSION(3), INTENT(INOUT), OPTIONAL :: dvhartree
3850 
3851  CHARACTER(len=*), PARAMETER :: routineN = 'pw_poisson_set'
3852 
3853  REAL(KIND=dp) :: ffa
3854  INTEGER :: alpha, beta, n(3), handle, i
3855  TYPE(pw_c1d_gs_type) :: dvg(3), dvg_aux(3)
3856  TYPE(pw_pool_type), POINTER :: pw_pool
3857 
3858  CALL timeset(routinen, handle)
3859 
3860  pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3861 
3862  DO i = 1, 3
3863  CALL pw_pool%create_pw(dvg(i))
3864  n = 0
3865  n(i) = 1
3866  CALL pw_copy(rhog, dvg(i))
3867  CALL pw_derive(dvg(i), n)
3868  IF (PRESENT(rhog_aux)) THEN
3869  CALL pw_pool%create_pw(dvg_aux(i))
3870  CALL pw_copy(rhog_aux, dvg_aux(i))
3871  CALL pw_derive(dvg_aux(i), n)
3872  END IF
3873  END DO
3874  ! save the derivatives
3875  IF (PRESENT(dvhartree)) THEN
3876  DO i = 1, 3
3877  CALL pw_transfer(dvg(i), dvhartree(i))
3878  END DO
3879  END IF
3880  ! Calculate the contribution to the stress tensor this is only the contribution from
3881  ! the Greens FUNCTION and the volume factor of the plane waves
3882  IF (PRESENT(h_stress)) THEN
3883  ffa = -1.0_dp/fourpi
3884  h_stress = 0.0_dp
3885  DO alpha = 1, 3
3886  h_stress(alpha, alpha) = ehartree
3887  IF (PRESENT(rhog_aux)) THEN
3888  DO beta = alpha, 3
3889  h_stress(alpha, beta) = h_stress(alpha, beta) &
3890  + ffa*pw_integral_ab(dvg_aux(alpha), dvg(beta))
3891  h_stress(beta, alpha) = h_stress(alpha, beta)
3892  END DO
3893  ELSE
3894  DO beta = alpha, 3
3895  h_stress(alpha, beta) = h_stress(alpha, beta) &
3896  + ffa*pw_integral_ab(dvg(alpha), dvg(beta))
3897  h_stress(beta, alpha) = h_stress(alpha, beta)
3898  END DO
3899  END IF
3900  END DO
3901 
3902  ! Handle the periodicity cases for the Stress Tensor
3903  SELECT CASE (poisson_env%used_grid)
3904  CASE (use_gs_grid)
3905 
3906  ! FFT based Poisson-Solver
3907  SELECT CASE (poisson_env%green_fft%method)
3908  CASE (periodic3d, ps_implicit)
3909  ! Do Nothing
3910  CASE (analytic2d, mt2d)
3911  ! Zero the 1 non-periodic component
3912  alpha = poisson_env%green_fft%special_dimension
3913  h_stress(:, alpha) = 0.0_dp
3914  h_stress(alpha, :) = 0.0_dp
3915  cpabort("Stress Tensor not tested for 2D systems.")
3916  CASE (analytic1d, mt1d)
3917  ! Zero the 2 non-periodic components
3918  DO alpha = 1, 3
3919  DO beta = alpha, 3
3920  IF ((alpha /= poisson_env%green_fft%special_dimension) .OR. &
3921  (beta /= poisson_env%green_fft%special_dimension)) THEN
3922  h_stress(alpha, beta) = 0.0_dp
3923  h_stress(beta, alpha) = 0.0_dp
3924  END IF
3925  END DO
3926  END DO
3927  cpabort("Stress Tensor not tested for 1D systems.")
3928  CASE (analytic0d, mt0d, multipole0d)
3929  ! Zero the full stress tensor
3930  h_stress = 0.0_dp
3931  CASE DEFAULT
3932  CALL cp_abort(__location__, &
3933  "unknown poisson method"// &
3934  cp_to_string(poisson_env%green_fft%method))
3935  END SELECT
3936 
3937  CASE (use_rs_grid)
3938 
3939  ! Wavelet based Poisson-Solver
3940  SELECT CASE (poisson_env%wavelet%method)
3941  CASE (wavelet3d)
3942  ! Do Nothing
3943  CASE (wavelet2d)
3944  ! Zero the 1 non-periodic component
3945  alpha = poisson_env%wavelet%special_dimension
3946  h_stress(:, alpha) = 0.0_dp
3947  h_stress(alpha, :) = 0.0_dp
3948  cpabort("Stress Tensor not tested for 2D systems.")
3949  CASE (wavelet1d)
3950  ! Zero the 2 non-periodic components
3951  cpabort("WAVELET 1D not implemented!")
3952  CASE (wavelet0d)
3953  ! Zero the full stress tensor
3954  h_stress = 0.0_dp
3955  END SELECT
3956 
3957  END SELECT
3958  END IF
3959 
3960  DO i = 1, 3
3961  CALL pw_pool%give_back_pw(dvg(i))
3962  IF (PRESENT(rhog_aux)) THEN
3963  CALL pw_pool%give_back_pw(dvg_aux(i))
3964  END IF
3965  END DO
3966 
3967  CALL timestop(handle)
3968 
3969  END SUBROUTINE calc_stress_and_gradient_r3d_rs
3970 
3971 ! **************************************************************************************************
3972 !> \brief sets cell, grids and parameters used by the poisson solver
3973 !> You should call this at least once (and set everything)
3974 !> before using the poisson solver.
3975 !> Smart, doesn't set the thing twice to the same value
3976 !> Keeps track of the need to rebuild the poisson_env
3977 !> \param poisson_env ...
3978 !> \param cell_hmat ...
3979 !> \param parameters ...
3980 !> \param pw_pools ...
3981 !> \param use_level ...
3982 !> \param mt_super_ref_pw_grid ...
3983 !> \param dct_pw_grid ...
3984 !> \param force_rebuild ...
3985 !> \author fawzi
3986 !> \note
3987 !> Checks everything at the end. This means that after *each* call to
3988 !> this method the poisson env must be fully ready, so the first time
3989 !> you have to set everything at once. Change this behaviour?
3990 ! **************************************************************************************************
3991  SUBROUTINE pw_poisson_set(poisson_env, cell_hmat, parameters, pw_pools, use_level, &
3992  mt_super_ref_pw_grid, dct_pw_grid, force_rebuild)
3993 
3994  TYPE(pw_poisson_type), INTENT(INOUT) :: poisson_env
3995  REAL(kind=dp), DIMENSION(3, 3), INTENT(IN), &
3996  OPTIONAL :: cell_hmat
3997  TYPE(pw_poisson_parameter_type), INTENT(IN), &
3998  OPTIONAL :: parameters
3999  TYPE(pw_pool_p_type), DIMENSION(:), OPTIONAL, &
4000  POINTER :: pw_pools
4001  INTEGER, INTENT(in), OPTIONAL :: use_level
4002  TYPE(pw_grid_type), OPTIONAL, POINTER :: mt_super_ref_pw_grid, dct_pw_grid
4003  LOGICAL, INTENT(in), OPTIONAL :: force_rebuild
4004 
4005  CHARACTER(len=*), PARAMETER :: routinen = 'pw_poisson_set'
4006 
4007  INTEGER :: handle, i
4008  LOGICAL :: same
4009  TYPE(pw_pool_p_type), DIMENSION(:), POINTER :: tmp_pools
4010 
4011  CALL timeset(routinen, handle)
4012 
4013  IF (PRESENT(parameters)) &
4014  poisson_env%parameters = parameters
4015 
4016  IF (PRESENT(cell_hmat)) THEN
4017  IF (any(poisson_env%cell_hmat /= cell_hmat)) &
4018  CALL pw_poisson_cleanup(poisson_env)
4019  poisson_env%cell_hmat(:, :) = cell_hmat(:, :)
4020  poisson_env%rebuild = .true.
4021  END IF
4022 
4023  IF (PRESENT(pw_pools)) THEN
4024  cpassert(ASSOCIATED(pw_pools))
4025  same = .false.
4026  IF (ASSOCIATED(poisson_env%pw_pools)) THEN
4027  same = SIZE(poisson_env%pw_pools) == SIZE(pw_pools)
4028  IF (same) THEN
4029  DO i = 1, SIZE(pw_pools)
4030  IF (.NOT. ASSOCIATED(poisson_env%pw_pools(i)%pool, &
4031  pw_pools(i)%pool)) same = .false.
4032  END DO
4033  END IF
4034  END IF
4035  IF (.NOT. same) THEN
4036  poisson_env%rebuild = .true.
4037  CALL pw_pools_copy(pw_pools, tmp_pools)
4038  CALL pw_pools_dealloc(poisson_env%pw_pools)
4039  poisson_env%pw_pools => tmp_pools
4040  END IF
4041  END IF
4042 
4043  IF (PRESENT(use_level)) poisson_env%pw_level = use_level
4044 
4045  IF (PRESENT(dct_pw_grid)) THEN
4046  IF (ASSOCIATED(dct_pw_grid)) THEN
4047  CALL pw_grid_retain(dct_pw_grid)
4048  END IF
4049  CALL pw_grid_release(poisson_env%dct_pw_grid)
4050  poisson_env%dct_pw_grid => dct_pw_grid
4051  END IF
4052 
4053  IF (PRESENT(mt_super_ref_pw_grid)) THEN
4054  IF (ASSOCIATED(mt_super_ref_pw_grid)) THEN
4055  CALL pw_grid_retain(mt_super_ref_pw_grid)
4056  END IF
4057  CALL pw_grid_release(poisson_env%mt_super_ref_pw_grid)
4058  poisson_env%mt_super_ref_pw_grid => mt_super_ref_pw_grid
4059  END IF
4060 
4061  IF (PRESENT(force_rebuild)) THEN
4062  IF (force_rebuild) poisson_env%rebuild = .true.
4063  END IF
4064 
4065  CALL pw_poisson_check(poisson_env)
4066 
4067  CALL timestop(handle)
4068 
4069  END SUBROUTINE pw_poisson_set
4070 
4071 END MODULE pw_poisson_methods
various routines to log and control the output. The idea is that decisions about where to log should ...
methods for evaluating the dielectric constant
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
Definition of mathematical constants and functions.
Definition: mathconstants.F:16
real(kind=dp), parameter, public fourpi
Definition: mt_util.F:9
integer, parameter, public mt0d
Definition: mt_util.F:33
integer, parameter, public mt2d
Definition: mt_util.F:33
integer, parameter, public mt1d
Definition: mt_util.F:33
The implicit (generalized) Poisson solver.
subroutine, public implicit_poisson_solver_periodic(poisson_env, density, v_new, ehartree)
implicit Poisson solver for periodic boundary conditions
subroutine, public implicit_poisson_solver_mixed(poisson_env, density, v_new, electric_enthalpy)
implicit Poisson solver for mixed boundary conditions (Neumann + Dirichlet)
subroutine, public implicit_poisson_solver_neumann(poisson_env, density, v_new, ehartree)
implicit Poisson solver: zero-average solution of the Poisson equation subject to homogeneous Neumann...
subroutine, public implicit_poisson_solver_mixed_periodic(poisson_env, density, v_new, electric_enthalpy)
implicit Poisson solver for mixed-periodic boundary conditions (periodic + Dirichlet)
subroutine, public ps_implicit_create(pw_pool, poisson_params, dct_pw_grid, green, ps_implicit_env)
Creates implicit Poisson solver environment.
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
Definition and initialisation of the ps_wavelet data type. \history 01.2014 Renamed from ps_wavelet_t...
subroutine, public ps_wavelet_create(poisson_params, wavelet, pw_grid)
creates the ps_wavelet_type which is needed for the link to the Poisson Solver of Luigi Genovese
subroutine, public ps_wavelet_solve(wavelet, pw_grid)
...
subroutine, public z_slices_to_cp2k_distribution(density, wavelet, pw_grid)
...
subroutine, public cp2k_distribution_to_z_slices(density, wavelet, pw_grid)
...
Definition and initialisation of the ps_wavelet data type.
integer, parameter, public wavelet3d
integer, parameter, public wavelet0d
integer, parameter, public wavelet1d
integer, parameter, public wavelet2d
This module defines the grid data type and some basic operations on it.
Definition: pw_grids.F:36
logical function, public pw_grid_compare(grida, gridb)
Check if two pw_grids are equal.
Definition: pw_grids.F:147
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
Definition: pw_grids.F:2133
subroutine, public pw_grid_retain(pw_grid)
retains the given pw grid
Definition: pw_grids.F:2117
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
Definition: pw_methods.F:10106
subroutine, public pw_poisson_set(poisson_env, cell_hmat, parameters, pw_pools, use_level, mt_super_ref_pw_grid, dct_pw_grid, force_rebuild)
sets cell, grids and parameters used by the poisson solver You should call this at least once (and se...
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_wavelet
subroutine, public pw_green_create(green, poisson_params, cell_hmat, pw_pool, mt_super_ref_pw_grid, dct_pw_grid)
Allocates and sets up the green functions for the fft based poisson solvers.
integer, parameter, public pw_poisson_periodic
subroutine, public pw_green_release(gftype, pw_pool)
destroys the type (deallocates data)
integer, parameter, public pw_poisson_none
integer, parameter, public pw_poisson_mt
integer, parameter, public analytic2d
integer, parameter, public analytic1d
integer, parameter, public periodic3d
integer, parameter, public ps_implicit
integer, parameter, public analytic0d
integer, parameter, public multipole0d
integer, parameter, public pw_poisson_implicit
integer, parameter, public pw_poisson_analytic
integer, parameter, public do_ewald_spme
integer, parameter, public pw_poisson_multipole
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Definition: pw_pool_types.F:24
subroutine, public pw_pools_dealloc(pools)
deallocates the given pools (releasing each of the underlying pools)
subroutine, public pw_pools_copy(source_pools, target_pools)
copies a multigrid pool, the underlying pools are shared