LCOV - code coverage report
Current view: top level - src/motion/thermostat - extended_system_init.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:b279b6b) Lines: 264 334 79.0 %
Date: 2024-04-24 07:13:09 Functions: 9 11 81.8 %

          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             : !> \par History
      10             : !>      cjm, FEB 20 2001:  added subroutine initialize_extended_parameters
      11             : !>      cjm, MAY 03 2001:  reorganized and added separtate routines for
      12             : !>                         nhc_part, nhc_baro, nhc_ao, npt
      13             : !> \author CJM
      14             : ! **************************************************************************************************
      15             : MODULE extended_system_init
      16             : 
      17             :    USE cell_types,                      ONLY: cell_type
      18             :    USE distribution_1d_types,           ONLY: distribution_1d_type
      19             :    USE extended_system_mapping,         ONLY: nhc_to_barostat_mapping,&
      20             :                                               nhc_to_particle_mapping,&
      21             :                                               nhc_to_particle_mapping_fast,&
      22             :                                               nhc_to_particle_mapping_slow,&
      23             :                                               nhc_to_shell_mapping
      24             :    USE extended_system_types,           ONLY: debug_isotropic_limit,&
      25             :                                               lnhc_parameters_type,&
      26             :                                               map_info_type,&
      27             :                                               npt_info_type
      28             :    USE global_types,                    ONLY: global_environment_type
      29             :    USE input_constants,                 ONLY: do_thermo_only_master,&
      30             :                                               npe_f_ensemble,&
      31             :                                               npe_i_ensemble,&
      32             :                                               nph_uniaxial_damped_ensemble,&
      33             :                                               nph_uniaxial_ensemble,&
      34             :                                               npt_f_ensemble,&
      35             :                                               npt_i_ensemble,&
      36             :                                               npt_ia_ensemble
      37             :    USE input_cp2k_binary_restarts,      ONLY: read_binary_thermostats_nose
      38             :    USE input_section_types,             ONLY: section_vals_get,&
      39             :                                               section_vals_get_subs_vals,&
      40             :                                               section_vals_remove_values,&
      41             :                                               section_vals_type,&
      42             :                                               section_vals_val_get
      43             :    USE kinds,                           ONLY: dp
      44             :    USE message_passing,                 ONLY: mp_para_env_type
      45             :    USE molecule_kind_types,             ONLY: molecule_kind_type
      46             :    USE molecule_types,                  ONLY: global_constraint_type,&
      47             :                                               molecule_type
      48             :    USE simpar_types,                    ONLY: simpar_type
      49             :    USE thermostat_types,                ONLY: thermostat_info_type
      50             :    USE thermostat_utils,                ONLY: get_nhc_energies
      51             : #include "../../base/base_uses.f90"
      52             : 
      53             :    IMPLICIT NONE
      54             : 
      55             :    PRIVATE
      56             : 
      57             :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'extended_system_init'
      58             : 
      59             :    PUBLIC :: initialize_nhc_part, initialize_nhc_baro, initialize_npt, &
      60             :              initialize_nhc_shell, initialize_nhc_slow, initialize_nhc_fast
      61             : 
      62             : CONTAINS
      63             : 
      64             : ! **************************************************************************************************
      65             : !> \brief ...
      66             : !> \param simpar ...
      67             : !> \param globenv ...
      68             : !> \param npt_info ...
      69             : !> \param cell ...
      70             : !> \param work_section ...
      71             : !> \author CJM
      72             : ! **************************************************************************************************
      73         172 :    SUBROUTINE initialize_npt(simpar, globenv, npt_info, cell, work_section)
      74             : 
      75             :       TYPE(simpar_type), POINTER                         :: simpar
      76             :       TYPE(global_environment_type), POINTER             :: globenv
      77             :       TYPE(npt_info_type), DIMENSION(:, :), POINTER      :: npt_info
      78             :       TYPE(cell_type), POINTER                           :: cell
      79             :       TYPE(section_vals_type), POINTER                   :: work_section
      80             : 
      81             :       CHARACTER(LEN=*), PARAMETER                        :: routineN = 'initialize_npt'
      82             : 
      83             :       INTEGER                                            :: handle, i, ind, j
      84             :       LOGICAL                                            :: explicit, restart
      85             :       REAL(KIND=dp)                                      :: temp
      86         172 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: buffer
      87             :       TYPE(section_vals_type), POINTER                   :: work_section2
      88             : 
      89         172 :       CALL timeset(routineN, handle)
      90             : 
      91         172 :       NULLIFY (work_section2)
      92             : 
      93         172 :       explicit = .FALSE.
      94         172 :       restart = .FALSE.
      95             : 
      96         172 :       CPASSERT(.NOT. ASSOCIATED(npt_info))
      97             : 
      98             :       ! first allocating the npt_info_type if requested
      99         280 :       SELECT CASE (simpar%ensemble)
     100             :       CASE (npt_i_ensemble, npe_i_ensemble, npt_ia_ensemble)
     101         108 :          ALLOCATE (npt_info(1, 1))
     102         324 :          npt_info(:, :)%eps = LOG(cell%deth)/3.0_dp
     103         108 :          temp = simpar%temp_baro_ext
     104             : 
     105             :       CASE (npt_f_ensemble, npe_f_ensemble)
     106          58 :          ALLOCATE (npt_info(3, 3))
     107          58 :          temp = simpar%temp_baro_ext
     108             : 
     109             :       CASE (nph_uniaxial_ensemble)
     110           4 :          ALLOCATE (npt_info(1, 1))
     111           4 :          temp = simpar%temp_baro_ext
     112             : 
     113             :       CASE (nph_uniaxial_damped_ensemble)
     114           2 :          ALLOCATE (npt_info(1, 1))
     115           2 :          temp = simpar%temp_baro_ext
     116             : 
     117             :       CASE DEFAULT
     118             :          ! Do nothing..
     119         172 :          NULLIFY (npt_info)
     120             :       END SELECT
     121             : 
     122         172 :       IF (ASSOCIATED(npt_info)) THEN
     123         172 :          IF (ASSOCIATED(work_section)) THEN
     124         172 :             work_section2 => section_vals_get_subs_vals(work_section, "VELOCITY")
     125         172 :             CALL section_vals_get(work_section2, explicit=explicit)
     126         172 :             restart = explicit
     127         172 :             work_section2 => section_vals_get_subs_vals(work_section, "MASS")
     128         172 :             CALL section_vals_get(work_section2, explicit=explicit)
     129         172 :             IF (restart .NEQV. explicit) &
     130             :                CALL cp_abort(__LOCATION__, "You need to define both VELOCITY and "// &
     131           0 :                              "MASS section (or none) in the BAROSTAT section")
     132         172 :             restart = explicit .AND. restart
     133             :          END IF
     134             : 
     135             :          IF (restart) THEN
     136          22 :             CALL section_vals_val_get(work_section, "VELOCITY%_DEFAULT_KEYWORD_", r_vals=buffer)
     137          22 :             ind = 0
     138          72 :             DO i = 1, SIZE(npt_info, 1)
     139         206 :                DO j = 1, SIZE(npt_info, 2)
     140         134 :                   ind = ind + 1
     141         184 :                   npt_info(i, j)%v = buffer(ind)
     142             :                END DO
     143             :             END DO
     144          22 :             CALL section_vals_val_get(work_section, "MASS%_DEFAULT_KEYWORD_", r_vals=buffer)
     145          22 :             ind = 0
     146          72 :             DO i = 1, SIZE(npt_info, 1)
     147         206 :                DO j = 1, SIZE(npt_info, 2)
     148         134 :                   ind = ind + 1
     149         184 :                   npt_info(i, j)%mass = buffer(ind)
     150             :                END DO
     151             :             END DO
     152             :          ELSE
     153             :             CALL init_barostat_variables(npt_info, simpar%tau_cell, temp, &
     154             :                                          simpar%nfree, simpar%ensemble, simpar%cmass, &
     155         150 :                                          globenv)
     156             :          END IF
     157             : 
     158             :       END IF
     159             : 
     160         172 :       CALL timestop(handle)
     161             : 
     162         172 :    END SUBROUTINE initialize_npt
     163             : 
     164             : ! **************************************************************************************************
     165             : !> \brief fire up the thermostats, if NPT
     166             : !> \param simpar ...
     167             : !> \param para_env ...
     168             : !> \param globenv ...
     169             : !> \param nhc ...
     170             : !> \param nose_section ...
     171             : !> \param save_mem ...
     172             : !> \author CJM
     173             : ! **************************************************************************************************
     174         240 :    SUBROUTINE initialize_nhc_baro(simpar, para_env, globenv, nhc, nose_section, save_mem)
     175             : 
     176             :       TYPE(simpar_type), POINTER                         :: simpar
     177             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     178             :       TYPE(global_environment_type), POINTER             :: globenv
     179             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     180             :       TYPE(section_vals_type), POINTER                   :: nose_section
     181             :       LOGICAL, INTENT(IN)                                :: save_mem
     182             : 
     183             :       CHARACTER(len=*), PARAMETER :: routineN = 'initialize_nhc_baro'
     184             : 
     185             :       INTEGER                                            :: handle
     186             :       LOGICAL                                            :: restart
     187             :       REAL(KIND=dp)                                      :: temp
     188             : 
     189         120 :       CALL timeset(routineN, handle)
     190             : 
     191         120 :       restart = .FALSE.
     192             : 
     193         120 :       CALL nhc_to_barostat_mapping(simpar, nhc)
     194             : 
     195             :       ! Set up the Yoshida weights
     196         120 :       IF (nhc%nyosh > 0) THEN
     197         360 :          ALLOCATE (nhc%dt_yosh(1:nhc%nyosh))
     198         120 :          CALL set_yoshida_coef(nhc, simpar%dt)
     199             :       END IF
     200             : 
     201         120 :       CALL restart_nose(nhc, nose_section, save_mem, restart, "", "", para_env)
     202             : 
     203         120 :       IF (.NOT. restart) THEN
     204             :          ! Initializing thermostat forces and velocities for the Nose-Hoover
     205             :          ! Chain variables
     206         102 :          SELECT CASE (simpar%ensemble)
     207             :          CASE DEFAULT
     208         102 :             temp = simpar%temp_baro_ext
     209             :          END SELECT
     210         102 :          IF (nhc%nhc_len /= 0) THEN
     211         102 :             CALL init_nhc_variables(nhc, temp, para_env, globenv)
     212             :          END IF
     213             :       END IF
     214             : 
     215         120 :       CALL init_nhc_forces(nhc)
     216             : 
     217         120 :       CALL timestop(handle)
     218             : 
     219         120 :    END SUBROUTINE initialize_nhc_baro
     220             : 
     221             : ! **************************************************************************************************
     222             : !> \brief ...
     223             : !> \param thermostat_info ...
     224             : !> \param simpar ...
     225             : !> \param local_molecules ...
     226             : !> \param molecule ...
     227             : !> \param molecule_kind_set ...
     228             : !> \param para_env ...
     229             : !> \param globenv ...
     230             : !> \param nhc ...
     231             : !> \param nose_section ...
     232             : !> \param gci ...
     233             : !> \param save_mem ...
     234             : !> \author CJM
     235             : ! **************************************************************************************************
     236           0 :    SUBROUTINE initialize_nhc_slow(thermostat_info, simpar, local_molecules, &
     237             :                                   molecule, molecule_kind_set, para_env, globenv, nhc, nose_section, &
     238             :                                   gci, save_mem)
     239             : 
     240             :       TYPE(thermostat_info_type), POINTER                :: thermostat_info
     241             :       TYPE(simpar_type), POINTER                         :: simpar
     242             :       TYPE(distribution_1d_type), POINTER                :: local_molecules
     243             :       TYPE(molecule_type), POINTER                       :: molecule(:)
     244             :       TYPE(molecule_kind_type), POINTER                  :: molecule_kind_set(:)
     245             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     246             :       TYPE(global_environment_type), POINTER             :: globenv
     247             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     248             :       TYPE(section_vals_type), POINTER                   :: nose_section
     249             :       TYPE(global_constraint_type), POINTER              :: gci
     250             :       LOGICAL, INTENT(IN)                                :: save_mem
     251             : 
     252             :       CHARACTER(len=*), PARAMETER :: routineN = 'initialize_nhc_slow'
     253             : 
     254             :       INTEGER                                            :: handle
     255             :       LOGICAL                                            :: restart
     256             : 
     257           0 :       CALL timeset(routineN, handle)
     258             : 
     259           0 :       restart = .FALSE.
     260             :       ! fire up the thermostats, if not NVE
     261             : 
     262             :       CALL nhc_to_particle_mapping_slow(thermostat_info, simpar, local_molecules, &
     263           0 :                                         molecule, molecule_kind_set, nhc, para_env, gci)
     264             : 
     265             :       ! Set up the Yoshida weights
     266           0 :       IF (nhc%nyosh > 0) THEN
     267           0 :          ALLOCATE (nhc%dt_yosh(1:nhc%nyosh))
     268           0 :          CALL set_yoshida_coef(nhc, simpar%dt)
     269             :       END IF
     270             : 
     271           0 :       CALL restart_nose(nhc, nose_section, save_mem, restart, "", "", para_env)
     272             : 
     273           0 :       IF (.NOT. restart) THEN
     274             :          ! Initializing thermostat forces and velocities for the Nose-Hoover
     275             :          ! Chain variables
     276           0 :          IF (nhc%nhc_len /= 0) THEN
     277           0 :             CALL init_nhc_variables(nhc, simpar%temp_slow, para_env, globenv)
     278             :          END IF
     279             :       END IF
     280             : 
     281           0 :       CALL init_nhc_forces(nhc)
     282             : 
     283           0 :       CALL timestop(handle)
     284             : 
     285           0 :    END SUBROUTINE initialize_nhc_slow
     286             : 
     287             : ! **************************************************************************************************
     288             : !> \brief ...
     289             : !> \param thermostat_info ...
     290             : !> \param simpar ...
     291             : !> \param local_molecules ...
     292             : !> \param molecule ...
     293             : !> \param molecule_kind_set ...
     294             : !> \param para_env ...
     295             : !> \param globenv ...
     296             : !> \param nhc ...
     297             : !> \param nose_section ...
     298             : !> \param gci ...
     299             : !> \param save_mem ...
     300             : !> \author CJM
     301             : ! **************************************************************************************************
     302           0 :    SUBROUTINE initialize_nhc_fast(thermostat_info, simpar, local_molecules, &
     303             :                                   molecule, molecule_kind_set, para_env, globenv, nhc, nose_section, &
     304             :                                   gci, save_mem)
     305             : 
     306             :       TYPE(thermostat_info_type), POINTER                :: thermostat_info
     307             :       TYPE(simpar_type), POINTER                         :: simpar
     308             :       TYPE(distribution_1d_type), POINTER                :: local_molecules
     309             :       TYPE(molecule_type), POINTER                       :: molecule(:)
     310             :       TYPE(molecule_kind_type), POINTER                  :: molecule_kind_set(:)
     311             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     312             :       TYPE(global_environment_type), POINTER             :: globenv
     313             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     314             :       TYPE(section_vals_type), POINTER                   :: nose_section
     315             :       TYPE(global_constraint_type), POINTER              :: gci
     316             :       LOGICAL, INTENT(IN)                                :: save_mem
     317             : 
     318             :       CHARACTER(len=*), PARAMETER :: routineN = 'initialize_nhc_fast'
     319             : 
     320             :       INTEGER                                            :: handle
     321             :       LOGICAL                                            :: restart
     322             : 
     323           0 :       CALL timeset(routineN, handle)
     324             : 
     325           0 :       restart = .FALSE.
     326             :       ! fire up the thermostats, if not NVE
     327             : 
     328             :       CALL nhc_to_particle_mapping_fast(thermostat_info, simpar, local_molecules, &
     329           0 :                                         molecule, molecule_kind_set, nhc, para_env, gci)
     330             : 
     331             :       ! Set up the Yoshida weights
     332           0 :       IF (nhc%nyosh > 0) THEN
     333           0 :          ALLOCATE (nhc%dt_yosh(1:nhc%nyosh))
     334           0 :          CALL set_yoshida_coef(nhc, simpar%dt)
     335             :       END IF
     336             : 
     337           0 :       CALL restart_nose(nhc, nose_section, save_mem, restart, "", "", para_env)
     338             : 
     339           0 :       IF (.NOT. restart) THEN
     340             :          ! Initializing thermostat forces and velocities for the Nose-Hoover
     341             :          ! Chain variables
     342           0 :          IF (nhc%nhc_len /= 0) THEN
     343           0 :             CALL init_nhc_variables(nhc, simpar%temp_fast, para_env, globenv)
     344             :          END IF
     345             :       END IF
     346             : 
     347           0 :       CALL init_nhc_forces(nhc)
     348             : 
     349           0 :       CALL timestop(handle)
     350             : 
     351           0 :    END SUBROUTINE initialize_nhc_fast
     352             : 
     353             : ! **************************************************************************************************
     354             : !> \brief ...
     355             : !> \param thermostat_info ...
     356             : !> \param simpar ...
     357             : !> \param local_molecules ...
     358             : !> \param molecule ...
     359             : !> \param molecule_kind_set ...
     360             : !> \param para_env ...
     361             : !> \param globenv ...
     362             : !> \param nhc ...
     363             : !> \param nose_section ...
     364             : !> \param gci ...
     365             : !> \param save_mem ...
     366             : !> \param binary_restart_file_name ...
     367             : !> \author CJM
     368             : ! **************************************************************************************************
     369         788 :    SUBROUTINE initialize_nhc_part(thermostat_info, simpar, local_molecules, &
     370             :                                   molecule, molecule_kind_set, para_env, globenv, nhc, nose_section, &
     371             :                                   gci, save_mem, binary_restart_file_name)
     372             : 
     373             :       TYPE(thermostat_info_type), POINTER                :: thermostat_info
     374             :       TYPE(simpar_type), POINTER                         :: simpar
     375             :       TYPE(distribution_1d_type), POINTER                :: local_molecules
     376             :       TYPE(molecule_type), POINTER                       :: molecule(:)
     377             :       TYPE(molecule_kind_type), POINTER                  :: molecule_kind_set(:)
     378             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     379             :       TYPE(global_environment_type), POINTER             :: globenv
     380             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     381             :       TYPE(section_vals_type), POINTER                   :: nose_section
     382             :       TYPE(global_constraint_type), POINTER              :: gci
     383             :       LOGICAL, INTENT(IN)                                :: save_mem
     384             :       CHARACTER(LEN=*), INTENT(IN)                       :: binary_restart_file_name
     385             : 
     386             :       CHARACTER(len=*), PARAMETER :: routineN = 'initialize_nhc_part'
     387             : 
     388             :       INTEGER                                            :: handle
     389             :       LOGICAL                                            :: restart
     390             : 
     391         394 :       CALL timeset(routineN, handle)
     392             : 
     393         394 :       restart = .FALSE.
     394             :       ! fire up the thermostats, if not NVE
     395             : 
     396             :       CALL nhc_to_particle_mapping(thermostat_info, simpar, local_molecules, &
     397         394 :                                    molecule, molecule_kind_set, nhc, para_env, gci)
     398             : 
     399             :       ! Set up the Yoshida weights
     400         394 :       IF (nhc%nyosh > 0) THEN
     401        1182 :          ALLOCATE (nhc%dt_yosh(1:nhc%nyosh))
     402         394 :          CALL set_yoshida_coef(nhc, simpar%dt)
     403             :       END IF
     404             : 
     405             :       CALL restart_nose(nhc, nose_section, save_mem, restart, binary_restart_file_name, &
     406         394 :                         "PARTICLE", para_env)
     407             : 
     408         394 :       IF (.NOT. restart) THEN
     409             :          ! Initializing thermostat forces and velocities for the Nose-Hoover
     410             :          ! Chain variables
     411         300 :          IF (nhc%nhc_len /= 0) THEN
     412         300 :             CALL init_nhc_variables(nhc, simpar%temp_ext, para_env, globenv)
     413             :          END IF
     414             :       END IF
     415             : 
     416         394 :       CALL init_nhc_forces(nhc)
     417             : 
     418         394 :       CALL timestop(handle)
     419             : 
     420         394 :    END SUBROUTINE initialize_nhc_part
     421             : 
     422             : ! **************************************************************************************************
     423             : !> \brief ...
     424             : !> \param thermostat_info ...
     425             : !> \param simpar ...
     426             : !> \param local_molecules ...
     427             : !> \param molecule ...
     428             : !> \param molecule_kind_set ...
     429             : !> \param para_env ...
     430             : !> \param globenv ...
     431             : !> \param nhc ...
     432             : !> \param nose_section ...
     433             : !> \param gci ...
     434             : !> \param save_mem ...
     435             : !> \param binary_restart_file_name ...
     436             : !> \author MI
     437             : ! **************************************************************************************************
     438          80 :    SUBROUTINE initialize_nhc_shell(thermostat_info, simpar, local_molecules, &
     439             :                                    molecule, molecule_kind_set, para_env, globenv, nhc, nose_section, &
     440             :                                    gci, save_mem, binary_restart_file_name)
     441             : 
     442             :       TYPE(thermostat_info_type), POINTER                :: thermostat_info
     443             :       TYPE(simpar_type), POINTER                         :: simpar
     444             :       TYPE(distribution_1d_type), POINTER                :: local_molecules
     445             :       TYPE(molecule_type), POINTER                       :: molecule(:)
     446             :       TYPE(molecule_kind_type), POINTER                  :: molecule_kind_set(:)
     447             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     448             :       TYPE(global_environment_type), POINTER             :: globenv
     449             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     450             :       TYPE(section_vals_type), POINTER                   :: nose_section
     451             :       TYPE(global_constraint_type), POINTER              :: gci
     452             :       LOGICAL, INTENT(IN)                                :: save_mem
     453             :       CHARACTER(LEN=*), INTENT(IN)                       :: binary_restart_file_name
     454             : 
     455             :       CHARACTER(len=*), PARAMETER :: routineN = 'initialize_nhc_shell'
     456             : 
     457             :       INTEGER                                            :: handle
     458             :       LOGICAL                                            :: restart
     459             : 
     460          40 :       CALL timeset(routineN, handle)
     461             : 
     462             :       CALL nhc_to_shell_mapping(thermostat_info, simpar, local_molecules, &
     463          40 :                                 molecule, molecule_kind_set, nhc, para_env, gci)
     464             : 
     465          40 :       restart = .FALSE.
     466             :       ! Set up the Yoshida weights
     467          40 :       IF (nhc%nyosh > 0) THEN
     468         120 :          ALLOCATE (nhc%dt_yosh(1:nhc%nyosh))
     469          40 :          CALL set_yoshida_coef(nhc, simpar%dt)
     470             :       END IF
     471             : 
     472             :       CALL restart_nose(nhc, nose_section, save_mem, restart, binary_restart_file_name, &
     473          40 :                         "SHELL", para_env)
     474             : 
     475          40 :       IF (.NOT. restart) THEN
     476             :          ! Initialize thermostat forces and velocities
     477             :          ! Chain variables
     478          28 :          IF (nhc%nhc_len /= 0) THEN
     479          28 :             CALL init_nhc_variables(nhc, simpar%temp_sh_ext, para_env, globenv)
     480             :          END IF
     481             :       END IF
     482             : 
     483          40 :       CALL init_nhc_forces(nhc)
     484             : 
     485          40 :       CALL timestop(handle)
     486             : 
     487          40 :    END SUBROUTINE initialize_nhc_shell
     488             : 
     489             : ! **************************************************************************************************
     490             : !> \brief This lists the coefficients for the Yoshida method (higher
     491             : !>      order integrator used in NVT)
     492             : !> \param nhc ...
     493             : !> \param dt ...
     494             : !> \date 14-NOV-2000
     495             : !> \par History
     496             : !>      none
     497             : ! **************************************************************************************************
     498         554 :    SUBROUTINE set_yoshida_coef(nhc, dt)
     499             : 
     500             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     501             :       REAL(KIND=dp), INTENT(IN)                          :: dt
     502             : 
     503        1108 :       REAL(KIND=dp), DIMENSION(nhc%nyosh)                :: yosh_wt
     504             : 
     505           0 :       SELECT CASE (nhc%nyosh)
     506             :       CASE DEFAULT
     507           0 :          CPABORT('Value not available.')
     508             :       CASE (1)
     509           0 :          yosh_wt(1) = 1.0_dp
     510             :       CASE (3)
     511         554 :          yosh_wt(1) = 1.0_dp/(2.0_dp - (2.0_dp)**(1.0_dp/3.0_dp))
     512         554 :          yosh_wt(2) = 1.0_dp - 2.0_dp*yosh_wt(1)
     513         554 :          yosh_wt(3) = yosh_wt(1)
     514             :       CASE (5)
     515           0 :          yosh_wt(1) = 1.0_dp/(4.0_dp - (4.0_dp)**(1.0_dp/3.0_dp))
     516           0 :          yosh_wt(2) = yosh_wt(1)
     517           0 :          yosh_wt(4) = yosh_wt(1)
     518           0 :          yosh_wt(5) = yosh_wt(1)
     519           0 :          yosh_wt(3) = 1.0_dp - 4.0_dp*yosh_wt(1)
     520             :       CASE (7)
     521           0 :          yosh_wt(1) = .78451361047756_dp
     522           0 :          yosh_wt(2) = .235573213359357_dp
     523           0 :          yosh_wt(3) = -1.17767998417887_dp
     524           0 :          yosh_wt(4) = 1.0_dp - 2.0_dp*(yosh_wt(1) + yosh_wt(2) + yosh_wt(3))
     525           0 :          yosh_wt(5) = yosh_wt(3)
     526           0 :          yosh_wt(6) = yosh_wt(2)
     527           0 :          yosh_wt(7) = yosh_wt(1)
     528             :       CASE (9)
     529           0 :          yosh_wt(1) = 0.192_dp
     530           0 :          yosh_wt(2) = 0.554910818409783619692725006662999_dp
     531           0 :          yosh_wt(3) = 0.124659619941888644216504240951585_dp
     532           0 :          yosh_wt(4) = -0.843182063596933505315033808282941_dp
     533             :          yosh_wt(5) = 1.0_dp - 2.0_dp*(yosh_wt(1) + yosh_wt(2) + &
     534           0 :                                        yosh_wt(3) + yosh_wt(4))
     535           0 :          yosh_wt(6) = yosh_wt(4)
     536           0 :          yosh_wt(7) = yosh_wt(3)
     537           0 :          yosh_wt(8) = yosh_wt(2)
     538           0 :          yosh_wt(9) = yosh_wt(1)
     539             :       CASE (15)
     540           0 :          yosh_wt(1) = 0.102799849391985_dp
     541           0 :          yosh_wt(2) = -0.196061023297549e1_dp
     542           0 :          yosh_wt(3) = 0.193813913762276e1_dp
     543           0 :          yosh_wt(4) = -0.158240635368243_dp
     544           0 :          yosh_wt(5) = -0.144485223686048e1_dp
     545           0 :          yosh_wt(6) = 0.253693336566229_dp
     546           0 :          yosh_wt(7) = 0.914844246229740_dp
     547             :          yosh_wt(8) = 1.0_dp - 2.0_dp*(yosh_wt(1) + yosh_wt(2) + &
     548           0 :                                        yosh_wt(3) + yosh_wt(4) + yosh_wt(5) + yosh_wt(6) + yosh_wt(7))
     549           0 :          yosh_wt(9) = yosh_wt(7)
     550           0 :          yosh_wt(10) = yosh_wt(6)
     551           0 :          yosh_wt(11) = yosh_wt(5)
     552           0 :          yosh_wt(12) = yosh_wt(4)
     553           0 :          yosh_wt(13) = yosh_wt(3)
     554           0 :          yosh_wt(14) = yosh_wt(2)
     555         554 :          yosh_wt(15) = yosh_wt(1)
     556             :       END SELECT
     557        2216 :       nhc%dt_yosh = dt*yosh_wt/REAL(nhc%nc, KIND=dp)
     558             : 
     559         554 :    END SUBROUTINE set_yoshida_coef
     560             : 
     561             : ! **************************************************************************************************
     562             : !> \brief read coordinate, velocities, forces and masses of the
     563             : !>      thermostat from restart file
     564             : !> \param nhc ...
     565             : !> \param nose_section ...
     566             : !> \param save_mem ...
     567             : !> \param restart ...
     568             : !> \param binary_restart_file_name ...
     569             : !> \param thermostat_name ...
     570             : !> \param para_env ...
     571             : !> \par History
     572             : !>     24-07-07 created
     573             : !> \author MI
     574             : ! **************************************************************************************************
     575         554 :    SUBROUTINE restart_nose(nhc, nose_section, save_mem, restart, &
     576             :                            binary_restart_file_name, thermostat_name, &
     577             :                            para_env)
     578             : 
     579             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     580             :       TYPE(section_vals_type), POINTER                   :: nose_section
     581             :       LOGICAL, INTENT(IN)                                :: save_mem
     582             :       LOGICAL, INTENT(OUT)                               :: restart
     583             :       CHARACTER(LEN=*), INTENT(IN)                       :: binary_restart_file_name, thermostat_name
     584             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     585             : 
     586             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'restart_nose'
     587             : 
     588             :       INTEGER                                            :: handle, i, ind, j
     589             :       LOGICAL                                            :: explicit
     590         554 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: buffer
     591             :       TYPE(map_info_type), POINTER                       :: map_info
     592             :       TYPE(section_vals_type), POINTER                   :: work_section
     593             : 
     594         554 :       CALL timeset(routineN, handle)
     595             : 
     596         554 :       NULLIFY (buffer)
     597         554 :       NULLIFY (work_section)
     598             : 
     599         554 :       IF (LEN_TRIM(binary_restart_file_name) > 0) THEN
     600             : 
     601             :          ! Read binary restart file, if available
     602             : 
     603             :          CALL read_binary_thermostats_nose(thermostat_name, nhc, binary_restart_file_name, &
     604          38 :                                            restart, para_env)
     605             : 
     606             :       ELSE
     607             : 
     608             :          ! Read the default restart file in ASCII format
     609             : 
     610         516 :          explicit = .FALSE.
     611         516 :          restart = .FALSE.
     612             : 
     613         516 :          IF (ASSOCIATED(nose_section)) THEN
     614         516 :             work_section => section_vals_get_subs_vals(nose_section, "VELOCITY")
     615         516 :             CALL section_vals_get(work_section, explicit=explicit)
     616         516 :             restart = explicit
     617         516 :             work_section => section_vals_get_subs_vals(nose_section, "COORD")
     618         516 :             CALL section_vals_get(work_section, explicit=explicit)
     619         516 :             IF (.NOT. restart .AND. explicit) &
     620             :                CALL cp_abort(__LOCATION__, "You need to define both VELOCITY and "// &
     621           0 :                              "COORD and MASS and FORCE section (or none) in the NOSE section")
     622         516 :             restart = explicit .AND. restart
     623         516 :             work_section => section_vals_get_subs_vals(nose_section, "MASS")
     624         516 :             CALL section_vals_get(work_section, explicit=explicit)
     625         516 :             IF (.NOT. restart .AND. explicit) &
     626             :                CALL cp_abort(__LOCATION__, "You need to define both VELOCITY and "// &
     627           0 :                              "COORD and MASS and FORCE section (or none) in the NOSE section")
     628         516 :             restart = explicit .AND. restart
     629         516 :             work_section => section_vals_get_subs_vals(nose_section, "FORCE")
     630         516 :             CALL section_vals_get(work_section, explicit=explicit)
     631         516 :             IF (.NOT. restart .AND. explicit) &
     632             :                CALL cp_abort(__LOCATION__, "You need to define both VELOCITY and "// &
     633           0 :                              "COORD and MASS and FORCE section (or none) in the NOSE section")
     634         940 :             restart = explicit .AND. restart
     635             :          END IF
     636             : 
     637         516 :          IF (restart) THEN
     638          92 :             map_info => nhc%map_info
     639          92 :             CALL section_vals_val_get(nose_section, "COORD%_DEFAULT_KEYWORD_", r_vals=buffer)
     640        4478 :             DO i = 1, SIZE(nhc%nvt, 2)
     641        4386 :                ind = map_info%index(i)
     642        4386 :                ind = (ind - 1)*nhc%nhc_len
     643       18018 :                DO j = 1, SIZE(nhc%nvt, 1)
     644       13540 :                   ind = ind + 1
     645       17926 :                   nhc%nvt(j, i)%eta = buffer(ind)
     646             :                END DO
     647             :             END DO
     648          92 :             CALL section_vals_val_get(nose_section, "VELOCITY%_DEFAULT_KEYWORD_", r_vals=buffer)
     649        4478 :             DO i = 1, SIZE(nhc%nvt, 2)
     650        4386 :                ind = map_info%index(i)
     651        4386 :                ind = (ind - 1)*nhc%nhc_len
     652       18018 :                DO j = 1, SIZE(nhc%nvt, 1)
     653       13540 :                   ind = ind + 1
     654       17926 :                   nhc%nvt(j, i)%v = buffer(ind)
     655             :                END DO
     656             :             END DO
     657          92 :             CALL section_vals_val_get(nose_section, "MASS%_DEFAULT_KEYWORD_", r_vals=buffer)
     658        4478 :             DO i = 1, SIZE(nhc%nvt, 2)
     659        4386 :                ind = map_info%index(i)
     660        4386 :                ind = (ind - 1)*nhc%nhc_len
     661       18018 :                DO j = 1, SIZE(nhc%nvt, 1)
     662       13540 :                   ind = ind + 1
     663       17926 :                   nhc%nvt(j, i)%mass = buffer(ind)
     664             :                END DO
     665             :             END DO
     666          92 :             CALL section_vals_val_get(nose_section, "FORCE%_DEFAULT_KEYWORD_", r_vals=buffer)
     667        4478 :             DO i = 1, SIZE(nhc%nvt, 2)
     668        4386 :                ind = map_info%index(i)
     669        4386 :                ind = (ind - 1)*nhc%nhc_len
     670       18018 :                DO j = 1, SIZE(nhc%nvt, 1)
     671       13540 :                   ind = ind + 1
     672       17926 :                   nhc%nvt(j, i)%f = buffer(ind)
     673             :                END DO
     674             :             END DO
     675             :          END IF
     676             : 
     677         516 :          IF (save_mem) THEN
     678           2 :             NULLIFY (work_section)
     679           2 :             work_section => section_vals_get_subs_vals(nose_section, "COORD")
     680           2 :             CALL section_vals_remove_values(work_section)
     681           2 :             NULLIFY (work_section)
     682           2 :             work_section => section_vals_get_subs_vals(nose_section, "VELOCITY")
     683           2 :             CALL section_vals_remove_values(work_section)
     684           2 :             NULLIFY (work_section)
     685           2 :             work_section => section_vals_get_subs_vals(nose_section, "FORCE")
     686           2 :             CALL section_vals_remove_values(work_section)
     687           2 :             NULLIFY (work_section)
     688           2 :             work_section => section_vals_get_subs_vals(nose_section, "MASS")
     689           2 :             CALL section_vals_remove_values(work_section)
     690             :          END IF
     691             : 
     692             :       END IF
     693             : 
     694         554 :       CALL timestop(handle)
     695             : 
     696         554 :    END SUBROUTINE restart_nose
     697             : 
     698             : ! **************************************************************************************************
     699             : !> \brief Initializes the NHC velocities to the Maxwellian distribution
     700             : !> \param nhc ...
     701             : !> \param temp_ext ...
     702             : !> \param para_env ...
     703             : !> \param globenv ...
     704             : !> \date 14-NOV-2000
     705             : !> \par History
     706             : !>      none
     707             : ! **************************************************************************************************
     708         430 :    SUBROUTINE init_nhc_variables(nhc, temp_ext, para_env, globenv)
     709             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     710             :       REAL(KIND=dp), INTENT(IN)                          :: temp_ext
     711             :       TYPE(mp_para_env_type), POINTER                    :: para_env
     712             :       TYPE(global_environment_type), POINTER             :: globenv
     713             : 
     714             :       CHARACTER(len=*), PARAMETER :: routineN = 'init_nhc_variables'
     715             : 
     716             :       INTEGER                                            :: handle, i, icount, j, number, tot_rn
     717             :       REAL(KIND=dp)                                      :: akin, dum, temp
     718         430 :       REAL(KIND=dp), ALLOCATABLE, DIMENSION(:)           :: array_of_rn
     719             :       TYPE(map_info_type), POINTER                       :: map_info
     720             : 
     721         430 :       CALL timeset(routineN, handle)
     722             : 
     723         430 :       tot_rn = 0
     724             : 
     725             :       ! first initializing the mass of the nhc variables
     726       72430 :       nhc%nvt(:, :)%mass = nhc%nvt(:, :)%nkt*nhc%tau_nhc**2
     727       72430 :       nhc%nvt(:, :)%eta = 0._dp
     728       72430 :       nhc%nvt(:, :)%v = 0._dp
     729       72430 :       nhc%nvt(:, :)%f = 0._dp
     730             : 
     731         430 :       map_info => nhc%map_info
     732         758 :       SELECT CASE (map_info%dis_type)
     733             :       CASE (do_thermo_only_master) ! for NPT
     734             :       CASE DEFAULT
     735         328 :          tot_rn = nhc%glob_num_nhc*nhc%nhc_len
     736             : 
     737         984 :          ALLOCATE (array_of_rn(tot_rn))
     738      110954 :          array_of_rn(:) = 0.0_dp
     739             :       END SELECT
     740             : 
     741         102 :       SELECT CASE (map_info%dis_type)
     742             :       CASE (do_thermo_only_master) ! for NPT
     743             :          ! Map deterministically determined random number to nhc % v
     744         204 :          DO i = 1, nhc%loc_num_nhc
     745         522 :             DO j = 1, nhc%nhc_len
     746         420 :                nhc%nvt(j, i)%v = globenv%gaussian_rng_stream%next()
     747             :             END DO
     748             :          END DO
     749             : 
     750         102 :          akin = 0.0_dp
     751         204 :          DO i = 1, nhc%loc_num_nhc
     752         522 :             DO j = 1, nhc%nhc_len
     753             :                akin = akin + 0.5_dp*(nhc%nvt(j, i)%mass* &
     754             :                                      nhc%nvt(j, i)%v* &
     755         420 :                                      nhc%nvt(j, i)%v)
     756             :             END DO
     757             :          END DO
     758         102 :          number = nhc%loc_num_nhc
     759             : 
     760             :          ! scale velocities to get the correct initial temperature
     761         102 :          temp = 2.0_dp*akin/REAL(number, KIND=dp)
     762         102 :          IF (temp > 0.0_dp) temp = SQRT(temp_ext/temp)
     763         204 :          DO i = 1, nhc%loc_num_nhc
     764         522 :             DO j = 1, nhc%nhc_len
     765         318 :                nhc%nvt(j, i)%v = temp*nhc%nvt(j, i)%v
     766         420 :                nhc%nvt(j, i)%eta = 0.0_dp
     767             :             END DO
     768             :          END DO
     769             : 
     770             :          ! initializing all of the forces on the thermostats
     771         204 :          DO i = 1, nhc%loc_num_nhc
     772         420 :             DO j = 2, nhc%nhc_len
     773             :                nhc%nvt(j, i)%f = nhc%nvt(j - 1, i)%mass*nhc%nvt(j - 1, i)%v* &
     774         216 :                                  nhc%nvt(j - 1, i)%v - nhc%nvt(j, i)%nkt
     775         318 :                IF (nhc%nvt(j, i)%mass > 0.0_dp) THEN
     776         216 :                   nhc%nvt(j, i)%f = nhc%nvt(j, i)%f/nhc%nvt(j, i)%mass
     777             :                END IF
     778             :             END DO
     779             :          END DO
     780             : 
     781             :       CASE DEFAULT
     782      110524 :          DO i = 1, tot_rn
     783      110524 :             array_of_rn(i) = globenv%gaussian_rng_stream%next()
     784             :          END DO
     785             :          ! Map deterministically determined random number to nhc % v
     786       16503 :          DO i = 1, nhc%loc_num_nhc
     787       16175 :             icount = map_info%index(i)
     788       16175 :             icount = (icount - 1)*nhc%nhc_len
     789       71908 :             DO j = 1, nhc%nhc_len
     790       55405 :                icount = icount + 1
     791       55405 :                nhc%nvt(j, i)%v = array_of_rn(icount)
     792             :                ! WRITE ( *, * ) 'VEL', para_env%mepos, i,j, nhc%nvt(j,i)%v
     793       71580 :                nhc%nvt(j, i)%eta = 0.0_dp
     794             :             END DO
     795             :          END DO
     796         328 :          DEALLOCATE (array_of_rn)
     797             : 
     798         328 :          number = nhc%glob_num_nhc
     799         328 :          CALL get_nhc_energies(nhc, dum, akin, para_env)
     800             : 
     801             :          ! scale velocities to get the correct initial temperature
     802         328 :          temp = 2.0_dp*akin/REAL(number, KIND=dp)
     803         328 :          IF (temp > 0.0_dp) temp = SQRT(temp_ext/temp)
     804       16503 :          DO i = 1, nhc%loc_num_nhc
     805       71908 :             DO j = 1, nhc%nhc_len
     806       71580 :                nhc%nvt(j, i)%v = temp*nhc%nvt(j, i)%v
     807             :             END DO
     808             :          END DO
     809             : 
     810             :          ! initializing all of the forces on the thermostats
     811       17261 :          DO i = 1, nhc%loc_num_nhc
     812       55733 :             DO j = 2, nhc%nhc_len
     813             :                nhc%nvt(j, i)%f = nhc%nvt(j - 1, i)%mass*nhc%nvt(j - 1, i)%v* &
     814       39230 :                                  nhc%nvt(j - 1, i)%v - nhc%nvt(j, i)%nkt
     815       55405 :                IF (nhc%nvt(j, i)%mass > 0.0_dp) THEN
     816       38654 :                   nhc%nvt(j, i)%f = nhc%nvt(j, i)%f/nhc%nvt(j, i)%mass
     817             :                END IF
     818             :             END DO
     819             :          END DO
     820             : 
     821             :       END SELECT
     822             : 
     823         430 :       CALL timestop(handle)
     824             : 
     825         430 :    END SUBROUTINE init_nhc_variables
     826             : 
     827             : ! **************************************************************************************************
     828             : !> \brief Initializes the barostat velocities to the Maxwellian distribution
     829             : !> \param npt ...
     830             : !> \param tau_cell ...
     831             : !> \param temp_ext ...
     832             : !> \param nfree ...
     833             : !> \param ensemble ...
     834             : !> \param cmass ...
     835             : !> \param globenv ...
     836             : !> \date 14-NOV-2000
     837             : !> \par History
     838             : !>      none
     839             : ! **************************************************************************************************
     840         150 :    SUBROUTINE init_barostat_variables(npt, tau_cell, temp_ext, nfree, ensemble, &
     841             :                                       cmass, globenv)
     842             : 
     843             :       TYPE(npt_info_type), DIMENSION(:, :), &
     844             :          INTENT(INOUT)                                   :: npt
     845             :       REAL(KIND=dp), INTENT(IN)                          :: tau_cell, temp_ext
     846             :       INTEGER, INTENT(IN)                                :: nfree, ensemble
     847             :       REAL(KIND=dp), INTENT(IN)                          :: cmass
     848             :       TYPE(global_environment_type), POINTER             :: globenv
     849             : 
     850             :       CHARACTER(len=*), PARAMETER :: routineN = 'init_barostat_variables'
     851             : 
     852             :       INTEGER                                            :: handle, i, j, number
     853             :       REAL(KIND=dp)                                      :: akin, temp, v
     854             : 
     855         150 :       CALL timeset(routineN, handle)
     856             : 
     857         150 :       temp = 0.0_dp
     858             : 
     859             :       ! first initializing the mass of the nhc variables
     860             : 
     861         890 :       npt(:, :)%eps = 0.0_dp
     862         890 :       npt(:, :)%v = 0.0_dp
     863         890 :       npt(:, :)%f = 0.0_dp
     864         248 :       SELECT CASE (ensemble)
     865             :       CASE (npt_i_ensemble, npt_ia_ensemble)
     866         294 :          npt(:, :)%mass = REAL(nfree + 3, KIND=dp)*temp_ext*tau_cell**2
     867             :       CASE (npt_f_ensemble)
     868         442 :          npt(:, :)%mass = REAL(nfree + 3, KIND=dp)*temp_ext*tau_cell**2/3.0_dp
     869             :       CASE (nph_uniaxial_ensemble, nph_uniaxial_damped_ensemble)
     870          18 :          npt(:, :)%mass = cmass
     871             :       CASE (npe_f_ensemble)
     872         130 :          npt(:, :)%mass = REAL(nfree + 3, KIND=dp)*temp_ext*tau_cell**2/3.0_dp
     873             :       CASE (npe_i_ensemble)
     874         154 :          npt(:, :)%mass = REAL(nfree + 3, KIND=dp)*temp_ext*tau_cell**2
     875             :       END SELECT
     876             :       ! initializing velocities
     877         388 :       DO i = 1, SIZE(npt, 1)
     878         758 :          DO j = i, SIZE(npt, 2)
     879         370 :             v = globenv%gaussian_rng_stream%next()
     880             :             ! Symmetrizing the initial barostat velocities to ensure
     881             :             ! no rotation of the cell under NPT_F
     882         370 :             npt(j, i)%v = v
     883         608 :             npt(i, j)%v = v
     884             :          END DO
     885             :       END DO
     886             : 
     887         388 :       akin = 0.0_dp
     888         388 :       DO i = 1, SIZE(npt, 1)
     889         890 :          DO j = 1, SIZE(npt, 2)
     890         740 :             akin = akin + 0.5_dp*(npt(j, i)%mass*npt(j, i)%v*npt(j, i)%v)
     891             :          END DO
     892             :       END DO
     893             : 
     894         150 :       number = SIZE(npt, 1)*SIZE(npt, 2)
     895             : 
     896             :       ! scale velocities to get the correct initial temperature
     897         150 :       IF (number /= 0) THEN
     898         150 :          temp = 2.0_dp*akin/REAL(number, KIND=dp)
     899         150 :          IF (temp > 0.0_dp) temp = SQRT(temp_ext/temp)
     900             :       END IF
     901         388 :       DO i = 1, SIZE(npt, 1)
     902         758 :          DO j = i, SIZE(npt, 2)
     903         370 :             npt(j, i)%v = temp*npt(j, i)%v
     904         370 :             npt(i, j)%v = npt(j, i)%v
     905         238 :             IF (debug_isotropic_limit) THEN
     906             :                npt(j, i)%v = 0.0_dp
     907             :                npt(i, j)%v = 0.0_dp
     908             :                WRITE (*, *) 'DEBUG ISOTROPIC LIMIT| INITIAL v_eps', npt(j, i)%v
     909             :             END IF
     910             :          END DO
     911             :       END DO
     912             : 
     913             :       ! Zero barostat velocities for nph_uniaxial
     914             :       SELECT CASE (ensemble)
     915             :          ! Zero barostat velocities for nph_uniaxial
     916             :       CASE (nph_uniaxial_ensemble, nph_uniaxial_damped_ensemble)
     917         162 :          npt(:, :)%v = 0.0_dp
     918             :       END SELECT
     919             : 
     920         150 :       CALL timestop(handle)
     921             : 
     922         150 :    END SUBROUTINE init_barostat_variables
     923             : 
     924             : ! **************************************************************************************************
     925             : !> \brief Assigns extended parameters from the restart file.
     926             : !> \param nhc ...
     927             : !> \author CJM
     928             : ! **************************************************************************************************
     929         554 :    SUBROUTINE init_nhc_forces(nhc)
     930             : 
     931             :       TYPE(lnhc_parameters_type), POINTER                :: nhc
     932             : 
     933             :       CHARACTER(len=*), PARAMETER                        :: routineN = 'init_nhc_forces'
     934             : 
     935             :       INTEGER                                            :: handle, i, j
     936             : 
     937         554 :       CALL timeset(routineN, handle)
     938             : 
     939         554 :       CPASSERT(ASSOCIATED(nhc))
     940             :       ! assign the forces
     941       25825 :       DO i = 1, SIZE(nhc%nvt, 2)
     942       83641 :          DO j = 2, SIZE(nhc%nvt, 1)
     943             :             nhc%nvt(j, i)%f = nhc%nvt(j - 1, i)%mass* &
     944             :                               nhc%nvt(j - 1, i)%v**2 - &
     945       57816 :                               nhc%nvt(j, i)%nkt
     946       83087 :             IF (nhc%nvt(j, i)%mass > 0.0_dp) THEN
     947       57240 :                nhc%nvt(j, i)%f = nhc%nvt(j, i)%f/nhc%nvt(j, i)%mass
     948             :             END IF
     949             :          END DO
     950             :       END DO
     951             : 
     952         554 :       CALL timestop(handle)
     953             : 
     954         554 :    END SUBROUTINE init_nhc_forces
     955             : 
     956             : END MODULE extended_system_init

Generated by: LCOV version 1.15