39#include "./base/base_uses.f90"
44 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_poisson_read_input'
66 NULLIFY (mt_section, wavelet_section)
73 SELECT CASE (params%solver)
76 CALL decode_periodic_green(periodic, params)
78 CALL decode_periodic_wavelet(periodic, params)
97 CALL ps_implicit_read_parameters(poisson_section, params)
107 SUBROUTINE decode_periodic_green(periodic, params)
108 INTEGER,
INTENT(IN) :: periodic
111 SELECT CASE (periodic)
113 params%periodic = [1, 0, 0]
115 params%periodic = [0, 1, 0]
117 params%periodic = [0, 0, 1]
119 params%periodic = [1, 1, 0]
121 params%periodic = [1, 0, 1]
123 params%periodic = [0, 1, 1]
125 params%periodic = [1, 1, 1]
127 params%periodic = [0, 0, 0]
134 END SUBROUTINE decode_periodic_green
142 SUBROUTINE decode_periodic_wavelet(periodic, params)
143 INTEGER,
INTENT(IN) :: periodic
146 params%wavelet_special_dimension = 0
148 SELECT CASE (periodic)
150 params%periodic = [0, 0, 0]
151 params%wavelet_geocode =
"F"
154 params%periodic = [1, 1, 0]
155 params%wavelet_geocode =
"S"
157 params%wavelet_special_dimension = 3
159 params%periodic = [1, 0, 1]
160 params%wavelet_geocode =
"S"
162 params%wavelet_special_dimension = 2
164 params%periodic = [0, 1, 1]
165 params%wavelet_geocode =
"S"
167 params%wavelet_special_dimension = 1
169 params%periodic = [1, 1, 1]
170 params%wavelet_geocode =
"P"
173 cpabort(
"Poisson solver for this periodicity not yet implemented")
178 END SUBROUTINE decode_periodic_wavelet
189 SUBROUTINE ps_implicit_read_parameters(poisson_section, params)
193 LOGICAL :: has_dielectric
197 NULLIFY (ps_implicit_section, dielectric_section, dbc_section)
202 i_val=params%ps_implicit_params%boundary_condition)
204 l_val=params%ps_implicit_params%zero_initial_guess)
205 CALL section_vals_val_get(ps_implicit_section,
"max_iter", i_val=params%ps_implicit_params%max_iter)
209 i_val=params%ps_implicit_params%neumann_directions)
214 params%has_dielectric = has_dielectric
215 CALL dielectric_read_parameters(dielectric_section, params)
219 CALL dirichlet_bc_read_parameters(dbc_section, params)
221 END SUBROUTINE ps_implicit_read_parameters
232 SUBROUTINE dielectric_read_parameters(dielectric_section, params)
236 INTEGER :: i, n_aac_rep, n_xaaa_rep
237 LOGICAL :: aa_cuboidal_explicit, &
239 REAL(
dp) :: eps, zeta
240 REAL(
dp),
DIMENSION(:),
POINTER :: aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt, &
241 xaa_annular_bctr, xaa_annular_brad, xaa_annular_xxtnt
245 l_val=params%dielectric_params%dielec_core_correction)
247 i_val=params%dielectric_params%dielec_functiontype)
249 CALL section_vals_val_get(dielectric_section,
"rho_min", r_val=params%dielectric_params%rho_min)
250 CALL section_vals_val_get(dielectric_section,
"rho_max", r_val=params%dielectric_params%rho_max)
252 i_val=params%dielectric_params%derivative_method)
256 CALL section_vals_get(aa_cuboidal_section, explicit=aa_cuboidal_explicit, n_repetition=n_aac_rep)
257 CALL section_vals_get(xaa_annular_section, explicit=xaa_annular_explicit, n_repetition=n_xaaa_rep)
261 IF (aa_cuboidal_explicit)
THEN
262 params%dielectric_params%n_aa_cuboidal = n_aac_rep
263 ALLOCATE (params%dielectric_params%aa_cuboidal_xxtnt(2, n_aac_rep), &
264 params%dielectric_params%aa_cuboidal_yxtnt(2, n_aac_rep), &
265 params%dielectric_params%aa_cuboidal_zxtnt(2, n_aac_rep), &
266 params%dielectric_params%aa_cuboidal_eps(n_aac_rep), &
267 params%dielectric_params%aa_cuboidal_zeta(n_aac_rep))
268 NULLIFY (aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt)
272 CALL section_vals_val_get(aa_cuboidal_section,
"X_xtnt", i_rep_section=i, r_vals=aa_cuboidal_xxtnt)
273 CALL section_vals_val_get(aa_cuboidal_section,
"Y_xtnt", i_rep_section=i, r_vals=aa_cuboidal_yxtnt)
274 CALL section_vals_val_get(aa_cuboidal_section,
"Z_xtnt", i_rep_section=i, r_vals=aa_cuboidal_zxtnt)
275 params%dielectric_params%aa_cuboidal_eps(i) = eps
276 params%dielectric_params%aa_cuboidal_zeta(i) = zeta
277 params%dielectric_params%aa_cuboidal_xxtnt(:, i) = aa_cuboidal_xxtnt
278 params%dielectric_params%aa_cuboidal_yxtnt(:, i) = aa_cuboidal_yxtnt
279 params%dielectric_params%aa_cuboidal_zxtnt(:, i) = aa_cuboidal_zxtnt
282 params%dielectric_params%n_aa_cuboidal = 0
285 IF (xaa_annular_explicit)
THEN
286 params%dielectric_params%n_xaa_annular = n_xaaa_rep
287 ALLOCATE (params%dielectric_params%xaa_annular_xxtnt(2, n_xaaa_rep), &
288 params%dielectric_params%xaa_annular_bctr(2, n_xaaa_rep), &
289 params%dielectric_params%xaa_annular_brad(2, n_xaaa_rep), &
290 params%dielectric_params%xaa_annular_eps(n_xaaa_rep), &
291 params%dielectric_params%xaa_annular_zeta(n_xaaa_rep))
292 NULLIFY (xaa_annular_xxtnt, xaa_annular_bctr, xaa_annular_brad)
296 CALL section_vals_val_get(xaa_annular_section,
"X_xtnt", i_rep_section=i, r_vals=xaa_annular_xxtnt)
297 CALL section_vals_val_get(xaa_annular_section,
"BASE_CENTER", i_rep_section=i, r_vals=xaa_annular_bctr)
298 CALL section_vals_val_get(xaa_annular_section,
"BASE_RADII", i_rep_section=i, r_vals=xaa_annular_brad)
299 params%dielectric_params%xaa_annular_eps(i) = eps
300 params%dielectric_params%xaa_annular_zeta(i) = zeta
301 params%dielectric_params%xaa_annular_xxtnt(:, i) = xaa_annular_xxtnt
302 params%dielectric_params%xaa_annular_bctr(:, i) = xaa_annular_bctr
303 params%dielectric_params%xaa_annular_brad(:, i) = xaa_annular_brad
306 params%dielectric_params%n_xaa_annular = 0
311 END SUBROUTINE dielectric_read_parameters
324 SUBROUTINE dirichlet_bc_read_parameters(dbc_section, params)
328 INTEGER :: aa_cylindrical_apxtyp, aa_cylindrical_nsides, i, n_aac_rep, n_aacyl_rep, &
329 n_aap_rep, n_p_rep, parallel_axis, parallel_plane
330 INTEGER,
DIMENSION(:),
POINTER :: aa_cuboidal_nprtn, aa_cylindrical_nprtn, &
331 aa_planar_nprtn, planar_nprtn
332 LOGICAL :: aa_cuboidal_explicit, &
333 aa_cylindrical_explicit, &
334 aa_planar_explicit, is_periodic, &
336 REAL(
dp) :: aa_cylindrical_brad, delta_alpha, freq, &
337 intercept, osc_frac, phase, sigma, &
339 REAL(
dp),
DIMENSION(:),
POINTER :: aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt, &
340 aa_cylindrical_bctr, aa_cylindrical_xtnt, aa_planar_xxtnt, aa_planar_yxtnt, &
341 aa_planar_zxtnt, planar_avtx, planar_bvtx, planar_cvtx
343 aa_cylindrical_section, &
344 aa_planar_section, planar_section
346 CALL section_vals_val_get(dbc_section,
"VERBOSE_OUTPUT", l_val=params%dbc_params%verbose_output)
351 CALL section_vals_get(aa_planar_section, explicit=aa_planar_explicit, n_repetition=n_aap_rep)
352 CALL section_vals_get(planar_section, explicit=planar_explicit, n_repetition=n_p_rep)
353 CALL section_vals_get(aa_cylindrical_section, explicit=aa_cylindrical_explicit, n_repetition=n_aacyl_rep)
354 CALL section_vals_get(aa_cuboidal_section, explicit=aa_cuboidal_explicit, n_repetition=n_aac_rep)
358 IF (aa_planar_explicit)
THEN
359 params%dbc_params%n_aa_planar = n_aap_rep
360 ALLOCATE (params%dbc_params%aa_planar_nprtn(3, n_aap_rep), &
361 params%dbc_params%aa_planar_pplane(n_aap_rep), &
362 params%dbc_params%aa_planar_xxtnt(2, n_aap_rep), &
363 params%dbc_params%aa_planar_yxtnt(2, n_aap_rep), &
364 params%dbc_params%aa_planar_zxtnt(2, n_aap_rep), &
365 params%dbc_params%aa_planar_vD(n_aap_rep), &
366 params%dbc_params%aa_planar_frequency(n_aap_rep), &
367 params%dbc_params%aa_planar_phase(n_aap_rep), &
368 params%dbc_params%aa_planar_osc_frac(n_aap_rep), &
369 params%dbc_params%aa_planar_sigma(n_aap_rep), &
370 params%dbc_params%aa_planar_thickness(n_aap_rep), &
371 params%dbc_params%aa_planar_is_periodic(n_aap_rep))
372 NULLIFY (aa_planar_nprtn, aa_planar_xxtnt, aa_planar_yxtnt, aa_planar_zxtnt)
375 CALL section_vals_val_get(aa_planar_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
380 CALL section_vals_val_get(aa_planar_section,
"PERIODIC_REGION", i_rep_section=i, l_val=is_periodic)
381 params%dbc_params%aa_planar_vD(i) = v_d
382 params%dbc_params%aa_planar_frequency(i) = freq
383 params%dbc_params%aa_planar_phase(i) = phase
384 params%dbc_params%aa_planar_osc_frac(i) = osc_frac
385 params%dbc_params%aa_planar_sigma(i) = sigma
386 params%dbc_params%aa_planar_thickness(i) = thickness
387 params%dbc_params%aa_planar_is_periodic(i) = is_periodic
389 CALL section_vals_val_get(aa_planar_section,
"PARALLEL_PLANE", i_rep_section=i, i_val=parallel_plane)
391 SELECT CASE (parallel_plane)
393 params%dbc_params%aa_planar_pplane(i) =
xy_plane
396 params%dbc_params%aa_planar_xxtnt(:, i) = aa_planar_xxtnt
397 params%dbc_params%aa_planar_yxtnt(:, i) = aa_planar_yxtnt
398 params%dbc_params%aa_planar_zxtnt(:, i) = intercept
401 params%dbc_params%aa_planar_nprtn(1, i) = aa_planar_nprtn(1)
402 params%dbc_params%aa_planar_nprtn(2, i) = aa_planar_nprtn(2)
403 params%dbc_params%aa_planar_nprtn(3, i) = 1
405 params%dbc_params%aa_planar_pplane(i) =
yz_plane
408 params%dbc_params%aa_planar_xxtnt(:, i) = intercept
409 params%dbc_params%aa_planar_yxtnt(:, i) = aa_planar_yxtnt
410 params%dbc_params%aa_planar_zxtnt(:, i) = aa_planar_zxtnt
413 params%dbc_params%aa_planar_nprtn(1, i) = 1
414 params%dbc_params%aa_planar_nprtn(2, i) = aa_planar_nprtn(1)
415 params%dbc_params%aa_planar_nprtn(3, i) = aa_planar_nprtn(2)
417 params%dbc_params%aa_planar_pplane(i) =
xz_plane
420 params%dbc_params%aa_planar_xxtnt(:, i) = aa_planar_xxtnt
421 params%dbc_params%aa_planar_yxtnt(:, i) = intercept
422 params%dbc_params%aa_planar_zxtnt(:, i) = aa_planar_zxtnt
425 params%dbc_params%aa_planar_nprtn(1, i) = aa_planar_nprtn(1)
426 params%dbc_params%aa_planar_nprtn(2, i) = 1
427 params%dbc_params%aa_planar_nprtn(3, i) = aa_planar_nprtn(2)
432 params%dbc_params%n_aa_planar = 0
435 IF (planar_explicit)
THEN
436 params%dbc_params%n_planar = n_p_rep
437 ALLOCATE (params%dbc_params%planar_nprtn(2, n_p_rep), &
438 params%dbc_params%planar_Avtx(3, n_p_rep), &
439 params%dbc_params%planar_Bvtx(3, n_p_rep), &
440 params%dbc_params%planar_Cvtx(3, n_p_rep), &
441 params%dbc_params%planar_vD(n_p_rep), &
442 params%dbc_params%planar_frequency(n_p_rep), &
443 params%dbc_params%planar_phase(n_p_rep), &
444 params%dbc_params%planar_osc_frac(n_p_rep), &
445 params%dbc_params%planar_sigma(n_p_rep), &
446 params%dbc_params%planar_thickness(n_p_rep), &
447 params%dbc_params%planar_is_periodic(n_p_rep))
448 NULLIFY (planar_nprtn, planar_avtx, planar_bvtx, planar_cvtx)
455 CALL section_vals_val_get(planar_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
460 params%dbc_params%planar_nprtn(:, i) = planar_nprtn
461 params%dbc_params%planar_Avtx(:, i) = planar_avtx
462 params%dbc_params%planar_Bvtx(:, i) = planar_bvtx
463 params%dbc_params%planar_Cvtx(:, i) = planar_cvtx
464 params%dbc_params%planar_vD(i) = v_d
465 params%dbc_params%planar_frequency(i) = freq
466 params%dbc_params%planar_phase(i) = phase
467 params%dbc_params%planar_osc_frac(i) = osc_frac
468 params%dbc_params%planar_sigma(i) = sigma
469 params%dbc_params%planar_thickness(i) = thickness
470 params%dbc_params%planar_is_periodic(i) = .false.
473 params%dbc_params%n_planar = 0
476 IF (aa_cylindrical_explicit)
THEN
477 params%dbc_params%n_aa_cylindrical = n_aacyl_rep
478 ALLOCATE (params%dbc_params%aa_cylindrical_paxis(n_aacyl_rep), &
479 params%dbc_params%aa_cylindrical_nprtn(2, n_aacyl_rep), &
480 params%dbc_params%aa_cylindrical_nsides(n_aacyl_rep), &
481 params%dbc_params%aa_cylindrical_apxtyp(n_aacyl_rep), &
482 params%dbc_params%aa_cylindrical_xtnt(2, n_aacyl_rep), &
483 params%dbc_params%aa_cylindrical_bctr(2, n_aacyl_rep), &
484 params%dbc_params%aa_cylindrical_brad(n_aacyl_rep), &
485 params%dbc_params%aa_cylindrical_vD(n_aacyl_rep), &
486 params%dbc_params%aa_cylindrical_frequency(n_aacyl_rep), &
487 params%dbc_params%aa_cylindrical_phase(n_aacyl_rep), &
488 params%dbc_params%aa_cylindrical_osc_frac(n_aacyl_rep), &
489 params%dbc_params%aa_cylindrical_sigma(n_aacyl_rep), &
490 params%dbc_params%aa_cylindrical_thickness(n_aacyl_rep), &
491 params%dbc_params%aa_cylindrical_sgap(n_aacyl_rep), &
492 params%dbc_params%aa_cylindrical_is_periodic(n_aacyl_rep))
493 NULLIFY (aa_cylindrical_nprtn, aa_cylindrical_xtnt, aa_cylindrical_bctr)
494 DO i = 1, n_aacyl_rep
495 CALL section_vals_val_get(aa_cylindrical_section,
"PARALLEL_AXIS", i_rep_section=i, i_val=parallel_axis)
496 CALL section_vals_val_get(aa_cylindrical_section,
"N_PRTN", i_rep_section=i, i_vals=aa_cylindrical_nprtn)
497 CALL section_vals_val_get(aa_cylindrical_section,
"N_SIDES", i_rep_section=i, i_val=aa_cylindrical_nsides)
498 CALL section_vals_val_get(aa_cylindrical_section,
"APX_TYPE", i_rep_section=i, i_val=aa_cylindrical_apxtyp)
499 CALL section_vals_val_get(aa_cylindrical_section,
"xtnt", i_rep_section=i, r_vals=aa_cylindrical_xtnt)
500 CALL section_vals_val_get(aa_cylindrical_section,
"BASE_CENTER", i_rep_section=i, r_vals=aa_cylindrical_bctr)
501 CALL section_vals_val_get(aa_cylindrical_section,
"BASE_RADIUS", i_rep_section=i, r_val=aa_cylindrical_brad)
503 CALL section_vals_val_get(aa_cylindrical_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
507 CALL section_vals_val_get(aa_cylindrical_section,
"THICKNESS", i_rep_section=i, r_val=thickness)
508 CALL section_vals_val_get(aa_cylindrical_section,
"delta_alpha", i_rep_section=i, r_val=delta_alpha)
509 params%dbc_params%aa_cylindrical_paxis(i) = parallel_axis
510 params%dbc_params%aa_cylindrical_nprtn(:, i) = aa_cylindrical_nprtn
511 params%dbc_params%aa_cylindrical_nsides(i) = aa_cylindrical_nsides
512 params%dbc_params%aa_cylindrical_apxtyp(i) = aa_cylindrical_apxtyp
513 params%dbc_params%aa_cylindrical_xtnt(:, i) = aa_cylindrical_xtnt
514 params%dbc_params%aa_cylindrical_bctr(:, i) = aa_cylindrical_bctr
515 params%dbc_params%aa_cylindrical_brad(i) = aa_cylindrical_brad
516 params%dbc_params%aa_cylindrical_vD(i) = v_d
517 params%dbc_params%aa_cylindrical_frequency(i) = freq
518 params%dbc_params%aa_cylindrical_phase(i) = phase
519 params%dbc_params%aa_cylindrical_osc_frac(i) = osc_frac
520 params%dbc_params%aa_cylindrical_sigma(i) = sigma
521 params%dbc_params%aa_cylindrical_thickness(i) = thickness
522 params%dbc_params%aa_cylindrical_sgap(i) = delta_alpha
523 params%dbc_params%aa_cylindrical_is_periodic(i) = .false.
526 params%dbc_params%n_aa_cylindrical = 0
527 ALLOCATE (params%dbc_params%aa_cylindrical_nsides(n_aacyl_rep))
530 IF (aa_cuboidal_explicit)
THEN
531 params%dbc_params%n_aa_cuboidal = n_aac_rep
532 ALLOCATE (params%dbc_params%aa_cuboidal_nprtn(3, n_aac_rep), &
533 params%dbc_params%aa_cuboidal_xxtnt(2, n_aac_rep), &
534 params%dbc_params%aa_cuboidal_yxtnt(2, n_aac_rep), &
535 params%dbc_params%aa_cuboidal_zxtnt(2, n_aac_rep), &
536 params%dbc_params%aa_cuboidal_vD(n_aac_rep), &
537 params%dbc_params%aa_cuboidal_frequency(n_aac_rep), &
538 params%dbc_params%aa_cuboidal_phase(n_aac_rep), &
539 params%dbc_params%aa_cuboidal_osc_frac(n_aac_rep), &
540 params%dbc_params%aa_cuboidal_sigma(n_aac_rep), &
541 params%dbc_params%aa_cuboidal_is_periodic(n_aac_rep))
542 NULLIFY (aa_cuboidal_nprtn, aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt)
544 CALL section_vals_val_get(aa_cuboidal_section,
"N_PRTN", i_rep_section=i, i_vals=aa_cuboidal_nprtn)
545 CALL section_vals_val_get(aa_cuboidal_section,
"X_xtnt", i_rep_section=i, r_vals=aa_cuboidal_xxtnt)
546 CALL section_vals_val_get(aa_cuboidal_section,
"Y_xtnt", i_rep_section=i, r_vals=aa_cuboidal_yxtnt)
547 CALL section_vals_val_get(aa_cuboidal_section,
"Z_xtnt", i_rep_section=i, r_vals=aa_cuboidal_zxtnt)
549 CALL section_vals_val_get(aa_cuboidal_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
553 CALL section_vals_val_get(aa_cuboidal_section,
"PERIODIC_REGION", i_rep_section=i, l_val=is_periodic)
554 params%dbc_params%aa_cuboidal_nprtn(:, i) = aa_cuboidal_nprtn
555 params%dbc_params%aa_cuboidal_xxtnt(:, i) = aa_cuboidal_xxtnt
556 params%dbc_params%aa_cuboidal_yxtnt(:, i) = aa_cuboidal_yxtnt
557 params%dbc_params%aa_cuboidal_zxtnt(:, i) = aa_cuboidal_zxtnt
558 params%dbc_params%aa_cuboidal_vD(i) = v_d
559 params%dbc_params%aa_cuboidal_frequency(i) = freq
560 params%dbc_params%aa_cuboidal_phase(i) = phase
561 params%dbc_params%aa_cuboidal_osc_frac(i) = osc_frac
562 params%dbc_params%aa_cuboidal_sigma(i) = sigma
563 params%dbc_params%aa_cuboidal_is_periodic(i) = is_periodic
566 params%dbc_params%n_aa_cuboidal = 0
571 END SUBROUTINE dirichlet_bc_read_parameters
Handles all functions related to the CELL.
integer, parameter, public use_perd_xyz
integer, parameter, public use_perd_y
integer, parameter, public use_perd_xz
integer, parameter, public use_perd_x
integer, parameter, public use_perd_z
integer, parameter, public use_perd_yz
integer, parameter, public use_perd_none
integer, parameter, public use_perd_xy
Dirichlet boundary condition data types.
integer, parameter, public xz_plane
integer, parameter, public yz_plane
integer, parameter, public xy_plane
Defines the basic variable types.
integer, parameter, public dp
Definition and initialisation of the ps_wavelet data type.
integer, parameter, public wavelet3d
integer, parameter, public wavelet0d
integer, parameter, public wavelet2d
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_wavelet
integer, parameter, public pw_poisson_periodic
integer, parameter, public pw_poisson_none
integer, parameter, public pw_poisson_mt
integer, parameter, public pw_poisson_implicit
integer, parameter, public do_ewald_none
integer, parameter, public pw_poisson_analytic
integer, parameter, public pw_poisson_multipole
parameters for the poisson solver independet of input_section