LCOV - code coverage report
Current view: top level - src/motion/thermostat - extended_system_init.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:71c3ab0) Lines: 79.2 % 327 259
Test Date: 2026-07-25 06:35:44 Functions: 81.8 % 11 9

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

Generated by: LCOV version 2.0-1