LCOV - code coverage report
Current view: top level - src/motion - simpar_methods.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:936074a) Lines: 97.6 % 166 162
Test Date: 2025-12-04 06:27:48 Functions: 100.0 % 2 2

            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  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         1769 :    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         1769 :       NULLIFY (logger, print_key, enum, keyword, section)
      77         1769 :       logger => cp_get_default_logger()
      78         1769 :       iw = cp_print_key_unit_nr(logger, md_section, "PRINT%PROGRAM_RUN_INFO", extension=".log")
      79              : 
      80         1769 :       CALL read_md_low(simpar, motion_section, md_section)
      81         1769 :       IF (iw > 0) WRITE (UNIT=iw, FMT="(A)") ""
      82              : 
      83              :       ! Begin setup Langevin dynamics
      84         1769 :       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         1769 :       CALL create_md_section(section)
     107         1769 :       keyword => section_get_keyword(section, "ENSEMBLE")
     108         1769 :       CALL keyword_get(keyword, enum=enum)
     109              : 
     110              :       ! Write MD setup information to output
     111         1769 :       IF (iw > 0) THEN
     112              :          WRITE (iw, '(T2,A)') &
     113          815 :             'MD_PAR| Molecular dynamics protocol (MD input parameters)'
     114              :          WRITE (iw, '(T2,A,T61,A20)') &
     115          815 :             'MD_PAR| Ensemble type', ADJUSTR(TRIM(enum_i2c(enum, simpar%ensemble)))
     116              :          WRITE (iw, '(T2,A,T61,I20)') &
     117          815 :             'MD_PAR| Number of time steps', simpar%nsteps
     118          815 :          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          809 :             tmp_r1 = cp_unit_from_cp2k(simpar%dt, "fs")
     129              :             WRITE (iw, '(T2,A,T61,F20.6)') &
     130          809 :                'MD_PAR| Time step [fs]', tmp_r1
     131              :          END IF
     132          815 :          tmp_r1 = cp_unit_from_cp2k(simpar%temp_ext, "K")
     133              :          WRITE (iw, '(T2,A,T61,F20.6)') &
     134          815 :             'MD_PAR| Temperature [K]', tmp_r1
     135          815 :          tmp_r1 = cp_unit_from_cp2k(simpar%temp_tol, "K")
     136              :          WRITE (iw, '(T2,A,T61,F20.6)') &
     137          815 :             'MD_PAR| Temperature tolerance [K]', tmp_r1
     138              : 
     139          815 :          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          815 :               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          815 :              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          815 :          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          815 :          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          815 :          print_key => section_vals_get_subs_vals(motion_section, "MD%PRINT%PROGRAM_RUN_INFO")
     175          815 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     176              :          WRITE (iw, '(T2,A,T63,I10,A)') &
     177          815 :             'MD_PAR| Print MD information every', iprint, ' step(s)'
     178              :          WRITE (iw, '(T2,A,T22,A,T71,A10)') &
     179          815 :             'MD_PAR| File type', 'Print frequency [steps]', 'File names'
     180              : 
     181          815 :          print_key => section_vals_get_subs_vals(motion_section, "PRINT%TRAJECTORY")
     182          815 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     183              :          filename = cp_print_key_generate_filename(logger, print_key, &
     184          815 :                                                    extension=".xyz", middle_name="pos", my_local=.FALSE.)
     185              :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     186          815 :             '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          815 :              (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          815 :          print_key => section_vals_get_subs_vals(motion_section, "PRINT%VELOCITIES")
     205          815 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     206              :          filename = cp_print_key_generate_filename(logger, print_key, &
     207          815 :                                                    extension=".xyz", middle_name="vel", my_local=.FALSE.)
     208              :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     209          815 :             'MD_PAR| Velocities', iprint, ADJUSTR(TRIM(filename))
     210              : 
     211          815 :          print_key => section_vals_get_subs_vals(motion_section, "MD%PRINT%ENERGY")
     212          815 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     213              :          filename = cp_print_key_generate_filename(logger, print_key, &
     214          815 :                                                    extension=".ener", my_local=.FALSE.)
     215              :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     216          815 :             'MD_PAR| Energies', iprint, ADJUSTR(TRIM(filename))
     217              : 
     218          815 :          print_key => section_vals_get_subs_vals(motion_section, "PRINT%RESTART")
     219          815 :          CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
     220              :          filename = cp_print_key_generate_filename(logger, print_key, &
     221          815 :                                                    extension=".restart", my_local=.FALSE.)
     222              :          WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
     223          815 :             'MD_PAR| Dump', iprint, ADJUSTR(TRIM(filename))
     224              : 
     225          815 :          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          815 :          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           45 :                          "Due to the velocity rescaling algorithm jumps may appear in the conserved quantity.")
     245              :          END IF
     246              :          ! Print warning for annealing
     247          815 :          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          815 :          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         1769 :       CALL section_release(section)
     272              :       CALL cp_print_key_finished_output(iw, logger, md_section, &
     273         1769 :                                         "PRINT%PROGRAM_RUN_INFO")
     274              : 
     275         1769 :    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         3538 :    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         1769 :       NULLIFY (tmp_section)
     292         1769 :       CALL section_vals_val_get(md_section, "ENSEMBLE", i_val=simpar%ensemble)
     293         1769 :       CALL section_vals_val_get(md_section, "STEPS", i_val=simpar%nsteps)
     294         1769 :       CALL section_vals_val_get(md_section, "MAX_STEPS", i_val=simpar%max_steps)
     295         1769 :       CALL section_vals_val_get(md_section, "TEMPERATURE", r_val=simpar%temp_ext)
     296         1769 :       CALL section_vals_val_get(md_section, "TEMP_TOL", r_val=simpar%temp_tol)
     297         1769 :       CALL section_vals_val_get(md_section, "ANGVEL_ZERO", l_val=simpar%angvel_zero)
     298         1769 :       CALL section_vals_val_get(md_section, "TEMP_KIND", l_val=simpar%temperature_per_kind)
     299         1769 :       CALL section_vals_val_get(md_section, "SCALE_TEMP_KIND", l_val=simpar%scale_temperature_per_kind)
     300         1769 :       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         1769 :                                 explicit=simpar%annealing_cell)
     303              :       CALL section_vals_val_get(md_section, "TEMPERATURE_ANNEALING", r_val=simpar%f_temperature_annealing, &
     304         1769 :                                 explicit=simpar%temperature_annealing)
     305              :       CALL section_vals_val_get(md_section, "DISPLACEMENT_TOL", r_val=simpar%dr_tol, &
     306         1769 :                                 explicit=simpar%variable_dt)
     307         1769 :       CALL section_vals_val_get(md_section, "TIMESTEP", r_val=simpar%dt)
     308              :       CALL section_vals_val_get(md_section, "INITIALIZATION_METHOD", &
     309         1769 :                                 i_val=simpar%initialization_method)
     310              :       ! Initialize dt_fact to 1.0
     311         1769 :       simpar%dt_fact = 1.0_dp
     312              : 
     313         1769 :       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         1769 :       tmp_section => section_vals_get_subs_vals(motion_section, "CONSTRAINT")
     320         1769 :       CALL section_vals_get(tmp_section, explicit=simpar%constraint)
     321         1769 :       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         1769 :       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         1941 :       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         1941 :          CALL section_vals_val_get(tmp_section, "TIMECON", r_val=simpar%tau_cell)
     354              :       END SELECT
     355              : 
     356              :       ! RESPA
     357         1769 :       tmp_section => section_vals_get_subs_vals(md_section, "RESPA")
     358         1769 :       CALL section_vals_get(tmp_section, explicit=simpar%do_respa)
     359         1769 :       CALL section_vals_val_get(tmp_section, "FREQUENCY", i_val=simpar%n_time_steps)
     360         1769 :       simpar%multi_time_switch = simpar%do_respa
     361              : 
     362              :       ! CORE-SHELL MODEL
     363         1769 :       tmp_section => section_vals_get_subs_vals(md_section, "SHELL")
     364         1769 :       CALL section_vals_val_get(tmp_section, "TEMPERATURE", r_val=simpar%temp_sh_ext)
     365         1769 :       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         1769 :                                 explicit=explicit)
     369         1769 :       simpar%variable_dt = simpar%variable_dt .OR. explicit
     370              :       ! ADIABATIC DYNAMICS
     371         1769 :       tmp_section => section_vals_get_subs_vals(md_section, "ADIABATIC_DYNAMICS")
     372         1769 :       CALL section_vals_val_get(tmp_section, "TEMP_FAST", r_val=simpar%temp_fast)
     373         1769 :       CALL section_vals_val_get(tmp_section, "TEMP_SLOW", r_val=simpar%temp_slow)
     374         1769 :       CALL section_vals_val_get(tmp_section, "TEMP_TOL_FAST", r_val=simpar%temp_tol_fast)
     375         1769 :       CALL section_vals_val_get(tmp_section, "TEMP_TOL_SLOW", r_val=simpar%temp_tol_slow)
     376         1769 :       CALL section_vals_val_get(tmp_section, "N_RESP_FAST", i_val=simpar%n_resp_fast)
     377              : 
     378              :       ! VELOCITY SOFTENING
     379         1769 :       tmp_section => section_vals_get_subs_vals(md_section, "VELOCITY_SOFTENING")
     380         1769 :       CALL section_vals_val_get(tmp_section, "STEPS", i_val=simpar%soften_nsteps)
     381         1769 :       CALL section_vals_val_get(tmp_section, "ALPHA", r_val=simpar%soften_alpha)
     382         1769 :       CALL section_vals_val_get(tmp_section, "DELTA", r_val=simpar%soften_delta)
     383         1769 :    END SUBROUTINE read_md_low
     384              : 
     385              : END MODULE simpar_methods
        

Generated by: LCOV version 2.0-1