LCOV - code coverage report
Current view: top level - src/motion - simpar_methods.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b195825) Lines: 162 166 97.6 %
Date: 2024-04-20 06:29:22 Functions: 2 2 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief  Methods for storing MD parameters type
      10             : !> \author CJM
      11             : !> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
      12             : !>         reorganization of the original routines/modules
      13             : ! **************************************************************************************************
      14             : MODULE simpar_methods
      15             :    USE bibliography,                    ONLY: Evans1983,&
      16             :                                               Kuhne2007,&
      17             :                                               Minary2003,&
      18             :                                               Rengaraj2020,&
      19             :                                               Ricci2003,&
      20             :                                               cite_reference
      21             :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      22             :                                               cp_logger_type
      23             :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      24             :                                               cp_print_key_generate_filename,&
      25             :                                               cp_print_key_unit_nr
      26             :    USE cp_units,                        ONLY: cp_unit_from_cp2k
      27             :    USE input_constants,                 ONLY: &
      28             :         isokin_ensemble, langevin_ensemble, npe_f_ensemble, npe_i_ensemble, &
      29             :         nph_uniaxial_damped_ensemble, nph_uniaxial_ensemble, npt_f_ensemble, npt_i_ensemble, &
      30             :         npt_ia_ensemble, nvt_ensemble, reftraj_ensemble
      31             :    USE input_cp2k_md,                   ONLY: create_md_section
      32             :    USE input_enumeration_types,         ONLY: enum_i2c,&
      33             :                                               enumeration_type
      34             :    USE input_keyword_types,             ONLY: keyword_get,&
      35             :                                               keyword_type
      36             :    USE input_section_types,             ONLY: section_get_keyword,&
      37             :                                               section_release,&
      38             :                                               section_type,&
      39             :                                               section_vals_get,&
      40             :                                               section_vals_get_subs_vals,&
      41             :                                               section_vals_type,&
      42             :                                               section_vals_val_get
      43             :    USE kinds,                           ONLY: default_path_length,&
      44             :                                               dp
      45             :    USE simpar_types,                    ONLY: simpar_type
      46             : #include "../base/base_uses.f90"
      47             : 
      48             :    IMPLICIT NONE
      49             : 
      50             :    PRIVATE
      51             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'simpar_methods'
      52             :    PUBLIC :: read_md_section
      53             : 
      54             : CONTAINS
      55             : 
      56             : ! **************************************************************************************************
      57             : !> \brief Reads the MD section and setup the simulation parameters type
      58             : !> \param simpar ...
      59             : !> \param motion_section ...
      60             : !> \param md_section ...
      61             : !> \author Teodoro Laino
      62             : ! **************************************************************************************************
      63        1796 :    SUBROUTINE read_md_section(simpar, motion_section, md_section)
      64             :       TYPE(simpar_type), POINTER                         :: simpar
      65             :       TYPE(section_vals_type), POINTER                   :: motion_section, md_section
      66             : 
      67             :       CHARACTER(LEN=default_path_length)                 :: filename
      68             :       INTEGER                                            :: iprint, iw
      69             :       REAL(kind=dp)                                      :: tmp_r1, tmp_r2, tmp_r3
      70             :       TYPE(cp_logger_type), POINTER                      :: logger
      71             :       TYPE(enumeration_type), POINTER                    :: enum
      72             :       TYPE(keyword_type), POINTER                        :: keyword
      73             :       TYPE(section_type), POINTER                        :: section
      74             :       TYPE(section_vals_type), POINTER                   :: print_key
      75             : 
      76        1796 :       NULLIFY (logger, print_key, enum, keyword, section)
      77        1796 :       logger => cp_get_default_logger()
      78        1796 :       iw = cp_print_key_unit_nr(logger, md_section, "PRINT%PROGRAM_RUN_INFO", extension=".log")
      79             : 
      80        1796 :       CALL read_md_low(simpar, motion_section, md_section)
      81        1796 :       IF (iw > 0) WRITE (UNIT=iw, FMT="(A)") ""
      82             : 
      83             :       ! Begin setup Langevin dynamics
      84        1796 :       IF (simpar%ensemble == langevin_ensemble) THEN
      85          42 :          CALL cite_reference(Ricci2003)
      86          42 :          IF (simpar%noisy_gamma > 0.0_dp) CALL cite_reference(Kuhne2007)
      87          42 :          IF (simpar%shadow_gamma > 0.0_dp) CALL cite_reference(Rengaraj2020)
      88             :          ! Normalization factor using a normal Gaussian random number distribution
      89          42 :          simpar%var_w = 2.0_dp*simpar%temp_ext*simpar%dt*(simpar%gamma + simpar%noisy_gamma)
      90          42 :          IF (iw > 0) THEN
      91             :             WRITE (UNIT=iw, FMT="(T2,A)") &
      92          21 :                "LD| Parameters for Langevin dynamics"
      93          21 :             tmp_r1 = cp_unit_from_cp2k(simpar%gamma, "fs^-1")
      94          21 :             tmp_r2 = cp_unit_from_cp2k(simpar%noisy_gamma, "fs^-1")
      95          21 :             tmp_r3 = cp_unit_from_cp2k(simpar%shadow_gamma, "fs^-1")
      96             :             WRITE (UNIT=iw, FMT="(T2,A,T71,ES10.3)") &
      97          21 :                "LD| Gamma [1/fs] ", tmp_r1, &
      98          21 :                "LD| Noisy Gamma [1/fs]", tmp_r2, &
      99          21 :                "LD| Shadow Gamma [1/fs]", tmp_r3, &
     100          21 :                "LD| Variance [a.u.]", simpar%var_w, &
     101          42 :                ""
     102             :          END IF
     103             :       END IF
     104             : 
     105             :       ! Create section for output enumeration infos
     106        1796 :       CALL create_md_section(section)
     107        1796 :       keyword => section_get_keyword(section, "ENSEMBLE")
     108        1796 :       CALL keyword_get(keyword, enum=enum)
     109             : 
     110             :       ! Write MD setup information to output
     111        1796 :       IF (iw > 0) THEN
     112             :          WRITE (iw, '(T2,A)') &
     113         811 :             'MD_PAR| Molecular dynamics protocol (MD input parameters)'
     114             :          WRITE (iw, '(T2,A,T61,A20)') &
     115         811 :             'MD_PAR| Ensemble type', ADJUSTR(TRIM(enum_i2c(enum, simpar%ensemble)))
     116             :          WRITE (iw, '(T2,A,T61,I20)') &
     117         811 :             'MD_PAR| Number of time steps', simpar%nsteps
     118         811 :          IF (simpar%variable_dt) THEN
     119             :             WRITE (iw, '(T2,A)') &
     120           6 :                'MD_PAR| Variable time step is activated'
     121           6 :             tmp_r1 = cp_unit_from_cp2k(simpar%dt, "fs")
     122             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     123           6 :                'MD_PAR| Maximum time step [fs]', tmp_r1
     124           6 :             tmp_r1 = cp_unit_from_cp2k(simpar%dr_tol, "angstrom")
     125             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     126           6 :                'MD_PAR| Maximum atomic displacement permitted [A]', tmp_r1
     127             :          ELSE
     128         805 :             tmp_r1 = cp_unit_from_cp2k(simpar%dt, "fs")
     129             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     130         805 :                'MD_PAR| Time step [fs]', tmp_r1
     131             :          END IF
     132         811 :          tmp_r1 = cp_unit_from_cp2k(simpar%temp_ext, "K")
     133             :          WRITE (iw, '(T2,A,T61,F20.6)') &
     134         811 :             'MD_PAR| Temperature [K]', tmp_r1
     135         811 :          tmp_r1 = cp_unit_from_cp2k(simpar%temp_tol, "K")
     136             :          WRITE (iw, '(T2,A,T61,F20.6)') &
     137         811 :             'MD_PAR| Temperature tolerance [K]', tmp_r1
     138             : 
     139         811 :          IF (simpar%annealing) THEN
     140             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     141           2 :                'MD_PAR| Annealing ion factor', simpar%f_annealing
     142             :          END IF
     143             :          IF ((simpar%ensemble == npe_f_ensemble .OR. &
     144         811 :               simpar%ensemble == npe_i_ensemble) .AND. &
     145             :              simpar%annealing_cell) THEN
     146             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     147           1 :                'MD_PAR| Annealing cell factor', simpar%f_annealing_cell
     148             :          END IF
     149             :          IF (simpar%ensemble == npt_i_ensemble .OR. &
     150             :              simpar%ensemble == npt_ia_ensemble .OR. &
     151             :              simpar%ensemble == npt_f_ensemble .OR. &
     152         811 :              simpar%ensemble == npe_i_ensemble .OR. &
     153             :              simpar%ensemble == npe_f_ensemble) THEN
     154          82 :             tmp_r1 = cp_unit_from_cp2k(simpar%p_ext, "bar")
     155             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     156          82 :                'MD_PAR| Pressure [bar]', tmp_r1
     157          82 :             tmp_r1 = cp_unit_from_cp2k(simpar%tau_cell, "fs")
     158             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     159          82 :                'MD_PAR| Barostat time constant [fs]', tmp_r1
     160             :          END IF
     161         811 :          IF (simpar%ensemble == isokin_ensemble) THEN
     162           1 :             CALL cite_reference(Evans1983)
     163           1 :             CALL cite_reference(Minary2003)
     164             :             WRITE (iw, '(T2,A)') &
     165           1 :                'MD_PAR| Simulation using the isokinetic ensemble'
     166             :          END IF
     167         811 :          IF (simpar%constraint) THEN
     168             :             WRITE (iw, '(T2,A)') &
     169         155 :                'MD_PAR| Constraints activated'
     170             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     171         155 :                'MD_PAR| Tolerance for shake', simpar%shake_tol
     172             :          END IF
     173             : 
     174         811 :          print_key => section_vals_get_subs_vals(motion_section, "MD%PRINT%PROGRAM_RUN_INFO")
     175         811 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     176             :          WRITE (iw, '(T2,A,T63,I10,A)') &
     177         811 :             'MD_PAR| Print MD information every', iprint, ' step(s)'
     178             :          WRITE (iw, '(T2,A,T22,A,T71,A10)') &
     179         811 :             'MD_PAR| File type', 'Print frequency [steps]', 'File names'
     180             : 
     181         811 :          print_key => section_vals_get_subs_vals(motion_section, "PRINT%TRAJECTORY")
     182         811 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     183             :          filename = cp_print_key_generate_filename(logger, print_key, &
     184         811 :                                                    extension=".xyz", middle_name="pos", my_local=.FALSE.)
     185             :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     186         811 :             'MD_PAR| Coordinates', iprint, ADJUSTR(TRIM(filename))
     187             : 
     188             :          IF ((simpar%ensemble == nph_uniaxial_ensemble) .OR. &
     189             :              (simpar%ensemble == nph_uniaxial_damped_ensemble) .OR. &
     190             :              (simpar%ensemble == npt_i_ensemble) .OR. &
     191             :              (simpar%ensemble == npt_ia_ensemble) .OR. &
     192             :              (simpar%ensemble == npt_f_ensemble) .OR. &
     193         811 :              (simpar%ensemble == npe_i_ensemble) .OR. &
     194             :              (simpar%ensemble == npe_f_ensemble)) THEN
     195             : 
     196          85 :             print_key => section_vals_get_subs_vals(motion_section, "PRINT%CELL")
     197          85 :             CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     198             :             filename = cp_print_key_generate_filename(logger, print_key, &
     199          85 :                                                       extension=".cell", my_local=.FALSE.)
     200             :             WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     201          85 :                'MD_PAR| Cell', iprint, ADJUSTR(TRIM(filename))
     202             :          END IF
     203             : 
     204         811 :          print_key => section_vals_get_subs_vals(motion_section, "PRINT%VELOCITIES")
     205         811 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     206             :          filename = cp_print_key_generate_filename(logger, print_key, &
     207         811 :                                                    extension=".xyz", middle_name="vel", my_local=.FALSE.)
     208             :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     209         811 :             'MD_PAR| Velocities', iprint, ADJUSTR(TRIM(filename))
     210             : 
     211         811 :          print_key => section_vals_get_subs_vals(motion_section, "MD%PRINT%ENERGY")
     212         811 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     213             :          filename = cp_print_key_generate_filename(logger, print_key, &
     214         811 :                                                    extension=".ener", my_local=.FALSE.)
     215             :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     216         811 :             'MD_PAR| Energies', iprint, ADJUSTR(TRIM(filename))
     217             : 
     218         811 :          print_key => section_vals_get_subs_vals(motion_section, "PRINT%RESTART")
     219         811 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     220             :          filename = cp_print_key_generate_filename(logger, print_key, &
     221         811 :                                                    extension=".restart", my_local=.FALSE.)
     222             :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     223         811 :             'MD_PAR| Dump', iprint, ADJUSTR(TRIM(filename))
     224             : 
     225         811 :          IF ((simpar%ensemble == nph_uniaxial_ensemble) .OR. &
     226             :              (simpar%ensemble == nph_uniaxial_damped_ensemble)) THEN
     227           3 :             WRITE (iw, '(T2,A)') 'SHOCK| Uniaxial shock parameters: '
     228           3 :             tmp_r1 = cp_unit_from_cp2k(simpar%v_shock, "m*s^-1")
     229             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     230           3 :                'SHOCK| Shock velocity [m/s]', tmp_r1
     231           3 :             tmp_r1 = cp_unit_from_cp2k(simpar%gamma_nph, "fs^-1")
     232             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     233           3 :                'SHOCK| Damping coefficient [1/fs]', tmp_r1
     234           3 :             tmp_r1 = cp_unit_from_cp2k(simpar%p0, "bar")
     235             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     236           3 :                'SHOCK| Pressure [bar]', tmp_r1
     237             :             WRITE (iw, '(T2,A,T61,F20.6)') &
     238           3 :                'SHOCK| Barostat mass [a.u.]', simpar%cmass
     239             :          END IF
     240             :          ! Print warning for temp_tol
     241         811 :          IF (simpar%temp_tol > 0.0_dp) THEN
     242             :             CALL cp_warn(__LOCATION__, &
     243             :                          "A temperature tolerance (TEMP_TOL) is used during the MD. "// &
     244          44 :                          "Due to the velocity rescaling algorithm jumps may appear in the conserved quantity.")
     245             :          END IF
     246             :          ! Print warning for annealing
     247         811 :          IF (simpar%annealing) THEN
     248             :             IF ((simpar%ensemble == nvt_ensemble) .OR. &
     249             :                 (simpar%ensemble == npt_i_ensemble) .OR. &
     250           2 :                 (simpar%ensemble == npt_ia_ensemble) .OR. &
     251             :                 (simpar%ensemble == npt_f_ensemble)) THEN
     252             :                CALL cp_abort(__LOCATION__, &
     253             :                              "Annealing of the ions has been required "// &
     254             :                              "even if the thermostat is active (nvt or npt_i or npt_ia or npt_f) "// &
     255           0 :                              "These two methods to control the temperature act one against the other.")
     256             :             END IF
     257             :          END IF
     258             :          ! Print warning for variable time step
     259         811 :          IF (simpar%variable_dt) THEN
     260             :             IF ((simpar%ensemble == langevin_ensemble) .OR. &
     261           6 :                 (simpar%ensemble == reftraj_ensemble) .OR. &
     262             :                 simpar%do_respa) THEN
     263             :                CALL cp_warn( &
     264             :                   __LOCATION__, &
     265             :                   "The variable timestep  has been required, however "// &
     266             :                   "this option is not available either with the Langevin ensemble or with the multiple timestep schme. "// &
     267           0 :                   "The run will proceed with constant timestep, as read from input.")
     268             :             END IF
     269             :          END IF
     270             :       END IF
     271        1796 :       CALL section_release(section)
     272             :       CALL cp_print_key_finished_output(iw, logger, md_section, &
     273        1796 :                                         "PRINT%PROGRAM_RUN_INFO")
     274             : 
     275        1796 :    END SUBROUTINE read_md_section
     276             : 
     277             : ! **************************************************************************************************
     278             : !> \brief Low Level: Parses the MD input section
     279             : !> \param simpar ...
     280             : !> \param motion_section ...
     281             : !> \param md_section ...
     282             : !> \author teo
     283             : ! **************************************************************************************************
     284        3592 :    SUBROUTINE read_md_low(simpar, motion_section, md_section)
     285             :       TYPE(simpar_type), POINTER                         :: simpar
     286             :       TYPE(section_vals_type), POINTER                   :: motion_section, md_section
     287             : 
     288             :       LOGICAL                                            :: explicit
     289             :       TYPE(section_vals_type), POINTER                   :: tmp_section
     290             : 
     291        1796 :       NULLIFY (tmp_section)
     292        1796 :       CALL section_vals_val_get(md_section, "ENSEMBLE", i_val=simpar%ensemble)
     293        1796 :       CALL section_vals_val_get(md_section, "STEPS", i_val=simpar%nsteps)
     294        1796 :       CALL section_vals_val_get(md_section, "MAX_STEPS", i_val=simpar%max_steps)
     295        1796 :       CALL section_vals_val_get(md_section, "TEMPERATURE", r_val=simpar%temp_ext)
     296        1796 :       CALL section_vals_val_get(md_section, "TEMP_TOL", r_val=simpar%temp_tol)
     297        1796 :       CALL section_vals_val_get(md_section, "ANGVEL_ZERO", l_val=simpar%angvel_zero)
     298        1796 :       CALL section_vals_val_get(md_section, "TEMP_KIND", l_val=simpar%temperature_per_kind)
     299        1796 :       CALL section_vals_val_get(md_section, "SCALE_TEMP_KIND", l_val=simpar%scale_temperature_per_kind)
     300        1796 :       CALL section_vals_val_get(md_section, "ANNEALING", r_val=simpar%f_annealing, explicit=simpar%annealing)
     301             :       CALL section_vals_val_get(md_section, "ANNEALING_CELL", r_val=simpar%f_annealing_cell, &
     302        1796 :                                 explicit=simpar%annealing_cell)
     303             :       CALL section_vals_val_get(md_section, "TEMPERATURE_ANNEALING", r_val=simpar%f_temperature_annealing, &
     304        1796 :                                 explicit=simpar%temperature_annealing)
     305             :       CALL section_vals_val_get(md_section, "DISPLACEMENT_TOL", r_val=simpar%dr_tol, &
     306        1796 :                                 explicit=simpar%variable_dt)
     307        1796 :       CALL section_vals_val_get(md_section, "TIMESTEP", r_val=simpar%dt)
     308             :       CALL section_vals_val_get(md_section, "INITIALIZATION_METHOD", &
     309        1796 :                                 i_val=simpar%initialization_method)
     310             :       ! Initialize dt_fact to 1.0
     311        1796 :       simpar%dt_fact = 1.0_dp
     312             : 
     313        1796 :       IF (simpar%ensemble == langevin_ensemble) THEN
     314          42 :          CALL section_vals_val_get(md_section, "LANGEVIN%GAMMA", r_val=simpar%gamma)
     315          42 :          CALL section_vals_val_get(md_section, "LANGEVIN%NOISY_GAMMA", r_val=simpar%noisy_gamma)
     316          42 :          CALL section_vals_val_get(md_section, "LANGEVIN%SHADOW_GAMMA", r_val=simpar%shadow_gamma)
     317             :       END IF
     318             : 
     319        1796 :       tmp_section => section_vals_get_subs_vals(motion_section, "CONSTRAINT")
     320        1796 :       CALL section_vals_get(tmp_section, explicit=simpar%constraint)
     321        1796 :       IF (simpar%constraint) THEN
     322         310 :          CALL section_vals_val_get(tmp_section, "SHAKE_TOLERANCE", r_val=simpar%shake_tol)
     323         310 :          IF (simpar%shake_tol <= EPSILON(0.0_dp)*1000.0_dp) &
     324             :             CALL cp_warn(__LOCATION__, &
     325             :                          "Shake tolerance lower than 1000*EPSILON, where EPSILON is the machine precision. "// &
     326           0 :                          "This may lead to numerical problems. Setting up shake_tol to 1000*EPSILON!")
     327         310 :          simpar%shake_tol = MAX(EPSILON(0.0_dp)*1000.0_dp, simpar%shake_tol)
     328             : 
     329         310 :          CALL section_vals_val_get(tmp_section, "ROLL_TOLERANCE", r_val=simpar%roll_tol)
     330         310 :          IF (simpar%roll_tol <= EPSILON(0.0_dp)*1000.0_dp) &
     331             :             CALL cp_warn(__LOCATION__, &
     332             :                          "Roll tolerance lower than 1000*EPSILON, where EPSILON is the machine precision. "// &
     333           0 :                          "This may lead to numerical problems. Setting up roll_tol to 1000*EPSILON!")
     334         310 :          simpar%roll_tol = MAX(EPSILON(0.0_dp)*1000.0_dp, simpar%roll_tol)
     335             :       END IF
     336             : 
     337        1796 :       IF (simpar%ensemble == nph_uniaxial_ensemble .OR. simpar%ensemble == nph_uniaxial_damped_ensemble) THEN
     338           6 :          tmp_section => section_vals_get_subs_vals(md_section, "MSST")
     339           6 :          CALL section_vals_val_get(tmp_section, "PRESSURE", r_val=simpar%p0)
     340           6 :          CALL section_vals_val_get(tmp_section, "ENERGY", r_val=simpar%e0)
     341           6 :          CALL section_vals_val_get(tmp_section, "VOLUME", r_val=simpar%v0)
     342           6 :          CALL section_vals_val_get(tmp_section, "GAMMA", r_val=simpar%gamma_nph)
     343           6 :          IF (simpar%gamma_nph /= 0.0_dp) simpar%ensemble = nph_uniaxial_damped_ensemble
     344           6 :          CALL section_vals_val_get(tmp_section, "CMASS", r_val=simpar%cmass)
     345           6 :          CALL section_vals_val_get(tmp_section, "VSHOCK", r_val=simpar%v_shock)
     346             :       END IF
     347             : 
     348        1968 :       SELECT CASE (simpar%ensemble)
     349             :       CASE (nph_uniaxial_damped_ensemble, nph_uniaxial_ensemble, &
     350             :             npt_f_ensemble, npt_i_ensemble, npt_ia_ensemble, npe_f_ensemble, npe_i_ensemble)
     351         172 :          tmp_section => section_vals_get_subs_vals(md_section, "BAROSTAT")
     352         172 :          CALL section_vals_val_get(tmp_section, "PRESSURE", r_val=simpar%p_ext)
     353        1968 :          CALL section_vals_val_get(tmp_section, "TIMECON", r_val=simpar%tau_cell)
     354             :       END SELECT
     355             : 
     356             :       ! RESPA
     357        1796 :       tmp_section => section_vals_get_subs_vals(md_section, "RESPA")
     358        1796 :       CALL section_vals_get(tmp_section, explicit=simpar%do_respa)
     359        1796 :       CALL section_vals_val_get(tmp_section, "FREQUENCY", i_val=simpar%n_time_steps)
     360        1796 :       simpar%multi_time_switch = simpar%do_respa
     361             : 
     362             :       ! CORE-SHELL MODEL
     363        1796 :       tmp_section => section_vals_get_subs_vals(md_section, "SHELL")
     364        1796 :       CALL section_vals_val_get(tmp_section, "TEMPERATURE", r_val=simpar%temp_sh_ext)
     365        1796 :       CALL section_vals_val_get(tmp_section, "TEMP_TOL", r_val=simpar%temp_sh_tol)
     366             : 
     367             :       CALL section_vals_val_get(tmp_section, "DISPLACEMENT_SHELL_TOL", r_val=simpar%dsc_tol, &
     368        1796 :                                 explicit=explicit)
     369        1796 :       simpar%variable_dt = simpar%variable_dt .OR. explicit
     370             :       ! ADIABATIC DYNAMICS
     371        1796 :       tmp_section => section_vals_get_subs_vals(md_section, "ADIABATIC_DYNAMICS")
     372        1796 :       CALL section_vals_val_get(tmp_section, "TEMP_FAST", r_val=simpar%temp_fast)
     373        1796 :       CALL section_vals_val_get(tmp_section, "TEMP_SLOW", r_val=simpar%temp_slow)
     374        1796 :       CALL section_vals_val_get(tmp_section, "TEMP_TOL_FAST", r_val=simpar%temp_tol_fast)
     375        1796 :       CALL section_vals_val_get(tmp_section, "TEMP_TOL_SLOW", r_val=simpar%temp_tol_slow)
     376        1796 :       CALL section_vals_val_get(tmp_section, "N_RESP_FAST", i_val=simpar%n_resp_fast)
     377             : 
     378             :       ! VELOCITY SOFTENING
     379        1796 :       tmp_section => section_vals_get_subs_vals(md_section, "VELOCITY_SOFTENING")
     380        1796 :       CALL section_vals_val_get(tmp_section, "STEPS", i_val=simpar%soften_nsteps)
     381        1796 :       CALL section_vals_val_get(tmp_section, "ALPHA", r_val=simpar%soften_alpha)
     382        1796 :       CALL section_vals_val_get(tmp_section, "DELTA", r_val=simpar%soften_delta)
     383        1796 :    END SUBROUTINE read_md_low
     384             : 
     385             : END MODULE simpar_methods

Generated by: LCOV version 1.15