Neko  0.9.0
A portable framework for high-order spectral element flow simulations
mean_field.f90
Go to the documentation of this file.
1 ! Copyright (c) 2021-2023, 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 !
34 !
35 module mean_field
36  use neko_config, only : neko_bcknd_device
37  use stats_quant, only : stats_quant_t
38  use num_types, only : rp
39  use field, only : field_t
41  implicit none
42  private
43 
45  type, public, extends(stats_quant_t) :: mean_field_t
47  type(field_t), pointer :: f => null()
49  type(field_t) :: mf
51  real(kind=rp) :: time
52  contains
54  procedure, pass(this) :: init => mean_field_init
56  procedure, pass(this) :: free => mean_field_free
58  procedure, pass(this) :: update => mean_field_update
60  procedure, pass(this) :: reset => mean_field_reset
61  end type mean_field_t
62 
63 contains
64 
69  subroutine mean_field_init(this, f, field_name)
70  class(mean_field_t), intent(inout) :: this
71  type(field_t), intent(inout), target :: f
72  character(len=*), optional, intent(in) :: field_name
73  character(len=80) :: name
74 
75  call this%free()
76 
77  this%f => f
78  this%time = 0.0_rp
79 
80  if (present(field_name)) then
81  name = field_name
82  else
83  write(name, '(A,A)') 'mean_', trim(f%name)
84  end if
85 
86  call this%mf%init(f%dof, name)
87 
88  end subroutine mean_field_init
89 
91  subroutine mean_field_free(this)
92  class(mean_field_t), intent(inout) :: this
93 
94  if (associated(this%f)) then
95  nullify(this%f)
96  end if
97  call this%mf%free()
98 
99  end subroutine mean_field_free
100 
102  subroutine mean_field_reset(this)
103  class(mean_field_t), intent(inout) :: this
104 
105  this%time = 0.0
106  this%mf = 0.0_rp
107  end subroutine mean_field_reset
108 
109 
112  subroutine mean_field_update(this, k)
113  class(mean_field_t), intent(inout) :: this
114  real(kind=rp), intent(in) :: k
115 
116  call field_cmult(this%mf, this%time, size(this%mf%x))
117  call field_add2s2(this%mf, this%f, k, size(this%mf%x))
118  this%time = this%time + k
119  call field_cmult(this%mf, 1.0_rp / this%time, size(this%mf%x))
120 
121  end subroutine mean_field_update
122 
123 end module mean_field
124 
subroutine, public field_add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
Definition: field_math.f90:386
subroutine, public field_cmult(a, c, n)
Multiplication by constant c .
Definition: field_math.f90:146
Defines a field.
Definition: field.f90:34
Implements mean_field_t.
Definition: mean_field.f90:35
subroutine mean_field_update(this, k)
Update the mean field with a new sample.
Definition: mean_field.f90:113
subroutine mean_field_init(this, f, field_name)
Constructor.
Definition: mean_field.f90:70
subroutine mean_field_reset(this)
Resets a the mean field and the averaging time value to zero.
Definition: mean_field.f90:103
subroutine mean_field_free(this)
Destructor.
Definition: mean_field.f90:92
Build configurations.
Definition: neko_config.f90:34
integer, parameter neko_bcknd_device
Definition: neko_config.f90:44
integer, parameter, public rp
Global precision used in computations.
Definition: num_types.f90:12
Defines a statistical quantity.
Definition: stats_quant.f90:34
Computes the temporal mean of a field.
Definition: mean_field.f90:45
Abstract type defining a statistical quantity.
Definition: stats_quant.f90:40