LCOV - code coverage report
Current view: top level - src - pw_poisson_read_input.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:cccd2f3) Lines: 99.6 % 274 273
Test Date: 2026-05-06 07:07:47 Functions: 100.0 % 6 6

            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
        

Generated by: LCOV version 2.0-1