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