Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Reading of input parameters for the pw_poisson-modules.
10 : !> \par History
11 : !> 01.2014 Code moved into separate module to make pw_poisson-modules
12 : !> independet from input_section_types and input_constants.
13 : !> \author Ole Schuett
14 : ! **************************************************************************************************
15 : MODULE pw_poisson_read_input
16 : USE cell_types, ONLY: use_perd_none,&
17 : use_perd_x,&
18 : use_perd_xy,&
19 : use_perd_xyz,&
20 : use_perd_xz,&
21 : use_perd_y,&
22 : use_perd_yz,&
23 : use_perd_z
24 : USE dirichlet_bc_types, ONLY: xy_plane,&
25 : xz_plane,&
26 : yz_plane
27 : USE input_section_types, ONLY: section_vals_get,&
28 : section_vals_get_subs_vals,&
29 : section_vals_type,&
30 : section_vals_val_get
31 : USE kinds, ONLY: dp
32 : USE ps_wavelet_types, ONLY: WAVELET0D,&
33 : WAVELET2D,&
34 : WAVELET3D
35 : USE pw_poisson_types, ONLY: &
36 : do_ewald_none, pw_poisson_analytic, pw_poisson_implicit, pw_poisson_mt, &
37 : pw_poisson_multipole, pw_poisson_none, pw_poisson_parameter_type, pw_poisson_periodic, &
38 : pw_poisson_wavelet
39 : #include "./base/base_uses.f90"
40 :
41 : IMPLICIT NONE
42 : PRIVATE
43 :
44 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'pw_poisson_read_input'
45 :
46 : PUBLIC :: pw_poisson_read_parameters
47 :
48 : CONTAINS
49 :
50 : ! **************************************************************************************************
51 : !> \brief Reads the POISSON input-section and into pw_poisson_parameter_type.
52 : !> \param poisson_section ...
53 : !> \param params ...
54 : !> \par History
55 : !> 01.2014 Code moved into separate module from pw_poisson_types,
56 : !> pw_poisson_methods and ps_wavelet_types.
57 : !> \author Ole Schuett
58 : ! **************************************************************************************************
59 50226 : SUBROUTINE pw_poisson_read_parameters(poisson_section, params)
60 : TYPE(section_vals_type), POINTER :: poisson_section
61 : TYPE(pw_poisson_parameter_type), INTENT(INOUT) :: params
62 :
63 : INTEGER :: periodic
64 : TYPE(section_vals_type), POINTER :: mt_section, wavelet_section
65 :
66 25113 : NULLIFY (mt_section, wavelet_section)
67 :
68 25113 : CALL section_vals_val_get(poisson_section, "POISSON_SOLVER", i_val=params%solver)
69 :
70 : ! Decoding PERIODIC depending on chosen solver,
71 : ! because not all solvers support every possible periodicity
72 25113 : CALL section_vals_val_get(poisson_section, "PERIODIC", i_val=periodic)
73 49358 : SELECT CASE (params%solver)
74 : CASE (pw_poisson_periodic, pw_poisson_analytic, pw_poisson_mt, pw_poisson_multipole, &
75 : pw_poisson_implicit)
76 24245 : CALL decode_periodic_green(periodic, params)
77 : CASE (pw_poisson_wavelet)
78 868 : CALL decode_periodic_wavelet(periodic, params)
79 : CASE (pw_poisson_none)
80 : CASE default
81 25113 : CPABORT("")
82 : END SELECT
83 :
84 : ! Set Ewald default to NONE
85 25113 : params%ewald_type = do_ewald_none
86 :
87 : ! parsing MT subsection
88 25113 : mt_section => section_vals_get_subs_vals(poisson_section, "MT")
89 25113 : CALL section_vals_val_get(mt_section, "REL_CUTOFF", r_val=params%mt_rel_cutoff)
90 25113 : CALL section_vals_val_get(mt_section, "ALPHA", r_val=params%mt_alpha)
91 :
92 : ! parsing WAVELET subsection
93 25113 : wavelet_section => section_vals_get_subs_vals(poisson_section, "WAVELET")
94 25113 : CALL section_vals_val_get(wavelet_section, "SCF_TYPE", i_val=params%wavelet_scf_type)
95 :
96 : ! parsing IMPLICIT subsection
97 25113 : CALL ps_implicit_read_parameters(poisson_section, params)
98 :
99 25113 : END SUBROUTINE pw_poisson_read_parameters
100 :
101 : ! **************************************************************************************************
102 : !> \brief Helper routien for pw_poisson_read_parameters
103 : !> \param periodic ...
104 : !> \param params ...
105 : !> \author Ole Schuett
106 : ! **************************************************************************************************
107 24245 : SUBROUTINE decode_periodic_green(periodic, params)
108 : INTEGER, INTENT(IN) :: periodic
109 : TYPE(pw_poisson_parameter_type), INTENT(INOUT) :: params
110 :
111 24245 : SELECT CASE (periodic)
112 : CASE (use_perd_x)
113 8 : params%periodic = [1, 0, 0]
114 : CASE (use_perd_y)
115 8 : params%periodic = [0, 1, 0]
116 : CASE (use_perd_z)
117 8 : params%periodic = [0, 0, 1]
118 : CASE (use_perd_xy)
119 16 : params%periodic = [1, 1, 0]
120 : CASE (use_perd_xz)
121 8 : params%periodic = [1, 0, 1]
122 : CASE (use_perd_yz)
123 16 : params%periodic = [0, 1, 1]
124 : CASE (use_perd_xyz)
125 90580 : params%periodic = [1, 1, 1]
126 : CASE (use_perd_none)
127 6336 : params%periodic = [0, 0, 0]
128 : CASE DEFAULT
129 24245 : CPABORT("")
130 : END SELECT
131 : ! check for consistent use of periodicity (cell <-> Poisson solver)
132 : !CPPostcondition(ALL(perd == cell%perd),cp_fatal_level,routineP,failure)
133 :
134 24245 : END SUBROUTINE decode_periodic_green
135 :
136 : ! **************************************************************************************************
137 : !> \brief Helper routien for pw_poisson_read_parameters
138 : !> \param periodic ...
139 : !> \param params ...
140 : !> \author Ole Schuett
141 : ! **************************************************************************************************
142 868 : SUBROUTINE decode_periodic_wavelet(periodic, params)
143 : INTEGER, INTENT(IN) :: periodic
144 : TYPE(pw_poisson_parameter_type), INTENT(INOUT) :: params
145 :
146 868 : params%wavelet_special_dimension = 0
147 :
148 868 : SELECT CASE (periodic)
149 : CASE (use_perd_none)
150 2112 : params%periodic = [0, 0, 0]
151 528 : params%wavelet_geocode = "F"
152 528 : params%wavelet_method = WAVELET0D
153 : CASE (use_perd_xy)
154 8 : params%periodic = [1, 1, 0]
155 2 : params%wavelet_geocode = "S"
156 2 : params%wavelet_method = WAVELET2D
157 2 : params%wavelet_special_dimension = 3
158 : CASE (use_perd_xz)
159 8 : params%periodic = [1, 0, 1]
160 2 : params%wavelet_geocode = "S"
161 2 : params%wavelet_method = WAVELET2D
162 2 : params%wavelet_special_dimension = 2
163 : CASE (use_perd_yz)
164 8 : params%periodic = [0, 1, 1]
165 2 : params%wavelet_geocode = "S"
166 2 : params%wavelet_method = WAVELET2D
167 2 : params%wavelet_special_dimension = 1
168 : CASE (use_perd_xyz)
169 1336 : params%periodic = [1, 1, 1]
170 334 : params%wavelet_geocode = "P"
171 334 : params%wavelet_method = WAVELET3D
172 : CASE (use_perd_x, use_perd_y, use_perd_z)
173 0 : CPABORT("Poisson solver for this periodicity not yet implemented")
174 : CASE DEFAULT
175 868 : CPABORT("")
176 : END SELECT
177 :
178 868 : END SUBROUTINE decode_periodic_wavelet
179 :
180 : ! **************************************************************************************************
181 : !> \brief Reads the subsection IMPLICIT and initializes corresponding parameters in
182 : !> pw_poisson_parameter_type
183 : !> \param poisson_section poisson section to be read from input
184 : !> \param params poisson_env parameters
185 : !> \par History
186 : !> 08.2014 created [Hossein Bani-Hashemian]
187 : !> \author Mohammad Hossein Bani-Hashemian
188 : ! **************************************************************************************************
189 50226 : SUBROUTINE ps_implicit_read_parameters(poisson_section, params)
190 : TYPE(section_vals_type), POINTER :: poisson_section
191 : TYPE(pw_poisson_parameter_type), INTENT(INOUT) :: params
192 :
193 : LOGICAL :: has_dielectric
194 : TYPE(section_vals_type), POINTER :: dbc_section, dielectric_section, &
195 : ps_implicit_section
196 :
197 25113 : NULLIFY (ps_implicit_section, dielectric_section, dbc_section)
198 :
199 : ! parsing IMPLICIT subsection
200 25113 : ps_implicit_section => section_vals_get_subs_vals(poisson_section, "IMPLICIT")
201 : CALL section_vals_val_get(ps_implicit_section, "BOUNDARY_CONDITIONS", &
202 25113 : i_val=params%ps_implicit_params%boundary_condition)
203 : CALL section_vals_val_get(ps_implicit_section, "ZERO_INITIAL_GUESS", &
204 25113 : l_val=params%ps_implicit_params%zero_initial_guess)
205 25113 : CALL section_vals_val_get(ps_implicit_section, "max_iter", i_val=params%ps_implicit_params%max_iter)
206 25113 : CALL section_vals_val_get(ps_implicit_section, "tol", r_val=params%ps_implicit_params%tol)
207 25113 : CALL section_vals_val_get(ps_implicit_section, "omega", r_val=params%ps_implicit_params%omega)
208 : CALL section_vals_val_get(ps_implicit_section, "neumann_directions", &
209 25113 : i_val=params%ps_implicit_params%neumann_directions)
210 :
211 : ! parsing DIELECTRIC subsection
212 25113 : dielectric_section => section_vals_get_subs_vals(ps_implicit_section, "DIELECTRIC")
213 25113 : CALL section_vals_get(dielectric_section, explicit=has_dielectric)
214 25113 : params%has_dielectric = has_dielectric
215 25113 : CALL dielectric_read_parameters(dielectric_section, params)
216 :
217 : ! parsing DIRICHLET_BC subsection
218 25113 : dbc_section => section_vals_get_subs_vals(ps_implicit_section, "DIRICHLET_BC")
219 25113 : CALL dirichlet_bc_read_parameters(dbc_section, params)
220 :
221 25113 : END SUBROUTINE ps_implicit_read_parameters
222 :
223 : ! **************************************************************************************************
224 : !> \brief Reads the subsection DIELECTRIC and initializes corresponding parameters in
225 : !> pw_poisson_parameter_type
226 : !> \param dielectric_section dielectric section to be read from input
227 : !> \param params poisson_env parameters
228 : !> \par History
229 : !> 07.2015 created [Hossein Bani-Hashemian]
230 : !> \author Mohammad Hossein Bani-Hashemian
231 : ! **************************************************************************************************
232 75339 : SUBROUTINE dielectric_read_parameters(dielectric_section, params)
233 : TYPE(section_vals_type), POINTER :: dielectric_section
234 : TYPE(pw_poisson_parameter_type), INTENT(INOUT) :: params
235 :
236 : INTEGER :: i, n_aac_rep, n_xaaa_rep
237 : LOGICAL :: aa_cuboidal_explicit, &
238 : xaa_annular_explicit
239 : REAL(dp) :: eps, zeta
240 25113 : REAL(dp), DIMENSION(:), POINTER :: aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt, &
241 25113 : xaa_annular_bctr, xaa_annular_brad, xaa_annular_xxtnt
242 : TYPE(section_vals_type), POINTER :: aa_cuboidal_section, xaa_annular_section
243 :
244 : CALL section_vals_val_get(dielectric_section, "DIELECTRIC_CORE_CORRECTION", &
245 25113 : l_val=params%dielectric_params%dielec_core_correction)
246 : CALL section_vals_val_get(dielectric_section, "DIELECTRIC_FUNCTION_TYPE", &
247 25113 : i_val=params%dielectric_params%dielec_functiontype)
248 25113 : CALL section_vals_val_get(dielectric_section, "epsilon", r_val=params%dielectric_params%eps0)
249 25113 : CALL section_vals_val_get(dielectric_section, "rho_min", r_val=params%dielectric_params%rho_min)
250 25113 : CALL section_vals_val_get(dielectric_section, "rho_max", r_val=params%dielectric_params%rho_max)
251 : CALL section_vals_val_get(dielectric_section, "DERIVATIVE_METHOD", &
252 25113 : i_val=params%dielectric_params%derivative_method)
253 :
254 25113 : aa_cuboidal_section => section_vals_get_subs_vals(dielectric_section, "DIELEC_AA_CUBOIDAL")
255 25113 : xaa_annular_section => section_vals_get_subs_vals(dielectric_section, "DIELEC_XAA_ANNULAR")
256 25113 : CALL section_vals_get(aa_cuboidal_section, explicit=aa_cuboidal_explicit, n_repetition=n_aac_rep)
257 25113 : CALL section_vals_get(xaa_annular_section, explicit=xaa_annular_explicit, n_repetition=n_xaaa_rep)
258 :
259 25113 : IF (params%solver == pw_poisson_implicit) THEN
260 :
261 54 : IF (aa_cuboidal_explicit) THEN
262 2 : 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 22 : params%dielectric_params%aa_cuboidal_zeta(n_aac_rep))
268 2 : NULLIFY (aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt)
269 4 : DO i = 1, n_aac_rep
270 2 : CALL section_vals_val_get(aa_cuboidal_section, "epsilon", i_rep_section=i, r_val=eps)
271 2 : CALL section_vals_val_get(aa_cuboidal_section, "zeta", i_rep_section=i, r_val=zeta)
272 2 : CALL section_vals_val_get(aa_cuboidal_section, "X_xtnt", i_rep_section=i, r_vals=aa_cuboidal_xxtnt)
273 2 : CALL section_vals_val_get(aa_cuboidal_section, "Y_xtnt", i_rep_section=i, r_vals=aa_cuboidal_yxtnt)
274 2 : CALL section_vals_val_get(aa_cuboidal_section, "Z_xtnt", i_rep_section=i, r_vals=aa_cuboidal_zxtnt)
275 2 : params%dielectric_params%aa_cuboidal_eps(i) = eps
276 2 : params%dielectric_params%aa_cuboidal_zeta(i) = zeta
277 6 : params%dielectric_params%aa_cuboidal_xxtnt(:, i) = aa_cuboidal_xxtnt
278 6 : params%dielectric_params%aa_cuboidal_yxtnt(:, i) = aa_cuboidal_yxtnt
279 10 : params%dielectric_params%aa_cuboidal_zxtnt(:, i) = aa_cuboidal_zxtnt
280 : END DO
281 : ELSE
282 52 : params%dielectric_params%n_aa_cuboidal = 0
283 : END IF
284 :
285 54 : IF (xaa_annular_explicit) THEN
286 4 : 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 44 : params%dielectric_params%xaa_annular_zeta(n_xaaa_rep))
292 4 : NULLIFY (xaa_annular_xxtnt, xaa_annular_bctr, xaa_annular_brad)
293 8 : DO i = 1, n_xaaa_rep
294 4 : CALL section_vals_val_get(xaa_annular_section, "epsilon", i_rep_section=i, r_val=eps)
295 4 : CALL section_vals_val_get(xaa_annular_section, "zeta", i_rep_section=i, r_val=zeta)
296 4 : CALL section_vals_val_get(xaa_annular_section, "X_xtnt", i_rep_section=i, r_vals=xaa_annular_xxtnt)
297 4 : CALL section_vals_val_get(xaa_annular_section, "BASE_CENTER", i_rep_section=i, r_vals=xaa_annular_bctr)
298 4 : CALL section_vals_val_get(xaa_annular_section, "BASE_RADII", i_rep_section=i, r_vals=xaa_annular_brad)
299 4 : params%dielectric_params%xaa_annular_eps(i) = eps
300 4 : params%dielectric_params%xaa_annular_zeta(i) = zeta
301 12 : params%dielectric_params%xaa_annular_xxtnt(:, i) = xaa_annular_xxtnt
302 12 : params%dielectric_params%xaa_annular_bctr(:, i) = xaa_annular_bctr
303 20 : params%dielectric_params%xaa_annular_brad(:, i) = xaa_annular_brad
304 : END DO
305 : ELSE
306 50 : params%dielectric_params%n_xaa_annular = 0
307 : END IF
308 :
309 : END IF
310 :
311 25113 : END SUBROUTINE dielectric_read_parameters
312 :
313 : ! **************************************************************************************************
314 : !> \brief Reads the subsection DIRICHLET_BC and initializes corresponding parameters in
315 : !> pw_poisson_parameter_type
316 : !> \param dbc_section dirichlet_bc section to be read from input
317 : !> \param params poisson_env parameters
318 : !> \par History
319 : !> 08.2014 created [Hossein Bani-Hashemian]
320 : !> 07.2015 refactored [Hossein Bani-Hashemian]
321 : !> 10.2015 revised [Hossein Bani-Hashemian]
322 : !> \author Mohammad Hossein Bani-Hashemian
323 : ! **************************************************************************************************
324 125565 : SUBROUTINE dirichlet_bc_read_parameters(dbc_section, params)
325 : TYPE(section_vals_type), POINTER :: dbc_section
326 : TYPE(pw_poisson_parameter_type), INTENT(INOUT) :: params
327 :
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 25113 : INTEGER, DIMENSION(:), POINTER :: aa_cuboidal_nprtn, aa_cylindrical_nprtn, &
331 25113 : aa_planar_nprtn, planar_nprtn
332 : LOGICAL :: aa_cuboidal_explicit, &
333 : aa_cylindrical_explicit, &
334 : aa_planar_explicit, is_periodic, &
335 : planar_explicit
336 : REAL(dp) :: aa_cylindrical_brad, delta_alpha, freq, &
337 : intercept, osc_frac, phase, sigma, &
338 : thickness, v_D
339 25113 : REAL(dp), DIMENSION(:), POINTER :: aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt, &
340 25113 : aa_cylindrical_bctr, aa_cylindrical_xtnt, aa_planar_xxtnt, aa_planar_yxtnt, &
341 25113 : aa_planar_zxtnt, planar_Avtx, planar_Bvtx, planar_Cvtx
342 : TYPE(section_vals_type), POINTER :: aa_cuboidal_section, &
343 : aa_cylindrical_section, &
344 : aa_planar_section, planar_section
345 :
346 25113 : CALL section_vals_val_get(dbc_section, "VERBOSE_OUTPUT", l_val=params%dbc_params%verbose_output)
347 25113 : aa_planar_section => section_vals_get_subs_vals(dbc_section, "AA_PLANAR")
348 25113 : planar_section => section_vals_get_subs_vals(dbc_section, "PLANAR")
349 25113 : aa_cylindrical_section => section_vals_get_subs_vals(dbc_section, "AA_CYLINDRICAL")
350 25113 : aa_cuboidal_section => section_vals_get_subs_vals(dbc_section, "AA_CUBOIDAL")
351 25113 : CALL section_vals_get(aa_planar_section, explicit=aa_planar_explicit, n_repetition=n_aap_rep)
352 25113 : CALL section_vals_get(planar_section, explicit=planar_explicit, n_repetition=n_p_rep)
353 25113 : CALL section_vals_get(aa_cylindrical_section, explicit=aa_cylindrical_explicit, n_repetition=n_aacyl_rep)
354 25113 : CALL section_vals_get(aa_cuboidal_section, explicit=aa_cuboidal_explicit, n_repetition=n_aac_rep)
355 :
356 25113 : IF (params%solver == pw_poisson_implicit) THEN
357 :
358 54 : IF (aa_planar_explicit) THEN
359 16 : 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 400 : params%dbc_params%aa_planar_is_periodic(n_aap_rep))
372 16 : NULLIFY (aa_planar_nprtn, aa_planar_xxtnt, aa_planar_yxtnt, aa_planar_zxtnt)
373 40 : DO i = 1, n_aap_rep
374 24 : CALL section_vals_val_get(aa_planar_section, "v_D", i_rep_section=i, r_val=v_D)
375 24 : CALL section_vals_val_get(aa_planar_section, "OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
376 24 : CALL section_vals_val_get(aa_planar_section, "FREQUENCY", i_rep_section=i, r_val=freq)
377 24 : CALL section_vals_val_get(aa_planar_section, "PHASE", i_rep_section=i, r_val=phase)
378 24 : CALL section_vals_val_get(aa_planar_section, "SIGMA", i_rep_section=i, r_val=sigma)
379 24 : CALL section_vals_val_get(aa_planar_section, "THICKNESS", i_rep_section=i, r_val=thickness)
380 24 : CALL section_vals_val_get(aa_planar_section, "PERIODIC_REGION", i_rep_section=i, l_val=is_periodic)
381 24 : params%dbc_params%aa_planar_vD(i) = v_D
382 24 : params%dbc_params%aa_planar_frequency(i) = freq
383 24 : params%dbc_params%aa_planar_phase(i) = phase
384 24 : params%dbc_params%aa_planar_osc_frac(i) = osc_frac
385 24 : params%dbc_params%aa_planar_sigma(i) = sigma
386 24 : params%dbc_params%aa_planar_thickness(i) = thickness
387 24 : params%dbc_params%aa_planar_is_periodic(i) = is_periodic
388 :
389 24 : CALL section_vals_val_get(aa_planar_section, "PARALLEL_PLANE", i_rep_section=i, i_val=parallel_plane)
390 24 : CALL section_vals_val_get(aa_planar_section, "INTERCEPT", i_rep_section=i, r_val=intercept)
391 40 : SELECT CASE (parallel_plane)
392 : CASE (xy_plane)
393 2 : params%dbc_params%aa_planar_pplane(i) = xy_plane
394 2 : CALL section_vals_val_get(aa_planar_section, "X_xtnt", i_rep_section=i, r_vals=aa_planar_xxtnt)
395 2 : CALL section_vals_val_get(aa_planar_section, "Y_xtnt", i_rep_section=i, r_vals=aa_planar_yxtnt)
396 6 : params%dbc_params%aa_planar_xxtnt(:, i) = aa_planar_xxtnt
397 6 : params%dbc_params%aa_planar_yxtnt(:, i) = aa_planar_yxtnt
398 6 : params%dbc_params%aa_planar_zxtnt(:, i) = intercept
399 :
400 2 : CALL section_vals_val_get(aa_planar_section, "N_PRTN", i_rep_section=i, i_vals=aa_planar_nprtn)
401 2 : params%dbc_params%aa_planar_nprtn(1, i) = aa_planar_nprtn(1)
402 2 : params%dbc_params%aa_planar_nprtn(2, i) = aa_planar_nprtn(2)
403 2 : params%dbc_params%aa_planar_nprtn(3, i) = 1
404 : CASE (yz_plane)
405 20 : params%dbc_params%aa_planar_pplane(i) = yz_plane
406 20 : CALL section_vals_val_get(aa_planar_section, "Y_xtnt", i_rep_section=i, r_vals=aa_planar_yxtnt)
407 20 : CALL section_vals_val_get(aa_planar_section, "Z_xtnt", i_rep_section=i, r_vals=aa_planar_zxtnt)
408 60 : params%dbc_params%aa_planar_xxtnt(:, i) = intercept
409 60 : params%dbc_params%aa_planar_yxtnt(:, i) = aa_planar_yxtnt
410 60 : params%dbc_params%aa_planar_zxtnt(:, i) = aa_planar_zxtnt
411 :
412 20 : CALL section_vals_val_get(aa_planar_section, "N_PRTN", i_rep_section=i, i_vals=aa_planar_nprtn)
413 20 : params%dbc_params%aa_planar_nprtn(1, i) = 1
414 20 : params%dbc_params%aa_planar_nprtn(2, i) = aa_planar_nprtn(1)
415 20 : params%dbc_params%aa_planar_nprtn(3, i) = aa_planar_nprtn(2)
416 : CASE (xz_plane)
417 2 : params%dbc_params%aa_planar_pplane(i) = xz_plane
418 2 : CALL section_vals_val_get(aa_planar_section, "X_xtnt", i_rep_section=i, r_vals=aa_planar_xxtnt)
419 2 : CALL section_vals_val_get(aa_planar_section, "Z_xtnt", i_rep_section=i, r_vals=aa_planar_zxtnt)
420 6 : params%dbc_params%aa_planar_xxtnt(:, i) = aa_planar_xxtnt
421 6 : params%dbc_params%aa_planar_yxtnt(:, i) = intercept
422 6 : params%dbc_params%aa_planar_zxtnt(:, i) = aa_planar_zxtnt
423 :
424 2 : CALL section_vals_val_get(aa_planar_section, "N_PRTN", i_rep_section=i, i_vals=aa_planar_nprtn)
425 2 : params%dbc_params%aa_planar_nprtn(1, i) = aa_planar_nprtn(1)
426 2 : params%dbc_params%aa_planar_nprtn(2, i) = 1
427 26 : params%dbc_params%aa_planar_nprtn(3, i) = aa_planar_nprtn(2)
428 : END SELECT
429 :
430 : END DO
431 : ELSE
432 38 : params%dbc_params%n_aa_planar = 0
433 : END IF
434 :
435 54 : IF (planar_explicit) THEN
436 6 : 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 138 : params%dbc_params%planar_is_periodic(n_p_rep))
448 6 : NULLIFY (planar_nprtn, planar_Avtx, planar_Bvtx, planar_Cvtx)
449 12 : DO i = 1, n_p_rep
450 6 : CALL section_vals_val_get(planar_section, "N_PRTN", i_rep_section=i, i_vals=planar_nprtn)
451 6 : CALL section_vals_val_get(planar_section, "A", i_rep_section=i, r_vals=planar_Avtx)
452 6 : CALL section_vals_val_get(planar_section, "B", i_rep_section=i, r_vals=planar_Bvtx)
453 6 : CALL section_vals_val_get(planar_section, "C", i_rep_section=i, r_vals=planar_Cvtx)
454 6 : CALL section_vals_val_get(planar_section, "v_D", i_rep_section=i, r_val=v_D)
455 6 : CALL section_vals_val_get(planar_section, "OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
456 6 : CALL section_vals_val_get(planar_section, "FREQUENCY", i_rep_section=i, r_val=freq)
457 6 : CALL section_vals_val_get(planar_section, "PHASE", i_rep_section=i, r_val=phase)
458 6 : CALL section_vals_val_get(planar_section, "SIGMA", i_rep_section=i, r_val=sigma)
459 6 : CALL section_vals_val_get(planar_section, "THICKNESS", i_rep_section=i, r_val=thickness)
460 18 : params%dbc_params%planar_nprtn(:, i) = planar_nprtn
461 24 : params%dbc_params%planar_Avtx(:, i) = planar_Avtx
462 24 : params%dbc_params%planar_Bvtx(:, i) = planar_Bvtx
463 24 : params%dbc_params%planar_Cvtx(:, i) = planar_Cvtx
464 6 : params%dbc_params%planar_vD(i) = v_D
465 6 : params%dbc_params%planar_frequency(i) = freq
466 6 : params%dbc_params%planar_phase(i) = phase
467 6 : params%dbc_params%planar_osc_frac(i) = osc_frac
468 6 : params%dbc_params%planar_sigma(i) = sigma
469 6 : params%dbc_params%planar_thickness(i) = thickness
470 18 : params%dbc_params%planar_is_periodic(i) = .FALSE. ! periodic not yet implemented
471 : END DO
472 : ELSE
473 48 : params%dbc_params%n_planar = 0
474 : END IF
475 :
476 54 : IF (aa_cylindrical_explicit) THEN
477 10 : 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 310 : params%dbc_params%aa_cylindrical_is_periodic(n_aacyl_rep))
493 10 : NULLIFY (aa_cylindrical_nprtn, aa_cylindrical_xtnt, aa_cylindrical_bctr)
494 22 : DO i = 1, n_aacyl_rep
495 12 : CALL section_vals_val_get(aa_cylindrical_section, "PARALLEL_AXIS", i_rep_section=i, i_val=parallel_axis)
496 12 : CALL section_vals_val_get(aa_cylindrical_section, "N_PRTN", i_rep_section=i, i_vals=aa_cylindrical_nprtn)
497 12 : CALL section_vals_val_get(aa_cylindrical_section, "N_SIDES", i_rep_section=i, i_val=aa_cylindrical_nsides)
498 12 : CALL section_vals_val_get(aa_cylindrical_section, "APX_TYPE", i_rep_section=i, i_val=aa_cylindrical_apxtyp)
499 12 : CALL section_vals_val_get(aa_cylindrical_section, "xtnt", i_rep_section=i, r_vals=aa_cylindrical_xtnt)
500 12 : CALL section_vals_val_get(aa_cylindrical_section, "BASE_CENTER", i_rep_section=i, r_vals=aa_cylindrical_bctr)
501 12 : CALL section_vals_val_get(aa_cylindrical_section, "BASE_RADIUS", i_rep_section=i, r_val=aa_cylindrical_brad)
502 12 : CALL section_vals_val_get(aa_cylindrical_section, "v_D", i_rep_section=i, r_val=v_D)
503 12 : CALL section_vals_val_get(aa_cylindrical_section, "OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
504 12 : CALL section_vals_val_get(aa_cylindrical_section, "FREQUENCY", i_rep_section=i, r_val=freq)
505 12 : CALL section_vals_val_get(aa_cylindrical_section, "PHASE", i_rep_section=i, r_val=phase)
506 12 : CALL section_vals_val_get(aa_cylindrical_section, "SIGMA", i_rep_section=i, r_val=sigma)
507 12 : CALL section_vals_val_get(aa_cylindrical_section, "THICKNESS", i_rep_section=i, r_val=thickness)
508 12 : CALL section_vals_val_get(aa_cylindrical_section, "delta_alpha", i_rep_section=i, r_val=delta_alpha)
509 12 : params%dbc_params%aa_cylindrical_paxis(i) = parallel_axis
510 36 : params%dbc_params%aa_cylindrical_nprtn(:, i) = aa_cylindrical_nprtn
511 12 : params%dbc_params%aa_cylindrical_nsides(i) = aa_cylindrical_nsides
512 12 : params%dbc_params%aa_cylindrical_apxtyp(i) = aa_cylindrical_apxtyp
513 36 : params%dbc_params%aa_cylindrical_xtnt(:, i) = aa_cylindrical_xtnt
514 36 : params%dbc_params%aa_cylindrical_bctr(:, i) = aa_cylindrical_bctr
515 12 : params%dbc_params%aa_cylindrical_brad(i) = aa_cylindrical_brad
516 12 : params%dbc_params%aa_cylindrical_vD(i) = v_D
517 12 : params%dbc_params%aa_cylindrical_frequency(i) = freq
518 12 : params%dbc_params%aa_cylindrical_phase(i) = phase
519 12 : params%dbc_params%aa_cylindrical_osc_frac(i) = osc_frac
520 12 : params%dbc_params%aa_cylindrical_sigma(i) = sigma
521 12 : params%dbc_params%aa_cylindrical_thickness(i) = thickness
522 12 : params%dbc_params%aa_cylindrical_sgap(i) = delta_alpha
523 58 : params%dbc_params%aa_cylindrical_is_periodic(i) = .FALSE. ! periodic not yet implemented
524 : END DO
525 : ELSE
526 44 : params%dbc_params%n_aa_cylindrical = 0
527 88 : ALLOCATE (params%dbc_params%aa_cylindrical_nsides(n_aacyl_rep))
528 : END IF
529 :
530 54 : IF (aa_cuboidal_explicit) THEN
531 6 : 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 126 : params%dbc_params%aa_cuboidal_is_periodic(n_aac_rep))
542 6 : NULLIFY (aa_cuboidal_nprtn, aa_cuboidal_xxtnt, aa_cuboidal_yxtnt, aa_cuboidal_zxtnt)
543 12 : DO i = 1, n_aac_rep
544 6 : CALL section_vals_val_get(aa_cuboidal_section, "N_PRTN", i_rep_section=i, i_vals=aa_cuboidal_nprtn)
545 6 : CALL section_vals_val_get(aa_cuboidal_section, "X_xtnt", i_rep_section=i, r_vals=aa_cuboidal_xxtnt)
546 6 : CALL section_vals_val_get(aa_cuboidal_section, "Y_xtnt", i_rep_section=i, r_vals=aa_cuboidal_yxtnt)
547 6 : CALL section_vals_val_get(aa_cuboidal_section, "Z_xtnt", i_rep_section=i, r_vals=aa_cuboidal_zxtnt)
548 6 : CALL section_vals_val_get(aa_cuboidal_section, "v_D", i_rep_section=i, r_val=v_D)
549 6 : CALL section_vals_val_get(aa_cuboidal_section, "OSCILLATING_FRACTION", i_rep_section=i, r_val=osc_frac)
550 6 : CALL section_vals_val_get(aa_cuboidal_section, "FREQUENCY", i_rep_section=i, r_val=freq)
551 6 : CALL section_vals_val_get(aa_cuboidal_section, "PHASE", i_rep_section=i, r_val=phase)
552 6 : CALL section_vals_val_get(aa_cuboidal_section, "SIGMA", i_rep_section=i, r_val=sigma)
553 6 : CALL section_vals_val_get(aa_cuboidal_section, "PERIODIC_REGION", i_rep_section=i, l_val=is_periodic)
554 24 : params%dbc_params%aa_cuboidal_nprtn(:, i) = aa_cuboidal_nprtn
555 18 : params%dbc_params%aa_cuboidal_xxtnt(:, i) = aa_cuboidal_xxtnt
556 18 : params%dbc_params%aa_cuboidal_yxtnt(:, i) = aa_cuboidal_yxtnt
557 18 : params%dbc_params%aa_cuboidal_zxtnt(:, i) = aa_cuboidal_zxtnt
558 6 : params%dbc_params%aa_cuboidal_vD(i) = v_D
559 6 : params%dbc_params%aa_cuboidal_frequency(i) = freq
560 6 : params%dbc_params%aa_cuboidal_phase(i) = phase
561 6 : params%dbc_params%aa_cuboidal_osc_frac(i) = osc_frac
562 6 : params%dbc_params%aa_cuboidal_sigma(i) = sigma
563 18 : params%dbc_params%aa_cuboidal_is_periodic(i) = is_periodic
564 : END DO
565 : ELSE
566 48 : params%dbc_params%n_aa_cuboidal = 0
567 : END IF
568 :
569 : END IF
570 :
571 25113 : END SUBROUTINE dirichlet_bc_read_parameters
572 :
573 : END MODULE pw_poisson_read_input
|