Neko  0.8.99
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 
44  type, public, extends(stats_quant_t) :: mean_field_t
45  type(field_t), pointer :: f => null()
46  type(field_t) :: mf
47  real(kind=rp) :: time
48  contains
49  procedure, pass(this) :: init => mean_field_init
50  procedure, pass(this) :: free => mean_field_free
51  procedure, pass(this) :: update => mean_field_update
52  procedure, pass(this) :: reset => mean_field_reset
53  end type mean_field_t
54 
55 contains
56 
58  subroutine mean_field_init(this, f, field_name)
59  class(mean_field_t), intent(inout) :: this
60  type(field_t), intent(inout), target :: f
61  character(len=*), optional, intent(in) :: field_name
62  character(len=80) :: name
63 
64 
65  call this%free()
66 
67  this%f => f
68  this%time = 0.0_rp
69  if (present(field_name)) then
70  name = field_name
71  else
72  write(name, '(A,A)') 'mean_',trim(f%name)
73  end if
74 
75  call this%mf%init(f%dof, name)
76 
77  end subroutine mean_field_init
78 
80  subroutine mean_field_free(this)
81  class(mean_field_t), intent(inout) :: this
82 
83  if (associated(this%f)) then
84  nullify(this%f)
85  end if
86  call this%mf%free()
87 
88  end subroutine mean_field_free
89 
91  subroutine mean_field_reset(this)
92  class(mean_field_t), intent(inout) :: this
93 
94  this%time = 0.0
95  this%mf = 0.0_rp
96  end subroutine mean_field_reset
97 
98 
100  subroutine mean_field_update(this, k)
101  class(mean_field_t), intent(inout) :: this
102  real(kind=rp), intent(in) :: k
103 
104  call field_cmult(this%mf, this%time, size(this%mf%x))
105  call field_add2s2(this%mf, this%f, k, size(this%mf%x))
106  this%time = this%time + k
107  call field_cmult(this%mf, 1.0_rp / this%time, size(this%mf%x))
108 
109  end subroutine mean_field_update
110 
111 end module mean_field
112 
subroutine, public field_add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
Definition: field_math.f90:344
subroutine, public field_cmult(a, c, n)
Multiplication by constant c .
Definition: field_math.f90:146
Defines a field.
Definition: field.f90:34
Defines a mean field.
Definition: mean_field.f90:35
subroutine mean_field_update(this, k)
Update a mean field.
Definition: mean_field.f90:101
subroutine mean_field_init(this, f, field_name)
Initialize a mean field for a field f.
Definition: mean_field.f90:59
subroutine mean_field_reset(this)
Resets a mean field.
Definition: mean_field.f90:92
subroutine mean_field_free(this)
Deallocates a mean field.
Definition: mean_field.f90:81
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
Abstract type defining a statistical quantity.
Definition: stats_quant.f90:40