LCOV - code coverage report
Current view: top level - src - smeagol_control_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 66.9 % 124 83
Test Date: 2025-12-04 06:27:48 Functions: 57.1 % 7 4

            Line data    Source code
       1              : !--------------------------------------------------------------------------------------------------!
       2              : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3              : !   Copyright 2000-2025 CP2K developers group <https://cp2k.org>                                   !
       4              : !                                                                                                  !
       5              : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6              : !--------------------------------------------------------------------------------------------------!
       7              : 
       8              : ! **************************************************************************************************
       9              : !> \brief Input control types for NEGF/SMEAGOL transport calculations.
      10              : !> \author Sergey Chulkov
      11              : !> \author Christian Ahart
      12              : !> \author Clotilde Cucinotta
      13              : ! **************************************************************************************************
      14              : 
      15              : MODULE smeagol_control_types
      16              :    USE cp_units, ONLY: cp_unit_from_cp2k
      17              :    USE input_constants, ONLY: smeagol_bulklead_leftright, &
      18              :                               smeagol_gridmethod_traditional, &
      19              :                               smeagol_integraltype_gauss_legendre, &
      20              :                               smeagol_runtype_bulktransport, &
      21              :                               smeagol_runtype_emtransport
      22              :    USE input_section_types, ONLY: section_vals_get, &
      23              :                                   section_vals_get_subs_vals, &
      24              :                                   section_vals_type, &
      25              :                                   section_vals_val_get
      26              :    USE kinds, ONLY: default_string_length, &
      27              :                     dp
      28              :    USE physcon, ONLY: kelvin
      29              :    USE string_utilities, ONLY: integer_to_string
      30              :    USE util, ONLY: sort
      31              : #include "./base/base_uses.f90"
      32              :    #:include 'input_cp2k_smeagol.fypp'
      33              : 
      34              :    IMPLICIT NONE
      35              :    PRIVATE
      36              : 
      37              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'smeagol_control_types'
      38              : 
      39              :    PUBLIC :: smeagol_control_type
      40              :    PUBLIC :: smeagol_control_create, smeagol_control_release, read_smeagol_control
      41              : 
      42              : ! **************************************************************************************************
      43              : !> \brief SMEAGOL-related input parameters
      44              : ! **************************************************************************************************
      45              :    TYPE smeagol_control_type
      46              :       LOGICAL                                            :: smeagol_enabled = .FALSE.
      47              : 
      48              :       !> type of calculation
      49              :       INTEGER                                            :: run_type = smeagol_runtype_bulktransport
      50              : 
      51              :       !> regression test mode
      52              :       LOGICAL                                            :: do_regtest = .FALSE.
      53              : 
      54              :       !> current-induced forces. It is set automatically based on GLOBAL/run_type
      55              :       LOGICAL                                            :: emforces = .FALSE.
      56              : 
      57              :       !> scale factor to convert from CP2K (Hartree) to SMEAGOL (Rydberg) default energy unit
      58              :       REAL(kind=dp)                                      :: to_smeagol_energy_units = 2.0_dp
      59              : 
      60              :       !> number of cell images along i and j cell vectors
      61              :       INTEGER, DIMENSION(2)                              :: n_cell_images = (/1, 1/)
      62              : 
      63              :       !> what lead (bulk transport calculation)
      64              :       INTEGER                                            :: lead_label = smeagol_bulklead_leftright
      65              : 
      66              :       !> The length of the SMEAGOL project name is limited by 20 characters (hardcoded in SMEAGOL)
      67              :       CHARACTER(len=20)                                  :: project_name = "PROJECT_NAME"
      68              : 
      69              :       TYPE(smeagol_aux_control_type), POINTER            :: aux => NULL()
      70              : 
      71              :    END TYPE smeagol_control_type
      72              : 
      73              : ! **************************************************************************************************
      74              : !> \brief SMEAGOL-related auxiliary input parameters. They remain unallocated when
      75              : !>        SMEAGOL support is disabled.
      76              : ! **************************************************************************************************
      77              :    TYPE smeagol_aux_control_type
      78              :       !> MD or GEO_OPT iteration. In contrast with other components of smeagol_control_type that are read from the input file,
      79              :       !> these variables are initialised at the first NEGF iteration.
      80              :       !>
      81              :       !> index of MD or GEO_OPT iteration level.
      82              :       !> 0 if there is neither MD nor GEO_OPT iteration level (e.g. single-point energy calculation).
      83              :       !> -1 if it is not initialised by run_smeagol_emtrans() subroutine
      84              :       INTEGER                                            :: md_iter_level = -1
      85              :       !> The starting step value for MD / GEO_OPT iterations. The default value 0 can be overrited via STEP_START_VAL input keyword.
      86              :       INTEGER                                            :: md_first_step = 0
      87              : 
      88              :       !> BS.SubSystemsDelta(1:BS.Subsystems)
      89              :       REAL(kind=dp), ALLOCATABLE, DIMENSION(:)           :: deltabss_bs
      90              :       !> BS.SubSystemsBoundaries(1:BS.Subsystems, 1:2)
      91              :       INTEGER, ALLOCATABLE, DIMENSION(:, :)              :: nebss_bs
      92              :       !>
      93              :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: atomlist_bs
      94              : 
      95              :       REAL(kind=dp)                                      :: temperature = 300.0_dp/kelvin
      96              : 
      97              :       ! reademtr()
      98              :       #:for name1, keyword1, val1 in reademtr_local_llist
      99              :          LOGICAL                                            :: ${name1}$ = ${val1}$
     100              :       #:endfor
     101              : 
     102              :       #:for name1, keyword1, val1, unit1 in reademtr_local_explicit_plist
     103              :          LOGICAL                                            :: isexplicit_${name1}$ = .FALSE.
     104              :       #:endfor
     105              : 
     106              :       #:for name1, keyword1, val1 in reademtr_negfmod_llist
     107              :          LOGICAL                                            :: ${name1}$ = ${val1}$
     108              :       #:endfor
     109              : 
     110              :       #:for name1, keyword1, val1 in reademtr_negfcoop_llist
     111              :          LOGICAL                                            :: ${name1}$ = ${val1}$
     112              :       #:endfor
     113              : 
     114              :       #:for name1, keyword1, val1 in reademtr_local_ilist
     115              :          INTEGER                                            :: ${name1}$ = ${val1}$
     116              :       #:endfor
     117              : 
     118              :       #:for name1, keyword1, val1 in reademtr_negfmod_ilist
     119              :          INTEGER                                            :: ${name1}$ = ${val1}$
     120              :       #:endfor
     121              : 
     122              :       #:for name1, keyword1, val1 in reademtr_negfcoop_ilist
     123              :          INTEGER                                            :: ${name1}$ = ${val1}$
     124              :       #:endfor
     125              : 
     126              :       #:for name1, keyword1, val1 in reademtr_local_rlist
     127              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     128              :       #:endfor
     129              : 
     130              :       #:for name1, keyword1, val1 in reademtr_negfmod_rlist
     131              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     132              :       #:endfor
     133              : 
     134              :       #:for name1, keyword1, val1, unit1 in reademtr_local_plist
     135              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     136              :       #:endfor
     137              : 
     138              :       #:for name1, keyword1, val1, unit1 in reademtr_local_explicit_plist
     139              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     140              :       #:endfor
     141              : 
     142              :       #:for name1, keyword1, val1, unit1 in reademtr_negfmod_rydberg_plist
     143              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     144              :       #:endfor
     145              : 
     146              :       #:for name1, keyword1, val1, unit1 in reademtr_negfmod_plist
     147              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     148              :       #:endfor
     149              : 
     150              :       ! ReadOptionsNEGF_DFT()
     151              :       #:for name1, keyword1, val1 in readoptsnegf_negfmod_llist
     152              :          LOGICAL                                            :: ${name1}$ = ${val1}$
     153              :       #:endfor
     154              : 
     155              :       #:for name1, keyword1, val1, unit1 in readoptsnegf_negfmod_explicit_plist
     156              :          LOGICAL                                            :: isexplicit_${name1}$ = .FALSE.
     157              :       #:endfor
     158              : 
     159              :       #:for name1, keyword1, val1 in readoptsnegf_negfmod_ilist
     160              :          INTEGER                                            :: ${name1}$ = ${val1}$
     161              :       #:endfor
     162              : 
     163              :       #:for name1, keyword1, val1 in readoptsnegf_negfmod_rlist
     164              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     165              :       #:endfor
     166              : 
     167              :       #:for name1, keyword1, val1, unit1 in readoptsnegf_negfmod_explicit_plist
     168              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     169              :       #:endfor
     170              : 
     171              :       #:for name1, keyword1, val1, unit1 in readoptsnegf_bfield_rydberg_plist
     172              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     173              :       #:endfor
     174              : 
     175              :       ! emtrans_options()
     176              :       INTEGER                                            :: gridmethod = smeagol_gridmethod_traditional
     177              :       INTEGER                                            :: integraltype = smeagol_integraltype_gauss_legendre
     178              : 
     179              :       #:for name1, keyword1, val1 in emtoptions_negfmod_llist
     180              :          LOGICAL                                            :: ${name1}$ = ${val1}$
     181              :       #:endfor
     182              : 
     183              :       #:for name1, keyword1, val1, unit1 in emtoptions_local_explicit_ilist
     184              :          LOGICAL                                            :: isexplicit_${name1}$ = .FALSE.
     185              :       #:endfor
     186              : 
     187              :       #:for name1, keyword1, val1, unit1 in emtoptions_negfmod_explicit_ilist
     188              :          LOGICAL                                            :: isexplicit_${name1}$ = .FALSE.
     189              :       #:endfor
     190              : 
     191              :       #:for name1, keyword1, val1, unit1 in emtoptions_negfmod_explicit_rlist
     192              :          LOGICAL                                            :: isexplicit_${name1}$ = .FALSE.
     193              :       #:endfor
     194              : 
     195              :       #:for name1, keyword1, val1 in emtoptions_local_ilist
     196              :          INTEGER                                            :: ${name1}$ = ${val1}$
     197              :       #:endfor
     198              : 
     199              :       #:for name1, keyword1, val1 in emtoptions_local_explicit_ilist
     200              :          INTEGER                                            :: ${name1}$ = ${val1}$
     201              :       #:endfor
     202              : 
     203              :       #:for name1, keyword1, val1 in emtoptions_negfmod_ilist
     204              :          INTEGER                                            :: ${name1}$ = ${val1}$
     205              :       #:endfor
     206              : 
     207              :       #:for name1, keyword1, val1 in emtoptions_negfmod_explicit_ilist
     208              :          INTEGER                                            :: ${name1}$ = ${val1}$
     209              :       #:endfor
     210              : 
     211              :       #:for name1, keyword1, val1 in emtoptions_sigma_ilist
     212              :          INTEGER                                            :: ${name1}$ = ${val1}$
     213              :       #:endfor
     214              : 
     215              :       #:for name1, keyword1, val1 in emtoptions_negfmod_rlist
     216              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     217              :       #:endfor
     218              : 
     219              :       #:for name1, keyword1, val1 in emtoptions_negfmod_explicit_rlist
     220              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     221              :       #:endfor
     222              : 
     223              :       #:for name1, keyword1, val1, unit1 in emtoptions_negfmod_rydberg_plist
     224              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     225              :       #:endfor
     226              : 
     227              :       ! interface options
     228              :       #:for name1, keyword1, val1, unit1 in smeagol_interface_local_plist
     229              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     230              :       #:endfor
     231              :       #:for name1, keyword1, val1, unit1 in smeagol_interface_local_explicit_plist
     232              :          REAL(kind=dp)                                      :: ${name1}$ = ${val1}$
     233              :       #:endfor
     234              :       #:for name1, keyword1, val1, unit1 in smeagol_interface_local_explicit_plist
     235              :          LOGICAL                                            :: isexplicit_${name1}$ = .FALSE.
     236              :       #:endfor
     237              : 
     238              :    END TYPE smeagol_aux_control_type
     239              : CONTAINS
     240              : 
     241              : ! **************************************************************************************************
     242              : !> \brief allocate control options for SMEAGOL calculation
     243              : !> \param smeagol_control an object to create
     244              : ! **************************************************************************************************
     245        14888 :    SUBROUTINE smeagol_control_create(smeagol_control)
     246              :       TYPE(smeagol_control_type), POINTER                :: smeagol_control
     247              : 
     248              :       CHARACTER(len=*), PARAMETER :: routineN = 'smeagol_control_create'
     249              : 
     250              :       INTEGER                                            :: handle
     251              : 
     252         7444 :       CPASSERT(.NOT. ASSOCIATED(smeagol_control))
     253         7444 :       CALL timeset(routineN, handle)
     254              : 
     255        29776 :       ALLOCATE (smeagol_control)
     256              : #if defined(__SMEAGOL)
     257         7444 :       ALLOCATE (smeagol_control%aux)
     258              : #else
     259              :       NULLIFY (smeagol_control%aux)
     260              : #endif
     261              : 
     262         7444 :       CALL timestop(handle)
     263         7444 :    END SUBROUTINE smeagol_control_create
     264              : 
     265              : ! **************************************************************************************************
     266              : !> \brief release SMEAGOL control object
     267              : !> \param smeagol_control an object to release
     268              : ! **************************************************************************************************
     269         7444 :    SUBROUTINE smeagol_control_release(smeagol_control)
     270              :       TYPE(smeagol_control_type), POINTER                :: smeagol_control
     271              : 
     272              :       CHARACTER(len=*), PARAMETER :: routineN = 'smeagol_control_release'
     273              : 
     274              :       INTEGER                                            :: handle
     275              : 
     276         7444 :       CALL timeset(routineN, handle)
     277              : 
     278         7444 :       IF (ASSOCIATED(smeagol_control)) THEN
     279         7444 :          IF (ASSOCIATED(smeagol_control%aux)) THEN
     280         7444 :             IF (ALLOCATED(smeagol_control%aux%nebss_bs)) DEALLOCATE (smeagol_control%aux%nebss_bs)
     281         7444 :             IF (ALLOCATED(smeagol_control%aux%deltabss_bs)) DEALLOCATE (smeagol_control%aux%deltabss_bs)
     282         7444 :             IF (ALLOCATED(smeagol_control%aux%atomlist_bs)) DEALLOCATE (smeagol_control%aux%atomlist_bs)
     283              : 
     284         7444 :             DEALLOCATE (smeagol_control%aux)
     285              :          END IF
     286         7444 :          DEALLOCATE (smeagol_control)
     287              :       END IF
     288              : 
     289         7444 :       CALL timestop(handle)
     290         7444 :    END SUBROUTINE smeagol_control_release
     291              : 
     292              : ! **************************************************************************************************
     293              : !> \brief Read SMEAGOL-related input parameters.
     294              : !> \param smeagol_control SMEAGOL control parameters
     295              : !> \param smeagol_section SMEAGOL input section
     296              : ! **************************************************************************************************
     297         7444 :    SUBROUTINE read_smeagol_control(smeagol_control, smeagol_section)
     298              :       TYPE(smeagol_control_type), POINTER                :: smeagol_control
     299              :       TYPE(section_vals_type), POINTER                   :: smeagol_section
     300              : 
     301              :       CHARACTER(len=*), PARAMETER :: routineN = 'read_smeagol_control'
     302              : 
     303              :       CHARACTER(len=default_string_length)               :: project_name
     304              :       INTEGER                                            :: handle
     305         7444 :       INTEGER, DIMENSION(:), POINTER                     :: n_cell_images_ptr
     306              : 
     307         7444 :       CALL timeset(routineN, handle)
     308              : 
     309         7444 :       CALL section_vals_val_get(smeagol_section, "_SECTION_PARAMETERS_", l_val=smeagol_control%smeagol_enabled)
     310              : 
     311              :       ! SMEAGOL project name
     312         7444 :       CALL section_vals_val_get(smeagol_section, "PROJECT_NAME", c_val=project_name)
     313         7444 :       smeagol_control%project_name = project_name(:20)
     314         7444 :       IF (smeagol_control%smeagol_enabled .AND. smeagol_control%project_name /= project_name) THEN
     315              :          CALL cp_warn(__LOCATION__, &
     316              :                       "SMEAGOL limits the length of the project name to 20 characters. "// &
     317            0 :                       "The project name is truncated to '"//TRIM(smeagol_control%project_name)//"'.")
     318              :       END IF
     319              : 
     320              :       ! reademtr() enum keywords
     321         7444 :       CALL section_vals_val_get(smeagol_section, "RUN_TYPE", i_val=smeagol_control%run_type)
     322              : 
     323              : #if !defined(__SMEAGOL)
     324              :       IF (smeagol_control%run_type == smeagol_runtype_emtransport) THEN
     325              :          CALL cp_abort(__LOCATION__, &
     326              :                        "CP2K was compiled with no SMEAGOL support. SMEAGOL RUN_TYPE EMTransport is not available")
     327              :       END IF
     328              : #endif
     329              : 
     330         7444 :       CALL section_vals_val_get(smeagol_section, "REGRESSION_TEST", l_val=smeagol_control%do_regtest)
     331              : 
     332         7444 :       CALL section_vals_val_get(smeagol_section, "BulkLead", i_val=smeagol_control%lead_label)
     333              : 
     334              :       ! NOTE: keyword NIMAGES_IJ seems to be identical to ignored SMEAGOL keywords BulkTransvCellSizeX and BulkTransvCellSizeY
     335         7444 :       NULLIFY (n_cell_images_ptr)
     336         7444 :       CALL section_vals_val_get(smeagol_section, "NIMAGES_IJ", i_vals=n_cell_images_ptr)
     337        37220 :       smeagol_control%n_cell_images(1:2) = n_cell_images_ptr(1:2)
     338              : 
     339              :       ! Hartree > Rydberg scaling factor
     340         7444 :       smeagol_control%to_smeagol_energy_units = cp_unit_from_cp2k(1.0_dp, "RY")
     341              : 
     342         7444 :       IF (ASSOCIATED(smeagol_control%aux)) CALL read_smeagol_aux_control(smeagol_control%aux, smeagol_section)
     343              : 
     344         7444 :       CALL timestop(handle)
     345         7444 :    END SUBROUTINE read_smeagol_control
     346              : 
     347              : ! **************************************************************************************************
     348              : !> \brief Read SMEAGOL-related auxiliary input parameters.
     349              : !> \param smeagol_control SMEAGOL control parameters
     350              : !> \param smeagol_section SMEAGOL input section
     351              : ! **************************************************************************************************
     352         7444 :    SUBROUTINE read_smeagol_aux_control(smeagol_control, smeagol_section)
     353              :       TYPE(smeagol_aux_control_type), POINTER            :: smeagol_control
     354              :       TYPE(section_vals_type), POINTER                   :: smeagol_section
     355              : 
     356              :       CHARACTER(len=*), PARAMETER :: routineN = 'read_smeagol_aux_control'
     357              : 
     358              :       CHARACTER(len=default_string_length)               :: nvals_str
     359              :       INTEGER                                            :: handle, i, n, nrep, n_unique
     360         7444 :       INTEGER, ALLOCATABLE, DIMENSION(:)                 :: ivec, indices
     361         7444 :       INTEGER, DIMENSION(:), POINTER                     :: iptr
     362              :       LOGICAL                                            :: is_explicit, do_abort
     363         7444 :       REAL(kind=dp), DIMENSION(:), POINTER               :: rptr
     364              :       TYPE(section_vals_type), POINTER                   :: subsection
     365              : 
     366         7444 :       CALL timeset(routineN, handle)
     367              : 
     368         7444 :       smeagol_control%md_iter_level = -1
     369         7444 :       smeagol_control%md_first_step = 0
     370              : 
     371         7444 :       CALL section_vals_val_get(smeagol_section, "TEMPERATURE", r_val=smeagol_control%temperature)
     372              : 
     373              :       ! reademtr() logical keywords
     374              :       ! The following keywords (variables) that are part of the reademtr_local_llist list are read but unused
     375              :       ! CB.WriteComplexBands (WriteComplexBands = .FALSE.) unimplemented.
     376              :       ! Presumably, some of these keywords should be removed.
     377              :       #:for name1, keyword1, val1 in reademtr_local_llist
     378         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", l_val=smeagol_control%${name1}$)
     379              :       #:endfor
     380              :       #:for name1, keyword1, val1 in reademtr_negfmod_llist
     381         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", l_val=smeagol_control%${name1}$)
     382              :       #:endfor
     383              :       #:for name1, keyword1, val1 in reademtr_negfcoop_llist
     384         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", l_val=smeagol_control%${name1}$)
     385              :       #:endfor
     386              : 
     387              :       ! reademtr() integer keywords
     388              :       #:for name1, keyword1, val1 in reademtr_local_ilist
     389         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     390              :       #:endfor
     391              :       #:for name1, keyword1, val1 in reademtr_negfmod_ilist
     392         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     393              :       #:endfor
     394              :       #:for name1, keyword1, val1 in reademtr_negfcoop_ilist
     395         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     396              :       #:endfor
     397              : 
     398              :       ! reademtr() real-valued keywords
     399              :       #:for name1, keyword1, val1 in reademtr_local_rlist
     400         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     401              :       #:endfor
     402              :       #:for name1, keyword1, val1 in reademtr_negfmod_rlist
     403         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     404              :       #:endfor
     405              : 
     406              :       ! reademtr() physical-valued keywords
     407              :       #:for name1, keyword1, val1, unit1 in reademtr_local_plist
     408         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     409              :       #:endfor
     410              :       #:for name1, keyword1, val1, unit1 in reademtr_local_explicit_plist
     411              :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", &
     412              :                                    r_val=smeagol_control%${name1}$, &
     413         7444 :                                    explicit=smeagol_control%isexplicit_${name1}$)
     414              :       #:endfor
     415              :       #:for name1, keyword1, val1, unit1 in reademtr_negfmod_rydberg_plist
     416         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     417              :       #:endfor
     418              :       #:for name1, keyword1, val1, unit1 in reademtr_negfmod_plist
     419         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     420              :       #:endfor
     421              : 
     422              :       ! ReadOptionsNEGF_DFT() logical keywords
     423              :       #:for name1, keyword1, val1 in readoptsnegf_negfmod_llist
     424         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", l_val=smeagol_control%${name1}$)
     425              :       #:endfor
     426              : 
     427              :       ! ReadOptionsNEGF_DFT() integer keywords
     428              :       #:for name1, keyword1, val1 in readoptsnegf_negfmod_ilist
     429         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     430              :       #:endfor
     431              : 
     432              :       ! ReadOptionsNEGF_DFT() real-valued keywords
     433              :       #:for name1, keyword1, val1 in readoptsnegf_negfmod_rlist
     434         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     435              :       #:endfor
     436              : 
     437              :       ! ReadOptionsNEGF_DFT() physical-valued keywords
     438              :       #:for name1, keyword1, val1, unit1 in readoptsnegf_negfmod_explicit_plist
     439              :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", &
     440              :                                    r_val=smeagol_control%${name1}$, &
     441         7444 :                                    explicit=smeagol_control%isexplicit_${name1}$)
     442              :       #:endfor
     443              : 
     444              :       #:for name1, keyword1, val1, unit1 in readoptsnegf_bfield_rydberg_plist
     445         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     446              :       #:endfor
     447              : 
     448              :       ! emtrans_options() enum keywords
     449         7444 :       CALL section_vals_val_get(smeagol_section, "EnergyGridType", i_val=smeagol_control%gridmethod)
     450         7444 :       CALL section_vals_val_get(smeagol_section, "TypeOfIntegral", i_val=smeagol_control%integraltype)
     451              : 
     452              :       ! emtrans_options() logical keywords
     453              :       #:for name1, keyword1, val1 in emtoptions_negfmod_llist
     454         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", l_val=smeagol_control%${name1}$)
     455              :       #:endfor
     456              : 
     457              :       ! emtrans_options() integer keywords
     458              :       #:for name1, keyword1, val1 in emtoptions_local_ilist
     459         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     460              :       #:endfor
     461              : 
     462              :       #:for name1, keyword1, val1 in emtoptions_local_explicit_ilist
     463              :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", &
     464              :                                    i_val=smeagol_control%${name1}$, &
     465         7444 :                                    explicit=smeagol_control%isexplicit_${name1}$)
     466              :       #:endfor
     467              : 
     468              :       #:for name1, keyword1, val1 in emtoptions_negfmod_ilist
     469         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     470              :       #:endfor
     471              : 
     472              :       #:for name1, keyword1, val1 in emtoptions_negfmod_explicit_ilist
     473              :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", &
     474              :                                    i_val=smeagol_control%${name1}$, &
     475         7444 :                                    explicit=smeagol_control%isexplicit_${name1}$)
     476              :       #:endfor
     477              : 
     478              :       #:for name1, keyword1, val1 in emtoptions_sigma_ilist
     479         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", i_val=smeagol_control%${name1}$)
     480              :       #:endfor
     481              : 
     482              :       ! emtrans_options() real-valued keywords
     483              :       #:for name1, keyword1, val1 in emtoptions_negfmod_rlist
     484         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     485              :       #:endfor
     486              : 
     487              :       #:for name1, keyword1, val1 in emtoptions_negfmod_explicit_rlist
     488              :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", &
     489              :                                    r_val=smeagol_control%${name1}$, &
     490         7444 :                                    explicit=smeagol_control%isexplicit_${name1}$)
     491              :       #:endfor
     492              : 
     493              :       ! emtrans_options() physical-valued keywords
     494              :       #:for name1, keyword1, val1, unit1 in emtoptions_negfmod_rydberg_plist
     495         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     496              :       #:endfor
     497              : 
     498              :       ! interface physical-valued keywords
     499              :       #:for name1, keyword1, val1, unit1 in smeagol_interface_local_plist
     500         7444 :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", r_val=smeagol_control%${name1}$)
     501              :       #:endfor
     502              :       #:for name1, keyword1, val1, unit1 in smeagol_interface_local_explicit_plist
     503              :          CALL section_vals_val_get(smeagol_section, "${keyword1}$", &
     504              :                                    r_val=smeagol_control%${name1}$, &
     505         7444 :                                    explicit=smeagol_control%isexplicit_${name1}$)
     506              :       #:endfor
     507              : 
     508              :       ! Bound states
     509         7444 :       IF (smeagol_control%nbss <= 0) THEN
     510              :          CALL cp_abort(__LOCATION__, &
     511            0 :                        "BS.Subsystems keyword should have a positive integer value.")
     512              :       END IF
     513              : 
     514         7444 :       subsection => section_vals_get_subs_vals(smeagol_section, "BS.SubSystemsBoundaries")
     515         7444 :       CALL section_vals_get(subsection, explicit=is_explicit)
     516         7444 :       IF (is_explicit) THEN
     517            0 :          CALL section_vals_val_get(subsection, "_DEFAULT_KEYWORD_", n_rep_val=nrep, explicit=is_explicit)
     518            0 :          IF (.NOT. is_explicit) nrep = 0
     519              : 
     520            0 :          do_abort = .FALSE.
     521            0 :          IF (smeagol_control%nbss == nrep) THEN
     522            0 :             IF (is_explicit) THEN
     523            0 :                ALLOCATE (smeagol_control%nebss_bs(nrep, 2))
     524            0 :                DO i = 1, nrep
     525            0 :                   CALL section_vals_val_get(subsection, "_DEFAULT_KEYWORD_", i_rep_val=i, i_vals=iptr)
     526            0 :                   IF (SIZE(iptr) == 2) THEN
     527            0 :                      IF (MINVAL(iptr) > 0 .AND. iptr(1) <= iptr(2)) THEN
     528            0 :                         smeagol_control%nebss_bs(i, 1:2) = iptr(1:2)
     529              :                      ELSE
     530              :                         do_abort = .TRUE.
     531              :                         EXIT
     532              :                      END IF
     533              :                   ELSE
     534              :                      do_abort = .TRUE.
     535              :                      EXIT
     536              :                   END IF
     537              :                END DO
     538              :             END IF
     539              :          ELSE
     540              :             do_abort = .TRUE.
     541              :          END IF
     542              : 
     543            0 :          IF (do_abort) THEN
     544            0 :             CALL integer_to_string(smeagol_control%nbss, nvals_str)
     545              :             CALL cp_abort(__LOCATION__, &
     546              :                           "BS.SubSystemsBoundaries section is expected to have BS.Subsystems ("//TRIM(nvals_str)// &
     547            0 :                           ") lines with two positive integer numbers on each line.")
     548              :          END IF
     549              : 
     550              :       END IF
     551              : 
     552         7444 :       CALL section_vals_val_get(smeagol_section, "BS.SubSystemsDelta", explicit=is_explicit)
     553         7444 :       IF (is_explicit) THEN
     554            0 :          CALL section_vals_val_get(smeagol_section, "BS.SubSystemsDelta", r_vals=rptr)
     555            0 :          IF (smeagol_control%nbss /= SIZE(rptr)) THEN ! do negative deltas make sense ? .OR. MINVAL(rptr) < 0
     556            0 :             CALL integer_to_string(smeagol_control%nbss, nvals_str)
     557              :             CALL cp_abort(__LOCATION__, &
     558            0 :                           "BS.SubSystemsDelta keyword is expected to have BS.Subsystems ("//TRIM(nvals_str)//") real numbers.")
     559              :          END IF
     560              : 
     561            0 :          n = SIZE(rptr)
     562            0 :          ALLOCATE (smeagol_control%deltabss_bs(n))
     563            0 :          smeagol_control%deltabss_bs(1:n) = rptr(1:n)
     564              :          !ELSE allocate and set deltabss_bs() to deltamin
     565              :       END IF
     566              : 
     567         7444 :       CALL section_vals_val_get(smeagol_section, "AM.AtomListBS", explicit=is_explicit)
     568         7444 :       IF (is_explicit) THEN
     569            0 :          CALL section_vals_val_get(smeagol_section, "AM.AtomListBS", i_vals=iptr)
     570              : 
     571              :          ! subsys is not available at this stage, so we cannot check that MINVAL(iptr) <= natoms so far
     572            0 :          IF (SIZE(iptr) == 0 .OR. MINVAL(iptr) <= 0) THEN
     573              :             CALL cp_abort(__LOCATION__, &
     574            0 :                           "All atomic indices in AM.AtomListBS should be positive integer numbers.")
     575              :          END IF
     576              : 
     577            0 :          n = SIZE(iptr)
     578            0 :          ALLOCATE (ivec(n), indices(n))
     579            0 :          ivec(1:n) = iptr(1:n)
     580            0 :          CALL sort(ivec, n, indices)
     581              : 
     582            0 :          n_unique = 1
     583            0 :          DO i = 2, n
     584            0 :             IF (ivec(i) > ivec(i - 1)) n_unique = n_unique + 1
     585              :          END DO
     586              : 
     587            0 :          ALLOCATE (smeagol_control%atomlist_bs(n_unique))
     588            0 :          n_unique = 1
     589            0 :          smeagol_control%atomlist_bs(1) = ivec(1)
     590              : 
     591            0 :          DO i = 2, n
     592            0 :             IF (ivec(i) > ivec(i - 1)) THEN
     593            0 :                n_unique = n_unique + 1
     594            0 :                smeagol_control%atomlist_bs(n_unique) = ivec(i)
     595              :             END IF
     596              :          END DO
     597              :       END IF
     598              : 
     599         7444 :       CALL timestop(handle)
     600        14888 :    END SUBROUTINE read_smeagol_aux_control
     601            0 : END MODULE smeagol_control_types
        

Generated by: LCOV version 2.0-1