59#include "../base/base_uses.f90"
64 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
65 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_poisson_methods'
70 INTEGER,
PARAMETER :: use_rs_grid = 0, &
74 MODULE PROCEDURE pw_poisson_rebuild_nodens
75 MODULE PROCEDURE pw_poisson_rebuild_c1d_gs, pw_poisson_rebuild_r3d_rs
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
109 SUBROUTINE pw_poisson_cleanup(poisson_env)
110 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
112 TYPE(pw_pool_type),
POINTER :: pw_pool
115 IF (
ASSOCIATED(poisson_env%pw_pools))
THEN
116 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
118 IF (
ASSOCIATED(poisson_env%green_fft))
THEN
120 DEALLOCATE (poisson_env%green_fft)
122 poisson_env%rebuild = .true.
124 END SUBROUTINE pw_poisson_cleanup
131 SUBROUTINE pw_poisson_check(poisson_env)
132 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
135 TYPE(greens_fn_type),
POINTER :: green
136 TYPE(ps_wavelet_type),
POINTER :: wavelet
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
149 poisson_env%used_grid = use_rs_grid
151 poisson_env%used_grid = use_gs_grid
153 IF (.NOT. rebuild)
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
158 SELECT CASE (poisson_env%method)
160 SELECT CASE (green%method)
166 SELECT CASE (green%method)
171 rebuild = (poisson_env%parameters%mt_alpha /= green%mt_alpha) .OR. rebuild
173 rebuild = (poisson_env%parameters%wavelet_scf_type /= wavelet%itype_scf) .OR. rebuild
175 cpabort(
"Unknown Poisson solver")
179 poisson_env%rebuild = .true.
180 CALL pw_poisson_cleanup(poisson_env)
182 END SUBROUTINE pw_poisson_check
192 SUBROUTINE pw_poisson_rebuild_nodens(poisson_env)
195 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_rebuild'
199 CALL timeset(routinen, handle)
201 cpassert(
ASSOCIATED(poisson_env%pw_pools))
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)
214 cpabort(
"Wavelet solver requires a density!")
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)
223 poisson_env%parameters, &
224 poisson_env%dct_pw_grid, &
225 poisson_env%green_fft, poisson_env%implicit_env)
228 cpabort(
"Unknown Poisson solver")
230 poisson_env%rebuild = .false.
233 CALL timestop(handle)
235 END SUBROUTINE pw_poisson_rebuild_nodens
245 SUBROUTINE pw_poisson_rebuild_r3d_rs (poisson_env, density)
249 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_rebuild'
253 CALL timeset(routinen, handle)
255 cpassert(
ASSOCIATED(poisson_env%pw_pools))
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)
268 cpassert(
ASSOCIATED(density%pw_grid))
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)
279 poisson_env%parameters, &
280 poisson_env%dct_pw_grid, &
281 poisson_env%green_fft, poisson_env%implicit_env)
284 cpabort(
"Unknown Poisson solver")
286 poisson_env%rebuild = .false.
289 CALL timestop(handle)
291 END SUBROUTINE pw_poisson_rebuild_r3d_rs
300 SUBROUTINE pw_poisson_rebuild_c1d_gs (poisson_env, density)
304 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_rebuild'
308 CALL timeset(routinen, handle)
310 cpassert(
ASSOCIATED(poisson_env%pw_pools))
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)
323 cpassert(
ASSOCIATED(density%pw_grid))
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)
334 poisson_env%parameters, &
335 poisson_env%dct_pw_grid, &
336 poisson_env%green_fft, poisson_env%implicit_env)
339 cpabort(
"Unknown Poisson solver")
341 poisson_env%rebuild = .false.
344 CALL timestop(handle)
346 END SUBROUTINE pw_poisson_rebuild_c1d_gs
363 SUBROUTINE pw_poisson_solve_nov_nodv_r3d_rs (poisson_env, density, ehartree, &
364 h_stress, rho_core, greenfn, aux_density)
368 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
369 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
374 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
377 LOGICAL :: has_dielectric
383 CALL timeset(routinen, handle)
387 has_dielectric = poisson_env%parameters%has_dielectric
390 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
391 pw_grid => pw_pool%pw_grid
393 CALL pw_pool%create_pw(rhog)
394 IF (
PRESENT(aux_density))
THEN
395 CALL pw_pool%create_pw(rhog_aux)
398 SELECT CASE (poisson_env%used_grid)
401 SELECT CASE (poisson_env%green_fft%method)
405 IF (
PRESENT(aux_density))
THEN
408 IF (
PRESENT(ehartree))
THEN
409 CALL pw_pool%create_pw(tmpg)
412 IF (
PRESENT(greenfn))
THEN
413 influence_fn = greenfn
415 influence_fn = poisson_env%green_fft%influence_fn
418 IF (
PRESENT(aux_density))
THEN
421 IF (
PRESENT(ehartree))
THEN
422 IF (
PRESENT(aux_density))
THEN
427 CALL pw_pool%give_back_pw(tmpg)
432 IF (
PRESENT(h_stress))
THEN
433 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
436 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
437 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
440 poisson_env%diel_rs_grid, &
441 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
442 density, rho_core=rho_core)
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)
458 CALL pw_pool%create_pw(rhor)
459 CALL pw_pool%create_pw(vhartree_rs)
462 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
471 electric_enthalpy=ehartree)
474 electric_enthalpy=ehartree)
477 IF (
PRESENT(aux_density))
THEN
482 CALL pw_pool%give_back_pw(rhor)
483 CALL pw_pool%give_back_pw(vhartree_rs)
486 CALL cp_abort(__location__, &
487 "unknown poisson method "// &
493 CALL pw_pool%create_pw(rhor)
498 IF (
PRESENT(ehartree))
THEN
499 IF (
PRESENT(aux_density))
THEN
505 IF (
PRESENT(h_stress))
THEN
507 IF (
PRESENT(aux_density))
THEN
515 CALL pw_pool%give_back_pw(rhor)
519 IF (
PRESENT(aux_density))
THEN
520 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
522 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
525 CALL pw_pool%give_back_pw(rhog)
526 IF (
PRESENT(aux_density))
THEN
527 CALL pw_pool%give_back_pw(rhog_aux)
530 CALL timestop(handle)
532 END SUBROUTINE pw_poisson_solve_nov_nodv_r3d_rs
548 SUBROUTINE pw_poisson_solve_nov_nodv_c1d_gs (poisson_env, density, ehartree, &
549 h_stress, rho_core, greenfn, aux_density)
553 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
554 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
559 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
562 LOGICAL :: has_dielectric
568 CALL timeset(routinen, handle)
572 has_dielectric = poisson_env%parameters%has_dielectric
575 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
576 pw_grid => pw_pool%pw_grid
578 CALL pw_pool%create_pw(rhog)
579 IF (
PRESENT(aux_density))
THEN
580 CALL pw_pool%create_pw(rhog_aux)
583 SELECT CASE (poisson_env%used_grid)
586 SELECT CASE (poisson_env%green_fft%method)
590 IF (
PRESENT(aux_density))
THEN
593 IF (
PRESENT(ehartree))
THEN
594 CALL pw_pool%create_pw(tmpg)
597 IF (
PRESENT(greenfn))
THEN
598 influence_fn = greenfn
600 influence_fn = poisson_env%green_fft%influence_fn
603 IF (
PRESENT(aux_density))
THEN
606 IF (
PRESENT(ehartree))
THEN
607 IF (
PRESENT(aux_density))
THEN
612 CALL pw_pool%give_back_pw(tmpg)
617 IF (
PRESENT(h_stress))
THEN
618 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
621 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
622 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
625 poisson_env%diel_rs_grid, &
626 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
627 density, rho_core=rho_core)
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)
643 CALL pw_pool%create_pw(rhor)
644 CALL pw_pool%create_pw(vhartree_rs)
647 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
656 electric_enthalpy=ehartree)
659 electric_enthalpy=ehartree)
662 IF (
PRESENT(aux_density))
THEN
667 CALL pw_pool%give_back_pw(rhor)
668 CALL pw_pool%give_back_pw(vhartree_rs)
671 CALL cp_abort(__location__, &
672 "unknown poisson method "// &
678 CALL pw_pool%create_pw(rhor)
683 IF (
PRESENT(ehartree))
THEN
684 IF (
PRESENT(aux_density))
THEN
685 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%create_pw(rhog)
688 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%give_back_pw(rhog)
690 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%create_pw(rhog)
693 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%give_back_pw(rhog)
696 IF (
PRESENT(h_stress))
THEN
698 IF (
PRESENT(aux_density))
THEN
706 CALL pw_pool%give_back_pw(rhor)
710 IF (
PRESENT(aux_density))
THEN
711 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
713 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
716 CALL pw_pool%give_back_pw(rhog)
717 IF (
PRESENT(aux_density))
THEN
718 CALL pw_pool%give_back_pw(rhog_aux)
721 CALL timestop(handle)
723 END SUBROUTINE pw_poisson_solve_nov_nodv_c1d_gs
741 SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
742 h_stress, rho_core, greenfn, aux_density)
746 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
748 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
753 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
756 LOGICAL :: has_dielectric
763 CALL timeset(routinen, handle)
767 has_dielectric = poisson_env%parameters%has_dielectric
770 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
771 pw_grid => pw_pool%pw_grid
773 cpabort(
"vhartree has a different grid than the poisson solver")
776 CALL pw_pool%create_pw(rhog)
777 IF (
PRESENT(aux_density))
THEN
778 CALL pw_pool%create_pw(rhog_aux)
781 SELECT CASE (poisson_env%used_grid)
784 SELECT CASE (poisson_env%green_fft%method)
788 IF (
PRESENT(aux_density))
THEN
791 IF (
PRESENT(greenfn))
THEN
792 influence_fn = greenfn
794 influence_fn = poisson_env%green_fft%influence_fn
797 IF (
PRESENT(aux_density))
THEN
801 IF (
PRESENT(ehartree))
THEN
802 IF (
PRESENT(aux_density))
THEN
810 IF (
PRESENT(h_stress))
THEN
811 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
814 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
815 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
818 poisson_env%diel_rs_grid, &
819 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
820 density, rho_core=rho_core)
823 poisson_env%diel_rs_grid, &
824 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
825 poisson_env%dct_pw_grid, &
826 poisson_env%parameters%ps_implicit_params%neumann_directions, &
827 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
828 poisson_env%implicit_env%dct_env%dests_expand, &
829 poisson_env%implicit_env%dct_env%srcs_expand, &
830 poisson_env%implicit_env%dct_env%flipg_stat, &
831 poisson_env%implicit_env%dct_env%bounds_shftd, &
832 density, rho_core=rho_core)
836 CALL pw_pool%create_pw(rhor)
837 CALL pw_pool%create_pw(vhartree_rs)
840 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
849 electric_enthalpy=ehartree)
852 electric_enthalpy=ehartree)
855 IF (
PRESENT(aux_density))
THEN
862 CALL pw_pool%give_back_pw(rhor)
863 CALL pw_pool%give_back_pw(vhartree_rs)
866 CALL cp_abort(__location__, &
867 "unknown poisson method "// &
873 CALL pw_pool%create_pw(rhor)
879 IF (
PRESENT(ehartree))
THEN
880 IF (
PRESENT(aux_density))
THEN
886 IF (
PRESENT(h_stress))
THEN
888 IF (
PRESENT(aux_density))
THEN
896 CALL pw_pool%give_back_pw(rhor)
900 IF (
PRESENT(aux_density))
THEN
901 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
903 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
906 CALL pw_pool%give_back_pw(rhog)
907 IF (
PRESENT(aux_density))
THEN
908 CALL pw_pool%give_back_pw(rhog_aux)
911 CALL timestop(handle)
913 END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs
930 SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
931 h_stress, rho_core, greenfn, aux_density)
935 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
937 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
942 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
945 LOGICAL :: has_dielectric
952 CALL timeset(routinen, handle)
956 has_dielectric = poisson_env%parameters%has_dielectric
959 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
960 pw_grid => pw_pool%pw_grid
962 cpabort(
"vhartree has a different grid than the poisson solver")
965 CALL pw_pool%create_pw(rhog)
966 IF (
PRESENT(aux_density))
THEN
967 CALL pw_pool%create_pw(rhog_aux)
970 SELECT CASE (poisson_env%used_grid)
973 SELECT CASE (poisson_env%green_fft%method)
977 IF (
PRESENT(aux_density))
THEN
980 IF (
PRESENT(greenfn))
THEN
981 influence_fn = greenfn
983 influence_fn = poisson_env%green_fft%influence_fn
986 IF (
PRESENT(aux_density))
THEN
990 IF (
PRESENT(ehartree))
THEN
991 IF (
PRESENT(aux_density))
THEN
1001 IF (
PRESENT(h_stress))
THEN
1002 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1005 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1006 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1009 poisson_env%diel_rs_grid, &
1010 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1011 density, rho_core=rho_core)
1014 poisson_env%diel_rs_grid, &
1015 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1016 poisson_env%dct_pw_grid, &
1017 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1018 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1019 poisson_env%implicit_env%dct_env%dests_expand, &
1020 poisson_env%implicit_env%dct_env%srcs_expand, &
1021 poisson_env%implicit_env%dct_env%flipg_stat, &
1022 poisson_env%implicit_env%dct_env%bounds_shftd, &
1023 density, rho_core=rho_core)
1027 CALL pw_pool%create_pw(rhor)
1028 CALL pw_pool%create_pw(vhartree_rs)
1031 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1040 electric_enthalpy=ehartree)
1043 electric_enthalpy=ehartree)
1046 IF (
PRESENT(aux_density))
THEN
1053 CALL pw_pool%give_back_pw(rhor)
1054 CALL pw_pool%give_back_pw(vhartree_rs)
1057 CALL cp_abort(__location__, &
1058 "unknown poisson method "// &
1064 CALL pw_pool%create_pw(rhor)
1070 IF (
PRESENT(ehartree))
THEN
1071 IF (
PRESENT(aux_density))
THEN
1077 IF (
PRESENT(h_stress))
THEN
1079 IF (
PRESENT(aux_density))
THEN
1087 CALL pw_pool%give_back_pw(rhor)
1091 IF (
PRESENT(aux_density))
THEN
1092 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1094 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
1097 CALL pw_pool%give_back_pw(rhog)
1098 IF (
PRESENT(aux_density))
THEN
1099 CALL pw_pool%give_back_pw(rhog_aux)
1102 CALL timestop(handle)
1104 END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs
1121 SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
1122 h_stress, rho_core, greenfn, aux_density)
1126 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1128 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1129 OPTIONAL :: h_stress
1133 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1136 LOGICAL :: has_dielectric
1143 CALL timeset(routinen, handle)
1147 has_dielectric = poisson_env%parameters%has_dielectric
1150 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1151 pw_grid => pw_pool%pw_grid
1153 cpabort(
"vhartree has a different grid than the poisson solver")
1156 CALL pw_pool%create_pw(rhog)
1157 IF (
PRESENT(aux_density))
THEN
1158 CALL pw_pool%create_pw(rhog_aux)
1161 SELECT CASE (poisson_env%used_grid)
1164 SELECT CASE (poisson_env%green_fft%method)
1168 IF (
PRESENT(aux_density))
THEN
1171 IF (
PRESENT(greenfn))
THEN
1172 influence_fn = greenfn
1174 influence_fn = poisson_env%green_fft%influence_fn
1177 IF (
PRESENT(aux_density))
THEN
1181 IF (
PRESENT(ehartree))
THEN
1182 IF (
PRESENT(aux_density))
THEN
1190 IF (
PRESENT(h_stress))
THEN
1191 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1194 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1195 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1198 poisson_env%diel_rs_grid, &
1199 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1200 density, rho_core=rho_core)
1203 poisson_env%diel_rs_grid, &
1204 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1205 poisson_env%dct_pw_grid, &
1206 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1207 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1208 poisson_env%implicit_env%dct_env%dests_expand, &
1209 poisson_env%implicit_env%dct_env%srcs_expand, &
1210 poisson_env%implicit_env%dct_env%flipg_stat, &
1211 poisson_env%implicit_env%dct_env%bounds_shftd, &
1212 density, rho_core=rho_core)
1216 CALL pw_pool%create_pw(rhor)
1217 CALL pw_pool%create_pw(vhartree_rs)
1220 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1229 electric_enthalpy=ehartree)
1232 electric_enthalpy=ehartree)
1235 IF (
PRESENT(aux_density))
THEN
1242 CALL pw_pool%give_back_pw(rhor)
1243 CALL pw_pool%give_back_pw(vhartree_rs)
1246 CALL cp_abort(__location__, &
1247 "unknown poisson method "// &
1253 CALL pw_pool%create_pw(rhor)
1259 IF (
PRESENT(ehartree))
THEN
1260 IF (
PRESENT(aux_density))
THEN
1268 IF (
PRESENT(h_stress))
THEN
1270 IF (
PRESENT(aux_density))
THEN
1278 CALL pw_pool%give_back_pw(rhor)
1282 IF (
PRESENT(aux_density))
THEN
1283 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1285 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1288 CALL pw_pool%give_back_pw(rhog)
1289 IF (
PRESENT(aux_density))
THEN
1290 CALL pw_pool%give_back_pw(rhog_aux)
1293 CALL timestop(handle)
1295 END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs
1312 SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
1313 h_stress, rho_core, greenfn, aux_density)
1317 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1319 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1320 OPTIONAL :: h_stress
1324 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1327 LOGICAL :: has_dielectric
1334 CALL timeset(routinen, handle)
1338 has_dielectric = poisson_env%parameters%has_dielectric
1341 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1342 pw_grid => pw_pool%pw_grid
1344 cpabort(
"vhartree has a different grid than the poisson solver")
1347 CALL pw_pool%create_pw(rhog)
1348 IF (
PRESENT(aux_density))
THEN
1349 CALL pw_pool%create_pw(rhog_aux)
1352 SELECT CASE (poisson_env%used_grid)
1355 SELECT CASE (poisson_env%green_fft%method)
1359 IF (
PRESENT(aux_density))
THEN
1362 IF (
PRESENT(greenfn))
THEN
1363 influence_fn = greenfn
1365 influence_fn = poisson_env%green_fft%influence_fn
1368 IF (
PRESENT(aux_density))
THEN
1372 IF (
PRESENT(ehartree))
THEN
1373 IF (
PRESENT(aux_density))
THEN
1381 IF (
PRESENT(h_stress))
THEN
1382 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1385 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1386 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1389 poisson_env%diel_rs_grid, &
1390 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1391 density, rho_core=rho_core)
1394 poisson_env%diel_rs_grid, &
1395 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1396 poisson_env%dct_pw_grid, &
1397 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1398 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1399 poisson_env%implicit_env%dct_env%dests_expand, &
1400 poisson_env%implicit_env%dct_env%srcs_expand, &
1401 poisson_env%implicit_env%dct_env%flipg_stat, &
1402 poisson_env%implicit_env%dct_env%bounds_shftd, &
1403 density, rho_core=rho_core)
1407 CALL pw_pool%create_pw(rhor)
1408 CALL pw_pool%create_pw(vhartree_rs)
1411 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1420 electric_enthalpy=ehartree)
1423 electric_enthalpy=ehartree)
1426 IF (
PRESENT(aux_density))
THEN
1433 CALL pw_pool%give_back_pw(rhor)
1434 CALL pw_pool%give_back_pw(vhartree_rs)
1437 CALL cp_abort(__location__, &
1438 "unknown poisson method "// &
1444 CALL pw_pool%create_pw(rhor)
1450 IF (
PRESENT(ehartree))
THEN
1451 IF (
PRESENT(aux_density))
THEN
1457 IF (
PRESENT(h_stress))
THEN
1459 IF (
PRESENT(aux_density))
THEN
1467 CALL pw_pool%give_back_pw(rhor)
1471 IF (
PRESENT(aux_density))
THEN
1472 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1474 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1477 CALL pw_pool%give_back_pw(rhog)
1478 IF (
PRESENT(aux_density))
THEN
1479 CALL pw_pool%give_back_pw(rhog_aux)
1482 CALL timestop(handle)
1484 END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs
1502 SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs (poisson_env, density, ehartree, &
1503 dvhartree, h_stress, rho_core, greenfn, aux_density)
1507 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1509 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1510 OPTIONAL :: h_stress
1514 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1517 LOGICAL :: has_dielectric
1524 CALL timeset(routinen, handle)
1528 has_dielectric = poisson_env%parameters%has_dielectric
1531 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1532 pw_grid => pw_pool%pw_grid
1534 CALL pw_pool%create_pw(rhog)
1535 IF (
PRESENT(aux_density))
THEN
1536 CALL pw_pool%create_pw(rhog_aux)
1539 SELECT CASE (poisson_env%used_grid)
1542 SELECT CASE (poisson_env%green_fft%method)
1546 IF (
PRESENT(aux_density))
THEN
1549 IF (
PRESENT(ehartree))
THEN
1550 CALL pw_pool%create_pw(tmpg)
1553 IF (
PRESENT(greenfn))
THEN
1554 influence_fn = greenfn
1556 influence_fn = poisson_env%green_fft%influence_fn
1559 IF (
PRESENT(aux_density))
THEN
1561 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1563 IF (
PRESENT(ehartree))
THEN
1564 IF (
PRESENT(aux_density))
THEN
1569 CALL pw_pool%give_back_pw(tmpg)
1573 IF (
PRESENT(h_stress))
THEN
1574 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1577 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1578 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1581 poisson_env%diel_rs_grid, &
1582 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1583 density, rho_core=rho_core)
1586 poisson_env%diel_rs_grid, &
1587 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1588 poisson_env%dct_pw_grid, &
1589 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1590 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1591 poisson_env%implicit_env%dct_env%dests_expand, &
1592 poisson_env%implicit_env%dct_env%srcs_expand, &
1593 poisson_env%implicit_env%dct_env%flipg_stat, &
1594 poisson_env%implicit_env%dct_env%bounds_shftd, &
1595 density, rho_core=rho_core)
1599 CALL pw_pool%create_pw(rhor)
1600 CALL pw_pool%create_pw(vhartree_rs)
1603 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1612 electric_enthalpy=ehartree)
1615 electric_enthalpy=ehartree)
1620 IF (
PRESENT(aux_density))
THEN
1625 CALL pw_pool%give_back_pw(rhor)
1626 CALL pw_pool%give_back_pw(vhartree_rs)
1629 CALL cp_abort(__location__, &
1630 "unknown poisson method "// &
1636 CALL pw_pool%create_pw(rhor)
1642 IF (
PRESENT(ehartree))
THEN
1645 CALL pw_pool%give_back_pw(rhor)
1649 IF (
PRESENT(aux_density))
THEN
1650 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1652 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1655 CALL pw_pool%give_back_pw(rhog)
1656 IF (
PRESENT(aux_density))
THEN
1657 CALL pw_pool%give_back_pw(rhog_aux)
1660 CALL timestop(handle)
1662 END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs
1679 SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs (poisson_env, density, ehartree, &
1680 dvhartree, h_stress, rho_core, greenfn, aux_density)
1684 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1686 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1687 OPTIONAL :: h_stress
1691 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1694 LOGICAL :: has_dielectric
1701 CALL timeset(routinen, handle)
1705 has_dielectric = poisson_env%parameters%has_dielectric
1708 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1709 pw_grid => pw_pool%pw_grid
1711 CALL pw_pool%create_pw(rhog)
1712 IF (
PRESENT(aux_density))
THEN
1713 CALL pw_pool%create_pw(rhog_aux)
1716 SELECT CASE (poisson_env%used_grid)
1719 SELECT CASE (poisson_env%green_fft%method)
1723 IF (
PRESENT(aux_density))
THEN
1726 IF (
PRESENT(ehartree))
THEN
1727 CALL pw_pool%create_pw(tmpg)
1730 IF (
PRESENT(greenfn))
THEN
1731 influence_fn = greenfn
1733 influence_fn = poisson_env%green_fft%influence_fn
1736 IF (
PRESENT(aux_density))
THEN
1738 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1740 IF (
PRESENT(ehartree))
THEN
1741 IF (
PRESENT(aux_density))
THEN
1746 CALL pw_pool%give_back_pw(tmpg)
1750 IF (
PRESENT(h_stress))
THEN
1751 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1754 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1755 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1758 poisson_env%diel_rs_grid, &
1759 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1760 density, rho_core=rho_core)
1763 poisson_env%diel_rs_grid, &
1764 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1765 poisson_env%dct_pw_grid, &
1766 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1767 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1768 poisson_env%implicit_env%dct_env%dests_expand, &
1769 poisson_env%implicit_env%dct_env%srcs_expand, &
1770 poisson_env%implicit_env%dct_env%flipg_stat, &
1771 poisson_env%implicit_env%dct_env%bounds_shftd, &
1772 density, rho_core=rho_core)
1776 CALL pw_pool%create_pw(rhor)
1777 CALL pw_pool%create_pw(vhartree_rs)
1780 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1789 electric_enthalpy=ehartree)
1792 electric_enthalpy=ehartree)
1797 IF (
PRESENT(aux_density))
THEN
1802 CALL pw_pool%give_back_pw(rhor)
1803 CALL pw_pool%give_back_pw(vhartree_rs)
1806 CALL cp_abort(__location__, &
1807 "unknown poisson method "// &
1813 CALL pw_pool%create_pw(rhor)
1819 IF (
PRESENT(ehartree))
THEN
1822 CALL pw_pool%give_back_pw(rhor)
1826 IF (
PRESENT(aux_density))
THEN
1827 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1829 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1832 CALL pw_pool%give_back_pw(rhog)
1833 IF (
PRESENT(aux_density))
THEN
1834 CALL pw_pool%give_back_pw(rhog_aux)
1837 CALL timestop(handle)
1839 END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs
1856 SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs (poisson_env, density, ehartree, &
1857 dvhartree, h_stress, rho_core, greenfn, aux_density)
1861 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1863 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1864 OPTIONAL :: h_stress
1868 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1871 LOGICAL :: has_dielectric
1878 CALL timeset(routinen, handle)
1882 has_dielectric = poisson_env%parameters%has_dielectric
1885 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1886 pw_grid => pw_pool%pw_grid
1888 CALL pw_pool%create_pw(rhog)
1889 IF (
PRESENT(aux_density))
THEN
1890 CALL pw_pool%create_pw(rhog_aux)
1893 SELECT CASE (poisson_env%used_grid)
1896 SELECT CASE (poisson_env%green_fft%method)
1900 IF (
PRESENT(aux_density))
THEN
1903 IF (
PRESENT(ehartree))
THEN
1904 CALL pw_pool%create_pw(tmpg)
1907 IF (
PRESENT(greenfn))
THEN
1908 influence_fn = greenfn
1910 influence_fn = poisson_env%green_fft%influence_fn
1913 IF (
PRESENT(aux_density))
THEN
1915 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1917 IF (
PRESENT(ehartree))
THEN
1918 IF (
PRESENT(aux_density))
THEN
1923 CALL pw_pool%give_back_pw(tmpg)
1927 IF (
PRESENT(h_stress))
THEN
1928 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1931 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1932 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1935 poisson_env%diel_rs_grid, &
1936 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1937 density, rho_core=rho_core)
1940 poisson_env%diel_rs_grid, &
1941 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1942 poisson_env%dct_pw_grid, &
1943 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1944 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1945 poisson_env%implicit_env%dct_env%dests_expand, &
1946 poisson_env%implicit_env%dct_env%srcs_expand, &
1947 poisson_env%implicit_env%dct_env%flipg_stat, &
1948 poisson_env%implicit_env%dct_env%bounds_shftd, &
1949 density, rho_core=rho_core)
1953 CALL pw_pool%create_pw(rhor)
1954 CALL pw_pool%create_pw(vhartree_rs)
1957 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1966 electric_enthalpy=ehartree)
1969 electric_enthalpy=ehartree)
1974 IF (
PRESENT(aux_density))
THEN
1979 CALL pw_pool%give_back_pw(rhor)
1980 CALL pw_pool%give_back_pw(vhartree_rs)
1983 CALL cp_abort(__location__, &
1984 "unknown poisson method "// &
1990 CALL pw_pool%create_pw(rhor)
1996 IF (
PRESENT(ehartree))
THEN
1999 CALL pw_pool%give_back_pw(rhor)
2003 IF (
PRESENT(aux_density))
THEN
2004 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2006 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2009 CALL pw_pool%give_back_pw(rhog)
2010 IF (
PRESENT(aux_density))
THEN
2011 CALL pw_pool%give_back_pw(rhog_aux)
2014 CALL timestop(handle)
2016 END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs
2033 SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs (poisson_env, density, ehartree, &
2034 dvhartree, h_stress, rho_core, greenfn, aux_density)
2038 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2040 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2041 OPTIONAL :: h_stress
2045 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2048 LOGICAL :: has_dielectric
2055 CALL timeset(routinen, handle)
2059 has_dielectric = poisson_env%parameters%has_dielectric
2062 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2063 pw_grid => pw_pool%pw_grid
2065 CALL pw_pool%create_pw(rhog)
2066 IF (
PRESENT(aux_density))
THEN
2067 CALL pw_pool%create_pw(rhog_aux)
2070 SELECT CASE (poisson_env%used_grid)
2073 SELECT CASE (poisson_env%green_fft%method)
2077 IF (
PRESENT(aux_density))
THEN
2080 IF (
PRESENT(ehartree))
THEN
2081 CALL pw_pool%create_pw(tmpg)
2084 IF (
PRESENT(greenfn))
THEN
2085 influence_fn = greenfn
2087 influence_fn = poisson_env%green_fft%influence_fn
2090 IF (
PRESENT(aux_density))
THEN
2092 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
2094 IF (
PRESENT(ehartree))
THEN
2095 IF (
PRESENT(aux_density))
THEN
2100 CALL pw_pool%give_back_pw(tmpg)
2104 IF (
PRESENT(h_stress))
THEN
2105 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
2108 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2109 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2112 poisson_env%diel_rs_grid, &
2113 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2114 density, rho_core=rho_core)
2117 poisson_env%diel_rs_grid, &
2118 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2119 poisson_env%dct_pw_grid, &
2120 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2121 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2122 poisson_env%implicit_env%dct_env%dests_expand, &
2123 poisson_env%implicit_env%dct_env%srcs_expand, &
2124 poisson_env%implicit_env%dct_env%flipg_stat, &
2125 poisson_env%implicit_env%dct_env%bounds_shftd, &
2126 density, rho_core=rho_core)
2130 CALL pw_pool%create_pw(rhor)
2131 CALL pw_pool%create_pw(vhartree_rs)
2134 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2143 electric_enthalpy=ehartree)
2146 electric_enthalpy=ehartree)
2151 IF (
PRESENT(aux_density))
THEN
2156 CALL pw_pool%give_back_pw(rhor)
2157 CALL pw_pool%give_back_pw(vhartree_rs)
2160 CALL cp_abort(__location__, &
2161 "unknown poisson method "// &
2167 CALL pw_pool%create_pw(rhor)
2173 IF (
PRESENT(ehartree))
THEN
2176 CALL pw_pool%give_back_pw(rhor)
2180 IF (
PRESENT(aux_density))
THEN
2181 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2183 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2186 CALL pw_pool%give_back_pw(rhog)
2187 IF (
PRESENT(aux_density))
THEN
2188 CALL pw_pool%give_back_pw(rhog_aux)
2191 CALL timestop(handle)
2193 END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs
2212 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2213 dvhartree, h_stress, rho_core, greenfn, aux_density)
2217 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2220 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2221 OPTIONAL :: h_stress
2225 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2228 LOGICAL :: has_dielectric
2234 CALL timeset(routinen, handle)
2238 has_dielectric = poisson_env%parameters%has_dielectric
2241 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2242 pw_grid => pw_pool%pw_grid
2244 cpabort(
"vhartree has a different grid than the poisson solver")
2247 CALL pw_pool%create_pw(rhog)
2248 IF (
PRESENT(aux_density))
THEN
2249 CALL pw_pool%create_pw(rhog_aux)
2252 SELECT CASE (poisson_env%used_grid)
2255 SELECT CASE (poisson_env%green_fft%method)
2259 IF (
PRESENT(aux_density))
THEN
2262 IF (
PRESENT(greenfn))
THEN
2263 influence_fn = greenfn
2265 influence_fn = poisson_env%green_fft%influence_fn
2268 IF (
PRESENT(aux_density))
THEN
2272 IF (
PRESENT(ehartree))
THEN
2273 IF (
PRESENT(aux_density))
THEN
2281 IF (
PRESENT(h_stress))
THEN
2282 CALL cp_abort(__location__, &
2283 "No stress tensor is implemented for the implicit Poisson solver.")
2286 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2287 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2290 poisson_env%diel_rs_grid, &
2291 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2292 density, rho_core=rho_core)
2295 poisson_env%diel_rs_grid, &
2296 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2297 poisson_env%dct_pw_grid, &
2298 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2299 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2300 poisson_env%implicit_env%dct_env%dests_expand, &
2301 poisson_env%implicit_env%dct_env%srcs_expand, &
2302 poisson_env%implicit_env%dct_env%flipg_stat, &
2303 poisson_env%implicit_env%dct_env%bounds_shftd, &
2304 density, rho_core=rho_core)
2308 CALL pw_pool%create_pw(rhor)
2309 CALL pw_pool%create_pw(vhartree_rs)
2312 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2321 electric_enthalpy=ehartree)
2324 electric_enthalpy=ehartree)
2330 IF (
PRESENT(aux_density))
THEN
2335 CALL pw_pool%give_back_pw(rhor)
2336 CALL pw_pool%give_back_pw(vhartree_rs)
2339 CALL cp_abort(__location__, &
2340 "unknown poisson method "// &
2346 CALL pw_pool%create_pw(rhor)
2353 IF (
PRESENT(ehartree))
THEN
2354 IF (
PRESENT(aux_density))
THEN
2361 IF (
PRESENT(aux_density))
THEN
2368 CALL pw_pool%give_back_pw(rhor)
2372 IF (
PRESENT(aux_density))
THEN
2373 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2375 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2378 CALL pw_pool%give_back_pw(rhog)
2379 IF (
PRESENT(aux_density))
THEN
2380 CALL pw_pool%give_back_pw(rhog_aux)
2383 CALL timestop(handle)
2385 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs
2403 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2404 dvhartree, h_stress, rho_core, greenfn, aux_density)
2408 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2411 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2412 OPTIONAL :: h_stress
2416 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2419 LOGICAL :: has_dielectric
2425 CALL timeset(routinen, handle)
2429 has_dielectric = poisson_env%parameters%has_dielectric
2432 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2433 pw_grid => pw_pool%pw_grid
2435 cpabort(
"vhartree has a different grid than the poisson solver")
2438 CALL pw_pool%create_pw(rhog)
2439 IF (
PRESENT(aux_density))
THEN
2440 CALL pw_pool%create_pw(rhog_aux)
2443 SELECT CASE (poisson_env%used_grid)
2446 SELECT CASE (poisson_env%green_fft%method)
2450 IF (
PRESENT(aux_density))
THEN
2453 IF (
PRESENT(greenfn))
THEN
2454 influence_fn = greenfn
2456 influence_fn = poisson_env%green_fft%influence_fn
2459 IF (
PRESENT(aux_density))
THEN
2463 IF (
PRESENT(ehartree))
THEN
2464 IF (
PRESENT(aux_density))
THEN
2474 IF (
PRESENT(h_stress))
THEN
2475 CALL cp_abort(__location__, &
2476 "No stress tensor is implemented for the implicit Poisson solver.")
2479 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2480 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2483 poisson_env%diel_rs_grid, &
2484 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2485 density, rho_core=rho_core)
2488 poisson_env%diel_rs_grid, &
2489 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2490 poisson_env%dct_pw_grid, &
2491 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2492 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2493 poisson_env%implicit_env%dct_env%dests_expand, &
2494 poisson_env%implicit_env%dct_env%srcs_expand, &
2495 poisson_env%implicit_env%dct_env%flipg_stat, &
2496 poisson_env%implicit_env%dct_env%bounds_shftd, &
2497 density, rho_core=rho_core)
2501 CALL pw_pool%create_pw(rhor)
2502 CALL pw_pool%create_pw(vhartree_rs)
2505 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2514 electric_enthalpy=ehartree)
2517 electric_enthalpy=ehartree)
2523 IF (
PRESENT(aux_density))
THEN
2528 CALL pw_pool%give_back_pw(rhor)
2529 CALL pw_pool%give_back_pw(vhartree_rs)
2532 CALL cp_abort(__location__, &
2533 "unknown poisson method "// &
2539 CALL pw_pool%create_pw(rhor)
2546 IF (
PRESENT(ehartree))
THEN
2547 IF (
PRESENT(aux_density))
THEN
2554 IF (
PRESENT(aux_density))
THEN
2561 CALL pw_pool%give_back_pw(rhor)
2565 IF (
PRESENT(aux_density))
THEN
2566 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2568 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2571 CALL pw_pool%give_back_pw(rhog)
2572 IF (
PRESENT(aux_density))
THEN
2573 CALL pw_pool%give_back_pw(rhog_aux)
2576 CALL timestop(handle)
2578 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs
2596 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
2597 dvhartree, h_stress, rho_core, greenfn, aux_density)
2601 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2604 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2605 OPTIONAL :: h_stress
2609 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2612 LOGICAL :: has_dielectric
2618 CALL timeset(routinen, handle)
2622 has_dielectric = poisson_env%parameters%has_dielectric
2625 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2626 pw_grid => pw_pool%pw_grid
2628 cpabort(
"vhartree has a different grid than the poisson solver")
2631 CALL pw_pool%create_pw(rhog)
2632 IF (
PRESENT(aux_density))
THEN
2633 CALL pw_pool%create_pw(rhog_aux)
2636 SELECT CASE (poisson_env%used_grid)
2639 SELECT CASE (poisson_env%green_fft%method)
2643 IF (
PRESENT(aux_density))
THEN
2646 IF (
PRESENT(greenfn))
THEN
2647 influence_fn = greenfn
2649 influence_fn = poisson_env%green_fft%influence_fn
2652 IF (
PRESENT(aux_density))
THEN
2656 IF (
PRESENT(ehartree))
THEN
2657 IF (
PRESENT(aux_density))
THEN
2665 IF (
PRESENT(h_stress))
THEN
2666 CALL cp_abort(__location__, &
2667 "No stress tensor is implemented for the implicit Poisson solver.")
2670 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2671 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2674 poisson_env%diel_rs_grid, &
2675 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2676 density, rho_core=rho_core)
2679 poisson_env%diel_rs_grid, &
2680 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2681 poisson_env%dct_pw_grid, &
2682 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2683 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2684 poisson_env%implicit_env%dct_env%dests_expand, &
2685 poisson_env%implicit_env%dct_env%srcs_expand, &
2686 poisson_env%implicit_env%dct_env%flipg_stat, &
2687 poisson_env%implicit_env%dct_env%bounds_shftd, &
2688 density, rho_core=rho_core)
2692 CALL pw_pool%create_pw(rhor)
2693 CALL pw_pool%create_pw(vhartree_rs)
2696 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2705 electric_enthalpy=ehartree)
2708 electric_enthalpy=ehartree)
2714 IF (
PRESENT(aux_density))
THEN
2719 CALL pw_pool%give_back_pw(rhor)
2720 CALL pw_pool%give_back_pw(vhartree_rs)
2723 CALL cp_abort(__location__, &
2724 "unknown poisson method "// &
2730 CALL pw_pool%create_pw(rhor)
2737 IF (
PRESENT(ehartree))
THEN
2738 IF (
PRESENT(aux_density))
THEN
2745 IF (
PRESENT(aux_density))
THEN
2752 CALL pw_pool%give_back_pw(rhor)
2756 IF (
PRESENT(aux_density))
THEN
2757 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2759 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2762 CALL pw_pool%give_back_pw(rhog)
2763 IF (
PRESENT(aux_density))
THEN
2764 CALL pw_pool%give_back_pw(rhog_aux)
2767 CALL timestop(handle)
2769 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs
2787 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
2788 dvhartree, h_stress, rho_core, greenfn, aux_density)
2792 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2795 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2796 OPTIONAL :: h_stress
2800 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2803 LOGICAL :: has_dielectric
2809 CALL timeset(routinen, handle)
2813 has_dielectric = poisson_env%parameters%has_dielectric
2816 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2817 pw_grid => pw_pool%pw_grid
2819 cpabort(
"vhartree has a different grid than the poisson solver")
2822 CALL pw_pool%create_pw(rhog)
2823 IF (
PRESENT(aux_density))
THEN
2824 CALL pw_pool%create_pw(rhog_aux)
2827 SELECT CASE (poisson_env%used_grid)
2830 SELECT CASE (poisson_env%green_fft%method)
2834 IF (
PRESENT(aux_density))
THEN
2837 IF (
PRESENT(greenfn))
THEN
2838 influence_fn = greenfn
2840 influence_fn = poisson_env%green_fft%influence_fn
2843 IF (
PRESENT(aux_density))
THEN
2847 IF (
PRESENT(ehartree))
THEN
2848 IF (
PRESENT(aux_density))
THEN
2858 IF (
PRESENT(h_stress))
THEN
2859 CALL cp_abort(__location__, &
2860 "No stress tensor is implemented for the implicit Poisson solver.")
2863 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2864 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2867 poisson_env%diel_rs_grid, &
2868 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2869 density, rho_core=rho_core)
2872 poisson_env%diel_rs_grid, &
2873 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2874 poisson_env%dct_pw_grid, &
2875 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2876 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2877 poisson_env%implicit_env%dct_env%dests_expand, &
2878 poisson_env%implicit_env%dct_env%srcs_expand, &
2879 poisson_env%implicit_env%dct_env%flipg_stat, &
2880 poisson_env%implicit_env%dct_env%bounds_shftd, &
2881 density, rho_core=rho_core)
2885 CALL pw_pool%create_pw(rhor)
2886 CALL pw_pool%create_pw(vhartree_rs)
2889 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2898 electric_enthalpy=ehartree)
2901 electric_enthalpy=ehartree)
2907 IF (
PRESENT(aux_density))
THEN
2912 CALL pw_pool%give_back_pw(rhor)
2913 CALL pw_pool%give_back_pw(vhartree_rs)
2916 CALL cp_abort(__location__, &
2917 "unknown poisson method "// &
2923 CALL pw_pool%create_pw(rhor)
2930 IF (
PRESENT(ehartree))
THEN
2931 IF (
PRESENT(aux_density))
THEN
2938 IF (
PRESENT(aux_density))
THEN
2945 CALL pw_pool%give_back_pw(rhor)
2949 IF (
PRESENT(aux_density))
THEN
2950 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2952 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2955 CALL pw_pool%give_back_pw(rhog)
2956 IF (
PRESENT(aux_density))
THEN
2957 CALL pw_pool%give_back_pw(rhog_aux)
2960 CALL timestop(handle)
2962 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs
2980 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2981 dvhartree, h_stress, rho_core, greenfn, aux_density)
2985 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2988 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2989 OPTIONAL :: h_stress
2993 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2996 LOGICAL :: has_dielectric
3002 CALL timeset(routinen, handle)
3006 has_dielectric = poisson_env%parameters%has_dielectric
3009 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3010 pw_grid => pw_pool%pw_grid
3012 cpabort(
"vhartree has a different grid than the poisson solver")
3015 CALL pw_pool%create_pw(rhog)
3016 IF (
PRESENT(aux_density))
THEN
3017 CALL pw_pool%create_pw(rhog_aux)
3020 SELECT CASE (poisson_env%used_grid)
3023 SELECT CASE (poisson_env%green_fft%method)
3027 IF (
PRESENT(aux_density))
THEN
3030 IF (
PRESENT(greenfn))
THEN
3031 influence_fn = greenfn
3033 influence_fn = poisson_env%green_fft%influence_fn
3036 IF (
PRESENT(aux_density))
THEN
3040 IF (
PRESENT(ehartree))
THEN
3041 IF (
PRESENT(aux_density))
THEN
3049 IF (
PRESENT(h_stress))
THEN
3050 CALL cp_abort(__location__, &
3051 "No stress tensor is implemented for the implicit Poisson solver.")
3054 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3055 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3058 poisson_env%diel_rs_grid, &
3059 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3060 density, rho_core=rho_core)
3063 poisson_env%diel_rs_grid, &
3064 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3065 poisson_env%dct_pw_grid, &
3066 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3067 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3068 poisson_env%implicit_env%dct_env%dests_expand, &
3069 poisson_env%implicit_env%dct_env%srcs_expand, &
3070 poisson_env%implicit_env%dct_env%flipg_stat, &
3071 poisson_env%implicit_env%dct_env%bounds_shftd, &
3072 density, rho_core=rho_core)
3076 CALL pw_pool%create_pw(rhor)
3077 CALL pw_pool%create_pw(vhartree_rs)
3080 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3089 electric_enthalpy=ehartree)
3092 electric_enthalpy=ehartree)
3098 IF (
PRESENT(aux_density))
THEN
3103 CALL pw_pool%give_back_pw(rhor)
3104 CALL pw_pool%give_back_pw(vhartree_rs)
3107 CALL cp_abort(__location__, &
3108 "unknown poisson method "// &
3114 CALL pw_pool%create_pw(rhor)
3121 IF (
PRESENT(ehartree))
THEN
3122 IF (
PRESENT(aux_density))
THEN
3129 IF (
PRESENT(aux_density))
THEN
3136 CALL pw_pool%give_back_pw(rhor)
3140 IF (
PRESENT(aux_density))
THEN
3141 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3143 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3146 CALL pw_pool%give_back_pw(rhog)
3147 IF (
PRESENT(aux_density))
THEN
3148 CALL pw_pool%give_back_pw(rhog_aux)
3151 CALL timestop(handle)
3153 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs
3171 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
3172 dvhartree, h_stress, rho_core, greenfn, aux_density)
3176 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3179 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3180 OPTIONAL :: h_stress
3184 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3187 LOGICAL :: has_dielectric
3193 CALL timeset(routinen, handle)
3197 has_dielectric = poisson_env%parameters%has_dielectric
3200 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3201 pw_grid => pw_pool%pw_grid
3203 cpabort(
"vhartree has a different grid than the poisson solver")
3206 CALL pw_pool%create_pw(rhog)
3207 IF (
PRESENT(aux_density))
THEN
3208 CALL pw_pool%create_pw(rhog_aux)
3211 SELECT CASE (poisson_env%used_grid)
3214 SELECT CASE (poisson_env%green_fft%method)
3218 IF (
PRESENT(aux_density))
THEN
3221 IF (
PRESENT(greenfn))
THEN
3222 influence_fn = greenfn
3224 influence_fn = poisson_env%green_fft%influence_fn
3227 IF (
PRESENT(aux_density))
THEN
3231 IF (
PRESENT(ehartree))
THEN
3232 IF (
PRESENT(aux_density))
THEN
3240 IF (
PRESENT(h_stress))
THEN
3241 CALL cp_abort(__location__, &
3242 "No stress tensor is implemented for the implicit Poisson solver.")
3245 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3246 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3249 poisson_env%diel_rs_grid, &
3250 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3251 density, rho_core=rho_core)
3254 poisson_env%diel_rs_grid, &
3255 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3256 poisson_env%dct_pw_grid, &
3257 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3258 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3259 poisson_env%implicit_env%dct_env%dests_expand, &
3260 poisson_env%implicit_env%dct_env%srcs_expand, &
3261 poisson_env%implicit_env%dct_env%flipg_stat, &
3262 poisson_env%implicit_env%dct_env%bounds_shftd, &
3263 density, rho_core=rho_core)
3267 CALL pw_pool%create_pw(rhor)
3268 CALL pw_pool%create_pw(vhartree_rs)
3271 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3280 electric_enthalpy=ehartree)
3283 electric_enthalpy=ehartree)
3289 IF (
PRESENT(aux_density))
THEN
3294 CALL pw_pool%give_back_pw(rhor)
3295 CALL pw_pool%give_back_pw(vhartree_rs)
3298 CALL cp_abort(__location__, &
3299 "unknown poisson method "// &
3305 CALL pw_pool%create_pw(rhor)
3312 IF (
PRESENT(ehartree))
THEN
3313 IF (
PRESENT(aux_density))
THEN
3320 IF (
PRESENT(aux_density))
THEN
3327 CALL pw_pool%give_back_pw(rhor)
3331 IF (
PRESENT(aux_density))
THEN
3332 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3334 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3337 CALL pw_pool%give_back_pw(rhog)
3338 IF (
PRESENT(aux_density))
THEN
3339 CALL pw_pool%give_back_pw(rhog_aux)
3342 CALL timestop(handle)
3344 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs
3362 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
3363 dvhartree, h_stress, rho_core, greenfn, aux_density)
3367 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3370 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3371 OPTIONAL :: h_stress
3375 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3378 LOGICAL :: has_dielectric
3384 CALL timeset(routinen, handle)
3388 has_dielectric = poisson_env%parameters%has_dielectric
3391 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3392 pw_grid => pw_pool%pw_grid
3394 cpabort(
"vhartree has a different grid than the poisson solver")
3397 CALL pw_pool%create_pw(rhog)
3398 IF (
PRESENT(aux_density))
THEN
3399 CALL pw_pool%create_pw(rhog_aux)
3402 SELECT CASE (poisson_env%used_grid)
3405 SELECT CASE (poisson_env%green_fft%method)
3409 IF (
PRESENT(aux_density))
THEN
3412 IF (
PRESENT(greenfn))
THEN
3413 influence_fn = greenfn
3415 influence_fn = poisson_env%green_fft%influence_fn
3418 IF (
PRESENT(aux_density))
THEN
3422 IF (
PRESENT(ehartree))
THEN
3423 IF (
PRESENT(aux_density))
THEN
3431 IF (
PRESENT(h_stress))
THEN
3432 CALL cp_abort(__location__, &
3433 "No stress tensor is implemented for the implicit Poisson solver.")
3436 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3437 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3440 poisson_env%diel_rs_grid, &
3441 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3442 density, rho_core=rho_core)
3445 poisson_env%diel_rs_grid, &
3446 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3447 poisson_env%dct_pw_grid, &
3448 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3449 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3450 poisson_env%implicit_env%dct_env%dests_expand, &
3451 poisson_env%implicit_env%dct_env%srcs_expand, &
3452 poisson_env%implicit_env%dct_env%flipg_stat, &
3453 poisson_env%implicit_env%dct_env%bounds_shftd, &
3454 density, rho_core=rho_core)
3458 CALL pw_pool%create_pw(rhor)
3459 CALL pw_pool%create_pw(vhartree_rs)
3462 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3471 electric_enthalpy=ehartree)
3474 electric_enthalpy=ehartree)
3480 IF (
PRESENT(aux_density))
THEN
3485 CALL pw_pool%give_back_pw(rhor)
3486 CALL pw_pool%give_back_pw(vhartree_rs)
3489 CALL cp_abort(__location__, &
3490 "unknown poisson method "// &
3496 CALL pw_pool%create_pw(rhor)
3503 IF (
PRESENT(ehartree))
THEN
3504 IF (
PRESENT(aux_density))
THEN
3511 IF (
PRESENT(aux_density))
THEN
3518 CALL pw_pool%give_back_pw(rhor)
3522 IF (
PRESENT(aux_density))
THEN
3523 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3525 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3528 CALL pw_pool%give_back_pw(rhog)
3529 IF (
PRESENT(aux_density))
THEN
3530 CALL pw_pool%give_back_pw(rhog_aux)
3533 CALL timestop(handle)
3535 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs
3553 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
3554 dvhartree, h_stress, rho_core, greenfn, aux_density)
3558 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3561 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3562 OPTIONAL :: h_stress
3566 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3569 LOGICAL :: has_dielectric
3575 CALL timeset(routinen, handle)
3579 has_dielectric = poisson_env%parameters%has_dielectric
3582 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3583 pw_grid => pw_pool%pw_grid
3585 cpabort(
"vhartree has a different grid than the poisson solver")
3588 CALL pw_pool%create_pw(rhog)
3589 IF (
PRESENT(aux_density))
THEN
3590 CALL pw_pool%create_pw(rhog_aux)
3593 SELECT CASE (poisson_env%used_grid)
3596 SELECT CASE (poisson_env%green_fft%method)
3600 IF (
PRESENT(aux_density))
THEN
3603 IF (
PRESENT(greenfn))
THEN
3604 influence_fn = greenfn
3606 influence_fn = poisson_env%green_fft%influence_fn
3609 IF (
PRESENT(aux_density))
THEN
3613 IF (
PRESENT(ehartree))
THEN
3614 IF (
PRESENT(aux_density))
THEN
3622 IF (
PRESENT(h_stress))
THEN
3623 CALL cp_abort(__location__, &
3624 "No stress tensor is implemented for the implicit Poisson solver.")
3627 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3628 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3631 poisson_env%diel_rs_grid, &
3632 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3633 density, rho_core=rho_core)
3636 poisson_env%diel_rs_grid, &
3637 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3638 poisson_env%dct_pw_grid, &
3639 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3640 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3641 poisson_env%implicit_env%dct_env%dests_expand, &
3642 poisson_env%implicit_env%dct_env%srcs_expand, &
3643 poisson_env%implicit_env%dct_env%flipg_stat, &
3644 poisson_env%implicit_env%dct_env%bounds_shftd, &
3645 density, rho_core=rho_core)
3649 CALL pw_pool%create_pw(rhor)
3650 CALL pw_pool%create_pw(vhartree_rs)
3653 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3662 electric_enthalpy=ehartree)
3665 electric_enthalpy=ehartree)
3671 IF (
PRESENT(aux_density))
THEN
3676 CALL pw_pool%give_back_pw(rhor)
3677 CALL pw_pool%give_back_pw(vhartree_rs)
3680 CALL cp_abort(__location__, &
3681 "unknown poisson method "// &
3687 CALL pw_pool%create_pw(rhor)
3694 IF (
PRESENT(ehartree))
THEN
3695 IF (
PRESENT(aux_density))
THEN
3702 IF (
PRESENT(aux_density))
THEN
3709 CALL pw_pool%give_back_pw(rhor)
3713 IF (
PRESENT(aux_density))
THEN
3714 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3716 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3719 CALL pw_pool%give_back_pw(rhog)
3720 IF (
PRESENT(aux_density))
THEN
3721 CALL pw_pool%give_back_pw(rhog_aux)
3724 CALL timestop(handle)
3726 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs
3728 SUBROUTINE calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
3731 REAL(KIND=
dp) :: ehartree
3733 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3734 TYPE(
pw_c1d_gs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3736 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
3738 REAL(kind=
dp) :: ffa
3739 INTEGER :: alpha, beta, n(3), handle, i
3743 CALL timeset(routinen, handle)
3745 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3748 CALL pw_pool%create_pw(dvg(i))
3753 IF (
PRESENT(rhog_aux))
THEN
3754 CALL pw_pool%create_pw(dvg_aux(i))
3755 CALL pw_copy(rhog_aux, dvg_aux(i))
3760 IF (
PRESENT(dvhartree))
THEN
3767 IF (
PRESENT(h_stress))
THEN
3771 h_stress(alpha, alpha) = ehartree
3772 IF (
PRESENT(rhog_aux))
THEN
3774 h_stress(alpha, beta) = h_stress(alpha, beta) &
3776 h_stress(beta, alpha) = h_stress(alpha, beta)
3780 h_stress(alpha, beta) = h_stress(alpha, beta) &
3782 h_stress(beta, alpha) = h_stress(alpha, beta)
3788 SELECT CASE (poisson_env%used_grid)
3792 SELECT CASE (poisson_env%green_fft%method)
3798 alpha = poisson_env%green_fft%special_dimension
3799 h_stress(:, alpha) = 0.0_dp
3800 h_stress(alpha, :) = 0.0_dp
3805 IF ((alpha /= poisson_env%green_fft%special_dimension) .OR. &
3806 (beta /= poisson_env%green_fft%special_dimension))
THEN
3807 h_stress(alpha, beta) = 0.0_dp
3808 h_stress(beta, alpha) = 0.0_dp
3812 cpabort(
"Stress Tensor not tested for 1D systems.")
3817 CALL cp_abort(__location__, &
3818 "unknown poisson method"// &
3825 SELECT CASE (poisson_env%wavelet%method)
3830 alpha = poisson_env%wavelet%special_dimension
3831 h_stress(:, alpha) = 0.0_dp
3832 h_stress(alpha, :) = 0.0_dp
3833 cpabort(
"Stress Tensor not tested for WAVELET 2D.")
3836 cpabort(
"WAVELET 1D not implemented!")
3846 CALL pw_pool%give_back_pw(dvg(i))
3847 IF (
PRESENT(rhog_aux))
THEN
3848 CALL pw_pool%give_back_pw(dvg_aux(i))
3852 CALL timestop(handle)
3854 END SUBROUTINE calc_stress_and_gradient_c1d_gs
3855 SUBROUTINE calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
3858 REAL(KIND=
dp) :: ehartree
3860 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3861 TYPE(
pw_r3d_rs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3863 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
3865 REAL(kind=
dp) :: ffa
3866 INTEGER :: alpha, beta, n(3), handle, i
3870 CALL timeset(routinen, handle)
3872 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3875 CALL pw_pool%create_pw(dvg(i))
3880 IF (
PRESENT(rhog_aux))
THEN
3881 CALL pw_pool%create_pw(dvg_aux(i))
3882 CALL pw_copy(rhog_aux, dvg_aux(i))
3887 IF (
PRESENT(dvhartree))
THEN
3894 IF (
PRESENT(h_stress))
THEN
3898 h_stress(alpha, alpha) = ehartree
3899 IF (
PRESENT(rhog_aux))
THEN
3901 h_stress(alpha, beta) = h_stress(alpha, beta) &
3903 h_stress(beta, alpha) = h_stress(alpha, beta)
3907 h_stress(alpha, beta) = h_stress(alpha, beta) &
3909 h_stress(beta, alpha) = h_stress(alpha, beta)
3915 SELECT CASE (poisson_env%used_grid)
3919 SELECT CASE (poisson_env%green_fft%method)
3925 alpha = poisson_env%green_fft%special_dimension
3926 h_stress(:, alpha) = 0.0_dp
3927 h_stress(alpha, :) = 0.0_dp
3932 IF ((alpha /= poisson_env%green_fft%special_dimension) .OR. &
3933 (beta /= poisson_env%green_fft%special_dimension))
THEN
3934 h_stress(alpha, beta) = 0.0_dp
3935 h_stress(beta, alpha) = 0.0_dp
3939 cpabort(
"Stress Tensor not tested for 1D systems.")
3944 CALL cp_abort(__location__, &
3945 "unknown poisson method"// &
3952 SELECT CASE (poisson_env%wavelet%method)
3957 alpha = poisson_env%wavelet%special_dimension
3958 h_stress(:, alpha) = 0.0_dp
3959 h_stress(alpha, :) = 0.0_dp
3960 cpabort(
"Stress Tensor not tested for WAVELET 2D.")
3963 cpabort(
"WAVELET 1D not implemented!")
3973 CALL pw_pool%give_back_pw(dvg(i))
3974 IF (
PRESENT(rhog_aux))
THEN
3975 CALL pw_pool%give_back_pw(dvg_aux(i))
3979 CALL timestop(handle)
3981 END SUBROUTINE calc_stress_and_gradient_r3d_rs
4004 mt_super_ref_pw_grid, dct_pw_grid, force_rebuild)
4007 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN), &
4008 OPTIONAL :: cell_hmat
4010 OPTIONAL :: parameters
4013 INTEGER,
INTENT(in),
OPTIONAL :: use_level
4014 TYPE(
pw_grid_type),
OPTIONAL,
POINTER :: mt_super_ref_pw_grid, dct_pw_grid
4015 LOGICAL,
INTENT(in),
OPTIONAL :: force_rebuild
4017 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
4019 INTEGER :: handle, i
4023 CALL timeset(routinen, handle)
4025 IF (
PRESENT(parameters)) poisson_env%parameters = parameters
4027 IF (
PRESENT(cell_hmat))
THEN
4028 IF (any(poisson_env%cell_hmat /= cell_hmat))
THEN
4029 CALL pw_poisson_cleanup(poisson_env)
4031 poisson_env%cell_hmat(:, :) = cell_hmat(:, :)
4032 poisson_env%rebuild = .true.
4035 IF (
PRESENT(pw_pools))
THEN
4036 cpassert(
ASSOCIATED(pw_pools))
4038 IF (
ASSOCIATED(poisson_env%pw_pools))
THEN
4039 same =
SIZE(poisson_env%pw_pools) ==
SIZE(pw_pools)
4041 DO i = 1,
SIZE(pw_pools)
4042 IF (.NOT.
ASSOCIATED(poisson_env%pw_pools(i)%pool, &
4043 pw_pools(i)%pool)) same = .false.
4047 IF (.NOT. same)
THEN
4048 poisson_env%rebuild = .true.
4051 poisson_env%pw_pools => tmp_pools
4055 IF (
PRESENT(use_level)) poisson_env%pw_level = use_level
4057 IF (
PRESENT(dct_pw_grid))
THEN
4058 IF (
ASSOCIATED(dct_pw_grid))
THEN
4062 poisson_env%dct_pw_grid => dct_pw_grid
4065 IF (
PRESENT(mt_super_ref_pw_grid))
THEN
4066 IF (
ASSOCIATED(mt_super_ref_pw_grid))
THEN
4070 poisson_env%mt_super_ref_pw_grid => mt_super_ref_pw_grid
4073 IF (
PRESENT(force_rebuild))
THEN
4074 IF (force_rebuild) poisson_env%rebuild = .true.
4077 CALL pw_poisson_check(poisson_env)
4079 CALL timestop(handle)
4101 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_func_u_convolution'
4107 CALL timeset(routinen, handle)
4109 cpassert(
ASSOCIATED(poisson_env))
4113 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
4114 pw_grid => pw_pool%pw_grid
4116 CALL pw_pool%create_pw(funcg)
4117 CALL pw_pool%create_pw(ug)
4122 funcg%array(:) = funcg%array(:)*ug%array(:)
4126 CALL pw_pool%give_back_pw(funcg)
4127 CALL pw_pool%give_back_pw(ug)
4129 CALL timestop(handle)
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.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public fourpi
integer, parameter, public mt0d
integer, parameter, public mt2d
integer, parameter, public mt1d
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.
logical function, public pw_grid_compare(grida, gridb)
Check if two pw_grids are equal.
subroutine, public pw_grid_release(pw_grid)
releases the given pw grid
subroutine, public pw_grid_retain(pw_grid)
retains the given pw grid
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
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...
subroutine, public pw_func_u_convolution(poisson_env, func, convolution, u)
computes the convolution f * u using reciprocal-space multiplication
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 ...
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
contains all the informations needed by the fft based poisson solvers
parameters for the poisson solver independet of input_section
environment for the poisson solver
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...