LCOV - code coverage report
Current view: top level - src/motion - averages_types.F (source / functions) Coverage Total Hit
Test: CP2K Regtests (git:123285f) Lines: 74.9 % 203 152
Test Date: 2026-11-04 00:58:17 Functions: 71.4 % 7 5

            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              : !> \brief Handles the type to compute averages during an MD
      10              : !> \author Teodoro Laino [tlaino] - 03.2008 - University of Zurich
      11              : ! **************************************************************************************************
      12              : MODULE averages_types
      13              :    USE cell_types,                      ONLY: cell_type
      14              :    USE colvar_utils,                    ONLY: get_clv_force,&
      15              :                                               number_of_colvar
      16              :    USE cp_log_handling,                 ONLY: cp_get_default_logger,&
      17              :                                               cp_logger_type,&
      18              :                                               cp_to_string
      19              :    USE cp_output_handling,              ONLY: cp_print_key_finished_output,&
      20              :                                               cp_print_key_unit_nr
      21              :    USE force_env_types,                 ONLY: force_env_type
      22              :    USE input_section_types,             ONLY: section_vals_get,&
      23              :                                               section_vals_get_subs_vals,&
      24              :                                               section_vals_remove_values,&
      25              :                                               section_vals_type,&
      26              :                                               section_vals_val_get
      27              :    USE kinds,                           ONLY: default_string_length,&
      28              :                                               dp
      29              :    USE md_ener_types,                   ONLY: md_ener_type
      30              :    USE virial_types,                    ONLY: virial_type
      31              : #include "../base/base_uses.f90"
      32              : 
      33              :    IMPLICIT NONE
      34              : 
      35              :    PRIVATE
      36              : 
      37              : ! **************************************************************************************************
      38              :    TYPE average_quantities_type
      39              :       INTEGER                                       :: itimes_start = -1
      40              :       LOGICAL                                       :: do_averages = .FALSE.
      41              :       TYPE(section_vals_type), POINTER              :: averages_section => NULL()
      42              :       ! Real Scalar Quantities
      43              :       REAL(KIND=dp)                                 :: avetemp = 0.0_dp, avepot = 0.0_dp, avekin = 0.0_dp, &
      44              :                                                        avevol = 0.0_dp, aveca = 0.0_dp, avecb = 0.0_dp, avecc = 0.0_dp
      45              :       REAL(KIND=dp)                                 :: avetemp_baro = 0.0_dp, avehugoniot = 0.0_dp, avecpu = 0.0_dp
      46              :       REAL(KIND=dp)                                 :: aveal = 0.0_dp, avebe = 0.0_dp, avega = 0.0_dp, avepress = 0.0_dp, &
      47              :                                                        avekinc = 0.0_dp, avetempc = 0.0_dp, avepxx = 0.0_dp
      48              :       REAL(KIND=dp)                                 :: avetemp_qm = 0.0_dp, avekin_qm = 0.0_dp, econs = 0.0_dp
      49              :       ! Virial
      50              :       TYPE(virial_type), POINTER                    :: virial => NULL()
      51              :       ! Colvar
      52              :       REAL(KIND=dp), POINTER, DIMENSION(:)          :: avecolvar => NULL()
      53              :       REAL(KIND=dp), POINTER, DIMENSION(:)          :: aveMmatrix => NULL()
      54              :    END TYPE average_quantities_type
      55              : 
      56              : ! **************************************************************************************************
      57              :    INTERFACE get_averages
      58              :       MODULE PROCEDURE get_averages_rs, get_averages_rv, get_averages_rm
      59              :    END INTERFACE get_averages
      60              : 
      61              : ! *** Public subroutines and data types ***
      62              :    PUBLIC :: average_quantities_type, create_averages, release_averages, &
      63              :              compute_averages
      64              : 
      65              : ! *** Global parameters ***
      66              :    CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'averages_types'
      67              : 
      68              : CONTAINS
      69              : 
      70              : ! **************************************************************************************************
      71              : !> \brief Creates averages environment
      72              : !> \param averages ...
      73              : !> \param averages_section ...
      74              : !> \param virial_avg ...
      75              : !> \param force_env ...
      76              : !> \author Teodoro Laino [tlaino] - 03.2008 - University of Zurich
      77              : ! **************************************************************************************************
      78         1763 :    SUBROUTINE create_averages(averages, averages_section, virial_avg, force_env)
      79              :       TYPE(average_quantities_type), POINTER             :: averages
      80              :       TYPE(section_vals_type), POINTER                   :: averages_section
      81              :       LOGICAL, INTENT(IN), OPTIONAL                      :: virial_avg
      82              :       TYPE(force_env_type), POINTER                      :: force_env
      83              : 
      84              :       INTEGER                                            :: i, nint
      85              :       LOGICAL                                            :: do_colvars
      86              : 
      87         1763 :       ALLOCATE (averages)
      88              :       ! Point to the averages section
      89         1763 :       averages%averages_section => averages_section
      90         1763 :       CALL section_vals_val_get(averages_section, "_SECTION_PARAMETERS_", l_val=averages%do_averages)
      91         1763 :       IF (averages%do_averages) THEN
      92              :          ! Setup Virial if requested
      93         1761 :          IF (PRESENT(virial_avg)) THEN
      94            0 :             IF (virial_avg) THEN
      95            0 :                ALLOCATE (averages%virial)
      96              :             END IF
      97              :          END IF
      98         1761 :          CALL section_vals_val_get(averages_section, "AVERAGE_COLVAR", l_val=do_colvars)
      99              :          ! Total number of COLVARs
     100         1761 :          nint = 0
     101         1761 :          IF (do_colvars) nint = number_of_colvar(force_env)
     102         3524 :          ALLOCATE (averages%avecolvar(nint))
     103         3524 :          ALLOCATE (averages%aveMmatrix(nint*nint))
     104         1857 :          DO i = 1, nint
     105         1857 :             averages%avecolvar(i) = 0.0_dp
     106              :          END DO
     107         8130 :          DO i = 1, nint*nint
     108         6369 :             averages%aveMmatrix(i) = 0.0_dp
     109              :          END DO
     110              :       END IF
     111         1763 :    END SUBROUTINE create_averages
     112              : 
     113              : ! **************************************************************************************************
     114              : !> \brief releases the given averages env
     115              : !> \param averages ...
     116              : !> \author Teodoro Laino [tlaino] - 03.2008 - University of Zurich
     117              : ! **************************************************************************************************
     118         1763 :    SUBROUTINE release_averages(averages)
     119              :       TYPE(average_quantities_type), POINTER             :: averages
     120              : 
     121              :       TYPE(section_vals_type), POINTER                   :: work_section
     122              : 
     123         1763 :       IF (ASSOCIATED(averages)) THEN
     124         1763 :          IF (ASSOCIATED(averages%virial)) DEALLOCATE (averages%virial)
     125         1763 :          IF (ASSOCIATED(averages%avecolvar)) THEN
     126         1761 :             DEALLOCATE (averages%avecolvar)
     127              :          END IF
     128         1763 :          IF (ASSOCIATED(averages%aveMmatrix)) THEN
     129         1761 :             DEALLOCATE (averages%aveMmatrix)
     130              :          END IF
     131              :          ! Removes restart values from the corresponding restart section..
     132         1763 :          work_section => section_vals_get_subs_vals(averages%averages_section, "RESTART_AVERAGES")
     133         1763 :          CALL section_vals_remove_values(work_section)
     134         1763 :          NULLIFY (averages%averages_section)
     135              :          !
     136         1763 :          DEALLOCATE (averages)
     137              :       END IF
     138              : 
     139         1763 :    END SUBROUTINE release_averages
     140              : 
     141              : ! **************************************************************************************************
     142              : !> \brief computes the averages
     143              : !> \param averages ...
     144              : !> \param force_env ...
     145              : !> \param md_ener ...
     146              : !> \param cell ...
     147              : !> \param virial ...
     148              : !> \param pv_scalar ...
     149              : !> \param pv_xx ...
     150              : !> \param used_time ...
     151              : !> \param hugoniot ...
     152              : !> \param abc ...
     153              : !> \param cell_angle ...
     154              : !> \param nat ...
     155              : !> \param itimes ...
     156              : !> \param time ...
     157              : !> \param my_pos ...
     158              : !> \param my_act ...
     159              : !> \author Teodoro Laino [tlaino] - 03.2008 - University of Zurich
     160              : ! **************************************************************************************************
     161        78958 :    SUBROUTINE compute_averages(averages, force_env, md_ener, cell, virial, &
     162              :                                pv_scalar, pv_xx, used_time, hugoniot, abc, cell_angle, nat, itimes, &
     163              :                                time, my_pos, my_act)
     164              :       TYPE(average_quantities_type), POINTER             :: averages
     165              :       TYPE(force_env_type), POINTER                      :: force_env
     166              :       TYPE(md_ener_type), POINTER                        :: md_ener
     167              :       TYPE(cell_type), POINTER                           :: cell
     168              :       TYPE(virial_type), POINTER                         :: virial
     169              :       REAL(KIND=dp), INTENT(IN)                          :: pv_scalar, pv_xx
     170              :       REAL(KIND=dp), POINTER                             :: used_time
     171              :       REAL(KIND=dp), INTENT(IN)                          :: hugoniot
     172              :       REAL(KIND=dp), DIMENSION(3), INTENT(IN)            :: abc, cell_angle
     173              :       INTEGER, INTENT(IN)                                :: nat, itimes
     174              :       REAL(KIND=dp), INTENT(IN)                          :: time
     175              :       CHARACTER(LEN=default_string_length), INTENT(IN)   :: my_pos, my_act
     176              : 
     177              :       CHARACTER(len=*), PARAMETER                        :: routineN = 'compute_averages'
     178              : 
     179              :       CHARACTER(LEN=default_string_length)               :: ctmp
     180              :       INTEGER                                            :: delta_t, handle, i, nint, output_unit
     181              :       LOGICAL                                            :: restart_averages
     182              :       REAL(KIND=dp)                                      :: start_time
     183        39479 :       REAL(KIND=dp), DIMENSION(:), POINTER               :: cvalues, Mmatrix, tmp
     184              :       TYPE(cp_logger_type), POINTER                      :: logger
     185              :       TYPE(section_vals_type), POINTER                   :: restart_section
     186              : 
     187        39479 :       CALL timeset(routineN, handle)
     188              :       CALL section_vals_val_get(averages%averages_section, "ACQUISITION_START_TIME", &
     189        39479 :                                 r_val=start_time)
     190        39479 :       IF (averages%do_averages) THEN
     191        39459 :          NULLIFY (cvalues, Mmatrix, logger)
     192        39459 :          logger => cp_get_default_logger()
     193              :          ! Determine the nr. of internal colvar (if any/requested)
     194        39459 :          nint = 0
     195        39459 :          IF (ASSOCIATED(averages%avecolvar)) nint = SIZE(averages%avecolvar)
     196              : 
     197              :          ! Evaluate averages if we collected enough statistics (user defined)
     198        39459 :          IF (time >= start_time) THEN
     199              : 
     200              :             ! Handling properly the restart
     201        39445 :             IF (averages%itimes_start == -1) THEN
     202         1745 :                restart_section => section_vals_get_subs_vals(averages%averages_section, "RESTART_AVERAGES")
     203         1745 :                CALL section_vals_get(restart_section, explicit=restart_averages)
     204         1745 :                IF (restart_averages) THEN
     205          172 :                   CALL section_vals_val_get(restart_section, "ITIMES_START", i_val=averages%itimes_start)
     206          172 :                   CALL section_vals_val_get(restart_section, "AVECPU", r_val=averages%avecpu)
     207          172 :                   CALL section_vals_val_get(restart_section, "AVEHUGONIOT", r_val=averages%avehugoniot)
     208          172 :                   CALL section_vals_val_get(restart_section, "AVETEMP_BARO", r_val=averages%avetemp_baro)
     209          172 :                   CALL section_vals_val_get(restart_section, "AVEPOT", r_val=averages%avepot)
     210          172 :                   CALL section_vals_val_get(restart_section, "AVEKIN", r_val=averages%avekin)
     211          172 :                   CALL section_vals_val_get(restart_section, "AVETEMP", r_val=averages%avetemp)
     212          172 :                   CALL section_vals_val_get(restart_section, "AVEKIN_QM", r_val=averages%avekin_qm)
     213          172 :                   CALL section_vals_val_get(restart_section, "AVETEMP_QM", r_val=averages%avetemp_qm)
     214          172 :                   CALL section_vals_val_get(restart_section, "AVEVOL", r_val=averages%avevol)
     215          172 :                   CALL section_vals_val_get(restart_section, "AVECELL_A", r_val=averages%aveca)
     216          172 :                   CALL section_vals_val_get(restart_section, "AVECELL_B", r_val=averages%avecb)
     217          172 :                   CALL section_vals_val_get(restart_section, "AVECELL_C", r_val=averages%avecc)
     218          172 :                   CALL section_vals_val_get(restart_section, "AVEALPHA", r_val=averages%aveal)
     219          172 :                   CALL section_vals_val_get(restart_section, "AVEBETA", r_val=averages%avebe)
     220          172 :                   CALL section_vals_val_get(restart_section, "AVEGAMMA", r_val=averages%avega)
     221          172 :                   CALL section_vals_val_get(restart_section, "AVE_ECONS", r_val=averages%econs)
     222              :                   ! Virial
     223          172 :                   IF (virial%pv_availability) THEN
     224           76 :                      CALL section_vals_val_get(restart_section, "AVE_PRESS", r_val=averages%avepress)
     225           76 :                      CALL section_vals_val_get(restart_section, "AVE_PXX", r_val=averages%avepxx)
     226           76 :                      IF (ASSOCIATED(averages%virial)) THEN
     227            0 :                         CALL section_vals_val_get(restart_section, "AVE_PV_TOT", r_vals=tmp)
     228            0 :                         averages%virial%pv_total = RESHAPE(tmp, [3, 3])
     229            0 :                         CALL section_vals_val_get(restart_section, "AVE_PV_VIR", r_vals=tmp)
     230            0 :                         averages%virial%pv_virial = RESHAPE(tmp, [3, 3])
     231            0 :                         CALL section_vals_val_get(restart_section, "AVE_PV_KIN", r_vals=tmp)
     232            0 :                         averages%virial%pv_kinetic = RESHAPE(tmp, [3, 3])
     233            0 :                         CALL section_vals_val_get(restart_section, "AVE_PV_CNSTR", r_vals=tmp)
     234            0 :                         averages%virial%pv_constraint = RESHAPE(tmp, [3, 3])
     235            0 :                         CALL section_vals_val_get(restart_section, "AVE_PV_XC", r_vals=tmp)
     236            0 :                         averages%virial%pv_xc = RESHAPE(tmp, [3, 3])
     237            0 :                         CALL section_vals_val_get(restart_section, "AVE_PV_FOCK_4C", r_vals=tmp)
     238            0 :                         averages%virial%pv_fock_4c = RESHAPE(tmp, [3, 3])
     239              :                      END IF
     240              :                   END IF
     241              :                   ! Colvars
     242          172 :                   IF (nint > 0) THEN
     243            0 :                      CALL section_vals_val_get(restart_section, "AVE_COLVARS", r_vals=cvalues)
     244            0 :                      CALL section_vals_val_get(restart_section, "AVE_MMATRIX", r_vals=Mmatrix)
     245            0 :                      CPASSERT(nint == SIZE(cvalues))
     246            0 :                      CPASSERT(nint*nint == SIZE(Mmatrix))
     247            0 :                      averages%avecolvar = cvalues
     248            0 :                      averages%aveMmatrix = Mmatrix
     249              :                   END IF
     250              :                ELSE
     251         1573 :                   averages%itimes_start = itimes
     252              :                END IF
     253              :             END IF
     254        39445 :             delta_t = itimes - averages%itimes_start + 1
     255              : 
     256              :             ! Perform averages
     257         1579 :             SELECT CASE (delta_t)
     258              :             CASE (1)
     259         1579 :                averages%avecpu = used_time
     260         1579 :                averages%avehugoniot = hugoniot
     261         1579 :                averages%avetemp_baro = md_ener%temp_baro
     262         1579 :                averages%avepot = md_ener%epot
     263         1579 :                averages%avekin = md_ener%ekin
     264         1579 :                averages%avetemp = md_ener%temp_part
     265         1579 :                averages%avekin_qm = md_ener%ekin_qm
     266         1579 :                averages%avetemp_qm = md_ener%temp_qm
     267         1579 :                averages%avevol = cell%deth
     268         1579 :                averages%aveca = abc(1)
     269         1579 :                averages%avecb = abc(2)
     270         1579 :                averages%avecc = abc(3)
     271         1579 :                averages%aveal = cell_angle(3)
     272         1579 :                averages%avebe = cell_angle(2)
     273         1579 :                averages%avega = cell_angle(1)
     274         1579 :                averages%econs = 0._dp
     275              :                ! Virial
     276         1579 :                IF (virial%pv_availability) THEN
     277          206 :                   averages%avepress = pv_scalar
     278          206 :                   averages%avepxx = pv_xx
     279          206 :                   IF (ASSOCIATED(averages%virial)) THEN
     280            0 :                      averages%virial%pv_total = virial%pv_total
     281            0 :                      averages%virial%pv_virial = virial%pv_virial
     282            0 :                      averages%virial%pv_kinetic = virial%pv_kinetic
     283            0 :                      averages%virial%pv_constraint = virial%pv_constraint
     284            0 :                      averages%virial%pv_xc = virial%pv_xc
     285            0 :                      averages%virial%pv_fock_4c = virial%pv_fock_4c
     286              :                   END IF
     287              :                END IF
     288              :                ! Colvars
     289         1579 :                IF (nint > 0) THEN
     290              :                   CALL get_clv_force(force_env, nsize_xyz=nat*3, nsize_int=nint, &
     291            2 :                                      cvalues=averages%avecolvar, Mmatrix=averages%aveMmatrix)
     292              :                END IF
     293              :             CASE DEFAULT
     294        37866 :                CALL get_averages(averages%avecpu, used_time, delta_t)
     295        37866 :                CALL get_averages(averages%avehugoniot, hugoniot, delta_t)
     296        37866 :                CALL get_averages(averages%avetemp_baro, md_ener%temp_baro, delta_t)
     297        37866 :                CALL get_averages(averages%avepot, md_ener%epot, delta_t)
     298        37866 :                CALL get_averages(averages%avekin, md_ener%ekin, delta_t)
     299        37866 :                CALL get_averages(averages%avetemp, md_ener%temp_part, delta_t)
     300        37866 :                CALL get_averages(averages%avekin_qm, md_ener%ekin_qm, delta_t)
     301        37866 :                CALL get_averages(averages%avetemp_qm, md_ener%temp_qm, delta_t)
     302        37866 :                CALL get_averages(averages%avevol, cell%deth, delta_t)
     303        37866 :                CALL get_averages(averages%aveca, abc(1), delta_t)
     304        37866 :                CALL get_averages(averages%avecb, abc(2), delta_t)
     305        37866 :                CALL get_averages(averages%avecc, abc(3), delta_t)
     306        37866 :                CALL get_averages(averages%aveal, cell_angle(3), delta_t)
     307        37866 :                CALL get_averages(averages%avebe, cell_angle(2), delta_t)
     308        37866 :                CALL get_averages(averages%avega, cell_angle(1), delta_t)
     309        37866 :                CALL get_averages(averages%econs, md_ener%delta_cons, delta_t)
     310              :                ! Virial
     311        37866 :                IF (virial%pv_availability) THEN
     312         4058 :                   CALL get_averages(averages%avepress, pv_scalar, delta_t)
     313         4058 :                   CALL get_averages(averages%avepxx, pv_xx, delta_t)
     314         4058 :                   IF (ASSOCIATED(averages%virial)) THEN
     315            0 :                      CALL get_averages(averages%virial%pv_total, virial%pv_total, delta_t)
     316            0 :                      CALL get_averages(averages%virial%pv_virial, virial%pv_virial, delta_t)
     317            0 :                      CALL get_averages(averages%virial%pv_kinetic, virial%pv_kinetic, delta_t)
     318            0 :                      CALL get_averages(averages%virial%pv_constraint, virial%pv_constraint, delta_t)
     319            0 :                      CALL get_averages(averages%virial%pv_xc, virial%pv_xc, delta_t)
     320            0 :                      CALL get_averages(averages%virial%pv_fock_4c, virial%pv_fock_4c, delta_t)
     321              :                   END IF
     322              :                END IF
     323              :                ! Colvars
     324        77311 :                IF (nint > 0) THEN
     325           72 :                   ALLOCATE (cvalues(nint))
     326           72 :                   ALLOCATE (Mmatrix(nint*nint))
     327              :                   CALL get_clv_force(force_env, nsize_xyz=nat*3, nsize_int=nint, cvalues=cvalues, &
     328           24 :                                      Mmatrix=Mmatrix)
     329           24 :                   CALL get_averages(averages%avecolvar, cvalues, delta_t)
     330           24 :                   CALL get_averages(averages%aveMmatrix, Mmatrix, delta_t)
     331           24 :                   DEALLOCATE (cvalues)
     332           24 :                   DEALLOCATE (Mmatrix)
     333              :                END IF
     334              :             END SELECT
     335              :          END IF
     336              : 
     337              :          ! Possibly print averages
     338              :          output_unit = cp_print_key_unit_nr(logger, averages%averages_section, "PRINT_AVERAGES", &
     339        39459 :                                             extension=".avg", file_position=my_pos, file_action=my_act)
     340        39459 :          IF (output_unit > 0) THEN
     341              :             WRITE (output_unit, FMT='(A15,1X,"=",1X,G15.9,"   NSTEP #",I15)') &
     342            4 :                "AVECPU", averages%avecpu, itimes, &
     343            4 :                "AVEHUGONIOT", averages%avehugoniot, itimes, &
     344            4 :                "AVETEMP_BARO", averages%avetemp_baro, itimes, &
     345            4 :                "AVEPOT", averages%avepot, itimes, &
     346            4 :                "AVEKIN", averages%avekin, itimes, &
     347            4 :                "AVETEMP", averages%avetemp, itimes, &
     348            4 :                "AVEKIN_QM", averages%avekin_qm, itimes, &
     349            4 :                "AVETEMP_QM", averages%avetemp_qm, itimes, &
     350            4 :                "AVEVOL", averages%avevol, itimes, &
     351            4 :                "AVECELL_A", averages%aveca, itimes, &
     352            4 :                "AVECELL_B", averages%avecb, itimes, &
     353            4 :                "AVECELL_C", averages%avecc, itimes, &
     354            4 :                "AVEALPHA", averages%aveal, itimes, &
     355            4 :                "AVEBETA", averages%avebe, itimes, &
     356            4 :                "AVEGAMMA", averages%avega, itimes, &
     357            8 :                "AVE_ECONS", averages%econs, itimes
     358              :             ! Print the virial
     359            4 :             IF (virial%pv_availability) THEN
     360              :                WRITE (output_unit, FMT='(A15,1X,"=",1X,G15.9,"   NSTEP #",I15)') &
     361            0 :                   "AVE_PRESS", averages%avepress, itimes, &
     362            0 :                   "AVE_PXX", averages%avepxx, itimes
     363            0 :                IF (ASSOCIATED(averages%virial)) THEN
     364              :                   WRITE (output_unit, FMT='(A15,1X,"=",1X,G15.9,"   NSTEP #",I15)') &
     365            0 :                      "AVE_PV_TOT", averages%virial%pv_total, itimes, &
     366            0 :                      "AVE_PV_VIR", averages%virial%pv_virial, itimes, &
     367            0 :                      "AVE_PV_KIN", averages%virial%pv_kinetic, itimes, &
     368            0 :                      "AVE_PV_CNSTR", averages%virial%pv_constraint, itimes, &
     369            0 :                      "AVE_PV_XC", averages%virial%pv_xc, itimes, &
     370            0 :                      "AVE_PV_FOCK_4C", averages%virial%pv_fock_4c, itimes
     371              :                END IF
     372              :             END IF
     373          196 :             DO i = 1, nint
     374          192 :                ctmp = cp_to_string(i)
     375              :                WRITE (output_unit, FMT='(A15,1X,"=",1X,G15.9,"   NSTEP #",I15)') &
     376          196 :                   TRIM("AVE_CV-"//ADJUSTL(ctmp)), averages%avecolvar(i), itimes
     377              :             END DO
     378            4 :             WRITE (output_unit, FMT='(/)')
     379              :          END IF
     380              :          CALL cp_print_key_finished_output(output_unit, logger, averages%averages_section, &
     381        39459 :                                            "PRINT_AVERAGES")
     382              :       END IF
     383        39479 :       CALL timestop(handle)
     384        39479 :    END SUBROUTINE compute_averages
     385              : 
     386              : ! **************************************************************************************************
     387              : !> \brief computes the averages - low level for REAL
     388              : !> \param avg ...
     389              : !> \param add ...
     390              : !> \param delta_t ...
     391              : !> \author Teodoro Laino [tlaino] - 03.2008 - University of Zurich
     392              : ! **************************************************************************************************
     393       613972 :    SUBROUTINE get_averages_rs(avg, add, delta_t)
     394              :       REAL(KIND=dp), INTENT(INOUT)                       :: avg
     395              :       REAL(KIND=dp), INTENT(IN)                          :: add
     396              :       INTEGER, INTENT(IN)                                :: delta_t
     397              : 
     398       613972 :       avg = (avg*REAL(delta_t - 1, dp) + add)/REAL(delta_t, dp)
     399       613972 :    END SUBROUTINE get_averages_rs
     400              : 
     401              : ! **************************************************************************************************
     402              : !> \brief computes the averages - low level for REAL vector
     403              : !> \param avg ...
     404              : !> \param add ...
     405              : !> \param delta_t ...
     406              : !> \author Teodoro Laino [tlaino] - 10.2008 - University of Zurich
     407              : ! **************************************************************************************************
     408           48 :    SUBROUTINE get_averages_rv(avg, add, delta_t)
     409              :       REAL(KIND=dp), DIMENSION(:), INTENT(INOUT)         :: avg
     410              :       REAL(KIND=dp), DIMENSION(:), INTENT(IN)            :: add
     411              :       INTEGER, INTENT(IN)                                :: delta_t
     412              : 
     413              :       INTEGER                                            :: i
     414              :       LOGICAL                                            :: check
     415              : 
     416           48 :       check = SIZE(avg) == SIZE(add)
     417           48 :       CPASSERT(check)
     418        56496 :       DO i = 1, SIZE(avg)
     419        56496 :          avg(i) = (avg(i)*REAL(delta_t - 1, dp) + add(i))/REAL(delta_t, dp)
     420              :       END DO
     421           48 :    END SUBROUTINE get_averages_rv
     422              : 
     423              : ! **************************************************************************************************
     424              : !> \brief computes the averages - low level for REAL matrix
     425              : !> \param avg ...
     426              : !> \param add ...
     427              : !> \param delta_t ...
     428              : !> \author Teodoro Laino [tlaino] - 10.2008 - University of Zurich
     429              : ! **************************************************************************************************
     430            0 :    SUBROUTINE get_averages_rm(avg, add, delta_t)
     431              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT)      :: avg
     432              :       REAL(KIND=dp), DIMENSION(:, :), INTENT(IN)         :: add
     433              :       INTEGER, INTENT(IN)                                :: delta_t
     434              : 
     435              :       INTEGER                                            :: i, j
     436              :       LOGICAL                                            :: check
     437              : 
     438            0 :       check = SIZE(avg, 1) == SIZE(add, 1)
     439            0 :       CPASSERT(check)
     440            0 :       check = SIZE(avg, 2) == SIZE(add, 2)
     441            0 :       CPASSERT(check)
     442            0 :       DO i = 1, SIZE(avg, 2)
     443            0 :          DO j = 1, SIZE(avg, 1)
     444            0 :             avg(j, i) = (avg(j, i)*REAL(delta_t - 1, dp) + add(j, i))/REAL(delta_t, dp)
     445              :          END DO
     446              :       END DO
     447            0 :    END SUBROUTINE get_averages_rm
     448              : 
     449            0 : END MODULE averages_types
        

Generated by: LCOV version 2.0-1