Neko 0.9.99
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
statistics.f90
Go to the documentation of this file.
1! Copyright (c) 2021, The Neko Authors
2! All rights reserved.
3!
4! Redistribution and use in source and binary forms, with or without
5! modification, are permitted provided that the following conditions
6! are met:
7!
8! * Redistributions of source code must retain the above copyright
9! notice, this list of conditions and the following disclaimer.
10!
11! * Redistributions in binary form must reproduce the above
12! copyright notice, this list of conditions and the following
13! disclaimer in the documentation and/or other materials provided
14! with the distribution.
15!
16! * Neither the name of the authors nor the names of its
17! contributors may be used to endorse or promote products derived
18! from this software without specific prior written permission.
19!
20! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31! POSSIBILITY OF SUCH DAMAGE.
32!
34module stats
35 use num_types, only : rp, dp
36 use stats_quant, only : stats_quant_t
37 use logger, only : log_size, neko_log
38 use comm
39 implicit none
40 private
41
43 type, private :: quantp_t
44 class(stats_quant_t), pointer :: quantp
45 end type quantp_t
46
48 type, public :: stats_t
49 type(quantp_t), allocatable :: quant_list(:)
50 integer :: n
51 integer :: size
52 real(kind=rp) :: t_begin
53 real(kind=rp) :: t_diff
54 integer :: samp_interval
55 contains
56 procedure, pass(this) :: init => stats_init
57 procedure, pass(this) :: free => stats_free
58 procedure, pass(this) :: add => stats_add
59 procedure, pass(this) :: eval => stats_eval
60 end type stats_t
61
62contains
63
65 subroutine stats_init(this, T_begin, samp_interval, size)
66 class(stats_t), intent(inout) :: this
67 real(kind=rp), intent(in) :: t_begin
68 integer, intent(in) :: samp_interval
69 integer, intent(inout), optional ::size
70 integer :: n, i
71
72 call this%free()
73
74 if (present(size)) then
75 n = size
76 else
77 n = 1
78 end if
79
80 allocate(this%quant_list(n))
81
82 do i = 1, n
83 this%quant_list(i)%quantp => null()
84 end do
85
86 this%n = 0
87 this%size = n
88 this%T_begin = t_begin
89 this%samp_interval = samp_interval
90 this%t_diff = 0.0
91
92 end subroutine stats_init
93
95 subroutine stats_free(this)
96 class(stats_t), intent(inout) :: this
97
98 if (allocated(this%quant_list)) then
99 deallocate(this%quant_list)
100 end if
101
102 this%n = 0
103 this%size = 0
104 end subroutine stats_free
105
107 subroutine stats_add(this, quant)
108 class(stats_t), intent(inout) :: this
109 class(stats_quant_t), intent(inout), target :: quant
110 type(quantp_t), allocatable :: tmp(:)
111
112 if (this%n .ge. this%size) then
113 allocate(tmp(this%size * 2))
114 tmp(1:this%size) = this%quant_list
115 call move_alloc(tmp, this%quant_list)
116 this%size = this%size * 2
117 end if
118
119 this%n = this%n + 1
120 this%quant_list(this%n)%quantp => quant
121 end subroutine stats_add
122
124 subroutine stats_eval(this, t, dt, tstep)
125 class(stats_t), intent(inout) :: this
126 real(kind=rp), intent(in) :: t
127 real(kind=rp), intent(in) :: dt
128 integer, intent(in) :: tstep
129 integer :: i, ierr
130 character(len=LOG_SIZE) :: log_buf
131 real(kind=rp) :: sample_start_time, sample_end_time
132 real(kind=dp) :: sample_time
133
134 if (t .ge. this%T_begin .and. this%n .gt. 0) then
135 this%t_diff = this%t_diff + dt
136 ! There is technically an issue here for the last sample if we
137 ! reset the stats If the reset is not on a multiple of
138 ! samp_interval the weight of the last sample is wrong.
139 if (mod(tstep,this%samp_interval) .eq. 0) then
140 call neko_log%section('Statistics')
141 call mpi_barrier(neko_comm, ierr)
142 sample_start_time = mpi_wtime()
143 do i = 1, this%n
144 call this%quant_list(i)%quantp%update(this%t_diff)
145 end do
146 this%t_diff = 0.0_rp
147 call mpi_barrier(neko_comm, ierr)
148 sample_end_time = mpi_wtime()
149 sample_time = sample_end_time - sample_start_time
150 write(log_buf,'(A17,1x,F10.6,A,F9.6)') 'Sampling at time:', t, &
151 ' Sampling time (s): ', sample_time
152 call neko_log%message(log_buf)
153 call neko_log%end_section()
154 end if
155 end if
156 end subroutine stats_eval
157
158end module stats
Definition comm.F90:1
type(mpi_comm) neko_comm
MPI communicator.
Definition comm.F90:16
Logging routines.
Definition log.f90:34
type(log_t), public neko_log
Global log stream.
Definition log.f90:65
integer, parameter, public log_size
Definition log.f90:42
integer, parameter, public dp
Definition num_types.f90:9
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines a statistical quantity.
Defines a container for all statistics.
subroutine stats_eval(this, t, dt, tstep)
Evaluated all statistical quantities.
subroutine stats_free(this)
Deallocate.
subroutine stats_init(this, t_begin, samp_interval, size)
Initialize statistics, computed after T_begin.
subroutine stats_add(this, quant)
Add a statistic quantitiy quant to the backend.
Pointer to an arbitrary quantitiy.
Statistics backend.
Abstract type defining a statistical quantity.