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
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")
775 CALL pw_pool%create_pw(rhog)
776 IF (
PRESENT(aux_density))
THEN
777 CALL pw_pool%create_pw(rhog_aux)
780 SELECT CASE (poisson_env%used_grid)
783 SELECT CASE (poisson_env%green_fft%method)
787 IF (
PRESENT(aux_density))
THEN
790 IF (
PRESENT(greenfn))
THEN
791 influence_fn = greenfn
793 influence_fn = poisson_env%green_fft%influence_fn
796 IF (
PRESENT(aux_density))
THEN
800 IF (
PRESENT(ehartree))
THEN
801 IF (
PRESENT(aux_density))
THEN
809 IF (
PRESENT(h_stress))
THEN
810 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
813 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
814 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
817 poisson_env%diel_rs_grid, &
818 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
819 density, rho_core=rho_core)
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)
835 CALL pw_pool%create_pw(rhor)
836 CALL pw_pool%create_pw(vhartree_rs)
839 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
848 electric_enthalpy=ehartree)
851 electric_enthalpy=ehartree)
854 IF (
PRESENT(aux_density))
THEN
861 CALL pw_pool%give_back_pw(rhor)
862 CALL pw_pool%give_back_pw(vhartree_rs)
865 CALL cp_abort(__location__, &
866 "unknown poisson method "// &
872 CALL pw_pool%create_pw(rhor)
878 IF (
PRESENT(ehartree))
THEN
879 IF (
PRESENT(aux_density))
THEN
885 IF (
PRESENT(h_stress))
THEN
887 IF (
PRESENT(aux_density))
THEN
895 CALL pw_pool%give_back_pw(rhor)
899 IF (
PRESENT(aux_density))
THEN
900 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
902 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
905 CALL pw_pool%give_back_pw(rhog)
906 IF (
PRESENT(aux_density))
THEN
907 CALL pw_pool%give_back_pw(rhog_aux)
910 CALL timestop(handle)
912 END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs
929 SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
930 h_stress, rho_core, greenfn, aux_density)
934 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
936 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
941 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
944 LOGICAL :: has_dielectric
951 CALL timeset(routinen, handle)
955 has_dielectric = poisson_env%parameters%has_dielectric
958 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
959 pw_grid => pw_pool%pw_grid
961 cpabort(
"vhartree has a different grid than the poisson solver")
963 CALL pw_pool%create_pw(rhog)
964 IF (
PRESENT(aux_density))
THEN
965 CALL pw_pool%create_pw(rhog_aux)
968 SELECT CASE (poisson_env%used_grid)
971 SELECT CASE (poisson_env%green_fft%method)
975 IF (
PRESENT(aux_density))
THEN
978 IF (
PRESENT(greenfn))
THEN
979 influence_fn = greenfn
981 influence_fn = poisson_env%green_fft%influence_fn
984 IF (
PRESENT(aux_density))
THEN
988 IF (
PRESENT(ehartree))
THEN
989 IF (
PRESENT(aux_density))
THEN
999 IF (
PRESENT(h_stress))
THEN
1000 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1003 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1004 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1007 poisson_env%diel_rs_grid, &
1008 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1009 density, rho_core=rho_core)
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)
1025 CALL pw_pool%create_pw(rhor)
1026 CALL pw_pool%create_pw(vhartree_rs)
1029 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1038 electric_enthalpy=ehartree)
1041 electric_enthalpy=ehartree)
1044 IF (
PRESENT(aux_density))
THEN
1051 CALL pw_pool%give_back_pw(rhor)
1052 CALL pw_pool%give_back_pw(vhartree_rs)
1055 CALL cp_abort(__location__, &
1056 "unknown poisson method "// &
1062 CALL pw_pool%create_pw(rhor)
1068 IF (
PRESENT(ehartree))
THEN
1069 IF (
PRESENT(aux_density))
THEN
1075 IF (
PRESENT(h_stress))
THEN
1077 IF (
PRESENT(aux_density))
THEN
1085 CALL pw_pool%give_back_pw(rhor)
1089 IF (
PRESENT(aux_density))
THEN
1090 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1092 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
1095 CALL pw_pool%give_back_pw(rhog)
1096 IF (
PRESENT(aux_density))
THEN
1097 CALL pw_pool%give_back_pw(rhog_aux)
1100 CALL timestop(handle)
1102 END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs
1119 SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
1120 h_stress, rho_core, greenfn, aux_density)
1124 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1126 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1127 OPTIONAL :: h_stress
1131 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1134 LOGICAL :: has_dielectric
1141 CALL timeset(routinen, handle)
1145 has_dielectric = poisson_env%parameters%has_dielectric
1148 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1149 pw_grid => pw_pool%pw_grid
1151 cpabort(
"vhartree has a different grid than the poisson solver")
1153 CALL pw_pool%create_pw(rhog)
1154 IF (
PRESENT(aux_density))
THEN
1155 CALL pw_pool%create_pw(rhog_aux)
1158 SELECT CASE (poisson_env%used_grid)
1161 SELECT CASE (poisson_env%green_fft%method)
1165 IF (
PRESENT(aux_density))
THEN
1168 IF (
PRESENT(greenfn))
THEN
1169 influence_fn = greenfn
1171 influence_fn = poisson_env%green_fft%influence_fn
1174 IF (
PRESENT(aux_density))
THEN
1178 IF (
PRESENT(ehartree))
THEN
1179 IF (
PRESENT(aux_density))
THEN
1187 IF (
PRESENT(h_stress))
THEN
1188 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1191 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1192 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1195 poisson_env%diel_rs_grid, &
1196 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1197 density, rho_core=rho_core)
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)
1213 CALL pw_pool%create_pw(rhor)
1214 CALL pw_pool%create_pw(vhartree_rs)
1217 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1226 electric_enthalpy=ehartree)
1229 electric_enthalpy=ehartree)
1232 IF (
PRESENT(aux_density))
THEN
1239 CALL pw_pool%give_back_pw(rhor)
1240 CALL pw_pool%give_back_pw(vhartree_rs)
1243 CALL cp_abort(__location__, &
1244 "unknown poisson method "// &
1250 CALL pw_pool%create_pw(rhor)
1256 IF (
PRESENT(ehartree))
THEN
1257 IF (
PRESENT(aux_density))
THEN
1265 IF (
PRESENT(h_stress))
THEN
1267 IF (
PRESENT(aux_density))
THEN
1275 CALL pw_pool%give_back_pw(rhor)
1279 IF (
PRESENT(aux_density))
THEN
1280 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1282 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1285 CALL pw_pool%give_back_pw(rhog)
1286 IF (
PRESENT(aux_density))
THEN
1287 CALL pw_pool%give_back_pw(rhog_aux)
1290 CALL timestop(handle)
1292 END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs
1309 SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
1310 h_stress, rho_core, greenfn, aux_density)
1314 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1316 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1317 OPTIONAL :: h_stress
1321 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1324 LOGICAL :: has_dielectric
1331 CALL timeset(routinen, handle)
1335 has_dielectric = poisson_env%parameters%has_dielectric
1338 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1339 pw_grid => pw_pool%pw_grid
1341 cpabort(
"vhartree has a different grid than the poisson solver")
1343 CALL pw_pool%create_pw(rhog)
1344 IF (
PRESENT(aux_density))
THEN
1345 CALL pw_pool%create_pw(rhog_aux)
1348 SELECT CASE (poisson_env%used_grid)
1351 SELECT CASE (poisson_env%green_fft%method)
1355 IF (
PRESENT(aux_density))
THEN
1358 IF (
PRESENT(greenfn))
THEN
1359 influence_fn = greenfn
1361 influence_fn = poisson_env%green_fft%influence_fn
1364 IF (
PRESENT(aux_density))
THEN
1368 IF (
PRESENT(ehartree))
THEN
1369 IF (
PRESENT(aux_density))
THEN
1377 IF (
PRESENT(h_stress))
THEN
1378 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1381 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1382 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1385 poisson_env%diel_rs_grid, &
1386 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1387 density, rho_core=rho_core)
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)
1403 CALL pw_pool%create_pw(rhor)
1404 CALL pw_pool%create_pw(vhartree_rs)
1407 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1416 electric_enthalpy=ehartree)
1419 electric_enthalpy=ehartree)
1422 IF (
PRESENT(aux_density))
THEN
1429 CALL pw_pool%give_back_pw(rhor)
1430 CALL pw_pool%give_back_pw(vhartree_rs)
1433 CALL cp_abort(__location__, &
1434 "unknown poisson method "// &
1440 CALL pw_pool%create_pw(rhor)
1446 IF (
PRESENT(ehartree))
THEN
1447 IF (
PRESENT(aux_density))
THEN
1453 IF (
PRESENT(h_stress))
THEN
1455 IF (
PRESENT(aux_density))
THEN
1463 CALL pw_pool%give_back_pw(rhor)
1467 IF (
PRESENT(aux_density))
THEN
1468 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1470 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1473 CALL pw_pool%give_back_pw(rhog)
1474 IF (
PRESENT(aux_density))
THEN
1475 CALL pw_pool%give_back_pw(rhog_aux)
1478 CALL timestop(handle)
1480 END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs
1498 SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs (poisson_env, density, ehartree, &
1499 dvhartree, h_stress, rho_core, greenfn, aux_density)
1503 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1505 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1506 OPTIONAL :: h_stress
1510 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1513 LOGICAL :: has_dielectric
1520 CALL timeset(routinen, handle)
1524 has_dielectric = poisson_env%parameters%has_dielectric
1527 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1528 pw_grid => pw_pool%pw_grid
1530 CALL pw_pool%create_pw(rhog)
1531 IF (
PRESENT(aux_density))
THEN
1532 CALL pw_pool%create_pw(rhog_aux)
1535 SELECT CASE (poisson_env%used_grid)
1538 SELECT CASE (poisson_env%green_fft%method)
1542 IF (
PRESENT(aux_density))
THEN
1545 IF (
PRESENT(ehartree))
THEN
1546 CALL pw_pool%create_pw(tmpg)
1549 IF (
PRESENT(greenfn))
THEN
1550 influence_fn = greenfn
1552 influence_fn = poisson_env%green_fft%influence_fn
1555 IF (
PRESENT(aux_density))
THEN
1557 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1559 IF (
PRESENT(ehartree))
THEN
1560 IF (
PRESENT(aux_density))
THEN
1565 CALL pw_pool%give_back_pw(tmpg)
1569 IF (
PRESENT(h_stress))
THEN
1570 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1573 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1574 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1577 poisson_env%diel_rs_grid, &
1578 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1579 density, rho_core=rho_core)
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)
1595 CALL pw_pool%create_pw(rhor)
1596 CALL pw_pool%create_pw(vhartree_rs)
1599 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1608 electric_enthalpy=ehartree)
1611 electric_enthalpy=ehartree)
1616 IF (
PRESENT(aux_density))
THEN
1621 CALL pw_pool%give_back_pw(rhor)
1622 CALL pw_pool%give_back_pw(vhartree_rs)
1625 CALL cp_abort(__location__, &
1626 "unknown poisson method "// &
1632 CALL pw_pool%create_pw(rhor)
1638 IF (
PRESENT(ehartree))
THEN
1641 CALL pw_pool%give_back_pw(rhor)
1645 IF (
PRESENT(aux_density))
THEN
1646 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1648 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1651 CALL pw_pool%give_back_pw(rhog)
1652 IF (
PRESENT(aux_density))
THEN
1653 CALL pw_pool%give_back_pw(rhog_aux)
1656 CALL timestop(handle)
1658 END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs
1675 SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs (poisson_env, density, ehartree, &
1676 dvhartree, h_stress, rho_core, greenfn, aux_density)
1680 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1682 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1683 OPTIONAL :: h_stress
1687 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1690 LOGICAL :: has_dielectric
1697 CALL timeset(routinen, handle)
1701 has_dielectric = poisson_env%parameters%has_dielectric
1704 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1705 pw_grid => pw_pool%pw_grid
1707 CALL pw_pool%create_pw(rhog)
1708 IF (
PRESENT(aux_density))
THEN
1709 CALL pw_pool%create_pw(rhog_aux)
1712 SELECT CASE (poisson_env%used_grid)
1715 SELECT CASE (poisson_env%green_fft%method)
1719 IF (
PRESENT(aux_density))
THEN
1722 IF (
PRESENT(ehartree))
THEN
1723 CALL pw_pool%create_pw(tmpg)
1726 IF (
PRESENT(greenfn))
THEN
1727 influence_fn = greenfn
1729 influence_fn = poisson_env%green_fft%influence_fn
1732 IF (
PRESENT(aux_density))
THEN
1734 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1736 IF (
PRESENT(ehartree))
THEN
1737 IF (
PRESENT(aux_density))
THEN
1742 CALL pw_pool%give_back_pw(tmpg)
1746 IF (
PRESENT(h_stress))
THEN
1747 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1750 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1751 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1754 poisson_env%diel_rs_grid, &
1755 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1756 density, rho_core=rho_core)
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)
1772 CALL pw_pool%create_pw(rhor)
1773 CALL pw_pool%create_pw(vhartree_rs)
1776 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1785 electric_enthalpy=ehartree)
1788 electric_enthalpy=ehartree)
1793 IF (
PRESENT(aux_density))
THEN
1798 CALL pw_pool%give_back_pw(rhor)
1799 CALL pw_pool%give_back_pw(vhartree_rs)
1802 CALL cp_abort(__location__, &
1803 "unknown poisson method "// &
1809 CALL pw_pool%create_pw(rhor)
1815 IF (
PRESENT(ehartree))
THEN
1818 CALL pw_pool%give_back_pw(rhor)
1822 IF (
PRESENT(aux_density))
THEN
1823 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1825 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1828 CALL pw_pool%give_back_pw(rhog)
1829 IF (
PRESENT(aux_density))
THEN
1830 CALL pw_pool%give_back_pw(rhog_aux)
1833 CALL timestop(handle)
1835 END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs
1852 SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs (poisson_env, density, ehartree, &
1853 dvhartree, h_stress, rho_core, greenfn, aux_density)
1857 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1859 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1860 OPTIONAL :: h_stress
1864 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1867 LOGICAL :: has_dielectric
1874 CALL timeset(routinen, handle)
1878 has_dielectric = poisson_env%parameters%has_dielectric
1881 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1882 pw_grid => pw_pool%pw_grid
1884 CALL pw_pool%create_pw(rhog)
1885 IF (
PRESENT(aux_density))
THEN
1886 CALL pw_pool%create_pw(rhog_aux)
1889 SELECT CASE (poisson_env%used_grid)
1892 SELECT CASE (poisson_env%green_fft%method)
1896 IF (
PRESENT(aux_density))
THEN
1899 IF (
PRESENT(ehartree))
THEN
1900 CALL pw_pool%create_pw(tmpg)
1903 IF (
PRESENT(greenfn))
THEN
1904 influence_fn = greenfn
1906 influence_fn = poisson_env%green_fft%influence_fn
1909 IF (
PRESENT(aux_density))
THEN
1911 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1913 IF (
PRESENT(ehartree))
THEN
1914 IF (
PRESENT(aux_density))
THEN
1919 CALL pw_pool%give_back_pw(tmpg)
1923 IF (
PRESENT(h_stress))
THEN
1924 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1927 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1928 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1931 poisson_env%diel_rs_grid, &
1932 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1933 density, rho_core=rho_core)
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)
1949 CALL pw_pool%create_pw(rhor)
1950 CALL pw_pool%create_pw(vhartree_rs)
1953 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1962 electric_enthalpy=ehartree)
1965 electric_enthalpy=ehartree)
1970 IF (
PRESENT(aux_density))
THEN
1975 CALL pw_pool%give_back_pw(rhor)
1976 CALL pw_pool%give_back_pw(vhartree_rs)
1979 CALL cp_abort(__location__, &
1980 "unknown poisson method "// &
1986 CALL pw_pool%create_pw(rhor)
1992 IF (
PRESENT(ehartree))
THEN
1995 CALL pw_pool%give_back_pw(rhor)
1999 IF (
PRESENT(aux_density))
THEN
2000 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2002 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2005 CALL pw_pool%give_back_pw(rhog)
2006 IF (
PRESENT(aux_density))
THEN
2007 CALL pw_pool%give_back_pw(rhog_aux)
2010 CALL timestop(handle)
2012 END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs
2029 SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs (poisson_env, density, ehartree, &
2030 dvhartree, h_stress, rho_core, greenfn, aux_density)
2034 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2036 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2037 OPTIONAL :: h_stress
2041 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2044 LOGICAL :: has_dielectric
2051 CALL timeset(routinen, handle)
2055 has_dielectric = poisson_env%parameters%has_dielectric
2058 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2059 pw_grid => pw_pool%pw_grid
2061 CALL pw_pool%create_pw(rhog)
2062 IF (
PRESENT(aux_density))
THEN
2063 CALL pw_pool%create_pw(rhog_aux)
2066 SELECT CASE (poisson_env%used_grid)
2069 SELECT CASE (poisson_env%green_fft%method)
2073 IF (
PRESENT(aux_density))
THEN
2076 IF (
PRESENT(ehartree))
THEN
2077 CALL pw_pool%create_pw(tmpg)
2080 IF (
PRESENT(greenfn))
THEN
2081 influence_fn = greenfn
2083 influence_fn = poisson_env%green_fft%influence_fn
2086 IF (
PRESENT(aux_density))
THEN
2088 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
2090 IF (
PRESENT(ehartree))
THEN
2091 IF (
PRESENT(aux_density))
THEN
2096 CALL pw_pool%give_back_pw(tmpg)
2100 IF (
PRESENT(h_stress))
THEN
2101 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
2104 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2105 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2108 poisson_env%diel_rs_grid, &
2109 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2110 density, rho_core=rho_core)
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)
2126 CALL pw_pool%create_pw(rhor)
2127 CALL pw_pool%create_pw(vhartree_rs)
2130 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2139 electric_enthalpy=ehartree)
2142 electric_enthalpy=ehartree)
2147 IF (
PRESENT(aux_density))
THEN
2152 CALL pw_pool%give_back_pw(rhor)
2153 CALL pw_pool%give_back_pw(vhartree_rs)
2156 CALL cp_abort(__location__, &
2157 "unknown poisson method "// &
2163 CALL pw_pool%create_pw(rhor)
2169 IF (
PRESENT(ehartree))
THEN
2172 CALL pw_pool%give_back_pw(rhor)
2176 IF (
PRESENT(aux_density))
THEN
2177 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2179 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2182 CALL pw_pool%give_back_pw(rhog)
2183 IF (
PRESENT(aux_density))
THEN
2184 CALL pw_pool%give_back_pw(rhog_aux)
2187 CALL timestop(handle)
2189 END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs
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)
2213 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2216 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2217 OPTIONAL :: h_stress
2221 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2224 LOGICAL :: has_dielectric
2230 CALL timeset(routinen, handle)
2234 has_dielectric = poisson_env%parameters%has_dielectric
2237 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2238 pw_grid => pw_pool%pw_grid
2240 cpabort(
"vhartree has a different grid than the poisson solver")
2242 CALL pw_pool%create_pw(rhog)
2243 IF (
PRESENT(aux_density))
THEN
2244 CALL pw_pool%create_pw(rhog_aux)
2247 SELECT CASE (poisson_env%used_grid)
2250 SELECT CASE (poisson_env%green_fft%method)
2254 IF (
PRESENT(aux_density))
THEN
2257 IF (
PRESENT(greenfn))
THEN
2258 influence_fn = greenfn
2260 influence_fn = poisson_env%green_fft%influence_fn
2263 IF (
PRESENT(aux_density))
THEN
2267 IF (
PRESENT(ehartree))
THEN
2268 IF (
PRESENT(aux_density))
THEN
2276 IF (
PRESENT(h_stress))
THEN
2277 CALL cp_abort(__location__, &
2278 "No stress tensor is implemented for the implicit Poisson solver.")
2281 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2282 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2285 poisson_env%diel_rs_grid, &
2286 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2287 density, rho_core=rho_core)
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)
2303 CALL pw_pool%create_pw(rhor)
2304 CALL pw_pool%create_pw(vhartree_rs)
2307 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2316 electric_enthalpy=ehartree)
2319 electric_enthalpy=ehartree)
2325 IF (
PRESENT(aux_density))
THEN
2330 CALL pw_pool%give_back_pw(rhor)
2331 CALL pw_pool%give_back_pw(vhartree_rs)
2334 CALL cp_abort(__location__, &
2335 "unknown poisson method "// &
2341 CALL pw_pool%create_pw(rhor)
2348 IF (
PRESENT(ehartree))
THEN
2349 IF (
PRESENT(aux_density))
THEN
2356 IF (
PRESENT(aux_density))
THEN
2363 CALL pw_pool%give_back_pw(rhor)
2367 IF (
PRESENT(aux_density))
THEN
2368 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2370 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2373 CALL pw_pool%give_back_pw(rhog)
2374 IF (
PRESENT(aux_density))
THEN
2375 CALL pw_pool%give_back_pw(rhog_aux)
2378 CALL timestop(handle)
2380 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs
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)
2403 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2406 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2407 OPTIONAL :: h_stress
2411 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2414 LOGICAL :: has_dielectric
2420 CALL timeset(routinen, handle)
2424 has_dielectric = poisson_env%parameters%has_dielectric
2427 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2428 pw_grid => pw_pool%pw_grid
2430 cpabort(
"vhartree has a different grid than the poisson solver")
2432 CALL pw_pool%create_pw(rhog)
2433 IF (
PRESENT(aux_density))
THEN
2434 CALL pw_pool%create_pw(rhog_aux)
2437 SELECT CASE (poisson_env%used_grid)
2440 SELECT CASE (poisson_env%green_fft%method)
2444 IF (
PRESENT(aux_density))
THEN
2447 IF (
PRESENT(greenfn))
THEN
2448 influence_fn = greenfn
2450 influence_fn = poisson_env%green_fft%influence_fn
2453 IF (
PRESENT(aux_density))
THEN
2457 IF (
PRESENT(ehartree))
THEN
2458 IF (
PRESENT(aux_density))
THEN
2468 IF (
PRESENT(h_stress))
THEN
2469 CALL cp_abort(__location__, &
2470 "No stress tensor is implemented for the implicit Poisson solver.")
2473 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2474 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2477 poisson_env%diel_rs_grid, &
2478 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2479 density, rho_core=rho_core)
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)
2495 CALL pw_pool%create_pw(rhor)
2496 CALL pw_pool%create_pw(vhartree_rs)
2499 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2508 electric_enthalpy=ehartree)
2511 electric_enthalpy=ehartree)
2517 IF (
PRESENT(aux_density))
THEN
2522 CALL pw_pool%give_back_pw(rhor)
2523 CALL pw_pool%give_back_pw(vhartree_rs)
2526 CALL cp_abort(__location__, &
2527 "unknown poisson method "// &
2533 CALL pw_pool%create_pw(rhor)
2540 IF (
PRESENT(ehartree))
THEN
2541 IF (
PRESENT(aux_density))
THEN
2548 IF (
PRESENT(aux_density))
THEN
2555 CALL pw_pool%give_back_pw(rhor)
2559 IF (
PRESENT(aux_density))
THEN
2560 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2562 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2565 CALL pw_pool%give_back_pw(rhog)
2566 IF (
PRESENT(aux_density))
THEN
2567 CALL pw_pool%give_back_pw(rhog_aux)
2570 CALL timestop(handle)
2572 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs
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)
2595 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2598 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2599 OPTIONAL :: h_stress
2603 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2606 LOGICAL :: has_dielectric
2612 CALL timeset(routinen, handle)
2616 has_dielectric = poisson_env%parameters%has_dielectric
2619 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2620 pw_grid => pw_pool%pw_grid
2622 cpabort(
"vhartree has a different grid than the poisson solver")
2624 CALL pw_pool%create_pw(rhog)
2625 IF (
PRESENT(aux_density))
THEN
2626 CALL pw_pool%create_pw(rhog_aux)
2629 SELECT CASE (poisson_env%used_grid)
2632 SELECT CASE (poisson_env%green_fft%method)
2636 IF (
PRESENT(aux_density))
THEN
2639 IF (
PRESENT(greenfn))
THEN
2640 influence_fn = greenfn
2642 influence_fn = poisson_env%green_fft%influence_fn
2645 IF (
PRESENT(aux_density))
THEN
2649 IF (
PRESENT(ehartree))
THEN
2650 IF (
PRESENT(aux_density))
THEN
2658 IF (
PRESENT(h_stress))
THEN
2659 CALL cp_abort(__location__, &
2660 "No stress tensor is implemented for the implicit Poisson solver.")
2663 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2664 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2667 poisson_env%diel_rs_grid, &
2668 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2669 density, rho_core=rho_core)
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)
2685 CALL pw_pool%create_pw(rhor)
2686 CALL pw_pool%create_pw(vhartree_rs)
2689 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2698 electric_enthalpy=ehartree)
2701 electric_enthalpy=ehartree)
2707 IF (
PRESENT(aux_density))
THEN
2712 CALL pw_pool%give_back_pw(rhor)
2713 CALL pw_pool%give_back_pw(vhartree_rs)
2716 CALL cp_abort(__location__, &
2717 "unknown poisson method "// &
2723 CALL pw_pool%create_pw(rhor)
2730 IF (
PRESENT(ehartree))
THEN
2731 IF (
PRESENT(aux_density))
THEN
2738 IF (
PRESENT(aux_density))
THEN
2745 CALL pw_pool%give_back_pw(rhor)
2749 IF (
PRESENT(aux_density))
THEN
2750 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2752 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2755 CALL pw_pool%give_back_pw(rhog)
2756 IF (
PRESENT(aux_density))
THEN
2757 CALL pw_pool%give_back_pw(rhog_aux)
2760 CALL timestop(handle)
2762 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs
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)
2785 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2788 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2789 OPTIONAL :: h_stress
2793 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2796 LOGICAL :: has_dielectric
2802 CALL timeset(routinen, handle)
2806 has_dielectric = poisson_env%parameters%has_dielectric
2809 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2810 pw_grid => pw_pool%pw_grid
2812 cpabort(
"vhartree has a different grid than the poisson solver")
2814 CALL pw_pool%create_pw(rhog)
2815 IF (
PRESENT(aux_density))
THEN
2816 CALL pw_pool%create_pw(rhog_aux)
2819 SELECT CASE (poisson_env%used_grid)
2822 SELECT CASE (poisson_env%green_fft%method)
2826 IF (
PRESENT(aux_density))
THEN
2829 IF (
PRESENT(greenfn))
THEN
2830 influence_fn = greenfn
2832 influence_fn = poisson_env%green_fft%influence_fn
2835 IF (
PRESENT(aux_density))
THEN
2839 IF (
PRESENT(ehartree))
THEN
2840 IF (
PRESENT(aux_density))
THEN
2850 IF (
PRESENT(h_stress))
THEN
2851 CALL cp_abort(__location__, &
2852 "No stress tensor is implemented for the implicit Poisson solver.")
2855 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2856 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2859 poisson_env%diel_rs_grid, &
2860 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2861 density, rho_core=rho_core)
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)
2877 CALL pw_pool%create_pw(rhor)
2878 CALL pw_pool%create_pw(vhartree_rs)
2881 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2890 electric_enthalpy=ehartree)
2893 electric_enthalpy=ehartree)
2899 IF (
PRESENT(aux_density))
THEN
2904 CALL pw_pool%give_back_pw(rhor)
2905 CALL pw_pool%give_back_pw(vhartree_rs)
2908 CALL cp_abort(__location__, &
2909 "unknown poisson method "// &
2915 CALL pw_pool%create_pw(rhor)
2922 IF (
PRESENT(ehartree))
THEN
2923 IF (
PRESENT(aux_density))
THEN
2930 IF (
PRESENT(aux_density))
THEN
2937 CALL pw_pool%give_back_pw(rhor)
2941 IF (
PRESENT(aux_density))
THEN
2942 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2944 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2947 CALL pw_pool%give_back_pw(rhog)
2948 IF (
PRESENT(aux_density))
THEN
2949 CALL pw_pool%give_back_pw(rhog_aux)
2952 CALL timestop(handle)
2954 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs
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)
2977 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2980 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2981 OPTIONAL :: h_stress
2985 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2988 LOGICAL :: has_dielectric
2994 CALL timeset(routinen, handle)
2998 has_dielectric = poisson_env%parameters%has_dielectric
3001 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3002 pw_grid => pw_pool%pw_grid
3004 cpabort(
"vhartree has a different grid than the poisson solver")
3006 CALL pw_pool%create_pw(rhog)
3007 IF (
PRESENT(aux_density))
THEN
3008 CALL pw_pool%create_pw(rhog_aux)
3011 SELECT CASE (poisson_env%used_grid)
3014 SELECT CASE (poisson_env%green_fft%method)
3018 IF (
PRESENT(aux_density))
THEN
3021 IF (
PRESENT(greenfn))
THEN
3022 influence_fn = greenfn
3024 influence_fn = poisson_env%green_fft%influence_fn
3027 IF (
PRESENT(aux_density))
THEN
3031 IF (
PRESENT(ehartree))
THEN
3032 IF (
PRESENT(aux_density))
THEN
3040 IF (
PRESENT(h_stress))
THEN
3041 CALL cp_abort(__location__, &
3042 "No stress tensor is implemented for the implicit Poisson solver.")
3045 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3046 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3049 poisson_env%diel_rs_grid, &
3050 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3051 density, rho_core=rho_core)
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)
3067 CALL pw_pool%create_pw(rhor)
3068 CALL pw_pool%create_pw(vhartree_rs)
3071 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3080 electric_enthalpy=ehartree)
3083 electric_enthalpy=ehartree)
3089 IF (
PRESENT(aux_density))
THEN
3094 CALL pw_pool%give_back_pw(rhor)
3095 CALL pw_pool%give_back_pw(vhartree_rs)
3098 CALL cp_abort(__location__, &
3099 "unknown poisson method "// &
3105 CALL pw_pool%create_pw(rhor)
3112 IF (
PRESENT(ehartree))
THEN
3113 IF (
PRESENT(aux_density))
THEN
3120 IF (
PRESENT(aux_density))
THEN
3127 CALL pw_pool%give_back_pw(rhor)
3131 IF (
PRESENT(aux_density))
THEN
3132 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3134 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3137 CALL pw_pool%give_back_pw(rhog)
3138 IF (
PRESENT(aux_density))
THEN
3139 CALL pw_pool%give_back_pw(rhog_aux)
3142 CALL timestop(handle)
3144 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs
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)
3167 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3170 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3171 OPTIONAL :: h_stress
3175 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3178 LOGICAL :: has_dielectric
3184 CALL timeset(routinen, handle)
3188 has_dielectric = poisson_env%parameters%has_dielectric
3191 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3192 pw_grid => pw_pool%pw_grid
3194 cpabort(
"vhartree has a different grid than the poisson solver")
3196 CALL pw_pool%create_pw(rhog)
3197 IF (
PRESENT(aux_density))
THEN
3198 CALL pw_pool%create_pw(rhog_aux)
3201 SELECT CASE (poisson_env%used_grid)
3204 SELECT CASE (poisson_env%green_fft%method)
3208 IF (
PRESENT(aux_density))
THEN
3211 IF (
PRESENT(greenfn))
THEN
3212 influence_fn = greenfn
3214 influence_fn = poisson_env%green_fft%influence_fn
3217 IF (
PRESENT(aux_density))
THEN
3221 IF (
PRESENT(ehartree))
THEN
3222 IF (
PRESENT(aux_density))
THEN
3230 IF (
PRESENT(h_stress))
THEN
3231 CALL cp_abort(__location__, &
3232 "No stress tensor is implemented for the implicit Poisson solver.")
3235 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3236 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3239 poisson_env%diel_rs_grid, &
3240 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3241 density, rho_core=rho_core)
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)
3257 CALL pw_pool%create_pw(rhor)
3258 CALL pw_pool%create_pw(vhartree_rs)
3261 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3270 electric_enthalpy=ehartree)
3273 electric_enthalpy=ehartree)
3279 IF (
PRESENT(aux_density))
THEN
3284 CALL pw_pool%give_back_pw(rhor)
3285 CALL pw_pool%give_back_pw(vhartree_rs)
3288 CALL cp_abort(__location__, &
3289 "unknown poisson method "// &
3295 CALL pw_pool%create_pw(rhor)
3302 IF (
PRESENT(ehartree))
THEN
3303 IF (
PRESENT(aux_density))
THEN
3310 IF (
PRESENT(aux_density))
THEN
3317 CALL pw_pool%give_back_pw(rhor)
3321 IF (
PRESENT(aux_density))
THEN
3322 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3324 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3327 CALL pw_pool%give_back_pw(rhog)
3328 IF (
PRESENT(aux_density))
THEN
3329 CALL pw_pool%give_back_pw(rhog_aux)
3332 CALL timestop(handle)
3334 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs
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)
3357 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3360 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3361 OPTIONAL :: h_stress
3365 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3368 LOGICAL :: has_dielectric
3374 CALL timeset(routinen, handle)
3378 has_dielectric = poisson_env%parameters%has_dielectric
3381 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3382 pw_grid => pw_pool%pw_grid
3384 cpabort(
"vhartree has a different grid than the poisson solver")
3386 CALL pw_pool%create_pw(rhog)
3387 IF (
PRESENT(aux_density))
THEN
3388 CALL pw_pool%create_pw(rhog_aux)
3391 SELECT CASE (poisson_env%used_grid)
3394 SELECT CASE (poisson_env%green_fft%method)
3398 IF (
PRESENT(aux_density))
THEN
3401 IF (
PRESENT(greenfn))
THEN
3402 influence_fn = greenfn
3404 influence_fn = poisson_env%green_fft%influence_fn
3407 IF (
PRESENT(aux_density))
THEN
3411 IF (
PRESENT(ehartree))
THEN
3412 IF (
PRESENT(aux_density))
THEN
3420 IF (
PRESENT(h_stress))
THEN
3421 CALL cp_abort(__location__, &
3422 "No stress tensor is implemented for the implicit Poisson solver.")
3425 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3426 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3429 poisson_env%diel_rs_grid, &
3430 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3431 density, rho_core=rho_core)
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)
3447 CALL pw_pool%create_pw(rhor)
3448 CALL pw_pool%create_pw(vhartree_rs)
3451 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3460 electric_enthalpy=ehartree)
3463 electric_enthalpy=ehartree)
3469 IF (
PRESENT(aux_density))
THEN
3474 CALL pw_pool%give_back_pw(rhor)
3475 CALL pw_pool%give_back_pw(vhartree_rs)
3478 CALL cp_abort(__location__, &
3479 "unknown poisson method "// &
3485 CALL pw_pool%create_pw(rhor)
3492 IF (
PRESENT(ehartree))
THEN
3493 IF (
PRESENT(aux_density))
THEN
3500 IF (
PRESENT(aux_density))
THEN
3507 CALL pw_pool%give_back_pw(rhor)
3511 IF (
PRESENT(aux_density))
THEN
3512 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3514 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3517 CALL pw_pool%give_back_pw(rhog)
3518 IF (
PRESENT(aux_density))
THEN
3519 CALL pw_pool%give_back_pw(rhog_aux)
3522 CALL timestop(handle)
3524 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs
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)
3547 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3550 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3551 OPTIONAL :: h_stress
3555 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3558 LOGICAL :: has_dielectric
3564 CALL timeset(routinen, handle)
3568 has_dielectric = poisson_env%parameters%has_dielectric
3571 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3572 pw_grid => pw_pool%pw_grid
3574 cpabort(
"vhartree has a different grid than the poisson solver")
3576 CALL pw_pool%create_pw(rhog)
3577 IF (
PRESENT(aux_density))
THEN
3578 CALL pw_pool%create_pw(rhog_aux)
3581 SELECT CASE (poisson_env%used_grid)
3584 SELECT CASE (poisson_env%green_fft%method)
3588 IF (
PRESENT(aux_density))
THEN
3591 IF (
PRESENT(greenfn))
THEN
3592 influence_fn = greenfn
3594 influence_fn = poisson_env%green_fft%influence_fn
3597 IF (
PRESENT(aux_density))
THEN
3601 IF (
PRESENT(ehartree))
THEN
3602 IF (
PRESENT(aux_density))
THEN
3610 IF (
PRESENT(h_stress))
THEN
3611 CALL cp_abort(__location__, &
3612 "No stress tensor is implemented for the implicit Poisson solver.")
3615 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3616 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3619 poisson_env%diel_rs_grid, &
3620 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3621 density, rho_core=rho_core)
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)
3637 CALL pw_pool%create_pw(rhor)
3638 CALL pw_pool%create_pw(vhartree_rs)
3641 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3650 electric_enthalpy=ehartree)
3653 electric_enthalpy=ehartree)
3659 IF (
PRESENT(aux_density))
THEN
3664 CALL pw_pool%give_back_pw(rhor)
3665 CALL pw_pool%give_back_pw(vhartree_rs)
3668 CALL cp_abort(__location__, &
3669 "unknown poisson method "// &
3675 CALL pw_pool%create_pw(rhor)
3682 IF (
PRESENT(ehartree))
THEN
3683 IF (
PRESENT(aux_density))
THEN
3690 IF (
PRESENT(aux_density))
THEN
3697 CALL pw_pool%give_back_pw(rhor)
3701 IF (
PRESENT(aux_density))
THEN
3702 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3704 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3707 CALL pw_pool%give_back_pw(rhog)
3708 IF (
PRESENT(aux_density))
THEN
3709 CALL pw_pool%give_back_pw(rhog_aux)
3712 CALL timestop(handle)
3714 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs
3716 SUBROUTINE calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
3719 REAL(KIND=
dp) :: ehartree
3721 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3722 TYPE(
pw_c1d_gs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3724 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
3726 REAL(kind=
dp) :: ffa
3727 INTEGER :: alpha, beta, n(3), handle, i
3731 CALL timeset(routinen, handle)
3733 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3736 CALL pw_pool%create_pw(dvg(i))
3741 IF (
PRESENT(rhog_aux))
THEN
3742 CALL pw_pool%create_pw(dvg_aux(i))
3743 CALL pw_copy(rhog_aux, dvg_aux(i))
3748 IF (
PRESENT(dvhartree))
THEN
3755 IF (
PRESENT(h_stress))
THEN
3759 h_stress(alpha, alpha) = ehartree
3760 IF (
PRESENT(rhog_aux))
THEN
3762 h_stress(alpha, beta) = h_stress(alpha, beta) &
3764 h_stress(beta, alpha) = h_stress(alpha, beta)
3768 h_stress(alpha, beta) = h_stress(alpha, beta) &
3770 h_stress(beta, alpha) = h_stress(alpha, beta)
3776 SELECT CASE (poisson_env%used_grid)
3780 SELECT CASE (poisson_env%green_fft%method)
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.")
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
3800 cpabort(
"Stress Tensor not tested for 1D systems.")
3805 CALL cp_abort(__location__, &
3806 "unknown poisson method"// &
3813 SELECT CASE (poisson_env%wavelet%method)
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.")
3824 cpabort(
"WAVELET 1D not implemented!")
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))
3840 CALL timestop(handle)
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)
3846 REAL(KIND=
dp) :: ehartree
3848 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3849 TYPE(
pw_r3d_rs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3851 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
3853 REAL(kind=
dp) :: ffa
3854 INTEGER :: alpha, beta, n(3), handle, i
3858 CALL timeset(routinen, handle)
3860 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3863 CALL pw_pool%create_pw(dvg(i))
3868 IF (
PRESENT(rhog_aux))
THEN
3869 CALL pw_pool%create_pw(dvg_aux(i))
3870 CALL pw_copy(rhog_aux, dvg_aux(i))
3875 IF (
PRESENT(dvhartree))
THEN
3882 IF (
PRESENT(h_stress))
THEN
3886 h_stress(alpha, alpha) = ehartree
3887 IF (
PRESENT(rhog_aux))
THEN
3889 h_stress(alpha, beta) = h_stress(alpha, beta) &
3891 h_stress(beta, alpha) = h_stress(alpha, beta)
3895 h_stress(alpha, beta) = h_stress(alpha, beta) &
3897 h_stress(beta, alpha) = h_stress(alpha, beta)
3903 SELECT CASE (poisson_env%used_grid)
3907 SELECT CASE (poisson_env%green_fft%method)
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.")
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
3927 cpabort(
"Stress Tensor not tested for 1D systems.")
3932 CALL cp_abort(__location__, &
3933 "unknown poisson method"// &
3940 SELECT CASE (poisson_env%wavelet%method)
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.")
3951 cpabort(
"WAVELET 1D not implemented!")
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))
3967 CALL timestop(handle)
3969 END SUBROUTINE calc_stress_and_gradient_r3d_rs
3992 mt_super_ref_pw_grid, dct_pw_grid, force_rebuild)
3995 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN), &
3996 OPTIONAL :: cell_hmat
3998 OPTIONAL :: parameters
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
4005 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
4007 INTEGER :: handle, i
4011 CALL timeset(routinen, handle)
4013 IF (
PRESENT(parameters)) &
4014 poisson_env%parameters = parameters
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.
4023 IF (
PRESENT(pw_pools))
THEN
4024 cpassert(
ASSOCIATED(pw_pools))
4026 IF (
ASSOCIATED(poisson_env%pw_pools))
THEN
4027 same =
SIZE(poisson_env%pw_pools) ==
SIZE(pw_pools)
4029 DO i = 1,
SIZE(pw_pools)
4030 IF (.NOT.
ASSOCIATED(poisson_env%pw_pools(i)%pool, &
4031 pw_pools(i)%pool)) same = .false.
4035 IF (.NOT. same)
THEN
4036 poisson_env%rebuild = .true.
4039 poisson_env%pw_pools => tmp_pools
4043 IF (
PRESENT(use_level)) poisson_env%pw_level = use_level
4045 IF (
PRESENT(dct_pw_grid))
THEN
4046 IF (
ASSOCIATED(dct_pw_grid))
THEN
4050 poisson_env%dct_pw_grid => dct_pw_grid
4053 IF (
PRESENT(mt_super_ref_pw_grid))
THEN
4054 IF (
ASSOCIATED(mt_super_ref_pw_grid))
THEN
4058 poisson_env%mt_super_ref_pw_grid => mt_super_ref_pw_grid
4061 IF (
PRESENT(force_rebuild))
THEN
4062 IF (force_rebuild) poisson_env%rebuild = .true.
4065 CALL pw_poisson_check(poisson_env)
4067 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...
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 ...