39 #include "./base/base_uses.f90"
44 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'pw_poisson_read_input'
60 TYPE(section_vals_type),
POINTER :: poisson_section
61 TYPE(pw_poisson_parameter_type),
INTENT(INOUT) :: params
64 TYPE(section_vals_type),
POINTER :: mt_section, wavelet_section
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
109 TYPE(pw_poisson_parameter_type),
INTENT(INOUT) :: params
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
144 TYPE(pw_poisson_parameter_type),
INTENT(INOUT) :: params
146 params%wavelet_special_dimension = 0
148 SELECT CASE (periodic)
150 params%wavelet_geocode =
"F"
153 params%wavelet_geocode =
"S"
155 params%wavelet_special_dimension = 2
157 params%wavelet_geocode =
"P"
160 cpabort(
"Poisson solver for this periodicity not yet implemented")
165 END SUBROUTINE decode_periodic_wavelet
176 SUBROUTINE ps_implicit_read_parameters(poisson_section, params)
177 TYPE(section_vals_type),
POINTER :: poisson_section
178 TYPE(pw_poisson_parameter_type),
INTENT(INOUT) :: params
180 LOGICAL :: has_dielectric
181 TYPE(section_vals_type),
POINTER :: dbc_section, dielectric_section, &
184 NULLIFY (ps_implicit_section, dielectric_section, dbc_section)
189 i_val=params%ps_implicit_params%boundary_condition)
191 l_val=params%ps_implicit_params%zero_initial_guess)
192 CALL section_vals_val_get(ps_implicit_section,
"max_iter", i_val=params%ps_implicit_params%max_iter)
196 i_val=params%ps_implicit_params%neumann_directions)
201 params%has_dielectric = has_dielectric
202 CALL dielectric_read_parameters(dielectric_section, params)
206 CALL dirichlet_bc_read_parameters(dbc_section, params)
208 END SUBROUTINE ps_implicit_read_parameters
219 SUBROUTINE dielectric_read_parameters(dielectric_section, params)
220 TYPE(section_vals_type),
POINTER :: dielectric_section
221 TYPE(pw_poisson_parameter_type),
INTENT(INOUT) :: params
223 INTEGER :: i, n_aac_rep, n_xaaa_rep
224 LOGICAL :: aa_cuboidal_explicit, &
226 REAL(
dp) :: eps, zeta
227 REAL(
dp),
DIMENSION(:),
POINTER :: aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt, &
228 xaa_annular_bctr, xaa_annular_brad, xaa_annular_xxtnt
229 TYPE(section_vals_type),
POINTER :: aa_cuboidal_section, xaa_annular_section
232 l_val=params%dielectric_params%dielec_core_correction)
234 i_val=params%dielectric_params%dielec_functiontype)
236 CALL section_vals_val_get(dielectric_section,
"rho_min", r_val=params%dielectric_params%rho_min)
237 CALL section_vals_val_get(dielectric_section,
"rho_max", r_val=params%dielectric_params%rho_max)
239 i_val=params%dielectric_params%derivative_method)
243 CALL section_vals_get(aa_cuboidal_section, explicit=aa_cuboidal_explicit, n_repetition=n_aac_rep)
244 CALL section_vals_get(xaa_annular_section, explicit=xaa_annular_explicit, n_repetition=n_xaaa_rep)
248 IF (aa_cuboidal_explicit)
THEN
249 params%dielectric_params%n_aa_cuboidal = n_aac_rep
250 ALLOCATE (params%dielectric_params%aa_cuboidal_xxtnt(2, n_aac_rep), &
251 params%dielectric_params%aa_cuboidal_yxtnt(2, n_aac_rep), &
252 params%dielectric_params%aa_cuboidal_zxtnt(2, n_aac_rep), &
253 params%dielectric_params%aa_cuboidal_eps(n_aac_rep), &
254 params%dielectric_params%aa_cuboidal_zeta(n_aac_rep))
255 NULLIFY (aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt)
259 CALL section_vals_val_get(aa_cuboidal_section,
"X_xtnt", i_rep_section=i, r_vals=aa_cuboidal_xxtnt)
260 CALL section_vals_val_get(aa_cuboidal_section,
"Y_xtnt", i_rep_section=i, r_vals=aa_cuboidal_yxtnt)
261 CALL section_vals_val_get(aa_cuboidal_section,
"Z_xtnt", i_rep_section=i, r_vals=aa_cuboidal_zxtnt)
262 params%dielectric_params%aa_cuboidal_eps(i) = eps
263 params%dielectric_params%aa_cuboidal_zeta(i) = zeta
264 params%dielectric_params%aa_cuboidal_xxtnt(:, i) = aa_cuboidal_xxtnt
265 params%dielectric_params%aa_cuboidal_yxtnt(:, i) = aa_cuboidal_yxtnt
266 params%dielectric_params%aa_cuboidal_zxtnt(:, i) = aa_cuboidal_zxtnt
269 params%dielectric_params%n_aa_cuboidal = 0
272 IF (xaa_annular_explicit)
THEN
273 params%dielectric_params%n_xaa_annular = n_xaaa_rep
274 ALLOCATE (params%dielectric_params%xaa_annular_xxtnt(2, n_xaaa_rep), &
275 params%dielectric_params%xaa_annular_bctr(2, n_xaaa_rep), &
276 params%dielectric_params%xaa_annular_brad(2, n_xaaa_rep), &
277 params%dielectric_params%xaa_annular_eps(n_xaaa_rep), &
278 params%dielectric_params%xaa_annular_zeta(n_xaaa_rep))
279 NULLIFY (xaa_annular_xxtnt, xaa_annular_bctr, xaa_annular_brad)
283 CALL section_vals_val_get(xaa_annular_section,
"X_xtnt", i_rep_section=i, r_vals=xaa_annular_xxtnt)
284 CALL section_vals_val_get(xaa_annular_section,
"BASE_CENTER", i_rep_section=i, r_vals=xaa_annular_bctr)
285 CALL section_vals_val_get(xaa_annular_section,
"BASE_RADII", i_rep_section=i, r_vals=xaa_annular_brad)
286 params%dielectric_params%xaa_annular_eps(i) = eps
287 params%dielectric_params%xaa_annular_zeta(i) = zeta
288 params%dielectric_params%xaa_annular_xxtnt(:, i) = xaa_annular_xxtnt
289 params%dielectric_params%xaa_annular_bctr(:, i) = xaa_annular_bctr
290 params%dielectric_params%xaa_annular_brad(:, i) = xaa_annular_brad
293 params%dielectric_params%n_xaa_annular = 0
298 END SUBROUTINE dielectric_read_parameters
311 SUBROUTINE dirichlet_bc_read_parameters(dbc_section, params)
312 TYPE(section_vals_type),
POINTER :: dbc_section
313 TYPE(pw_poisson_parameter_type),
INTENT(INOUT) :: params
315 INTEGER :: aa_cylindrical_apxtyp, aa_cylindrical_nsides, i, n_aac_rep, n_aacyl_rep, &
316 n_aap_rep, n_p_rep, parallel_axis, parallel_plane
317 INTEGER,
DIMENSION(:),
POINTER :: aa_cuboidal_nprtn, aa_cylindrical_nprtn, &
318 aa_planar_nprtn, planar_nprtn
319 LOGICAL :: aa_cuboidal_explicit, &
320 aa_cylindrical_explicit, &
321 aa_planar_explicit, is_periodic, &
323 REAL(
dp) :: aa_cylindrical_brad, delta_alpha, freq, &
324 intercept, osc_frac, phase, sigma, &
326 REAL(
dp),
DIMENSION(:),
POINTER :: aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt, &
327 aa_cylindrical_bctr, aa_cylindrical_xtnt, aa_planar_xxtnt, aa_planar_yxtnt, &
328 aa_planar_zxtnt, planar_avtx, planar_bvtx, planar_cvtx
329 TYPE(section_vals_type),
POINTER :: aa_cuboidal_section, &
330 aa_cylindrical_section, &
331 aa_planar_section, planar_section
333 CALL section_vals_val_get(dbc_section,
"VERBOSE_OUTPUT", l_val=params%dbc_params%verbose_output)
338 CALL section_vals_get(aa_planar_section, explicit=aa_planar_explicit, n_repetition=n_aap_rep)
339 CALL section_vals_get(planar_section, explicit=planar_explicit, n_repetition=n_p_rep)
340 CALL section_vals_get(aa_cylindrical_section, explicit=aa_cylindrical_explicit, n_repetition=n_aacyl_rep)
341 CALL section_vals_get(aa_cuboidal_section, explicit=aa_cuboidal_explicit, n_repetition=n_aac_rep)
345 IF (aa_planar_explicit)
THEN
346 params%dbc_params%n_aa_planar = n_aap_rep
347 ALLOCATE (params%dbc_params%aa_planar_nprtn(3, n_aap_rep), &
348 params%dbc_params%aa_planar_pplane(n_aap_rep), &
349 params%dbc_params%aa_planar_xxtnt(2, n_aap_rep), &
350 params%dbc_params%aa_planar_yxtnt(2, n_aap_rep), &
351 params%dbc_params%aa_planar_zxtnt(2, n_aap_rep), &
352 params%dbc_params%aa_planar_vD(n_aap_rep), &
353 params%dbc_params%aa_planar_frequency(n_aap_rep), &
354 params%dbc_params%aa_planar_phase(n_aap_rep), &
355 params%dbc_params%aa_planar_osc_frac(n_aap_rep), &
356 params%dbc_params%aa_planar_sigma(n_aap_rep), &
357 params%dbc_params%aa_planar_thickness(n_aap_rep), &
358 params%dbc_params%aa_planar_is_periodic(n_aap_rep))
359 NULLIFY (aa_planar_nprtn, aa_planar_xxtnt, aa_planar_yxtnt, aa_planar_zxtnt)
362 CALL section_vals_val_get(aa_planar_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
367 CALL section_vals_val_get(aa_planar_section,
"PERIODIC_REGION", i_rep_section=i, l_val=is_periodic)
368 params%dbc_params%aa_planar_vD(i) = v_d
369 params%dbc_params%aa_planar_frequency(i) = freq
370 params%dbc_params%aa_planar_phase(i) = phase
371 params%dbc_params%aa_planar_osc_frac(i) = osc_frac
372 params%dbc_params%aa_planar_sigma(i) = sigma
373 params%dbc_params%aa_planar_thickness(i) = thickness
374 params%dbc_params%aa_planar_is_periodic(i) = is_periodic
376 CALL section_vals_val_get(aa_planar_section,
"PARALLEL_PLANE", i_rep_section=i, i_val=parallel_plane)
378 SELECT CASE (parallel_plane)
380 params%dbc_params%aa_planar_pplane(i) =
xy_plane
383 params%dbc_params%aa_planar_xxtnt(:, i) = aa_planar_xxtnt
384 params%dbc_params%aa_planar_yxtnt(:, i) = aa_planar_yxtnt
385 params%dbc_params%aa_planar_zxtnt(:, i) = intercept
388 params%dbc_params%aa_planar_nprtn(1, i) = aa_planar_nprtn(1)
389 params%dbc_params%aa_planar_nprtn(2, i) = aa_planar_nprtn(2)
390 params%dbc_params%aa_planar_nprtn(3, i) = 1
392 params%dbc_params%aa_planar_pplane(i) =
yz_plane
395 params%dbc_params%aa_planar_xxtnt(:, i) = intercept
396 params%dbc_params%aa_planar_yxtnt(:, i) = aa_planar_yxtnt
397 params%dbc_params%aa_planar_zxtnt(:, i) = aa_planar_zxtnt
400 params%dbc_params%aa_planar_nprtn(1, i) = 1
401 params%dbc_params%aa_planar_nprtn(2, i) = aa_planar_nprtn(1)
402 params%dbc_params%aa_planar_nprtn(3, i) = aa_planar_nprtn(2)
404 params%dbc_params%aa_planar_pplane(i) =
xz_plane
407 params%dbc_params%aa_planar_xxtnt(:, i) = aa_planar_xxtnt
408 params%dbc_params%aa_planar_yxtnt(:, i) = intercept
409 params%dbc_params%aa_planar_zxtnt(:, i) = aa_planar_zxtnt
412 params%dbc_params%aa_planar_nprtn(1, i) = aa_planar_nprtn(1)
413 params%dbc_params%aa_planar_nprtn(2, i) = 1
414 params%dbc_params%aa_planar_nprtn(3, i) = aa_planar_nprtn(2)
419 params%dbc_params%n_aa_planar = 0
422 IF (planar_explicit)
THEN
423 params%dbc_params%n_planar = n_p_rep
424 ALLOCATE (params%dbc_params%planar_nprtn(2, n_p_rep), &
425 params%dbc_params%planar_Avtx(3, n_p_rep), &
426 params%dbc_params%planar_Bvtx(3, n_p_rep), &
427 params%dbc_params%planar_Cvtx(3, n_p_rep), &
428 params%dbc_params%planar_vD(n_p_rep), &
429 params%dbc_params%planar_frequency(n_p_rep), &
430 params%dbc_params%planar_phase(n_p_rep), &
431 params%dbc_params%planar_osc_frac(n_p_rep), &
432 params%dbc_params%planar_sigma(n_p_rep), &
433 params%dbc_params%planar_thickness(n_p_rep), &
434 params%dbc_params%planar_is_periodic(n_p_rep))
435 NULLIFY (planar_nprtn, planar_avtx, planar_bvtx, planar_cvtx)
442 CALL section_vals_val_get(planar_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
447 params%dbc_params%planar_nprtn(:, i) = planar_nprtn
448 params%dbc_params%planar_Avtx(:, i) = planar_avtx
449 params%dbc_params%planar_Bvtx(:, i) = planar_bvtx
450 params%dbc_params%planar_Cvtx(:, i) = planar_cvtx
451 params%dbc_params%planar_vD(i) = v_d
452 params%dbc_params%planar_frequency(i) = freq
453 params%dbc_params%planar_phase(i) = phase
454 params%dbc_params%planar_osc_frac(i) = osc_frac
455 params%dbc_params%planar_sigma(i) = sigma
456 params%dbc_params%planar_thickness(i) = thickness
457 params%dbc_params%planar_is_periodic(i) = .false.
460 params%dbc_params%n_planar = 0
463 IF (aa_cylindrical_explicit)
THEN
464 params%dbc_params%n_aa_cylindrical = n_aacyl_rep
465 ALLOCATE (params%dbc_params%aa_cylindrical_paxis(n_aacyl_rep), &
466 params%dbc_params%aa_cylindrical_nprtn(2, n_aacyl_rep), &
467 params%dbc_params%aa_cylindrical_nsides(n_aacyl_rep), &
468 params%dbc_params%aa_cylindrical_apxtyp(n_aacyl_rep), &
469 params%dbc_params%aa_cylindrical_xtnt(2, n_aacyl_rep), &
470 params%dbc_params%aa_cylindrical_bctr(2, n_aacyl_rep), &
471 params%dbc_params%aa_cylindrical_brad(n_aacyl_rep), &
472 params%dbc_params%aa_cylindrical_vD(n_aacyl_rep), &
473 params%dbc_params%aa_cylindrical_frequency(n_aacyl_rep), &
474 params%dbc_params%aa_cylindrical_phase(n_aacyl_rep), &
475 params%dbc_params%aa_cylindrical_osc_frac(n_aacyl_rep), &
476 params%dbc_params%aa_cylindrical_sigma(n_aacyl_rep), &
477 params%dbc_params%aa_cylindrical_thickness(n_aacyl_rep), &
478 params%dbc_params%aa_cylindrical_sgap(n_aacyl_rep), &
479 params%dbc_params%aa_cylindrical_is_periodic(n_aacyl_rep))
480 NULLIFY (aa_cylindrical_nprtn, aa_cylindrical_xtnt, aa_cylindrical_bctr)
481 DO i = 1, n_aacyl_rep
482 CALL section_vals_val_get(aa_cylindrical_section,
"PARALLEL_AXIS", i_rep_section=i, i_val=parallel_axis)
483 CALL section_vals_val_get(aa_cylindrical_section,
"N_PRTN", i_rep_section=i, i_vals=aa_cylindrical_nprtn)
484 CALL section_vals_val_get(aa_cylindrical_section,
"N_SIDES", i_rep_section=i, i_val=aa_cylindrical_nsides)
485 CALL section_vals_val_get(aa_cylindrical_section,
"APX_TYPE", i_rep_section=i, i_val=aa_cylindrical_apxtyp)
486 CALL section_vals_val_get(aa_cylindrical_section,
"xtnt", i_rep_section=i, r_vals=aa_cylindrical_xtnt)
487 CALL section_vals_val_get(aa_cylindrical_section,
"BASE_CENTER", i_rep_section=i, r_vals=aa_cylindrical_bctr)
488 CALL section_vals_val_get(aa_cylindrical_section,
"BASE_RADIUS", i_rep_section=i, r_val=aa_cylindrical_brad)
490 CALL section_vals_val_get(aa_cylindrical_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
494 CALL section_vals_val_get(aa_cylindrical_section,
"THICKNESS", i_rep_section=i, r_val=thickness)
495 CALL section_vals_val_get(aa_cylindrical_section,
"delta_alpha", i_rep_section=i, r_val=delta_alpha)
496 params%dbc_params%aa_cylindrical_paxis(i) = parallel_axis
497 params%dbc_params%aa_cylindrical_nprtn(:, i) = aa_cylindrical_nprtn
498 params%dbc_params%aa_cylindrical_nsides(i) = aa_cylindrical_nsides
499 params%dbc_params%aa_cylindrical_apxtyp(i) = aa_cylindrical_apxtyp
500 params%dbc_params%aa_cylindrical_xtnt(:, i) = aa_cylindrical_xtnt
501 params%dbc_params%aa_cylindrical_bctr(:, i) = aa_cylindrical_bctr
502 params%dbc_params%aa_cylindrical_brad(i) = aa_cylindrical_brad
503 params%dbc_params%aa_cylindrical_vD(i) = v_d
504 params%dbc_params%aa_cylindrical_frequency(i) = freq
505 params%dbc_params%aa_cylindrical_phase(i) = phase
506 params%dbc_params%aa_cylindrical_osc_frac(i) = osc_frac
507 params%dbc_params%aa_cylindrical_sigma(i) = sigma
508 params%dbc_params%aa_cylindrical_thickness(i) = thickness
509 params%dbc_params%aa_cylindrical_sgap(i) = delta_alpha
510 params%dbc_params%aa_cylindrical_is_periodic(i) = .false.
513 params%dbc_params%n_aa_cylindrical = 0
514 ALLOCATE (params%dbc_params%aa_cylindrical_nsides(n_aacyl_rep))
517 IF (aa_cuboidal_explicit)
THEN
518 params%dbc_params%n_aa_cuboidal = n_aac_rep
519 ALLOCATE (params%dbc_params%aa_cuboidal_nprtn(3, n_aac_rep), &
520 params%dbc_params%aa_cuboidal_xxtnt(2, n_aac_rep), &
521 params%dbc_params%aa_cuboidal_yxtnt(2, n_aac_rep), &
522 params%dbc_params%aa_cuboidal_zxtnt(2, n_aac_rep), &
523 params%dbc_params%aa_cuboidal_vD(n_aac_rep), &
524 params%dbc_params%aa_cuboidal_frequency(n_aac_rep), &
525 params%dbc_params%aa_cuboidal_phase(n_aac_rep), &
526 params%dbc_params%aa_cuboidal_osc_frac(n_aac_rep), &
527 params%dbc_params%aa_cuboidal_sigma(n_aac_rep), &
528 params%dbc_params%aa_cuboidal_is_periodic(n_aac_rep))
529 NULLIFY (aa_cuboidal_nprtn, aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt)
531 CALL section_vals_val_get(aa_cuboidal_section,
"N_PRTN", i_rep_section=i, i_vals=aa_cuboidal_nprtn)
532 CALL section_vals_val_get(aa_cuboidal_section,
"X_xtnt", i_rep_section=i, r_vals=aa_cuboidal_xxtnt)
533 CALL section_vals_val_get(aa_cuboidal_section,
"Y_xtnt", i_rep_section=i, r_vals=aa_cuboidal_yxtnt)
534 CALL section_vals_val_get(aa_cuboidal_section,
"Z_xtnt", i_rep_section=i, r_vals=aa_cuboidal_zxtnt)
536 CALL section_vals_val_get(aa_cuboidal_section,
"OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
540 CALL section_vals_val_get(aa_cuboidal_section,
"PERIODIC_REGION", i_rep_section=i, l_val=is_periodic)
541 params%dbc_params%aa_cuboidal_nprtn(:, i) = aa_cuboidal_nprtn
542 params%dbc_params%aa_cuboidal_xxtnt(:, i) = aa_cuboidal_xxtnt
543 params%dbc_params%aa_cuboidal_yxtnt(:, i) = aa_cuboidal_yxtnt
544 params%dbc_params%aa_cuboidal_zxtnt(:, i) = aa_cuboidal_zxtnt
545 params%dbc_params%aa_cuboidal_vD(i) = v_d
546 params%dbc_params%aa_cuboidal_frequency(i) = freq
547 params%dbc_params%aa_cuboidal_phase(i) = phase
548 params%dbc_params%aa_cuboidal_osc_frac(i) = osc_frac
549 params%dbc_params%aa_cuboidal_sigma(i) = sigma
550 params%dbc_params%aa_cuboidal_is_periodic(i) = is_periodic
553 params%dbc_params%n_aa_cuboidal = 0
558 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