47 pw_transfer, pw_multiply_with
58 pw_r3d_rs_type, pw_c1d_gs_type, pw_r3d_rs_type
59 #include "../base/base_uses.f90"
64 LOGICAL,
PRIVATE,
PARAMETER :: debug_this_module = .true.
65 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_poisson_methods'
67 PUBLIC :: pw_poisson_rebuild, &
70 INTEGER,
PARAMETER :: use_rs_grid = 0, &
73 INTERFACE pw_poisson_rebuild
74 MODULE PROCEDURE pw_poisson_rebuild_nodens
75 MODULE PROCEDURE pw_poisson_rebuild_c1d_gs, pw_poisson_rebuild_r3d_rs
78 INTERFACE pw_poisson_solve
79 MODULE PROCEDURE pw_poisson_solve_nov_nodv_r3d_rs
80 MODULE PROCEDURE pw_poisson_solve_v_nodv_r3d_rs_r3d_rs
81 MODULE PROCEDURE pw_poisson_solve_v_nodv_r3d_rs_c1d_gs
82 MODULE PROCEDURE pw_poisson_solve_nov_dv_r3d_rs_r3d_rs
83 MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_r3d_rs
84 MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_r3d_rs
85 MODULE PROCEDURE pw_poisson_solve_nov_dv_r3d_rs_c1d_gs
86 MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_r3d_rs_c1d_gs
87 MODULE PROCEDURE pw_poisson_solve_v_dv_r3d_rs_c1d_gs_c1d_gs
88 MODULE PROCEDURE pw_poisson_solve_nov_nodv_c1d_gs
89 MODULE PROCEDURE pw_poisson_solve_v_nodv_c1d_gs_r3d_rs
90 MODULE PROCEDURE pw_poisson_solve_v_nodv_c1d_gs_c1d_gs
91 MODULE PROCEDURE pw_poisson_solve_nov_dv_c1d_gs_r3d_rs
92 MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_r3d_rs
93 MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_r3d_rs
94 MODULE PROCEDURE pw_poisson_solve_nov_dv_c1d_gs_c1d_gs
95 MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_r3d_rs_c1d_gs
96 MODULE PROCEDURE pw_poisson_solve_v_dv_c1d_gs_c1d_gs_c1d_gs
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)
193 TYPE(pw_poisson_type),
INTENT(INOUT) :: 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)
246 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
247 TYPE(pw_r3d_rs_type),
INTENT(IN) :: 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)
301 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
302 TYPE(pw_c1d_gs_type),
INTENT(IN) :: 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)
366 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
367 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
368 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
369 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
371 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
372 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
374 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
377 LOGICAL :: has_dielectric
378 TYPE(pw_grid_type),
POINTER :: pw_grid
379 TYPE(pw_pool_type),
POINTER :: pw_pool
380 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
381 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
383 CALL timeset(routinen, handle)
385 CALL pw_poisson_rebuild(poisson_env, density)
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)
404 CALL pw_transfer(density, rhog)
405 IF (
PRESENT(aux_density))
THEN
406 CALL pw_transfer(aux_density, rhog_aux)
408 IF (
PRESENT(ehartree))
THEN
409 CALL pw_pool%create_pw(tmpg)
410 CALL pw_copy(rhog, tmpg)
412 IF (
PRESENT(greenfn))
THEN
413 influence_fn = greenfn
415 influence_fn = poisson_env%green_fft%influence_fn
417 CALL pw_multiply_with(rhog, influence_fn)
418 IF (
PRESENT(aux_density))
THEN
419 CALL pw_multiply_with(rhog_aux, influence_fn)
421 IF (
PRESENT(ehartree))
THEN
422 IF (
PRESENT(aux_density))
THEN
423 ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
425 ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
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)
439 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
440 poisson_env%diel_rs_grid, &
441 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
442 density, rho_core=rho_core)
444 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
445 poisson_env%diel_rs_grid, &
446 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
447 poisson_env%dct_pw_grid, &
448 poisson_env%parameters%ps_implicit_params%neumann_directions, &
449 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
450 poisson_env%implicit_env%dct_env%dests_expand, &
451 poisson_env%implicit_env%dct_env%srcs_expand, &
452 poisson_env%implicit_env%dct_env%flipg_stat, &
453 poisson_env%implicit_env%dct_env%bounds_shftd, &
454 density, rho_core=rho_core)
458 CALL pw_pool%create_pw(rhor)
459 CALL pw_pool%create_pw(vhartree_rs)
460 CALL pw_transfer(density, rhor)
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
478 CALL pw_transfer(aux_density, rhor)
479 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
488 cp_to_string(poisson_env%green_fft%method))
493 CALL pw_pool%create_pw(rhor)
494 CALL pw_transfer(density, rhor)
498 IF (
PRESENT(ehartree))
THEN
499 IF (
PRESENT(aux_density))
THEN
500 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
502 ehartree = 0.5_dp*pw_integral_ab(density, rhor)
505 IF (
PRESENT(h_stress))
THEN
506 CALL pw_transfer(rhor, rhog)
507 IF (
PRESENT(aux_density))
THEN
508 CALL pw_transfer(aux_density, rhor)
512 CALL pw_transfer(rhor, rhog_aux)
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)
551 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
552 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
553 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
554 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
556 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
557 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
559 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
562 LOGICAL :: has_dielectric
563 TYPE(pw_grid_type),
POINTER :: pw_grid
564 TYPE(pw_pool_type),
POINTER :: pw_pool
565 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
566 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
568 CALL timeset(routinen, handle)
570 CALL pw_poisson_rebuild(poisson_env, density)
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)
589 CALL pw_transfer(density, rhog)
590 IF (
PRESENT(aux_density))
THEN
591 CALL pw_transfer(aux_density, rhog_aux)
593 IF (
PRESENT(ehartree))
THEN
594 CALL pw_pool%create_pw(tmpg)
595 CALL pw_copy(rhog, tmpg)
597 IF (
PRESENT(greenfn))
THEN
598 influence_fn = greenfn
600 influence_fn = poisson_env%green_fft%influence_fn
602 CALL pw_multiply_with(rhog, influence_fn)
603 IF (
PRESENT(aux_density))
THEN
604 CALL pw_multiply_with(rhog_aux, influence_fn)
606 IF (
PRESENT(ehartree))
THEN
607 IF (
PRESENT(aux_density))
THEN
608 ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
610 ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
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)
624 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
625 poisson_env%diel_rs_grid, &
626 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
627 density, rho_core=rho_core)
629 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
630 poisson_env%diel_rs_grid, &
631 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
632 poisson_env%dct_pw_grid, &
633 poisson_env%parameters%ps_implicit_params%neumann_directions, &
634 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
635 poisson_env%implicit_env%dct_env%dests_expand, &
636 poisson_env%implicit_env%dct_env%srcs_expand, &
637 poisson_env%implicit_env%dct_env%flipg_stat, &
638 poisson_env%implicit_env%dct_env%bounds_shftd, &
639 density, rho_core=rho_core)
643 CALL pw_pool%create_pw(rhor)
644 CALL pw_pool%create_pw(vhartree_rs)
645 CALL pw_transfer(density, rhor)
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
663 CALL pw_transfer(aux_density, rhor)
664 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
673 cp_to_string(poisson_env%green_fft%method))
678 CALL pw_pool%create_pw(rhor)
679 CALL pw_transfer(density, rhor)
683 IF (
PRESENT(ehartree))
THEN
684 IF (
PRESENT(aux_density))
THEN
685 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%create_pw(rhog)
686 CALL pw_transfer(rhor, rhog)
687 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
688 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%give_back_pw(rhog)
690 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%create_pw(rhog)
691 CALL pw_transfer(rhor, rhog)
692 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
693 IF (.NOT.
PRESENT(h_stress))
CALL pw_pool%give_back_pw(rhog)
696 IF (
PRESENT(h_stress))
THEN
697 CALL pw_transfer(rhor, rhog)
698 IF (
PRESENT(aux_density))
THEN
699 CALL pw_transfer(aux_density, rhor)
703 CALL pw_transfer(rhor, rhog_aux)
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)
744 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
745 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
746 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
747 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: vhartree
748 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
750 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
751 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
753 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
756 LOGICAL :: has_dielectric
757 TYPE(pw_grid_type),
POINTER :: pw_grid
758 TYPE(pw_pool_type),
POINTER :: pw_pool
759 TYPE(pw_r3d_rs_type) :: &
761 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
763 CALL timeset(routinen, handle)
765 CALL pw_poisson_rebuild(poisson_env, density)
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)
786 CALL pw_transfer(density, rhog)
787 IF (
PRESENT(aux_density))
THEN
788 CALL pw_transfer(aux_density, rhog_aux)
790 IF (
PRESENT(greenfn))
THEN
791 influence_fn = greenfn
793 influence_fn = poisson_env%green_fft%influence_fn
795 CALL pw_multiply_with(rhog, influence_fn)
796 IF (
PRESENT(aux_density))
THEN
797 CALL pw_multiply_with(rhog_aux, influence_fn)
799 CALL pw_transfer(rhog, vhartree)
800 IF (
PRESENT(ehartree))
THEN
801 IF (
PRESENT(aux_density))
THEN
802 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
804 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
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)
816 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
817 poisson_env%diel_rs_grid, &
818 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
819 density, rho_core=rho_core)
821 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
822 poisson_env%diel_rs_grid, &
823 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
824 poisson_env%dct_pw_grid, &
825 poisson_env%parameters%ps_implicit_params%neumann_directions, &
826 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
827 poisson_env%implicit_env%dct_env%dests_expand, &
828 poisson_env%implicit_env%dct_env%srcs_expand, &
829 poisson_env%implicit_env%dct_env%flipg_stat, &
830 poisson_env%implicit_env%dct_env%bounds_shftd, &
831 density, rho_core=rho_core)
835 CALL pw_pool%create_pw(rhor)
836 CALL pw_pool%create_pw(vhartree_rs)
837 CALL pw_transfer(density, rhor)
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
855 CALL pw_transfer(aux_density, rhor)
856 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
859 CALL pw_transfer(vhartree_rs, vhartree)
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 "// &
867 cp_to_string(poisson_env%green_fft%method))
872 CALL pw_pool%create_pw(rhor)
873 CALL pw_transfer(density, rhor)
877 CALL pw_transfer(rhor, vhartree)
878 IF (
PRESENT(ehartree))
THEN
879 IF (
PRESENT(aux_density))
THEN
880 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
882 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
885 IF (
PRESENT(h_stress))
THEN
886 CALL pw_transfer(rhor, rhog)
887 IF (
PRESENT(aux_density))
THEN
888 CALL pw_transfer(aux_density, rhor)
892 CALL pw_transfer(rhor, rhog_aux)
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)
932 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
933 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
934 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
935 TYPE(pw_c1d_gs_type),
INTENT(INOUT) :: vhartree
936 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
938 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
939 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
941 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
944 LOGICAL :: has_dielectric
945 TYPE(pw_grid_type),
POINTER :: pw_grid
946 TYPE(pw_pool_type),
POINTER :: pw_pool
947 TYPE(pw_r3d_rs_type) :: &
949 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
951 CALL timeset(routinen, handle)
953 CALL pw_poisson_rebuild(poisson_env, density)
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)
974 CALL pw_transfer(density, rhog)
975 IF (
PRESENT(aux_density))
THEN
976 CALL pw_transfer(aux_density, rhog_aux)
978 IF (
PRESENT(greenfn))
THEN
979 influence_fn = greenfn
981 influence_fn = poisson_env%green_fft%influence_fn
983 CALL pw_multiply_with(rhog, influence_fn)
984 IF (
PRESENT(aux_density))
THEN
985 CALL pw_multiply_with(rhog_aux, influence_fn)
987 CALL pw_transfer(rhog, vhartree)
988 IF (
PRESENT(ehartree))
THEN
989 IF (
PRESENT(aux_density))
THEN
990 CALL pw_transfer(aux_density, rhog)
991 ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
993 CALL pw_transfer(density, rhog)
994 ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
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)
1006 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1007 poisson_env%diel_rs_grid, &
1008 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1009 density, rho_core=rho_core)
1011 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1012 poisson_env%diel_rs_grid, &
1013 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1014 poisson_env%dct_pw_grid, &
1015 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1016 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1017 poisson_env%implicit_env%dct_env%dests_expand, &
1018 poisson_env%implicit_env%dct_env%srcs_expand, &
1019 poisson_env%implicit_env%dct_env%flipg_stat, &
1020 poisson_env%implicit_env%dct_env%bounds_shftd, &
1021 density, rho_core=rho_core)
1025 CALL pw_pool%create_pw(rhor)
1026 CALL pw_pool%create_pw(vhartree_rs)
1027 CALL pw_transfer(density, rhor)
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
1045 CALL pw_transfer(aux_density, rhor)
1046 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1049 CALL pw_transfer(vhartree_rs, vhartree)
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 "// &
1057 cp_to_string(poisson_env%green_fft%method))
1062 CALL pw_pool%create_pw(rhor)
1063 CALL pw_transfer(density, rhor)
1067 CALL pw_transfer(rhor, vhartree)
1068 IF (
PRESENT(ehartree))
THEN
1069 IF (
PRESENT(aux_density))
THEN
1070 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
1072 ehartree = 0.5_dp*pw_integral_ab(density, rhor)
1075 IF (
PRESENT(h_stress))
THEN
1076 CALL pw_transfer(rhor, rhog)
1077 IF (
PRESENT(aux_density))
THEN
1078 CALL pw_transfer(aux_density, rhor)
1082 CALL pw_transfer(rhor, rhog_aux)
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)
1122 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
1123 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
1124 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1125 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: vhartree
1126 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1127 OPTIONAL :: h_stress
1128 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
1129 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
1131 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1134 LOGICAL :: has_dielectric
1135 TYPE(pw_grid_type),
POINTER :: pw_grid
1136 TYPE(pw_pool_type),
POINTER :: pw_pool
1137 TYPE(pw_r3d_rs_type) :: &
1139 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
1141 CALL timeset(routinen, handle)
1143 CALL pw_poisson_rebuild(poisson_env, density)
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)
1164 CALL pw_transfer(density, rhog)
1165 IF (
PRESENT(aux_density))
THEN
1166 CALL pw_transfer(aux_density, rhog_aux)
1168 IF (
PRESENT(greenfn))
THEN
1169 influence_fn = greenfn
1171 influence_fn = poisson_env%green_fft%influence_fn
1173 CALL pw_multiply_with(rhog, influence_fn)
1174 IF (
PRESENT(aux_density))
THEN
1175 CALL pw_multiply_with(rhog_aux, influence_fn)
1177 CALL pw_transfer(rhog, vhartree)
1178 IF (
PRESENT(ehartree))
THEN
1179 IF (
PRESENT(aux_density))
THEN
1180 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
1182 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
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)
1194 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1195 poisson_env%diel_rs_grid, &
1196 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1197 density, rho_core=rho_core)
1199 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1200 poisson_env%diel_rs_grid, &
1201 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1202 poisson_env%dct_pw_grid, &
1203 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1204 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1205 poisson_env%implicit_env%dct_env%dests_expand, &
1206 poisson_env%implicit_env%dct_env%srcs_expand, &
1207 poisson_env%implicit_env%dct_env%flipg_stat, &
1208 poisson_env%implicit_env%dct_env%bounds_shftd, &
1209 density, rho_core=rho_core)
1213 CALL pw_pool%create_pw(rhor)
1214 CALL pw_pool%create_pw(vhartree_rs)
1215 CALL pw_transfer(density, rhor)
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
1233 CALL pw_transfer(aux_density, rhor)
1234 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1237 CALL pw_transfer(vhartree_rs, vhartree)
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 "// &
1245 cp_to_string(poisson_env%green_fft%method))
1250 CALL pw_pool%create_pw(rhor)
1251 CALL pw_transfer(density, rhor)
1255 CALL pw_transfer(rhor, vhartree)
1256 IF (
PRESENT(ehartree))
THEN
1257 IF (
PRESENT(aux_density))
THEN
1258 CALL pw_transfer(vhartree, rhog)
1259 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
1261 CALL pw_transfer(vhartree, rhog)
1262 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
1265 IF (
PRESENT(h_stress))
THEN
1266 CALL pw_transfer(rhor, rhog)
1267 IF (
PRESENT(aux_density))
THEN
1268 CALL pw_transfer(aux_density, rhor)
1272 CALL pw_transfer(rhor, rhog_aux)
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)
1312 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
1313 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
1314 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1315 TYPE(pw_c1d_gs_type),
INTENT(INOUT) :: vhartree
1316 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1317 OPTIONAL :: h_stress
1318 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
1319 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
1321 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1324 LOGICAL :: has_dielectric
1325 TYPE(pw_grid_type),
POINTER :: pw_grid
1326 TYPE(pw_pool_type),
POINTER :: pw_pool
1327 TYPE(pw_r3d_rs_type) :: &
1329 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
1331 CALL timeset(routinen, handle)
1333 CALL pw_poisson_rebuild(poisson_env, density)
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)
1354 CALL pw_transfer(density, rhog)
1355 IF (
PRESENT(aux_density))
THEN
1356 CALL pw_transfer(aux_density, rhog_aux)
1358 IF (
PRESENT(greenfn))
THEN
1359 influence_fn = greenfn
1361 influence_fn = poisson_env%green_fft%influence_fn
1363 CALL pw_multiply_with(rhog, influence_fn)
1364 IF (
PRESENT(aux_density))
THEN
1365 CALL pw_multiply_with(rhog_aux, influence_fn)
1367 CALL pw_transfer(rhog, vhartree)
1368 IF (
PRESENT(ehartree))
THEN
1369 IF (
PRESENT(aux_density))
THEN
1370 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
1372 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
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)
1384 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1385 poisson_env%diel_rs_grid, &
1386 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1387 density, rho_core=rho_core)
1389 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1390 poisson_env%diel_rs_grid, &
1391 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1392 poisson_env%dct_pw_grid, &
1393 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1394 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1395 poisson_env%implicit_env%dct_env%dests_expand, &
1396 poisson_env%implicit_env%dct_env%srcs_expand, &
1397 poisson_env%implicit_env%dct_env%flipg_stat, &
1398 poisson_env%implicit_env%dct_env%bounds_shftd, &
1399 density, rho_core=rho_core)
1403 CALL pw_pool%create_pw(rhor)
1404 CALL pw_pool%create_pw(vhartree_rs)
1405 CALL pw_transfer(density, rhor)
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
1423 CALL pw_transfer(aux_density, rhor)
1424 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
1427 CALL pw_transfer(vhartree_rs, vhartree)
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 "// &
1435 cp_to_string(poisson_env%green_fft%method))
1440 CALL pw_pool%create_pw(rhor)
1441 CALL pw_transfer(density, rhor)
1445 CALL pw_transfer(rhor, vhartree)
1446 IF (
PRESENT(ehartree))
THEN
1447 IF (
PRESENT(aux_density))
THEN
1448 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
1450 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
1453 IF (
PRESENT(h_stress))
THEN
1454 CALL pw_transfer(rhor, rhog)
1455 IF (
PRESENT(aux_density))
THEN
1456 CALL pw_transfer(aux_density, rhor)
1460 CALL pw_transfer(rhor, rhog_aux)
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)
1501 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
1502 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
1503 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1504 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: dvhartree
1505 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1506 OPTIONAL :: h_stress
1507 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
1508 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
1510 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1513 LOGICAL :: has_dielectric
1514 TYPE(pw_grid_type),
POINTER :: pw_grid
1515 TYPE(pw_pool_type),
POINTER :: pw_pool
1516 TYPE(pw_r3d_rs_type) :: &
1518 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
1520 CALL timeset(routinen, handle)
1522 CALL pw_poisson_rebuild(poisson_env, density)
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)
1541 CALL pw_transfer(density, rhog)
1542 IF (
PRESENT(aux_density))
THEN
1543 CALL pw_transfer(aux_density, rhog_aux)
1545 IF (
PRESENT(ehartree))
THEN
1546 CALL pw_pool%create_pw(tmpg)
1547 CALL pw_copy(rhog, tmpg)
1549 IF (
PRESENT(greenfn))
THEN
1550 influence_fn = greenfn
1552 influence_fn = poisson_env%green_fft%influence_fn
1554 CALL pw_multiply_with(rhog, influence_fn)
1555 IF (
PRESENT(aux_density))
THEN
1556 CALL pw_multiply_with(rhog_aux, influence_fn)
1557 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1559 IF (
PRESENT(ehartree))
THEN
1560 IF (
PRESENT(aux_density))
THEN
1561 ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
1563 ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
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)
1576 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1577 poisson_env%diel_rs_grid, &
1578 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1579 density, rho_core=rho_core)
1581 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1582 poisson_env%diel_rs_grid, &
1583 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1584 poisson_env%dct_pw_grid, &
1585 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1586 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1587 poisson_env%implicit_env%dct_env%dests_expand, &
1588 poisson_env%implicit_env%dct_env%srcs_expand, &
1589 poisson_env%implicit_env%dct_env%flipg_stat, &
1590 poisson_env%implicit_env%dct_env%bounds_shftd, &
1591 density, rho_core=rho_core)
1595 CALL pw_pool%create_pw(rhor)
1596 CALL pw_pool%create_pw(vhartree_rs)
1597 CALL pw_transfer(density, rhor)
1599 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1608 electric_enthalpy=ehartree)
1611 electric_enthalpy=ehartree)
1614 CALL pw_transfer(rhor, rhog)
1616 IF (
PRESENT(aux_density))
THEN
1617 CALL pw_transfer(aux_density, rhor)
1618 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
1627 cp_to_string(poisson_env%green_fft%method))
1632 CALL pw_pool%create_pw(rhor)
1633 CALL pw_transfer(density, rhor)
1637 CALL pw_transfer(rhor, rhog)
1638 IF (
PRESENT(ehartree))
THEN
1639 ehartree = 0.5_dp*pw_integral_ab(density, rhor)
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)
1678 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
1679 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
1680 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1681 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dvhartree
1682 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1683 OPTIONAL :: h_stress
1684 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
1685 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
1687 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1690 LOGICAL :: has_dielectric
1691 TYPE(pw_grid_type),
POINTER :: pw_grid
1692 TYPE(pw_pool_type),
POINTER :: pw_pool
1693 TYPE(pw_r3d_rs_type) :: &
1695 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
1697 CALL timeset(routinen, handle)
1699 CALL pw_poisson_rebuild(poisson_env, density)
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)
1718 CALL pw_transfer(density, rhog)
1719 IF (
PRESENT(aux_density))
THEN
1720 CALL pw_transfer(aux_density, rhog_aux)
1722 IF (
PRESENT(ehartree))
THEN
1723 CALL pw_pool%create_pw(tmpg)
1724 CALL pw_copy(rhog, tmpg)
1726 IF (
PRESENT(greenfn))
THEN
1727 influence_fn = greenfn
1729 influence_fn = poisson_env%green_fft%influence_fn
1731 CALL pw_multiply_with(rhog, influence_fn)
1732 IF (
PRESENT(aux_density))
THEN
1733 CALL pw_multiply_with(rhog_aux, influence_fn)
1734 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1736 IF (
PRESENT(ehartree))
THEN
1737 IF (
PRESENT(aux_density))
THEN
1738 ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
1740 ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
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)
1753 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1754 poisson_env%diel_rs_grid, &
1755 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1756 density, rho_core=rho_core)
1758 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1759 poisson_env%diel_rs_grid, &
1760 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1761 poisson_env%dct_pw_grid, &
1762 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1763 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1764 poisson_env%implicit_env%dct_env%dests_expand, &
1765 poisson_env%implicit_env%dct_env%srcs_expand, &
1766 poisson_env%implicit_env%dct_env%flipg_stat, &
1767 poisson_env%implicit_env%dct_env%bounds_shftd, &
1768 density, rho_core=rho_core)
1772 CALL pw_pool%create_pw(rhor)
1773 CALL pw_pool%create_pw(vhartree_rs)
1774 CALL pw_transfer(density, rhor)
1776 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1785 electric_enthalpy=ehartree)
1788 electric_enthalpy=ehartree)
1791 CALL pw_transfer(rhor, rhog)
1793 IF (
PRESENT(aux_density))
THEN
1794 CALL pw_transfer(aux_density, rhor)
1795 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
1804 cp_to_string(poisson_env%green_fft%method))
1809 CALL pw_pool%create_pw(rhor)
1810 CALL pw_transfer(density, rhor)
1814 CALL pw_transfer(rhor, rhog)
1815 IF (
PRESENT(ehartree))
THEN
1816 ehartree = 0.5_dp*pw_integral_ab(density, rhor)
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)
1855 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
1856 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
1857 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
1858 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: dvhartree
1859 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
1860 OPTIONAL :: h_stress
1861 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
1862 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
1864 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
1867 LOGICAL :: has_dielectric
1868 TYPE(pw_grid_type),
POINTER :: pw_grid
1869 TYPE(pw_pool_type),
POINTER :: pw_pool
1870 TYPE(pw_r3d_rs_type) :: &
1872 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
1874 CALL timeset(routinen, handle)
1876 CALL pw_poisson_rebuild(poisson_env, density)
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)
1895 CALL pw_transfer(density, rhog)
1896 IF (
PRESENT(aux_density))
THEN
1897 CALL pw_transfer(aux_density, rhog_aux)
1899 IF (
PRESENT(ehartree))
THEN
1900 CALL pw_pool%create_pw(tmpg)
1901 CALL pw_copy(rhog, tmpg)
1903 IF (
PRESENT(greenfn))
THEN
1904 influence_fn = greenfn
1906 influence_fn = poisson_env%green_fft%influence_fn
1908 CALL pw_multiply_with(rhog, influence_fn)
1909 IF (
PRESENT(aux_density))
THEN
1910 CALL pw_multiply_with(rhog_aux, influence_fn)
1911 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
1913 IF (
PRESENT(ehartree))
THEN
1914 IF (
PRESENT(aux_density))
THEN
1915 ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
1917 ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
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)
1930 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1931 poisson_env%diel_rs_grid, &
1932 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1933 density, rho_core=rho_core)
1935 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
1936 poisson_env%diel_rs_grid, &
1937 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
1938 poisson_env%dct_pw_grid, &
1939 poisson_env%parameters%ps_implicit_params%neumann_directions, &
1940 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
1941 poisson_env%implicit_env%dct_env%dests_expand, &
1942 poisson_env%implicit_env%dct_env%srcs_expand, &
1943 poisson_env%implicit_env%dct_env%flipg_stat, &
1944 poisson_env%implicit_env%dct_env%bounds_shftd, &
1945 density, rho_core=rho_core)
1949 CALL pw_pool%create_pw(rhor)
1950 CALL pw_pool%create_pw(vhartree_rs)
1951 CALL pw_transfer(density, rhor)
1953 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
1962 electric_enthalpy=ehartree)
1965 electric_enthalpy=ehartree)
1968 CALL pw_transfer(rhor, rhog)
1970 IF (
PRESENT(aux_density))
THEN
1971 CALL pw_transfer(aux_density, rhor)
1972 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
1981 cp_to_string(poisson_env%green_fft%method))
1986 CALL pw_pool%create_pw(rhor)
1987 CALL pw_transfer(density, rhor)
1991 CALL pw_transfer(rhor, rhog)
1992 IF (
PRESENT(ehartree))
THEN
1993 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
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)
2032 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
2033 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
2034 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2035 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dvhartree
2036 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2037 OPTIONAL :: h_stress
2038 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
2039 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
2041 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2044 LOGICAL :: has_dielectric
2045 TYPE(pw_grid_type),
POINTER :: pw_grid
2046 TYPE(pw_pool_type),
POINTER :: pw_pool
2047 TYPE(pw_r3d_rs_type) :: &
2049 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux, tmpg
2051 CALL timeset(routinen, handle)
2053 CALL pw_poisson_rebuild(poisson_env, density)
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)
2072 CALL pw_transfer(density, rhog)
2073 IF (
PRESENT(aux_density))
THEN
2074 CALL pw_transfer(aux_density, rhog_aux)
2076 IF (
PRESENT(ehartree))
THEN
2077 CALL pw_pool%create_pw(tmpg)
2078 CALL pw_copy(rhog, tmpg)
2080 IF (
PRESENT(greenfn))
THEN
2081 influence_fn = greenfn
2083 influence_fn = poisson_env%green_fft%influence_fn
2085 CALL pw_multiply_with(rhog, influence_fn)
2086 IF (
PRESENT(aux_density))
THEN
2087 CALL pw_multiply_with(rhog_aux, influence_fn)
2088 rhog_aux%array(:) = rhog_aux%array(:)*influence_fn%array(:)
2090 IF (
PRESENT(ehartree))
THEN
2091 IF (
PRESENT(aux_density))
THEN
2092 ehartree = 0.5_dp*pw_integral_ab(rhog_aux, tmpg)
2094 ehartree = 0.5_dp*pw_integral_ab(rhog, tmpg)
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)
2107 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2108 poisson_env%diel_rs_grid, &
2109 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2110 density, rho_core=rho_core)
2112 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2113 poisson_env%diel_rs_grid, &
2114 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2115 poisson_env%dct_pw_grid, &
2116 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2117 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2118 poisson_env%implicit_env%dct_env%dests_expand, &
2119 poisson_env%implicit_env%dct_env%srcs_expand, &
2120 poisson_env%implicit_env%dct_env%flipg_stat, &
2121 poisson_env%implicit_env%dct_env%bounds_shftd, &
2122 density, rho_core=rho_core)
2126 CALL pw_pool%create_pw(rhor)
2127 CALL pw_pool%create_pw(vhartree_rs)
2128 CALL pw_transfer(density, rhor)
2130 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2139 electric_enthalpy=ehartree)
2142 electric_enthalpy=ehartree)
2145 CALL pw_transfer(rhor, rhog)
2147 IF (
PRESENT(aux_density))
THEN
2148 CALL pw_transfer(aux_density, rhor)
2149 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
2158 cp_to_string(poisson_env%green_fft%method))
2163 CALL pw_pool%create_pw(rhor)
2164 CALL pw_transfer(density, rhor)
2168 CALL pw_transfer(rhor, rhog)
2169 IF (
PRESENT(ehartree))
THEN
2170 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
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)
2211 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
2212 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
2213 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2214 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: vhartree
2215 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: dvhartree
2216 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2217 OPTIONAL :: h_stress
2218 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
2219 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
2221 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2224 LOGICAL :: has_dielectric
2225 TYPE(pw_grid_type),
POINTER :: pw_grid
2226 TYPE(pw_pool_type),
POINTER :: pw_pool
2227 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2228 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2230 CALL timeset(routinen, handle)
2232 CALL pw_poisson_rebuild(poisson_env, density)
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)
2253 CALL pw_transfer(density, rhog)
2254 IF (
PRESENT(aux_density))
THEN
2255 CALL pw_transfer(aux_density, rhog_aux)
2257 IF (
PRESENT(greenfn))
THEN
2258 influence_fn = greenfn
2260 influence_fn = poisson_env%green_fft%influence_fn
2262 CALL pw_multiply_with(rhog, influence_fn)
2263 IF (
PRESENT(aux_density))
THEN
2264 CALL pw_multiply_with(rhog_aux, influence_fn)
2266 CALL pw_transfer(rhog, vhartree)
2267 IF (
PRESENT(ehartree))
THEN
2268 IF (
PRESENT(aux_density))
THEN
2269 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2271 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
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)
2284 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2285 poisson_env%diel_rs_grid, &
2286 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2287 density, rho_core=rho_core)
2289 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2290 poisson_env%diel_rs_grid, &
2291 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2292 poisson_env%dct_pw_grid, &
2293 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2294 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2295 poisson_env%implicit_env%dct_env%dests_expand, &
2296 poisson_env%implicit_env%dct_env%srcs_expand, &
2297 poisson_env%implicit_env%dct_env%flipg_stat, &
2298 poisson_env%implicit_env%dct_env%bounds_shftd, &
2299 density, rho_core=rho_core)
2303 CALL pw_pool%create_pw(rhor)
2304 CALL pw_pool%create_pw(vhartree_rs)
2305 CALL pw_transfer(density, rhor)
2307 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2316 electric_enthalpy=ehartree)
2319 electric_enthalpy=ehartree)
2322 CALL pw_transfer(vhartree_rs, vhartree)
2323 CALL pw_transfer(rhor, rhog)
2325 IF (
PRESENT(aux_density))
THEN
2326 CALL pw_transfer(aux_density, rhor)
2327 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
2336 cp_to_string(poisson_env%green_fft%method))
2341 CALL pw_pool%create_pw(rhor)
2342 CALL pw_transfer(density, rhor)
2346 CALL pw_transfer(rhor, vhartree)
2347 CALL pw_transfer(rhor, rhog)
2348 IF (
PRESENT(ehartree))
THEN
2349 IF (
PRESENT(aux_density))
THEN
2350 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2352 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
2355 CALL pw_transfer(rhor, rhog)
2356 IF (
PRESENT(aux_density))
THEN
2357 CALL pw_transfer(aux_density, rhor)
2361 CALL pw_transfer(rhor, rhog_aux)
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)
2401 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
2402 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
2403 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2404 TYPE(pw_c1d_gs_type),
INTENT(INOUT) :: vhartree
2405 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: dvhartree
2406 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2407 OPTIONAL :: h_stress
2408 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
2409 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
2411 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2414 LOGICAL :: has_dielectric
2415 TYPE(pw_grid_type),
POINTER :: pw_grid
2416 TYPE(pw_pool_type),
POINTER :: pw_pool
2417 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2418 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2420 CALL timeset(routinen, handle)
2422 CALL pw_poisson_rebuild(poisson_env, density)
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)
2443 CALL pw_transfer(density, rhog)
2444 IF (
PRESENT(aux_density))
THEN
2445 CALL pw_transfer(aux_density, rhog_aux)
2447 IF (
PRESENT(greenfn))
THEN
2448 influence_fn = greenfn
2450 influence_fn = poisson_env%green_fft%influence_fn
2452 CALL pw_multiply_with(rhog, influence_fn)
2453 IF (
PRESENT(aux_density))
THEN
2454 CALL pw_multiply_with(rhog_aux, influence_fn)
2456 CALL pw_transfer(rhog, vhartree)
2457 IF (
PRESENT(ehartree))
THEN
2458 IF (
PRESENT(aux_density))
THEN
2459 CALL pw_transfer(aux_density, rhog)
2460 ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
2462 CALL pw_transfer(density, rhog)
2463 ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
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)
2476 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2477 poisson_env%diel_rs_grid, &
2478 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2479 density, rho_core=rho_core)
2481 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2482 poisson_env%diel_rs_grid, &
2483 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2484 poisson_env%dct_pw_grid, &
2485 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2486 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2487 poisson_env%implicit_env%dct_env%dests_expand, &
2488 poisson_env%implicit_env%dct_env%srcs_expand, &
2489 poisson_env%implicit_env%dct_env%flipg_stat, &
2490 poisson_env%implicit_env%dct_env%bounds_shftd, &
2491 density, rho_core=rho_core)
2495 CALL pw_pool%create_pw(rhor)
2496 CALL pw_pool%create_pw(vhartree_rs)
2497 CALL pw_transfer(density, rhor)
2499 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2508 electric_enthalpy=ehartree)
2511 electric_enthalpy=ehartree)
2514 CALL pw_transfer(vhartree_rs, vhartree)
2515 CALL pw_transfer(rhor, rhog)
2517 IF (
PRESENT(aux_density))
THEN
2518 CALL pw_transfer(aux_density, rhor)
2519 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
2528 cp_to_string(poisson_env%green_fft%method))
2533 CALL pw_pool%create_pw(rhor)
2534 CALL pw_transfer(density, rhor)
2538 CALL pw_transfer(rhor, vhartree)
2539 CALL pw_transfer(rhor, rhog)
2540 IF (
PRESENT(ehartree))
THEN
2541 IF (
PRESENT(aux_density))
THEN
2542 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
2544 ehartree = 0.5_dp*pw_integral_ab(density, rhor)
2547 CALL pw_transfer(rhor, rhog)
2548 IF (
PRESENT(aux_density))
THEN
2549 CALL pw_transfer(aux_density, rhor)
2553 CALL pw_transfer(rhor, rhog_aux)
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)
2593 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
2594 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
2595 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2596 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: vhartree
2597 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dvhartree
2598 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2599 OPTIONAL :: h_stress
2600 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
2601 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
2603 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2606 LOGICAL :: has_dielectric
2607 TYPE(pw_grid_type),
POINTER :: pw_grid
2608 TYPE(pw_pool_type),
POINTER :: pw_pool
2609 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2610 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2612 CALL timeset(routinen, handle)
2614 CALL pw_poisson_rebuild(poisson_env, density)
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)
2635 CALL pw_transfer(density, rhog)
2636 IF (
PRESENT(aux_density))
THEN
2637 CALL pw_transfer(aux_density, rhog_aux)
2639 IF (
PRESENT(greenfn))
THEN
2640 influence_fn = greenfn
2642 influence_fn = poisson_env%green_fft%influence_fn
2644 CALL pw_multiply_with(rhog, influence_fn)
2645 IF (
PRESENT(aux_density))
THEN
2646 CALL pw_multiply_with(rhog_aux, influence_fn)
2648 CALL pw_transfer(rhog, vhartree)
2649 IF (
PRESENT(ehartree))
THEN
2650 IF (
PRESENT(aux_density))
THEN
2651 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2653 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
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)
2666 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2667 poisson_env%diel_rs_grid, &
2668 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2669 density, rho_core=rho_core)
2671 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2672 poisson_env%diel_rs_grid, &
2673 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2674 poisson_env%dct_pw_grid, &
2675 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2676 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2677 poisson_env%implicit_env%dct_env%dests_expand, &
2678 poisson_env%implicit_env%dct_env%srcs_expand, &
2679 poisson_env%implicit_env%dct_env%flipg_stat, &
2680 poisson_env%implicit_env%dct_env%bounds_shftd, &
2681 density, rho_core=rho_core)
2685 CALL pw_pool%create_pw(rhor)
2686 CALL pw_pool%create_pw(vhartree_rs)
2687 CALL pw_transfer(density, rhor)
2689 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2698 electric_enthalpy=ehartree)
2701 electric_enthalpy=ehartree)
2704 CALL pw_transfer(vhartree_rs, vhartree)
2705 CALL pw_transfer(rhor, rhog)
2707 IF (
PRESENT(aux_density))
THEN
2708 CALL pw_transfer(aux_density, rhor)
2709 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
2718 cp_to_string(poisson_env%green_fft%method))
2723 CALL pw_pool%create_pw(rhor)
2724 CALL pw_transfer(density, rhor)
2728 CALL pw_transfer(rhor, vhartree)
2729 CALL pw_transfer(rhor, rhog)
2730 IF (
PRESENT(ehartree))
THEN
2731 IF (
PRESENT(aux_density))
THEN
2732 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
2734 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
2737 CALL pw_transfer(rhor, rhog)
2738 IF (
PRESENT(aux_density))
THEN
2739 CALL pw_transfer(aux_density, rhor)
2743 CALL pw_transfer(rhor, rhog_aux)
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)
2783 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
2784 TYPE(pw_r3d_rs_type),
INTENT(IN) :: density
2785 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2786 TYPE(pw_c1d_gs_type),
INTENT(INOUT) :: vhartree
2787 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dvhartree
2788 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2789 OPTIONAL :: h_stress
2790 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
2791 TYPE(pw_r3d_rs_type),
INTENT(IN),
OPTIONAL :: aux_density
2793 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2796 LOGICAL :: has_dielectric
2797 TYPE(pw_grid_type),
POINTER :: pw_grid
2798 TYPE(pw_pool_type),
POINTER :: pw_pool
2799 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2800 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2802 CALL timeset(routinen, handle)
2804 CALL pw_poisson_rebuild(poisson_env, density)
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)
2825 CALL pw_transfer(density, rhog)
2826 IF (
PRESENT(aux_density))
THEN
2827 CALL pw_transfer(aux_density, rhog_aux)
2829 IF (
PRESENT(greenfn))
THEN
2830 influence_fn = greenfn
2832 influence_fn = poisson_env%green_fft%influence_fn
2834 CALL pw_multiply_with(rhog, influence_fn)
2835 IF (
PRESENT(aux_density))
THEN
2836 CALL pw_multiply_with(rhog_aux, influence_fn)
2838 CALL pw_transfer(rhog, vhartree)
2839 IF (
PRESENT(ehartree))
THEN
2840 IF (
PRESENT(aux_density))
THEN
2841 CALL pw_transfer(aux_density, rhog)
2842 ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
2844 CALL pw_transfer(density, rhog)
2845 ehartree = 0.5_dp*pw_integral_ab(rhog, vhartree)
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)
2858 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2859 poisson_env%diel_rs_grid, &
2860 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2861 density, rho_core=rho_core)
2863 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
2864 poisson_env%diel_rs_grid, &
2865 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
2866 poisson_env%dct_pw_grid, &
2867 poisson_env%parameters%ps_implicit_params%neumann_directions, &
2868 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
2869 poisson_env%implicit_env%dct_env%dests_expand, &
2870 poisson_env%implicit_env%dct_env%srcs_expand, &
2871 poisson_env%implicit_env%dct_env%flipg_stat, &
2872 poisson_env%implicit_env%dct_env%bounds_shftd, &
2873 density, rho_core=rho_core)
2877 CALL pw_pool%create_pw(rhor)
2878 CALL pw_pool%create_pw(vhartree_rs)
2879 CALL pw_transfer(density, rhor)
2881 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
2890 electric_enthalpy=ehartree)
2893 electric_enthalpy=ehartree)
2896 CALL pw_transfer(vhartree_rs, vhartree)
2897 CALL pw_transfer(rhor, rhog)
2899 IF (
PRESENT(aux_density))
THEN
2900 CALL pw_transfer(aux_density, rhor)
2901 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
2910 cp_to_string(poisson_env%green_fft%method))
2915 CALL pw_pool%create_pw(rhor)
2916 CALL pw_transfer(density, rhor)
2920 CALL pw_transfer(rhor, vhartree)
2921 CALL pw_transfer(rhor, rhog)
2922 IF (
PRESENT(ehartree))
THEN
2923 IF (
PRESENT(aux_density))
THEN
2924 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhor)
2926 ehartree = 0.5_dp*pw_integral_ab(density, rhor)
2929 CALL pw_transfer(rhor, rhog)
2930 IF (
PRESENT(aux_density))
THEN
2931 CALL pw_transfer(aux_density, rhor)
2935 CALL pw_transfer(rhor, rhog_aux)
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)
2975 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
2976 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
2977 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
2978 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: vhartree
2979 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: dvhartree
2980 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
2981 OPTIONAL :: h_stress
2982 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
2983 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
2985 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
2988 LOGICAL :: has_dielectric
2989 TYPE(pw_grid_type),
POINTER :: pw_grid
2990 TYPE(pw_pool_type),
POINTER :: pw_pool
2991 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
2992 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
2994 CALL timeset(routinen, handle)
2996 CALL pw_poisson_rebuild(poisson_env, density)
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)
3017 CALL pw_transfer(density, rhog)
3018 IF (
PRESENT(aux_density))
THEN
3019 CALL pw_transfer(aux_density, rhog_aux)
3021 IF (
PRESENT(greenfn))
THEN
3022 influence_fn = greenfn
3024 influence_fn = poisson_env%green_fft%influence_fn
3026 CALL pw_multiply_with(rhog, influence_fn)
3027 IF (
PRESENT(aux_density))
THEN
3028 CALL pw_multiply_with(rhog_aux, influence_fn)
3030 CALL pw_transfer(rhog, vhartree)
3031 IF (
PRESENT(ehartree))
THEN
3032 IF (
PRESENT(aux_density))
THEN
3033 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3035 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
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)
3048 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3049 poisson_env%diel_rs_grid, &
3050 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3051 density, rho_core=rho_core)
3053 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3054 poisson_env%diel_rs_grid, &
3055 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3056 poisson_env%dct_pw_grid, &
3057 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3058 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3059 poisson_env%implicit_env%dct_env%dests_expand, &
3060 poisson_env%implicit_env%dct_env%srcs_expand, &
3061 poisson_env%implicit_env%dct_env%flipg_stat, &
3062 poisson_env%implicit_env%dct_env%bounds_shftd, &
3063 density, rho_core=rho_core)
3067 CALL pw_pool%create_pw(rhor)
3068 CALL pw_pool%create_pw(vhartree_rs)
3069 CALL pw_transfer(density, rhor)
3071 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3080 electric_enthalpy=ehartree)
3083 electric_enthalpy=ehartree)
3086 CALL pw_transfer(vhartree_rs, vhartree)
3087 CALL pw_transfer(rhor, rhog)
3089 IF (
PRESENT(aux_density))
THEN
3090 CALL pw_transfer(aux_density, rhor)
3091 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
3100 cp_to_string(poisson_env%green_fft%method))
3105 CALL pw_pool%create_pw(rhor)
3106 CALL pw_transfer(density, rhor)
3110 CALL pw_transfer(rhor, vhartree)
3111 CALL pw_transfer(rhor, rhog)
3112 IF (
PRESENT(ehartree))
THEN
3113 IF (
PRESENT(aux_density))
THEN
3114 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3116 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
3119 CALL pw_transfer(rhor, rhog)
3120 IF (
PRESENT(aux_density))
THEN
3121 CALL pw_transfer(aux_density, rhor)
3125 CALL pw_transfer(rhor, rhog_aux)
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)
3165 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
3166 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
3167 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3168 TYPE(pw_c1d_gs_type),
INTENT(INOUT) :: vhartree
3169 TYPE(pw_r3d_rs_type),
DIMENSION(3) :: dvhartree
3170 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3171 OPTIONAL :: h_stress
3172 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
3173 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
3175 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3178 LOGICAL :: has_dielectric
3179 TYPE(pw_grid_type),
POINTER :: pw_grid
3180 TYPE(pw_pool_type),
POINTER :: pw_pool
3181 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
3182 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
3184 CALL timeset(routinen, handle)
3186 CALL pw_poisson_rebuild(poisson_env, density)
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)
3207 CALL pw_transfer(density, rhog)
3208 IF (
PRESENT(aux_density))
THEN
3209 CALL pw_transfer(aux_density, rhog_aux)
3211 IF (
PRESENT(greenfn))
THEN
3212 influence_fn = greenfn
3214 influence_fn = poisson_env%green_fft%influence_fn
3216 CALL pw_multiply_with(rhog, influence_fn)
3217 IF (
PRESENT(aux_density))
THEN
3218 CALL pw_multiply_with(rhog_aux, influence_fn)
3220 CALL pw_transfer(rhog, vhartree)
3221 IF (
PRESENT(ehartree))
THEN
3222 IF (
PRESENT(aux_density))
THEN
3223 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3225 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
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)
3238 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3239 poisson_env%diel_rs_grid, &
3240 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3241 density, rho_core=rho_core)
3243 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3244 poisson_env%diel_rs_grid, &
3245 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3246 poisson_env%dct_pw_grid, &
3247 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3248 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3249 poisson_env%implicit_env%dct_env%dests_expand, &
3250 poisson_env%implicit_env%dct_env%srcs_expand, &
3251 poisson_env%implicit_env%dct_env%flipg_stat, &
3252 poisson_env%implicit_env%dct_env%bounds_shftd, &
3253 density, rho_core=rho_core)
3257 CALL pw_pool%create_pw(rhor)
3258 CALL pw_pool%create_pw(vhartree_rs)
3259 CALL pw_transfer(density, rhor)
3261 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3270 electric_enthalpy=ehartree)
3273 electric_enthalpy=ehartree)
3276 CALL pw_transfer(vhartree_rs, vhartree)
3277 CALL pw_transfer(rhor, rhog)
3279 IF (
PRESENT(aux_density))
THEN
3280 CALL pw_transfer(aux_density, rhor)
3281 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
3290 cp_to_string(poisson_env%green_fft%method))
3295 CALL pw_pool%create_pw(rhor)
3296 CALL pw_transfer(density, rhor)
3300 CALL pw_transfer(rhor, vhartree)
3301 CALL pw_transfer(rhor, rhog)
3302 IF (
PRESENT(ehartree))
THEN
3303 IF (
PRESENT(aux_density))
THEN
3304 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3306 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
3309 CALL pw_transfer(rhor, rhog)
3310 IF (
PRESENT(aux_density))
THEN
3311 CALL pw_transfer(aux_density, rhor)
3315 CALL pw_transfer(rhor, rhog_aux)
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)
3355 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
3356 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
3357 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3358 TYPE(pw_r3d_rs_type),
INTENT(INOUT) :: vhartree
3359 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dvhartree
3360 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3361 OPTIONAL :: h_stress
3362 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
3363 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
3365 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3368 LOGICAL :: has_dielectric
3369 TYPE(pw_grid_type),
POINTER :: pw_grid
3370 TYPE(pw_pool_type),
POINTER :: pw_pool
3371 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
3372 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
3374 CALL timeset(routinen, handle)
3376 CALL pw_poisson_rebuild(poisson_env, density)
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)
3397 CALL pw_transfer(density, rhog)
3398 IF (
PRESENT(aux_density))
THEN
3399 CALL pw_transfer(aux_density, rhog_aux)
3401 IF (
PRESENT(greenfn))
THEN
3402 influence_fn = greenfn
3404 influence_fn = poisson_env%green_fft%influence_fn
3406 CALL pw_multiply_with(rhog, influence_fn)
3407 IF (
PRESENT(aux_density))
THEN
3408 CALL pw_multiply_with(rhog_aux, influence_fn)
3410 CALL pw_transfer(rhog, vhartree)
3411 IF (
PRESENT(ehartree))
THEN
3412 IF (
PRESENT(aux_density))
THEN
3413 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3415 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
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)
3428 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3429 poisson_env%diel_rs_grid, &
3430 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3431 density, rho_core=rho_core)
3433 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3434 poisson_env%diel_rs_grid, &
3435 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3436 poisson_env%dct_pw_grid, &
3437 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3438 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3439 poisson_env%implicit_env%dct_env%dests_expand, &
3440 poisson_env%implicit_env%dct_env%srcs_expand, &
3441 poisson_env%implicit_env%dct_env%flipg_stat, &
3442 poisson_env%implicit_env%dct_env%bounds_shftd, &
3443 density, rho_core=rho_core)
3447 CALL pw_pool%create_pw(rhor)
3448 CALL pw_pool%create_pw(vhartree_rs)
3449 CALL pw_transfer(density, rhor)
3451 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3460 electric_enthalpy=ehartree)
3463 electric_enthalpy=ehartree)
3466 CALL pw_transfer(vhartree_rs, vhartree)
3467 CALL pw_transfer(rhor, rhog)
3469 IF (
PRESENT(aux_density))
THEN
3470 CALL pw_transfer(aux_density, rhor)
3471 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
3480 cp_to_string(poisson_env%green_fft%method))
3485 CALL pw_pool%create_pw(rhor)
3486 CALL pw_transfer(density, rhor)
3490 CALL pw_transfer(rhor, vhartree)
3491 CALL pw_transfer(rhor, rhog)
3492 IF (
PRESENT(ehartree))
THEN
3493 IF (
PRESENT(aux_density))
THEN
3494 ehartree = 0.5_dp*pw_integral_ab(aux_density, rhog)
3496 ehartree = 0.5_dp*pw_integral_ab(density, rhog)
3499 CALL pw_transfer(rhor, rhog)
3500 IF (
PRESENT(aux_density))
THEN
3501 CALL pw_transfer(aux_density, rhor)
3505 CALL pw_transfer(rhor, rhog_aux)
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)
3545 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
3546 TYPE(pw_c1d_gs_type),
INTENT(IN) :: density
3547 REAL(kind=
dp),
INTENT(out),
OPTIONAL :: ehartree
3548 TYPE(pw_c1d_gs_type),
INTENT(INOUT) :: vhartree
3549 TYPE(pw_c1d_gs_type),
DIMENSION(3) :: dvhartree
3550 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT), &
3551 OPTIONAL :: h_stress
3552 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rho_core, greenfn
3553 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: aux_density
3555 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_solve'
3558 LOGICAL :: has_dielectric
3559 TYPE(pw_grid_type),
POINTER :: pw_grid
3560 TYPE(pw_pool_type),
POINTER :: pw_pool
3561 TYPE(pw_r3d_rs_type) :: rhor, vhartree_rs
3562 TYPE(pw_c1d_gs_type) :: influence_fn, rhog, rhog_aux
3564 CALL timeset(routinen, handle)
3566 CALL pw_poisson_rebuild(poisson_env, density)
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)
3587 CALL pw_transfer(density, rhog)
3588 IF (
PRESENT(aux_density))
THEN
3589 CALL pw_transfer(aux_density, rhog_aux)
3591 IF (
PRESENT(greenfn))
THEN
3592 influence_fn = greenfn
3594 influence_fn = poisson_env%green_fft%influence_fn
3596 CALL pw_multiply_with(rhog, influence_fn)
3597 IF (
PRESENT(aux_density))
THEN
3598 CALL pw_multiply_with(rhog_aux, influence_fn)
3600 CALL pw_transfer(rhog, vhartree)
3601 IF (
PRESENT(ehartree))
THEN
3602 IF (
PRESENT(aux_density))
THEN
3603 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3605 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
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)
3618 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3619 poisson_env%diel_rs_grid, &
3620 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3621 density, rho_core=rho_core)
3623 CALL dielectric_compute(poisson_env%implicit_env%dielectric, &
3624 poisson_env%diel_rs_grid, &
3625 poisson_env%pw_pools(poisson_env%pw_level)%pool, &
3626 poisson_env%dct_pw_grid, &
3627 poisson_env%parameters%ps_implicit_params%neumann_directions, &
3628 poisson_env%implicit_env%dct_env%recv_msgs_bnds, &
3629 poisson_env%implicit_env%dct_env%dests_expand, &
3630 poisson_env%implicit_env%dct_env%srcs_expand, &
3631 poisson_env%implicit_env%dct_env%flipg_stat, &
3632 poisson_env%implicit_env%dct_env%bounds_shftd, &
3633 density, rho_core=rho_core)
3637 CALL pw_pool%create_pw(rhor)
3638 CALL pw_pool%create_pw(vhartree_rs)
3639 CALL pw_transfer(density, rhor)
3641 SELECT CASE (poisson_env%parameters%ps_implicit_params%boundary_condition)
3650 electric_enthalpy=ehartree)
3653 electric_enthalpy=ehartree)
3656 CALL pw_transfer(vhartree_rs, vhartree)
3657 CALL pw_transfer(rhor, rhog)
3659 IF (
PRESENT(aux_density))
THEN
3660 CALL pw_transfer(aux_density, rhor)
3661 ehartree = 0.5_dp*pw_integral_ab(rhor, vhartree_rs)
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 "// &
3670 cp_to_string(poisson_env%green_fft%method))
3675 CALL pw_pool%create_pw(rhor)
3676 CALL pw_transfer(density, rhor)
3680 CALL pw_transfer(rhor, vhartree)
3681 CALL pw_transfer(rhor, rhog)
3682 IF (
PRESENT(ehartree))
THEN
3683 IF (
PRESENT(aux_density))
THEN
3684 ehartree = 0.5_dp*pw_integral_ab(aux_density, vhartree)
3686 ehartree = 0.5_dp*pw_integral_ab(density, vhartree)
3689 CALL pw_transfer(rhor, rhog)
3690 IF (
PRESENT(aux_density))
THEN
3691 CALL pw_transfer(aux_density, rhor)
3695 CALL pw_transfer(rhor, rhog_aux)
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)
3717 TYPE(pw_poisson_type),
INTENT(IN) :: poisson_env
3718 TYPE(pw_c1d_gs_type),
INTENT(IN) :: rhog
3719 REAL(KIND=
dp) :: ehartree
3720 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rhog_aux
3721 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3722 TYPE(pw_c1d_gs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3724 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_set'
3726 REAL(KIND=
dp) :: ffa
3727 INTEGER :: alpha, beta, n(3), handle, i
3728 TYPE(pw_c1d_gs_type) :: dvg(3), dvg_aux(3)
3729 TYPE(pw_pool_type),
POINTER :: pw_pool
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))
3739 CALL pw_copy(rhog, 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
3750 CALL pw_transfer(dvg(i), dvhartree(i))
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) &
3763 + ffa*pw_integral_ab(dvg_aux(alpha), dvg(beta))
3764 h_stress(beta, alpha) = h_stress(alpha, beta)
3768 h_stress(alpha, beta) = h_stress(alpha, beta) &
3769 + ffa*pw_integral_ab(dvg(alpha), dvg(beta))
3770 h_stress(beta, alpha) = h_stress(alpha, beta)
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"// &
3807 cp_to_string(poisson_env%green_fft%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)
3844 TYPE(pw_poisson_type),
INTENT(IN) :: poisson_env
3845 TYPE(pw_c1d_gs_type),
INTENT(IN) :: rhog
3846 REAL(KIND=
dp) :: ehartree
3847 TYPE(pw_c1d_gs_type),
INTENT(IN),
OPTIONAL :: rhog_aux
3848 REAL(KIND=
dp),
DIMENSION(3, 3),
INTENT(OUT),
OPTIONAL :: h_stress
3849 TYPE(pw_r3d_rs_type),
DIMENSION(3),
INTENT(INOUT),
OPTIONAL :: dvhartree
3851 CHARACTER(len=*),
PARAMETER :: routineN =
'pw_poisson_set'
3853 REAL(KIND=
dp) :: ffa
3854 INTEGER :: alpha, beta, n(3), handle, i
3855 TYPE(pw_c1d_gs_type) :: dvg(3), dvg_aux(3)
3856 TYPE(pw_pool_type),
POINTER :: pw_pool
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))
3866 CALL pw_copy(rhog, 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
3877 CALL pw_transfer(dvg(i), dvhartree(i))
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) &
3890 + ffa*pw_integral_ab(dvg_aux(alpha), dvg(beta))
3891 h_stress(beta, alpha) = h_stress(alpha, beta)
3895 h_stress(alpha, beta) = h_stress(alpha, beta) &
3896 + ffa*pw_integral_ab(dvg(alpha), dvg(beta))
3897 h_stress(beta, alpha) = h_stress(alpha, beta)
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"// &
3934 cp_to_string(poisson_env%green_fft%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)
3994 TYPE(pw_poisson_type),
INTENT(INOUT) :: poisson_env
3995 REAL(kind=
dp),
DIMENSION(3, 3),
INTENT(IN), &
3996 OPTIONAL :: cell_hmat
3997 TYPE(pw_poisson_parameter_type),
INTENT(IN), &
3998 OPTIONAL :: parameters
3999 TYPE(pw_pool_p_type),
DIMENSION(:),
OPTIONAL, &
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
4009 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: tmp_pools
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