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
99 INTERFACE mt2d_hartree_stress
100 MODULE PROCEDURE mt2d_hartree_stress_r3d_rs, mt2d_hartree_stress_c1d_gs
113 SUBROUTINE pw_poisson_cleanup(poisson_env)
114 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
116 TYPE(pw_pool_type),
POINTER :: pw_pool
119 IF (
ASSOCIATED(poisson_env%pw_pools))
THEN
120 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
122 IF (
ASSOCIATED(poisson_env%green_fft))
THEN
124 DEALLOCATE (poisson_env%green_fft)
126 poisson_env%rebuild = .true.
128 END SUBROUTINE pw_poisson_cleanup
135 SUBROUTINE pw_poisson_check(poisson_env)
136 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
139 TYPE(greens_fn_type),
POINTER :: green
140 TYPE(ps_wavelet_type),
POINTER :: wavelet
142 cpassert(
ASSOCIATED(poisson_env%pw_pools))
143 cpassert(poisson_env%pw_level >= lbound(poisson_env%pw_pools, 1))
144 cpassert(poisson_env%pw_level <= ubound(poisson_env%pw_pools, 1))
145 green => poisson_env%green_fft
146 wavelet => poisson_env%wavelet
147 rebuild = poisson_env%rebuild
148 rebuild = rebuild .OR. (poisson_env%method /= poisson_env%parameters%solver) &
149 .OR. .NOT.
ASSOCIATED(green)
150 poisson_env%method = poisson_env%parameters%solver
153 poisson_env%used_grid = use_rs_grid
155 poisson_env%used_grid = use_gs_grid
157 IF (.NOT. rebuild)
THEN
159 rebuild = (poisson_env%parameters%ewald_alpha /= green%p3m_alpha) .OR. rebuild
160 rebuild = (poisson_env%parameters%ewald_o_spline /= green%p3m_order) .OR. rebuild
162 SELECT CASE (poisson_env%method)
164 SELECT CASE (green%method)
170 SELECT CASE (green%method)
175 rebuild = (poisson_env%parameters%mt_alpha /= green%mt_alpha) .OR. rebuild
177 rebuild = (poisson_env%parameters%wavelet_scf_type /= wavelet%itype_scf) .OR. rebuild
179 cpabort(
"Unknown Poisson solver")
183 poisson_env%rebuild = .true.
184 CALL pw_poisson_cleanup(poisson_env)
186 END SUBROUTINE pw_poisson_check
196 SUBROUTINE pw_poisson_rebuild_nodens(poisson_env)
199 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_rebuild'
203 CALL timeset(routinen, handle)
205 cpassert(
ASSOCIATED(poisson_env%pw_pools))
207 IF (poisson_env%rebuild)
THEN
208 CALL pw_poisson_cleanup(poisson_env)
209 SELECT CASE (poisson_env%parameters%solver)
211 ALLOCATE (poisson_env%green_fft)
212 CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
213 pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
214 poisson_params=poisson_env%parameters, &
215 mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
216 dct_pw_grid=poisson_env%dct_pw_grid)
218 cpabort(
"Wavelet solver requires a density!")
220 ALLOCATE (poisson_env%green_fft)
221 CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
222 pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
223 poisson_params=poisson_env%parameters, &
224 mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
225 dct_pw_grid=poisson_env%dct_pw_grid)
227 poisson_env%parameters, &
228 poisson_env%dct_pw_grid, &
229 poisson_env%green_fft, poisson_env%implicit_env)
232 cpabort(
"Unknown Poisson solver")
234 poisson_env%rebuild = .false.
237 CALL timestop(handle)
239 END SUBROUTINE pw_poisson_rebuild_nodens
249 SUBROUTINE pw_poisson_rebuild_r3d_rs (poisson_env, density)
253 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_rebuild'
257 CALL timeset(routinen, handle)
259 cpassert(
ASSOCIATED(poisson_env%pw_pools))
261 IF (poisson_env%rebuild)
THEN
262 CALL pw_poisson_cleanup(poisson_env)
263 SELECT CASE (poisson_env%parameters%solver)
265 ALLOCATE (poisson_env%green_fft)
266 CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
267 pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
268 poisson_params=poisson_env%parameters, &
269 mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
270 dct_pw_grid=poisson_env%dct_pw_grid)
272 cpassert(
ASSOCIATED(density%pw_grid))
276 ALLOCATE (poisson_env%green_fft)
277 CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
278 pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
279 poisson_params=poisson_env%parameters, &
280 mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
281 dct_pw_grid=poisson_env%dct_pw_grid)
283 poisson_env%parameters, &
284 poisson_env%dct_pw_grid, &
285 poisson_env%green_fft, poisson_env%implicit_env)
288 cpabort(
"Unknown Poisson solver")
290 poisson_env%rebuild = .false.
293 CALL timestop(handle)
295 END SUBROUTINE pw_poisson_rebuild_r3d_rs
304 SUBROUTINE pw_poisson_rebuild_c1d_gs (poisson_env, density)
308 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_rebuild'
312 CALL timeset(routinen, handle)
314 cpassert(
ASSOCIATED(poisson_env%pw_pools))
316 IF (poisson_env%rebuild)
THEN
317 CALL pw_poisson_cleanup(poisson_env)
318 SELECT CASE (poisson_env%parameters%solver)
320 ALLOCATE (poisson_env%green_fft)
321 CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
322 pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
323 poisson_params=poisson_env%parameters, &
324 mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
325 dct_pw_grid=poisson_env%dct_pw_grid)
327 cpassert(
ASSOCIATED(density%pw_grid))
331 ALLOCATE (poisson_env%green_fft)
332 CALL pw_green_create(poisson_env%green_fft, cell_hmat=poisson_env%cell_hmat, &
333 pw_pool=poisson_env%pw_pools(poisson_env%pw_level)%pool, &
334 poisson_params=poisson_env%parameters, &
335 mt_super_ref_pw_grid=poisson_env%mt_super_ref_pw_grid, &
336 dct_pw_grid=poisson_env%dct_pw_grid)
338 poisson_env%parameters, &
339 poisson_env%dct_pw_grid, &
340 poisson_env%green_fft, poisson_env%implicit_env)
343 cpabort(
"Unknown Poisson solver")
345 poisson_env%rebuild = .false.
348 CALL timestop(handle)
350 END SUBROUTINE pw_poisson_rebuild_c1d_gs
367 SUBROUTINE pw_poisson_solve_nov_nodv_r3d_rs (poisson_env, density, ehartree, &
368 h_stress, rho_core, greenfn, aux_density)
372 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
373 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
378 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
381 LOGICAL :: has_dielectric
387 CALL timeset(routinen, handle)
391 has_dielectric = poisson_env%parameters%has_dielectric
394 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
395 pw_grid => pw_pool%pw_grid
397 CALL pw_pool%create_pw(rhog)
398 IF (
PRESENT(aux_density))
THEN
399 CALL pw_pool%create_pw(rhog_aux)
402 SELECT CASE (poisson_env%used_grid)
405 SELECT CASE (poisson_env%green_fft%method)
409 IF (
PRESENT(aux_density))
THEN
412 IF (
PRESENT(ehartree))
THEN
413 CALL pw_pool%create_pw(tmpg)
416 IF (
PRESENT(greenfn))
THEN
417 influence_fn = greenfn
419 influence_fn = poisson_env%green_fft%influence_fn
422 IF (
PRESENT(aux_density))
THEN
425 IF (
PRESENT(ehartree))
THEN
426 IF (
PRESENT(aux_density))
THEN
431 CALL pw_pool%give_back_pw(tmpg)
436 IF (
PRESENT(h_stress))
THEN
437 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
440 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
441 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
444 poisson_env%diel_rs_grid, &
445 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
446 density, rho_core=rho_core)
449 poisson_env%diel_rs_grid, &
450 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
451 poisson_env%dct_pw_grid, &
452 poisson_env%parameters%ps_implicit_params%neumann_directions, &
453 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
454 poisson_env%implicit_env%dct_env%dests_expand, &
455 poisson_env%implicit_env%dct_env%srcs_expand, &
456 poisson_env%implicit_env%dct_env%flipg_stat, &
457 poisson_env%implicit_env%dct_env%bounds_shftd, &
458 density, rho_core=rho_core)
462 CALL pw_pool%create_pw(rhor)
463 CALL pw_pool%create_pw(vhartree_rs)
466 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
475 electric_enthalpy=ehartree)
478 electric_enthalpy=ehartree)
481 IF (
PRESENT(aux_density))
THEN
486 CALL pw_pool%give_back_pw(rhor)
487 CALL pw_pool%give_back_pw(vhartree_rs)
490 CALL cp_abort(__location__, &
491 "unknown poisson method "// &
497 CALL pw_pool%create_pw(rhor)
502 IF (
PRESENT(ehartree))
THEN
503 IF (
PRESENT(aux_density))
THEN
509 IF (
PRESENT(h_stress))
THEN
511 IF (
PRESENT(aux_density))
THEN
519 CALL pw_pool%give_back_pw(rhor)
523 IF (
PRESENT(aux_density))
THEN
524 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
526 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
528 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
530 CALL pw_pool%give_back_pw(rhog)
531 IF (
PRESENT(aux_density))
THEN
532 CALL pw_pool%give_back_pw(rhog_aux)
535 CALL timestop(handle)
537 END SUBROUTINE pw_poisson_solve_nov_nodv_r3d_rs
553 SUBROUTINE pw_poisson_solve_nov_nodv_c1d_gs (poisson_env, density, ehartree, &
554 h_stress, rho_core, greenfn, aux_density)
558 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
559 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
564 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
567 LOGICAL :: has_dielectric
573 CALL timeset(routinen, handle)
577 has_dielectric = poisson_env%parameters%has_dielectric
580 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
581 pw_grid => pw_pool%pw_grid
583 CALL pw_pool%create_pw(rhog)
584 IF (
PRESENT(aux_density))
THEN
585 CALL pw_pool%create_pw(rhog_aux)
588 SELECT CASE (poisson_env%used_grid)
591 SELECT CASE (poisson_env%green_fft%method)
595 IF (
PRESENT(aux_density))
THEN
598 IF (
PRESENT(ehartree))
THEN
599 CALL pw_pool%create_pw(tmpg)
602 IF (
PRESENT(greenfn))
THEN
603 influence_fn = greenfn
605 influence_fn = poisson_env%green_fft%influence_fn
608 IF (
PRESENT(aux_density))
THEN
611 IF (
PRESENT(ehartree))
THEN
612 IF (
PRESENT(aux_density))
THEN
617 CALL pw_pool%give_back_pw(tmpg)
622 IF (
PRESENT(h_stress))
THEN
623 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
626 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
627 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
630 poisson_env%diel_rs_grid, &
631 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
632 density, rho_core=rho_core)
635 poisson_env%diel_rs_grid, &
636 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
637 poisson_env%dct_pw_grid, &
638 poisson_env%parameters%ps_implicit_params%neumann_directions, &
639 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
640 poisson_env%implicit_env%dct_env%dests_expand, &
641 poisson_env%implicit_env%dct_env%srcs_expand, &
642 poisson_env%implicit_env%dct_env%flipg_stat, &
643 poisson_env%implicit_env%dct_env%bounds_shftd, &
644 density, rho_core=rho_core)
648 CALL pw_pool%create_pw(rhor)
649 CALL pw_pool%create_pw(vhartree_rs)
652 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
661 electric_enthalpy=ehartree)
664 electric_enthalpy=ehartree)
667 IF (
PRESENT(aux_density))
THEN
672 CALL pw_pool%give_back_pw(rhor)
673 CALL pw_pool%give_back_pw(vhartree_rs)
676 CALL cp_abort(__location__, &
677 "unknown poisson method "// &
683 CALL pw_pool%create_pw(rhor)
688 IF (
PRESENT(ehartree))
THEN
689 IF (
PRESENT(aux_density))
THEN
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)
695 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%create_pw(rhog)
698 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%give_back_pw(rhog)
701 IF (
PRESENT(h_stress))
THEN
703 IF (
PRESENT(aux_density))
THEN
711 CALL pw_pool%give_back_pw(rhor)
715 IF (
PRESENT(aux_density))
THEN
716 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
718 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
720 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
722 CALL pw_pool%give_back_pw(rhog)
723 IF (
PRESENT(aux_density))
THEN
724 CALL pw_pool%give_back_pw(rhog_aux)
727 CALL timestop(handle)
729 END SUBROUTINE pw_poisson_solve_nov_nodv_c1d_gs
747 SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
748 h_stress, rho_core, greenfn, aux_density)
752 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
754 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
759 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
762 LOGICAL :: has_dielectric
769 CALL timeset(routinen, handle)
773 has_dielectric = poisson_env%parameters%has_dielectric
776 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
777 pw_grid => pw_pool%pw_grid
779 cpabort(
"vhartree has a different grid than the poisson solver")
782 CALL pw_pool%create_pw(rhog)
783 IF (
PRESENT(aux_density))
THEN
784 CALL pw_pool%create_pw(rhog_aux)
787 SELECT CASE (poisson_env%used_grid)
790 SELECT CASE (poisson_env%green_fft%method)
794 IF (
PRESENT(aux_density))
THEN
797 IF (
PRESENT(greenfn))
THEN
798 influence_fn = greenfn
800 influence_fn = poisson_env%green_fft%influence_fn
803 IF (
PRESENT(aux_density))
THEN
807 IF (
PRESENT(ehartree))
THEN
808 IF (
PRESENT(aux_density))
THEN
816 IF (
PRESENT(h_stress))
THEN
817 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
820 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
821 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
824 poisson_env%diel_rs_grid, &
825 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
826 density, rho_core=rho_core)
829 poisson_env%diel_rs_grid, &
830 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
831 poisson_env%dct_pw_grid, &
832 poisson_env%parameters%ps_implicit_params%neumann_directions, &
833 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
834 poisson_env%implicit_env%dct_env%dests_expand, &
835 poisson_env%implicit_env%dct_env%srcs_expand, &
836 poisson_env%implicit_env%dct_env%flipg_stat, &
837 poisson_env%implicit_env%dct_env%bounds_shftd, &
838 density, rho_core=rho_core)
842 CALL pw_pool%create_pw(rhor)
843 CALL pw_pool%create_pw(vhartree_rs)
846 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
855 electric_enthalpy=ehartree)
858 electric_enthalpy=ehartree)
861 IF (
PRESENT(aux_density))
THEN
868 CALL pw_pool%give_back_pw(rhor)
869 CALL pw_pool%give_back_pw(vhartree_rs)
872 CALL cp_abort(__location__, &
873 "unknown poisson method "// &
879 CALL pw_pool%create_pw(rhor)
885 IF (
PRESENT(ehartree))
THEN
886 IF (
PRESENT(aux_density))
THEN
892 IF (
PRESENT(h_stress))
THEN
894 IF (
PRESENT(aux_density))
THEN
902 CALL pw_pool%give_back_pw(rhor)
906 IF (
PRESENT(aux_density))
THEN
907 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
909 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
911 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
913 CALL pw_pool%give_back_pw(rhog)
914 IF (
PRESENT(aux_density))
THEN
915 CALL pw_pool%give_back_pw(rhog_aux)
918 CALL timestop(handle)
920 END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs
937 SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
938 h_stress, rho_core, greenfn, aux_density)
942 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
944 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
949 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
952 LOGICAL :: has_dielectric
959 CALL timeset(routinen, handle)
963 has_dielectric = poisson_env%parameters%has_dielectric
966 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
967 pw_grid => pw_pool%pw_grid
969 cpabort(
"vhartree has a different grid than the poisson solver")
972 CALL pw_pool%create_pw(rhog)
973 IF (
PRESENT(aux_density))
THEN
974 CALL pw_pool%create_pw(rhog_aux)
977 SELECT CASE (poisson_env%used_grid)
980 SELECT CASE (poisson_env%green_fft%method)
984 IF (
PRESENT(aux_density))
THEN
987 IF (
PRESENT(greenfn))
THEN
988 influence_fn = greenfn
990 influence_fn = poisson_env%green_fft%influence_fn
993 IF (
PRESENT(aux_density))
THEN
997 IF (
PRESENT(ehartree))
THEN
998 IF (
PRESENT(aux_density))
THEN
1008 IF (
PRESENT(h_stress))
THEN
1009 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1012 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1013 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1016 poisson_env%diel_rs_grid, &
1017 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1018 density, rho_core=rho_core)
1021 poisson_env%diel_rs_grid, &
1022 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1023 poisson_env%dct_pw_grid, &
1024 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1025 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1026 poisson_env%implicit_env%dct_env%dests_expand, &
1027 poisson_env%implicit_env%dct_env%srcs_expand, &
1028 poisson_env%implicit_env%dct_env%flipg_stat, &
1029 poisson_env%implicit_env%dct_env%bounds_shftd, &
1030 density, rho_core=rho_core)
1034 CALL pw_pool%create_pw(rhor)
1035 CALL pw_pool%create_pw(vhartree_rs)
1038 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1047 electric_enthalpy=ehartree)
1050 electric_enthalpy=ehartree)
1053 IF (
PRESENT(aux_density))
THEN
1060 CALL pw_pool%give_back_pw(rhor)
1061 CALL pw_pool%give_back_pw(vhartree_rs)
1064 CALL cp_abort(__location__, &
1065 "unknown poisson method "// &
1071 CALL pw_pool%create_pw(rhor)
1077 IF (
PRESENT(ehartree))
THEN
1078 IF (
PRESENT(aux_density))
THEN
1084 IF (
PRESENT(h_stress))
THEN
1086 IF (
PRESENT(aux_density))
THEN
1094 CALL pw_pool%give_back_pw(rhor)
1098 IF (
PRESENT(aux_density))
THEN
1099 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1101 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress)
1103 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
1105 CALL pw_pool%give_back_pw(rhog)
1106 IF (
PRESENT(aux_density))
THEN
1107 CALL pw_pool%give_back_pw(rhog_aux)
1110 CALL timestop(handle)
1112 END SUBROUTINE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs
1129 SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
1130 h_stress, rho_core, greenfn, aux_density)
1134 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1136 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1137 OPTIONAL :: h_stress
1141 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1144 LOGICAL :: has_dielectric
1151 CALL timeset(routinen, handle)
1155 has_dielectric = poisson_env%parameters%has_dielectric
1158 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1159 pw_grid => pw_pool%pw_grid
1161 cpabort(
"vhartree has a different grid than the poisson solver")
1164 CALL pw_pool%create_pw(rhog)
1165 IF (
PRESENT(aux_density))
THEN
1166 CALL pw_pool%create_pw(rhog_aux)
1169 SELECT CASE (poisson_env%used_grid)
1172 SELECT CASE (poisson_env%green_fft%method)
1176 IF (
PRESENT(aux_density))
THEN
1179 IF (
PRESENT(greenfn))
THEN
1180 influence_fn = greenfn
1182 influence_fn = poisson_env%green_fft%influence_fn
1185 IF (
PRESENT(aux_density))
THEN
1189 IF (
PRESENT(ehartree))
THEN
1190 IF (
PRESENT(aux_density))
THEN
1198 IF (
PRESENT(h_stress))
THEN
1199 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1202 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1203 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1206 poisson_env%diel_rs_grid, &
1207 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1208 density, rho_core=rho_core)
1211 poisson_env%diel_rs_grid, &
1212 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1213 poisson_env%dct_pw_grid, &
1214 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1215 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1216 poisson_env%implicit_env%dct_env%dests_expand, &
1217 poisson_env%implicit_env%dct_env%srcs_expand, &
1218 poisson_env%implicit_env%dct_env%flipg_stat, &
1219 poisson_env%implicit_env%dct_env%bounds_shftd, &
1220 density, rho_core=rho_core)
1224 CALL pw_pool%create_pw(rhor)
1225 CALL pw_pool%create_pw(vhartree_rs)
1228 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1237 electric_enthalpy=ehartree)
1240 electric_enthalpy=ehartree)
1243 IF (
PRESENT(aux_density))
THEN
1250 CALL pw_pool%give_back_pw(rhor)
1251 CALL pw_pool%give_back_pw(vhartree_rs)
1254 CALL cp_abort(__location__, &
1255 "unknown poisson method "// &
1261 CALL pw_pool%create_pw(rhor)
1267 IF (
PRESENT(ehartree))
THEN
1268 IF (
PRESENT(aux_density))
THEN
1276 IF (
PRESENT(h_stress))
THEN
1278 IF (
PRESENT(aux_density))
THEN
1286 CALL pw_pool%give_back_pw(rhor)
1290 IF (
PRESENT(aux_density))
THEN
1291 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1293 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1295 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
1297 CALL pw_pool%give_back_pw(rhog)
1298 IF (
PRESENT(aux_density))
THEN
1299 CALL pw_pool%give_back_pw(rhog_aux)
1302 CALL timestop(handle)
1304 END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs
1321 SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
1322 h_stress, rho_core, greenfn, aux_density)
1326 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1328 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1329 OPTIONAL :: h_stress
1333 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1336 LOGICAL :: has_dielectric
1343 CALL timeset(routinen, handle)
1347 has_dielectric = poisson_env%parameters%has_dielectric
1350 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1351 pw_grid => pw_pool%pw_grid
1353 cpabort(
"vhartree has a different grid than the poisson solver")
1356 CALL pw_pool%create_pw(rhog)
1357 IF (
PRESENT(aux_density))
THEN
1358 CALL pw_pool%create_pw(rhog_aux)
1361 SELECT CASE (poisson_env%used_grid)
1364 SELECT CASE (poisson_env%green_fft%method)
1368 IF (
PRESENT(aux_density))
THEN
1371 IF (
PRESENT(greenfn))
THEN
1372 influence_fn = greenfn
1374 influence_fn = poisson_env%green_fft%influence_fn
1377 IF (
PRESENT(aux_density))
THEN
1381 IF (
PRESENT(ehartree))
THEN
1382 IF (
PRESENT(aux_density))
THEN
1390 IF (
PRESENT(h_stress))
THEN
1391 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1394 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1395 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1398 poisson_env%diel_rs_grid, &
1399 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1400 density, rho_core=rho_core)
1403 poisson_env%diel_rs_grid, &
1404 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1405 poisson_env%dct_pw_grid, &
1406 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1407 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1408 poisson_env%implicit_env%dct_env%dests_expand, &
1409 poisson_env%implicit_env%dct_env%srcs_expand, &
1410 poisson_env%implicit_env%dct_env%flipg_stat, &
1411 poisson_env%implicit_env%dct_env%bounds_shftd, &
1412 density, rho_core=rho_core)
1416 CALL pw_pool%create_pw(rhor)
1417 CALL pw_pool%create_pw(vhartree_rs)
1420 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1429 electric_enthalpy=ehartree)
1432 electric_enthalpy=ehartree)
1435 IF (
PRESENT(aux_density))
THEN
1442 CALL pw_pool%give_back_pw(rhor)
1443 CALL pw_pool%give_back_pw(vhartree_rs)
1446 CALL cp_abort(__location__, &
1447 "unknown poisson method "// &
1453 CALL pw_pool%create_pw(rhor)
1459 IF (
PRESENT(ehartree))
THEN
1460 IF (
PRESENT(aux_density))
THEN
1466 IF (
PRESENT(h_stress))
THEN
1468 IF (
PRESENT(aux_density))
THEN
1476 CALL pw_pool%give_back_pw(rhor)
1480 IF (
PRESENT(aux_density))
THEN
1481 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress)
1483 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress)
1485 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
1487 CALL pw_pool%give_back_pw(rhog)
1488 IF (
PRESENT(aux_density))
THEN
1489 CALL pw_pool%give_back_pw(rhog_aux)
1492 CALL timestop(handle)
1494 END SUBROUTINE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs
1512 SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs (poisson_env, density, ehartree, &
1513 dvhartree, h_stress, rho_core, greenfn, aux_density)
1517 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1519 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1520 OPTIONAL :: h_stress
1524 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1527 LOGICAL :: has_dielectric
1534 CALL timeset(routinen, handle)
1538 has_dielectric = poisson_env%parameters%has_dielectric
1541 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1542 pw_grid => pw_pool%pw_grid
1544 CALL pw_pool%create_pw(rhog)
1545 IF (
PRESENT(aux_density))
THEN
1546 CALL pw_pool%create_pw(rhog_aux)
1549 SELECT CASE (poisson_env%used_grid)
1552 SELECT CASE (poisson_env%green_fft%method)
1556 IF (
PRESENT(aux_density))
THEN
1559 IF (
PRESENT(ehartree))
THEN
1560 CALL pw_pool%create_pw(tmpg)
1563 IF (
PRESENT(greenfn))
THEN
1564 influence_fn = greenfn
1566 influence_fn = poisson_env%green_fft%influence_fn
1569 IF (
PRESENT(aux_density))
THEN
1572 IF (
PRESENT(ehartree))
THEN
1573 IF (
PRESENT(aux_density))
THEN
1578 CALL pw_pool%give_back_pw(tmpg)
1582 IF (
PRESENT(h_stress))
THEN
1583 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1586 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1587 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1590 poisson_env%diel_rs_grid, &
1591 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1592 density, rho_core=rho_core)
1595 poisson_env%diel_rs_grid, &
1596 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1597 poisson_env%dct_pw_grid, &
1598 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1599 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1600 poisson_env%implicit_env%dct_env%dests_expand, &
1601 poisson_env%implicit_env%dct_env%srcs_expand, &
1602 poisson_env%implicit_env%dct_env%flipg_stat, &
1603 poisson_env%implicit_env%dct_env%bounds_shftd, &
1604 density, rho_core=rho_core)
1608 CALL pw_pool%create_pw(rhor)
1609 CALL pw_pool%create_pw(vhartree_rs)
1612 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1621 electric_enthalpy=ehartree)
1624 electric_enthalpy=ehartree)
1629 IF (
PRESENT(aux_density))
THEN
1634 CALL pw_pool%give_back_pw(rhor)
1635 CALL pw_pool%give_back_pw(vhartree_rs)
1638 CALL cp_abort(__location__, &
1639 "unknown poisson method "// &
1645 CALL pw_pool%create_pw(rhor)
1651 IF (
PRESENT(ehartree))
THEN
1654 CALL pw_pool%give_back_pw(rhor)
1658 IF (
PRESENT(aux_density))
THEN
1659 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1661 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1663 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
1665 CALL pw_pool%give_back_pw(rhog)
1666 IF (
PRESENT(aux_density))
THEN
1667 CALL pw_pool%give_back_pw(rhog_aux)
1670 CALL timestop(handle)
1672 END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs
1689 SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs (poisson_env, density, ehartree, &
1690 dvhartree, h_stress, rho_core, greenfn, aux_density)
1694 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1696 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1697 OPTIONAL :: h_stress
1701 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1704 LOGICAL :: has_dielectric
1711 CALL timeset(routinen, handle)
1715 has_dielectric = poisson_env%parameters%has_dielectric
1718 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1719 pw_grid => pw_pool%pw_grid
1721 CALL pw_pool%create_pw(rhog)
1722 IF (
PRESENT(aux_density))
THEN
1723 CALL pw_pool%create_pw(rhog_aux)
1726 SELECT CASE (poisson_env%used_grid)
1729 SELECT CASE (poisson_env%green_fft%method)
1733 IF (
PRESENT(aux_density))
THEN
1736 IF (
PRESENT(ehartree))
THEN
1737 CALL pw_pool%create_pw(tmpg)
1740 IF (
PRESENT(greenfn))
THEN
1741 influence_fn = greenfn
1743 influence_fn = poisson_env%green_fft%influence_fn
1746 IF (
PRESENT(aux_density))
THEN
1749 IF (
PRESENT(ehartree))
THEN
1750 IF (
PRESENT(aux_density))
THEN
1755 CALL pw_pool%give_back_pw(tmpg)
1759 IF (
PRESENT(h_stress))
THEN
1760 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1763 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1764 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1767 poisson_env%diel_rs_grid, &
1768 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1769 density, rho_core=rho_core)
1772 poisson_env%diel_rs_grid, &
1773 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1774 poisson_env%dct_pw_grid, &
1775 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1776 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1777 poisson_env%implicit_env%dct_env%dests_expand, &
1778 poisson_env%implicit_env%dct_env%srcs_expand, &
1779 poisson_env%implicit_env%dct_env%flipg_stat, &
1780 poisson_env%implicit_env%dct_env%bounds_shftd, &
1781 density, rho_core=rho_core)
1785 CALL pw_pool%create_pw(rhor)
1786 CALL pw_pool%create_pw(vhartree_rs)
1789 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1798 electric_enthalpy=ehartree)
1801 electric_enthalpy=ehartree)
1806 IF (
PRESENT(aux_density))
THEN
1811 CALL pw_pool%give_back_pw(rhor)
1812 CALL pw_pool%give_back_pw(vhartree_rs)
1815 CALL cp_abort(__location__, &
1816 "unknown poisson method "// &
1822 CALL pw_pool%create_pw(rhor)
1828 IF (
PRESENT(ehartree))
THEN
1831 CALL pw_pool%give_back_pw(rhor)
1835 IF (
PRESENT(aux_density))
THEN
1836 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
1838 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
1840 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
1842 CALL pw_pool%give_back_pw(rhog)
1843 IF (
PRESENT(aux_density))
THEN
1844 CALL pw_pool%give_back_pw(rhog_aux)
1847 CALL timestop(handle)
1849 END SUBROUTINE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs
1866 SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs (poisson_env, density, ehartree, &
1867 dvhartree, h_stress, rho_core, greenfn, aux_density)
1871 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1873 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1874 OPTIONAL :: h_stress
1878 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1881 LOGICAL :: has_dielectric
1888 CALL timeset(routinen, handle)
1892 has_dielectric = poisson_env%parameters%has_dielectric
1895 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
1896 pw_grid => pw_pool%pw_grid
1898 CALL pw_pool%create_pw(rhog)
1899 IF (
PRESENT(aux_density))
THEN
1900 CALL pw_pool%create_pw(rhog_aux)
1903 SELECT CASE (poisson_env%used_grid)
1906 SELECT CASE (poisson_env%green_fft%method)
1910 IF (
PRESENT(aux_density))
THEN
1913 IF (
PRESENT(ehartree))
THEN
1914 CALL pw_pool%create_pw(tmpg)
1917 IF (
PRESENT(greenfn))
THEN
1918 influence_fn = greenfn
1920 influence_fn = poisson_env%green_fft%influence_fn
1923 IF (
PRESENT(aux_density))
THEN
1926 IF (
PRESENT(ehartree))
THEN
1927 IF (
PRESENT(aux_density))
THEN
1932 CALL pw_pool%give_back_pw(tmpg)
1936 IF (
PRESENT(h_stress))
THEN
1937 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
1940 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
1941 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1944 poisson_env%diel_rs_grid, &
1945 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1946 density, rho_core=rho_core)
1949 poisson_env%diel_rs_grid, &
1950 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1951 poisson_env%dct_pw_grid, &
1952 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1953 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1954 poisson_env%implicit_env%dct_env%dests_expand, &
1955 poisson_env%implicit_env%dct_env%srcs_expand, &
1956 poisson_env%implicit_env%dct_env%flipg_stat, &
1957 poisson_env%implicit_env%dct_env%bounds_shftd, &
1958 density, rho_core=rho_core)
1962 CALL pw_pool%create_pw(rhor)
1963 CALL pw_pool%create_pw(vhartree_rs)
1966 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1975 electric_enthalpy=ehartree)
1978 electric_enthalpy=ehartree)
1983 IF (
PRESENT(aux_density))
THEN
1988 CALL pw_pool%give_back_pw(rhor)
1989 CALL pw_pool%give_back_pw(vhartree_rs)
1992 CALL cp_abort(__location__, &
1993 "unknown poisson method "// &
1999 CALL pw_pool%create_pw(rhor)
2005 IF (
PRESENT(ehartree))
THEN
2008 CALL pw_pool%give_back_pw(rhor)
2012 IF (
PRESENT(aux_density))
THEN
2013 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2015 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2017 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
2019 CALL pw_pool%give_back_pw(rhog)
2020 IF (
PRESENT(aux_density))
THEN
2021 CALL pw_pool%give_back_pw(rhog_aux)
2024 CALL timestop(handle)
2026 END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs
2043 SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs (poisson_env, density, ehartree, &
2044 dvhartree, h_stress, rho_core, greenfn, aux_density)
2048 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2050 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2051 OPTIONAL :: h_stress
2055 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2058 LOGICAL :: has_dielectric
2065 CALL timeset(routinen, handle)
2069 has_dielectric = poisson_env%parameters%has_dielectric
2072 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2073 pw_grid => pw_pool%pw_grid
2075 CALL pw_pool%create_pw(rhog)
2076 IF (
PRESENT(aux_density))
THEN
2077 CALL pw_pool%create_pw(rhog_aux)
2080 SELECT CASE (poisson_env%used_grid)
2083 SELECT CASE (poisson_env%green_fft%method)
2087 IF (
PRESENT(aux_density))
THEN
2090 IF (
PRESENT(ehartree))
THEN
2091 CALL pw_pool%create_pw(tmpg)
2094 IF (
PRESENT(greenfn))
THEN
2095 influence_fn = greenfn
2097 influence_fn = poisson_env%green_fft%influence_fn
2100 IF (
PRESENT(aux_density))
THEN
2103 IF (
PRESENT(ehartree))
THEN
2104 IF (
PRESENT(aux_density))
THEN
2109 CALL pw_pool%give_back_pw(tmpg)
2113 IF (
PRESENT(h_stress))
THEN
2114 cpabort(
"No stress tensor is implemented for the implicit Poisson solver.")
2117 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2118 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2121 poisson_env%diel_rs_grid, &
2122 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2123 density, rho_core=rho_core)
2126 poisson_env%diel_rs_grid, &
2127 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2128 poisson_env%dct_pw_grid, &
2129 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2130 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2131 poisson_env%implicit_env%dct_env%dests_expand, &
2132 poisson_env%implicit_env%dct_env%srcs_expand, &
2133 poisson_env%implicit_env%dct_env%flipg_stat, &
2134 poisson_env%implicit_env%dct_env%bounds_shftd, &
2135 density, rho_core=rho_core)
2139 CALL pw_pool%create_pw(rhor)
2140 CALL pw_pool%create_pw(vhartree_rs)
2143 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2152 electric_enthalpy=ehartree)
2155 electric_enthalpy=ehartree)
2160 IF (
PRESENT(aux_density))
THEN
2165 CALL pw_pool%give_back_pw(rhor)
2166 CALL pw_pool%give_back_pw(vhartree_rs)
2169 CALL cp_abort(__location__, &
2170 "unknown poisson method "// &
2176 CALL pw_pool%create_pw(rhor)
2182 IF (
PRESENT(ehartree))
THEN
2185 CALL pw_pool%give_back_pw(rhor)
2189 IF (
PRESENT(aux_density))
THEN
2190 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2192 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2194 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
2196 CALL pw_pool%give_back_pw(rhog)
2197 IF (
PRESENT(aux_density))
THEN
2198 CALL pw_pool%give_back_pw(rhog_aux)
2201 CALL timestop(handle)
2203 END SUBROUTINE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs
2222 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2223 dvhartree, h_stress, rho_core, greenfn, aux_density)
2227 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2230 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2231 OPTIONAL :: h_stress
2235 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2238 LOGICAL :: has_dielectric
2244 CALL timeset(routinen, handle)
2248 has_dielectric = poisson_env%parameters%has_dielectric
2251 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2252 pw_grid => pw_pool%pw_grid
2254 cpabort(
"vhartree has a different grid than the poisson solver")
2257 CALL pw_pool%create_pw(rhog)
2258 IF (
PRESENT(aux_density))
THEN
2259 CALL pw_pool%create_pw(rhog_aux)
2262 SELECT CASE (poisson_env%used_grid)
2265 SELECT CASE (poisson_env%green_fft%method)
2269 IF (
PRESENT(aux_density))
THEN
2272 IF (
PRESENT(greenfn))
THEN
2273 influence_fn = greenfn
2275 influence_fn = poisson_env%green_fft%influence_fn
2278 IF (
PRESENT(aux_density))
THEN
2282 IF (
PRESENT(ehartree))
THEN
2283 IF (
PRESENT(aux_density))
THEN
2291 IF (
PRESENT(h_stress))
THEN
2292 CALL cp_abort(__location__, &
2293 "No stress tensor is implemented for the implicit Poisson solver.")
2296 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2297 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2300 poisson_env%diel_rs_grid, &
2301 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2302 density, rho_core=rho_core)
2305 poisson_env%diel_rs_grid, &
2306 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2307 poisson_env%dct_pw_grid, &
2308 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2309 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2310 poisson_env%implicit_env%dct_env%dests_expand, &
2311 poisson_env%implicit_env%dct_env%srcs_expand, &
2312 poisson_env%implicit_env%dct_env%flipg_stat, &
2313 poisson_env%implicit_env%dct_env%bounds_shftd, &
2314 density, rho_core=rho_core)
2318 CALL pw_pool%create_pw(rhor)
2319 CALL pw_pool%create_pw(vhartree_rs)
2322 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2331 electric_enthalpy=ehartree)
2334 electric_enthalpy=ehartree)
2340 IF (
PRESENT(aux_density))
THEN
2345 CALL pw_pool%give_back_pw(rhor)
2346 CALL pw_pool%give_back_pw(vhartree_rs)
2349 CALL cp_abort(__location__, &
2350 "unknown poisson method "// &
2356 CALL pw_pool%create_pw(rhor)
2363 IF (
PRESENT(ehartree))
THEN
2364 IF (
PRESENT(aux_density))
THEN
2371 IF (
PRESENT(aux_density))
THEN
2378 CALL pw_pool%give_back_pw(rhor)
2382 IF (
PRESENT(aux_density))
THEN
2383 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2385 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2387 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
2389 CALL pw_pool%give_back_pw(rhog)
2390 IF (
PRESENT(aux_density))
THEN
2391 CALL pw_pool%give_back_pw(rhog_aux)
2394 CALL timestop(handle)
2396 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs
2414 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2415 dvhartree, h_stress, rho_core, greenfn, aux_density)
2419 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2422 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2423 OPTIONAL :: h_stress
2427 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2430 LOGICAL :: has_dielectric
2436 CALL timeset(routinen, handle)
2440 has_dielectric = poisson_env%parameters%has_dielectric
2443 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2444 pw_grid => pw_pool%pw_grid
2446 cpabort(
"vhartree has a different grid than the poisson solver")
2449 CALL pw_pool%create_pw(rhog)
2450 IF (
PRESENT(aux_density))
THEN
2451 CALL pw_pool%create_pw(rhog_aux)
2454 SELECT CASE (poisson_env%used_grid)
2457 SELECT CASE (poisson_env%green_fft%method)
2461 IF (
PRESENT(aux_density))
THEN
2464 IF (
PRESENT(greenfn))
THEN
2465 influence_fn = greenfn
2467 influence_fn = poisson_env%green_fft%influence_fn
2470 IF (
PRESENT(aux_density))
THEN
2474 IF (
PRESENT(ehartree))
THEN
2475 IF (
PRESENT(aux_density))
THEN
2485 IF (
PRESENT(h_stress))
THEN
2486 CALL cp_abort(__location__, &
2487 "No stress tensor is implemented for the implicit Poisson solver.")
2490 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2491 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2494 poisson_env%diel_rs_grid, &
2495 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2496 density, rho_core=rho_core)
2499 poisson_env%diel_rs_grid, &
2500 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2501 poisson_env%dct_pw_grid, &
2502 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2503 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2504 poisson_env%implicit_env%dct_env%dests_expand, &
2505 poisson_env%implicit_env%dct_env%srcs_expand, &
2506 poisson_env%implicit_env%dct_env%flipg_stat, &
2507 poisson_env%implicit_env%dct_env%bounds_shftd, &
2508 density, rho_core=rho_core)
2512 CALL pw_pool%create_pw(rhor)
2513 CALL pw_pool%create_pw(vhartree_rs)
2516 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2525 electric_enthalpy=ehartree)
2528 electric_enthalpy=ehartree)
2534 IF (
PRESENT(aux_density))
THEN
2539 CALL pw_pool%give_back_pw(rhor)
2540 CALL pw_pool%give_back_pw(vhartree_rs)
2543 CALL cp_abort(__location__, &
2544 "unknown poisson method "// &
2550 CALL pw_pool%create_pw(rhor)
2557 IF (
PRESENT(ehartree))
THEN
2558 IF (
PRESENT(aux_density))
THEN
2565 IF (
PRESENT(aux_density))
THEN
2572 CALL pw_pool%give_back_pw(rhor)
2576 IF (
PRESENT(aux_density))
THEN
2577 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2579 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2581 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
2583 CALL pw_pool%give_back_pw(rhog)
2584 IF (
PRESENT(aux_density))
THEN
2585 CALL pw_pool%give_back_pw(rhog_aux)
2588 CALL timestop(handle)
2590 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs
2608 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
2609 dvhartree, h_stress, rho_core, greenfn, aux_density)
2613 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2616 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2617 OPTIONAL :: h_stress
2621 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2624 LOGICAL :: has_dielectric
2630 CALL timeset(routinen, handle)
2634 has_dielectric = poisson_env%parameters%has_dielectric
2637 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2638 pw_grid => pw_pool%pw_grid
2640 cpabort(
"vhartree has a different grid than the poisson solver")
2643 CALL pw_pool%create_pw(rhog)
2644 IF (
PRESENT(aux_density))
THEN
2645 CALL pw_pool%create_pw(rhog_aux)
2648 SELECT CASE (poisson_env%used_grid)
2651 SELECT CASE (poisson_env%green_fft%method)
2655 IF (
PRESENT(aux_density))
THEN
2658 IF (
PRESENT(greenfn))
THEN
2659 influence_fn = greenfn
2661 influence_fn = poisson_env%green_fft%influence_fn
2664 IF (
PRESENT(aux_density))
THEN
2668 IF (
PRESENT(ehartree))
THEN
2669 IF (
PRESENT(aux_density))
THEN
2677 IF (
PRESENT(h_stress))
THEN
2678 CALL cp_abort(__location__, &
2679 "No stress tensor is implemented for the implicit Poisson solver.")
2682 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2683 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2686 poisson_env%diel_rs_grid, &
2687 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2688 density, rho_core=rho_core)
2691 poisson_env%diel_rs_grid, &
2692 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2693 poisson_env%dct_pw_grid, &
2694 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2695 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2696 poisson_env%implicit_env%dct_env%dests_expand, &
2697 poisson_env%implicit_env%dct_env%srcs_expand, &
2698 poisson_env%implicit_env%dct_env%flipg_stat, &
2699 poisson_env%implicit_env%dct_env%bounds_shftd, &
2700 density, rho_core=rho_core)
2704 CALL pw_pool%create_pw(rhor)
2705 CALL pw_pool%create_pw(vhartree_rs)
2708 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2717 electric_enthalpy=ehartree)
2720 electric_enthalpy=ehartree)
2726 IF (
PRESENT(aux_density))
THEN
2731 CALL pw_pool%give_back_pw(rhor)
2732 CALL pw_pool%give_back_pw(vhartree_rs)
2735 CALL cp_abort(__location__, &
2736 "unknown poisson method "// &
2742 CALL pw_pool%create_pw(rhor)
2749 IF (
PRESENT(ehartree))
THEN
2750 IF (
PRESENT(aux_density))
THEN
2757 IF (
PRESENT(aux_density))
THEN
2764 CALL pw_pool%give_back_pw(rhor)
2768 IF (
PRESENT(aux_density))
THEN
2769 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2771 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2773 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
2775 CALL pw_pool%give_back_pw(rhog)
2776 IF (
PRESENT(aux_density))
THEN
2777 CALL pw_pool%give_back_pw(rhog_aux)
2780 CALL timestop(handle)
2782 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs
2800 SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
2801 dvhartree, h_stress, rho_core, greenfn, aux_density)
2805 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2808 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2809 OPTIONAL :: h_stress
2813 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2816 LOGICAL :: has_dielectric
2822 CALL timeset(routinen, handle)
2826 has_dielectric = poisson_env%parameters%has_dielectric
2829 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
2830 pw_grid => pw_pool%pw_grid
2832 cpabort(
"vhartree has a different grid than the poisson solver")
2835 CALL pw_pool%create_pw(rhog)
2836 IF (
PRESENT(aux_density))
THEN
2837 CALL pw_pool%create_pw(rhog_aux)
2840 SELECT CASE (poisson_env%used_grid)
2843 SELECT CASE (poisson_env%green_fft%method)
2847 IF (
PRESENT(aux_density))
THEN
2850 IF (
PRESENT(greenfn))
THEN
2851 influence_fn = greenfn
2853 influence_fn = poisson_env%green_fft%influence_fn
2856 IF (
PRESENT(aux_density))
THEN
2860 IF (
PRESENT(ehartree))
THEN
2861 IF (
PRESENT(aux_density))
THEN
2871 IF (
PRESENT(h_stress))
THEN
2872 CALL cp_abort(__location__, &
2873 "No stress tensor is implemented for the implicit Poisson solver.")
2876 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
2877 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2880 poisson_env%diel_rs_grid, &
2881 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2882 density, rho_core=rho_core)
2885 poisson_env%diel_rs_grid, &
2886 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2887 poisson_env%dct_pw_grid, &
2888 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2889 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2890 poisson_env%implicit_env%dct_env%dests_expand, &
2891 poisson_env%implicit_env%dct_env%srcs_expand, &
2892 poisson_env%implicit_env%dct_env%flipg_stat, &
2893 poisson_env%implicit_env%dct_env%bounds_shftd, &
2894 density, rho_core=rho_core)
2898 CALL pw_pool%create_pw(rhor)
2899 CALL pw_pool%create_pw(vhartree_rs)
2902 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2911 electric_enthalpy=ehartree)
2914 electric_enthalpy=ehartree)
2920 IF (
PRESENT(aux_density))
THEN
2925 CALL pw_pool%give_back_pw(rhor)
2926 CALL pw_pool%give_back_pw(vhartree_rs)
2929 CALL cp_abort(__location__, &
2930 "unknown poisson method "// &
2936 CALL pw_pool%create_pw(rhor)
2943 IF (
PRESENT(ehartree))
THEN
2944 IF (
PRESENT(aux_density))
THEN
2951 IF (
PRESENT(aux_density))
THEN
2958 CALL pw_pool%give_back_pw(rhor)
2962 IF (
PRESENT(aux_density))
THEN
2963 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
2965 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
2967 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
2969 CALL pw_pool%give_back_pw(rhog)
2970 IF (
PRESENT(aux_density))
THEN
2971 CALL pw_pool%give_back_pw(rhog_aux)
2974 CALL timestop(handle)
2976 END SUBROUTINE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs
2994 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs (poisson_env, density, ehartree, vhartree, &
2995 dvhartree, h_stress, rho_core, greenfn, aux_density)
2999 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3002 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3003 OPTIONAL :: h_stress
3007 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3010 LOGICAL :: has_dielectric
3016 CALL timeset(routinen, handle)
3020 has_dielectric = poisson_env%parameters%has_dielectric
3023 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3024 pw_grid => pw_pool%pw_grid
3026 cpabort(
"vhartree has a different grid than the poisson solver")
3029 CALL pw_pool%create_pw(rhog)
3030 IF (
PRESENT(aux_density))
THEN
3031 CALL pw_pool%create_pw(rhog_aux)
3034 SELECT CASE (poisson_env%used_grid)
3037 SELECT CASE (poisson_env%green_fft%method)
3041 IF (
PRESENT(aux_density))
THEN
3044 IF (
PRESENT(greenfn))
THEN
3045 influence_fn = greenfn
3047 influence_fn = poisson_env%green_fft%influence_fn
3050 IF (
PRESENT(aux_density))
THEN
3054 IF (
PRESENT(ehartree))
THEN
3055 IF (
PRESENT(aux_density))
THEN
3063 IF (
PRESENT(h_stress))
THEN
3064 CALL cp_abort(__location__, &
3065 "No stress tensor is implemented for the implicit Poisson solver.")
3068 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3069 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3072 poisson_env%diel_rs_grid, &
3073 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3074 density, rho_core=rho_core)
3077 poisson_env%diel_rs_grid, &
3078 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3079 poisson_env%dct_pw_grid, &
3080 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3081 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3082 poisson_env%implicit_env%dct_env%dests_expand, &
3083 poisson_env%implicit_env%dct_env%srcs_expand, &
3084 poisson_env%implicit_env%dct_env%flipg_stat, &
3085 poisson_env%implicit_env%dct_env%bounds_shftd, &
3086 density, rho_core=rho_core)
3090 CALL pw_pool%create_pw(rhor)
3091 CALL pw_pool%create_pw(vhartree_rs)
3094 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3103 electric_enthalpy=ehartree)
3106 electric_enthalpy=ehartree)
3112 IF (
PRESENT(aux_density))
THEN
3117 CALL pw_pool%give_back_pw(rhor)
3118 CALL pw_pool%give_back_pw(vhartree_rs)
3121 CALL cp_abort(__location__, &
3122 "unknown poisson method "// &
3128 CALL pw_pool%create_pw(rhor)
3135 IF (
PRESENT(ehartree))
THEN
3136 IF (
PRESENT(aux_density))
THEN
3143 IF (
PRESENT(aux_density))
THEN
3150 CALL pw_pool%give_back_pw(rhor)
3154 IF (
PRESENT(aux_density))
THEN
3155 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3157 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3159 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
3161 CALL pw_pool%give_back_pw(rhog)
3162 IF (
PRESENT(aux_density))
THEN
3163 CALL pw_pool%give_back_pw(rhog_aux)
3166 CALL timestop(handle)
3168 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs
3186 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs (poisson_env, density, ehartree, vhartree, &
3187 dvhartree, h_stress, rho_core, greenfn, aux_density)
3191 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3194 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3195 OPTIONAL :: h_stress
3199 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3202 LOGICAL :: has_dielectric
3208 CALL timeset(routinen, handle)
3212 has_dielectric = poisson_env%parameters%has_dielectric
3215 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3216 pw_grid => pw_pool%pw_grid
3218 cpabort(
"vhartree has a different grid than the poisson solver")
3221 CALL pw_pool%create_pw(rhog)
3222 IF (
PRESENT(aux_density))
THEN
3223 CALL pw_pool%create_pw(rhog_aux)
3226 SELECT CASE (poisson_env%used_grid)
3229 SELECT CASE (poisson_env%green_fft%method)
3233 IF (
PRESENT(aux_density))
THEN
3236 IF (
PRESENT(greenfn))
THEN
3237 influence_fn = greenfn
3239 influence_fn = poisson_env%green_fft%influence_fn
3242 IF (
PRESENT(aux_density))
THEN
3246 IF (
PRESENT(ehartree))
THEN
3247 IF (
PRESENT(aux_density))
THEN
3255 IF (
PRESENT(h_stress))
THEN
3256 CALL cp_abort(__location__, &
3257 "No stress tensor is implemented for the implicit Poisson solver.")
3260 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3261 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3264 poisson_env%diel_rs_grid, &
3265 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3266 density, rho_core=rho_core)
3269 poisson_env%diel_rs_grid, &
3270 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3271 poisson_env%dct_pw_grid, &
3272 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3273 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3274 poisson_env%implicit_env%dct_env%dests_expand, &
3275 poisson_env%implicit_env%dct_env%srcs_expand, &
3276 poisson_env%implicit_env%dct_env%flipg_stat, &
3277 poisson_env%implicit_env%dct_env%bounds_shftd, &
3278 density, rho_core=rho_core)
3282 CALL pw_pool%create_pw(rhor)
3283 CALL pw_pool%create_pw(vhartree_rs)
3286 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3295 electric_enthalpy=ehartree)
3298 electric_enthalpy=ehartree)
3304 IF (
PRESENT(aux_density))
THEN
3309 CALL pw_pool%give_back_pw(rhor)
3310 CALL pw_pool%give_back_pw(vhartree_rs)
3313 CALL cp_abort(__location__, &
3314 "unknown poisson method "// &
3320 CALL pw_pool%create_pw(rhor)
3327 IF (
PRESENT(ehartree))
THEN
3328 IF (
PRESENT(aux_density))
THEN
3335 IF (
PRESENT(aux_density))
THEN
3342 CALL pw_pool%give_back_pw(rhor)
3346 IF (
PRESENT(aux_density))
THEN
3347 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3349 CALL calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3351 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
3353 CALL pw_pool%give_back_pw(rhog)
3354 IF (
PRESENT(aux_density))
THEN
3355 CALL pw_pool%give_back_pw(rhog_aux)
3358 CALL timestop(handle)
3360 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs
3378 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs (poisson_env, density, ehartree, vhartree, &
3379 dvhartree, h_stress, rho_core, greenfn, aux_density)
3383 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3386 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3387 OPTIONAL :: h_stress
3391 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3394 LOGICAL :: has_dielectric
3400 CALL timeset(routinen, handle)
3404 has_dielectric = poisson_env%parameters%has_dielectric
3407 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3408 pw_grid => pw_pool%pw_grid
3410 cpabort(
"vhartree has a different grid than the poisson solver")
3413 CALL pw_pool%create_pw(rhog)
3414 IF (
PRESENT(aux_density))
THEN
3415 CALL pw_pool%create_pw(rhog_aux)
3418 SELECT CASE (poisson_env%used_grid)
3421 SELECT CASE (poisson_env%green_fft%method)
3425 IF (
PRESENT(aux_density))
THEN
3428 IF (
PRESENT(greenfn))
THEN
3429 influence_fn = greenfn
3431 influence_fn = poisson_env%green_fft%influence_fn
3434 IF (
PRESENT(aux_density))
THEN
3438 IF (
PRESENT(ehartree))
THEN
3439 IF (
PRESENT(aux_density))
THEN
3447 IF (
PRESENT(h_stress))
THEN
3448 CALL cp_abort(__location__, &
3449 "No stress tensor is implemented for the implicit Poisson solver.")
3452 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3453 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3456 poisson_env%diel_rs_grid, &
3457 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3458 density, rho_core=rho_core)
3461 poisson_env%diel_rs_grid, &
3462 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3463 poisson_env%dct_pw_grid, &
3464 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3465 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3466 poisson_env%implicit_env%dct_env%dests_expand, &
3467 poisson_env%implicit_env%dct_env%srcs_expand, &
3468 poisson_env%implicit_env%dct_env%flipg_stat, &
3469 poisson_env%implicit_env%dct_env%bounds_shftd, &
3470 density, rho_core=rho_core)
3474 CALL pw_pool%create_pw(rhor)
3475 CALL pw_pool%create_pw(vhartree_rs)
3478 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3487 electric_enthalpy=ehartree)
3490 electric_enthalpy=ehartree)
3496 IF (
PRESENT(aux_density))
THEN
3501 CALL pw_pool%give_back_pw(rhor)
3502 CALL pw_pool%give_back_pw(vhartree_rs)
3505 CALL cp_abort(__location__, &
3506 "unknown poisson method "// &
3512 CALL pw_pool%create_pw(rhor)
3519 IF (
PRESENT(ehartree))
THEN
3520 IF (
PRESENT(aux_density))
THEN
3527 IF (
PRESENT(aux_density))
THEN
3534 CALL pw_pool%give_back_pw(rhor)
3538 IF (
PRESENT(aux_density))
THEN
3539 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3541 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3543 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
3545 CALL pw_pool%give_back_pw(rhog)
3546 IF (
PRESENT(aux_density))
THEN
3547 CALL pw_pool%give_back_pw(rhog_aux)
3550 CALL timestop(handle)
3552 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs
3570 SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs (poisson_env, density, ehartree, vhartree, &
3571 dvhartree, h_stress, rho_core, greenfn, aux_density)
3575 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3578 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3579 OPTIONAL :: h_stress
3583 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3586 LOGICAL :: has_dielectric
3592 CALL timeset(routinen, handle)
3596 has_dielectric = poisson_env%parameters%has_dielectric
3599 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3600 pw_grid => pw_pool%pw_grid
3602 cpabort(
"vhartree has a different grid than the poisson solver")
3605 CALL pw_pool%create_pw(rhog)
3606 IF (
PRESENT(aux_density))
THEN
3607 CALL pw_pool%create_pw(rhog_aux)
3610 SELECT CASE (poisson_env%used_grid)
3613 SELECT CASE (poisson_env%green_fft%method)
3617 IF (
PRESENT(aux_density))
THEN
3620 IF (
PRESENT(greenfn))
THEN
3621 influence_fn = greenfn
3623 influence_fn = poisson_env%green_fft%influence_fn
3626 IF (
PRESENT(aux_density))
THEN
3630 IF (
PRESENT(ehartree))
THEN
3631 IF (
PRESENT(aux_density))
THEN
3639 IF (
PRESENT(h_stress))
THEN
3640 CALL cp_abort(__location__, &
3641 "No stress tensor is implemented for the implicit Poisson solver.")
3644 IF (has_dielectric .AND.
PRESENT(rho_core))
THEN
3645 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3648 poisson_env%diel_rs_grid, &
3649 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3650 density, rho_core=rho_core)
3653 poisson_env%diel_rs_grid, &
3654 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3655 poisson_env%dct_pw_grid, &
3656 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3657 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3658 poisson_env%implicit_env%dct_env%dests_expand, &
3659 poisson_env%implicit_env%dct_env%srcs_expand, &
3660 poisson_env%implicit_env%dct_env%flipg_stat, &
3661 poisson_env%implicit_env%dct_env%bounds_shftd, &
3662 density, rho_core=rho_core)
3666 CALL pw_pool%create_pw(rhor)
3667 CALL pw_pool%create_pw(vhartree_rs)
3670 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3679 electric_enthalpy=ehartree)
3682 electric_enthalpy=ehartree)
3688 IF (
PRESENT(aux_density))
THEN
3693 CALL pw_pool%give_back_pw(rhor)
3694 CALL pw_pool%give_back_pw(vhartree_rs)
3697 CALL cp_abort(__location__, &
3698 "unknown poisson method "// &
3704 CALL pw_pool%create_pw(rhor)
3711 IF (
PRESENT(ehartree))
THEN
3712 IF (
PRESENT(aux_density))
THEN
3719 IF (
PRESENT(aux_density))
THEN
3726 CALL pw_pool%give_back_pw(rhor)
3730 IF (
PRESENT(aux_density))
THEN
3731 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree=dvhartree)
3733 CALL calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, h_stress=h_stress, dvhartree=dvhartree)
3735 CALL mt2d_hartree_stress(poisson_env, density, ehartree, h_stress, aux_density, greenfn)
3737 CALL pw_pool%give_back_pw(rhog)
3738 IF (
PRESENT(aux_density))
THEN
3739 CALL pw_pool%give_back_pw(rhog_aux)
3742 CALL timestop(handle)
3744 END SUBROUTINE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs
3755 SUBROUTINE mt2d_hartree_stress_r3d_rs (poisson_env, density, ehartree, h_stress, aux_density, greenfn)
3758 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: ehartree
3759 REAL(KIND=
dp),
INTENT(INOUT),
OPTIONAL :: h_stress(3, 3)
3763 INTEGER :: alpha, beta, ig, iz
3764 REAL(KIND=
dp) :: energy, kernel, strain(3, 3), tolerance
3769 IF (.NOT.
PRESENT(h_stress))
RETURN
3770 IF (poisson_env%used_grid /= use_gs_grid)
RETURN
3771 IF (poisson_env%green_fft%method /=
mt2d)
RETURN
3772 IF (
PRESENT(greenfn))
THEN
3773 cpabort(
"MT2D stress for a custom Green function is not implemented")
3775 iz = poisson_env%green_fft%special_dimension
3776 cpassert(iz >= 1 .AND. iz <= 3)
3779 tolerance = 64.0_dp*epsilon(1.0_dp)*maxval(abs(poisson_env%cell_hmat))
3781 IF (alpha == iz) cycle
3782 IF (abs(poisson_env%cell_hmat(alpha, iz)) > tolerance .OR. &
3783 abs(poisson_env%cell_hmat(iz, alpha)) > tolerance)
THEN
3784 cpabort(
"MT2D stress requires a Cartesian slab normal")
3787 pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3788 CALL pool%create_pw(rho_g)
3789 CALL pool%create_pw(weighted_g)
3791 IF (
PRESENT(aux_density))
THEN
3792 CALL pool%create_pw(rho_aux_g)
3795 grid => rho_g%pw_grid
3796 IF (
PRESENT(ehartree))
THEN
3799 weighted_g%array = rho_g%array*poisson_env%green_fft%influence_fn%array
3800 IF (
PRESENT(aux_density))
THEN
3808 IF (alpha == iz) cycle
3809 h_stress(alpha, alpha) = energy
3811 IF (beta == iz) cycle
3815 DO ig = 1, grid%ngpts_cut_local
3816 CALL mt2d_kernel_strain(grid%g(:, ig), iz, poisson_env%green_fft%slab_size, kernel, strain)
3817 weighted_g%array(ig) = rho_g%array(ig)*strain(alpha, beta)
3819 IF (
PRESENT(aux_density))
THEN
3820 h_stress(alpha, beta) = h_stress(alpha, beta) &
3823 h_stress(alpha, beta) = h_stress(alpha, beta) &
3826 h_stress(beta, alpha) = h_stress(alpha, beta)
3829 CALL pool%give_back_pw(rho_g)
3830 CALL pool%give_back_pw(weighted_g)
3831 IF (
PRESENT(aux_density))
CALL pool%give_back_pw(rho_aux_g)
3832 END SUBROUTINE mt2d_hartree_stress_r3d_rs
3842 SUBROUTINE mt2d_hartree_stress_c1d_gs (poisson_env, density, ehartree, h_stress, aux_density, greenfn)
3845 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: ehartree
3846 REAL(KIND=
dp),
INTENT(INOUT),
OPTIONAL :: h_stress(3, 3)
3850 INTEGER :: alpha, beta, ig, iz
3851 REAL(KIND=
dp) :: energy, kernel, strain(3, 3), tolerance
3856 IF (.NOT.
PRESENT(h_stress))
RETURN
3857 IF (poisson_env%used_grid /= use_gs_grid)
RETURN
3858 IF (poisson_env%green_fft%method /=
mt2d)
RETURN
3859 IF (
PRESENT(greenfn))
THEN
3860 cpabort(
"MT2D stress for a custom Green function is not implemented")
3862 iz = poisson_env%green_fft%special_dimension
3863 cpassert(iz >= 1 .AND. iz <= 3)
3866 tolerance = 64.0_dp*epsilon(1.0_dp)*maxval(abs(poisson_env%cell_hmat))
3868 IF (alpha == iz) cycle
3869 IF (abs(poisson_env%cell_hmat(alpha, iz)) > tolerance .OR. &
3870 abs(poisson_env%cell_hmat(iz, alpha)) > tolerance)
THEN
3871 cpabort(
"MT2D stress requires a Cartesian slab normal")
3874 pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3875 CALL pool%create_pw(rho_g)
3876 CALL pool%create_pw(weighted_g)
3878 IF (
PRESENT(aux_density))
THEN
3879 CALL pool%create_pw(rho_aux_g)
3882 grid => rho_g%pw_grid
3883 IF (
PRESENT(ehartree))
THEN
3886 weighted_g%array = rho_g%array*poisson_env%green_fft%influence_fn%array
3887 IF (
PRESENT(aux_density))
THEN
3895 IF (alpha == iz) cycle
3896 h_stress(alpha, alpha) = energy
3898 IF (beta == iz) cycle
3902 DO ig = 1, grid%ngpts_cut_local
3903 CALL mt2d_kernel_strain(grid%g(:, ig), iz, poisson_env%green_fft%slab_size, kernel, strain)
3904 weighted_g%array(ig) = rho_g%array(ig)*strain(alpha, beta)
3906 IF (
PRESENT(aux_density))
THEN
3907 h_stress(alpha, beta) = h_stress(alpha, beta) &
3910 h_stress(alpha, beta) = h_stress(alpha, beta) &
3913 h_stress(beta, alpha) = h_stress(alpha, beta)
3916 CALL pool%give_back_pw(rho_g)
3917 CALL pool%give_back_pw(weighted_g)
3918 IF (
PRESENT(aux_density))
CALL pool%give_back_pw(rho_aux_g)
3919 END SUBROUTINE mt2d_hartree_stress_c1d_gs
3921 SUBROUTINE calc_stress_and_gradient_c1d_gs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
3924 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: ehartree
3926 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3927 TYPE(
pw_c1d_gs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3929 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
3931 REAL(kind=
dp) :: ffa
3932 INTEGER :: alpha, beta, n(3), handle, i
3933 LOGICAL :: calculate_stress
3937 CALL timeset(routinen, handle)
3939 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
3942 CALL pw_pool%create_pw(dvg(i))
3947 IF (
PRESENT(rhog_aux))
THEN
3948 CALL pw_pool%create_pw(dvg_aux(i))
3949 CALL pw_copy(rhog_aux, dvg_aux(i))
3954 IF (
PRESENT(dvhartree))
THEN
3961 calculate_stress =
PRESENT(h_stress)
3962 IF (calculate_stress .AND. poisson_env%used_grid == use_gs_grid)
THEN
3965 calculate_stress = poisson_env%green_fft%method /=
mt2d
3967 IF (calculate_stress)
THEN
3968 cpassert(
PRESENT(ehartree))
3972 h_stress(alpha, alpha) = ehartree
3973 IF (
PRESENT(rhog_aux))
THEN
3975 h_stress(alpha, beta) = h_stress(alpha, beta) &
3977 h_stress(beta, alpha) = h_stress(alpha, beta)
3981 h_stress(alpha, beta) = h_stress(alpha, beta) &
3983 h_stress(beta, alpha) = h_stress(alpha, beta)
3989 SELECT CASE (poisson_env%used_grid)
3993 SELECT CASE (poisson_env%green_fft%method)
3999 alpha = poisson_env%green_fft%special_dimension
4000 h_stress(:, alpha) = 0.0_dp
4001 h_stress(alpha, :) = 0.0_dp
4006 IF ((alpha /= poisson_env%green_fft%special_dimension) .OR. &
4007 (beta /= poisson_env%green_fft%special_dimension))
THEN
4008 h_stress(alpha, beta) = 0.0_dp
4009 h_stress(beta, alpha) = 0.0_dp
4013 cpabort(
"Stress Tensor not tested for 1D systems.")
4018 CALL cp_abort(__location__, &
4019 "unknown poisson method"// &
4026 SELECT CASE (poisson_env%wavelet%method)
4031 alpha = poisson_env%wavelet%special_dimension
4032 h_stress(:, alpha) = 0.0_dp
4033 h_stress(alpha, :) = 0.0_dp
4034 cpabort(
"Stress Tensor not tested for WAVELET 2D.")
4037 cpabort(
"WAVELET 1D not implemented!")
4047 CALL pw_pool%give_back_pw(dvg(i))
4048 IF (
PRESENT(rhog_aux))
THEN
4049 CALL pw_pool%give_back_pw(dvg_aux(i))
4053 CALL timestop(handle)
4055 END SUBROUTINE calc_stress_and_gradient_c1d_gs
4056 SUBROUTINE calc_stress_and_gradient_r3d_rs (poisson_env, rhog, ehartree, rhog_aux, h_stress, dvhartree)
4059 REAL(KIND=
dp),
INTENT(IN),
OPTIONAL :: ehartree
4061 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
4062 TYPE(
pw_r3d_rs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
4064 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
4066 REAL(kind=
dp) :: ffa
4067 INTEGER :: alpha, beta, n(3), handle, i
4068 LOGICAL :: calculate_stress
4072 CALL timeset(routinen, handle)
4074 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
4077 CALL pw_pool%create_pw(dvg(i))
4082 IF (
PRESENT(rhog_aux))
THEN
4083 CALL pw_pool%create_pw(dvg_aux(i))
4084 CALL pw_copy(rhog_aux, dvg_aux(i))
4089 IF (
PRESENT(dvhartree))
THEN
4096 calculate_stress =
PRESENT(h_stress)
4097 IF (calculate_stress .AND. poisson_env%used_grid == use_gs_grid)
THEN
4100 calculate_stress = poisson_env%green_fft%method /=
mt2d
4102 IF (calculate_stress)
THEN
4103 cpassert(
PRESENT(ehartree))
4107 h_stress(alpha, alpha) = ehartree
4108 IF (
PRESENT(rhog_aux))
THEN
4110 h_stress(alpha, beta) = h_stress(alpha, beta) &
4112 h_stress(beta, alpha) = h_stress(alpha, beta)
4116 h_stress(alpha, beta) = h_stress(alpha, beta) &
4118 h_stress(beta, alpha) = h_stress(alpha, beta)
4124 SELECT CASE (poisson_env%used_grid)
4128 SELECT CASE (poisson_env%green_fft%method)
4134 alpha = poisson_env%green_fft%special_dimension
4135 h_stress(:, alpha) = 0.0_dp
4136 h_stress(alpha, :) = 0.0_dp
4141 IF ((alpha /= poisson_env%green_fft%special_dimension) .OR. &
4142 (beta /= poisson_env%green_fft%special_dimension))
THEN
4143 h_stress(alpha, beta) = 0.0_dp
4144 h_stress(beta, alpha) = 0.0_dp
4148 cpabort(
"Stress Tensor not tested for 1D systems.")
4153 CALL cp_abort(__location__, &
4154 "unknown poisson method"// &
4161 SELECT CASE (poisson_env%wavelet%method)
4166 alpha = poisson_env%wavelet%special_dimension
4167 h_stress(:, alpha) = 0.0_dp
4168 h_stress(alpha, :) = 0.0_dp
4169 cpabort(
"Stress Tensor not tested for WAVELET 2D.")
4172 cpabort(
"WAVELET 1D not implemented!")
4182 CALL pw_pool%give_back_pw(dvg(i))
4183 IF (
PRESENT(rhog_aux))
THEN
4184 CALL pw_pool%give_back_pw(dvg_aux(i))
4188 CALL timestop(handle)
4190 END SUBROUTINE calc_stress_and_gradient_r3d_rs
4213 mt_super_ref_pw_grid, dct_pw_grid, force_rebuild)
4216 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN), &
4217 OPTIONAL :: cell_hmat
4219 OPTIONAL :: parameters
4222 INTEGER,
INTENT(in),
OPTIONAL :: use_level
4223 TYPE(
pw_grid_type),
OPTIONAL,
POINTER :: mt_super_ref_pw_grid, dct_pw_grid
4224 LOGICAL,
INTENT(in),
OPTIONAL :: force_rebuild
4226 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_poisson_set'
4228 INTEGER :: handle, i
4232 CALL timeset(routinen, handle)
4234 IF (
PRESENT(parameters)) poisson_env%parameters = parameters
4236 IF (
PRESENT(cell_hmat))
THEN
4237 IF (any(poisson_env%cell_hmat /= cell_hmat))
THEN
4238 CALL pw_poisson_cleanup(poisson_env)
4240 poisson_env%cell_hmat(:, :) = cell_hmat(:, :)
4241 poisson_env%rebuild = .true.
4244 IF (
PRESENT(pw_pools))
THEN
4245 cpassert(
ASSOCIATED(pw_pools))
4247 IF (
ASSOCIATED(poisson_env%pw_pools))
THEN
4248 same =
SIZE(poisson_env%pw_pools) ==
SIZE(pw_pools)
4250 DO i = 1,
SIZE(pw_pools)
4251 IF (.NOT.
ASSOCIATED(poisson_env%pw_pools(i)%pool, &
4252 pw_pools(i)%pool)) same = .false.
4256 IF (.NOT. same)
THEN
4257 poisson_env%rebuild = .true.
4260 poisson_env%pw_pools => tmp_pools
4264 IF (
PRESENT(use_level)) poisson_env%pw_level = use_level
4266 IF (
PRESENT(dct_pw_grid))
THEN
4267 IF (
ASSOCIATED(dct_pw_grid))
THEN
4271 poisson_env%dct_pw_grid => dct_pw_grid
4274 IF (
PRESENT(mt_super_ref_pw_grid))
THEN
4275 IF (
ASSOCIATED(mt_super_ref_pw_grid))
THEN
4279 poisson_env%mt_super_ref_pw_grid => mt_super_ref_pw_grid
4282 IF (
PRESENT(force_rebuild))
THEN
4283 IF (force_rebuild) poisson_env%rebuild = .true.
4286 CALL pw_poisson_check(poisson_env)
4288 CALL timestop(handle)
4310 CHARACTER(len=*),
PARAMETER :: routinen =
'pw_func_u_convolution'
4316 CALL timeset(routinen, handle)
4318 cpassert(
ASSOCIATED(poisson_env))
4322 pw_pool => poisson_env%pw_pools(poisson_env%pw_level)%pool
4323 pw_grid => pw_pool%pw_grid
4325 CALL pw_pool%create_pw(funcg)
4326 CALL pw_pool%create_pw(ug)
4331 funcg%array(:) = funcg%array(:)*ug%array(:)
4335 CALL pw_pool%give_back_pw(funcg)
4336 CALL pw_pool%give_back_pw(ug)
4338 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
subroutine, public mt2d_kernel_strain(g, special_dimension, slab_size, kernel, strain)
MT2D Coulomb kernel and its affine strain derivative in the periodic plane.
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 ...