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
|