Neko 1.99.5
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
rough_log_law.f90
Go to the documentation of this file.
1! Copyright (c) 2024, 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!
33!
36 use field, only: field_t
37 use num_types, only : rp
38 use json_module, only : json_file
39 use coefs, only : coef_t
41 use vector, only : vector_t
42 use wall_model, only : wall_model_t
43 use utils, only : neko_error
44 use registry, only : neko_registry
45 use json_utils, only : json_get_or_lookup, &
50 use math, only: masked_gather_copy_0
52 use logger, only : log_size, neko_log
53 implicit none
54 private
55
60 type, public, extends(wall_model_t) :: rough_log_law_t
61
63 real(kind=rp) :: kappa
65 real(kind=rp) :: b
67 real(kind=rp) :: z0
68 ! The fluid density at the boundary
69 type(vector_t) :: rho_w
70 contains
72 procedure, pass(this) :: init => rough_log_law_init
75 procedure, pass(this) :: partial_init => rough_log_law_partial_init
77 procedure, pass(this) :: finalize => rough_log_law_finalize
79 procedure, pass(this) :: init_from_components => &
82 procedure, pass(this) :: free => rough_log_law_free
84 procedure, pass(this) :: compute => rough_log_law_compute
85 ! Extract fluid properties at the wall (rho)
86 procedure, pass(this) :: extract_properties => &
88 end type rough_log_law_t
89
90contains
98 subroutine rough_log_law_init(this, scheme_name, coef, msk, facet, &
99 h_index, json)
100 class(rough_log_law_t), intent(inout) :: this
101 character(len=*), intent(in) :: scheme_name
102 type(coef_t), intent(in) :: coef
103 integer, intent(in) :: msk(:)
104 integer, intent(in) :: facet(:)
105 integer, intent(in) :: h_index
106 type(json_file), intent(inout) :: json
107 real(kind=rp) :: kappa, b, z0
108
109 call json_get_or_lookup_or_default(json, "kappa", kappa, 0.4_rp)
110 call json_get_or_lookup_or_default(json, "B", b, 0.0_rp)
111 call json_get_or_lookup(json, "z0", z0)
112
113 call this%init_from_components(scheme_name, coef, msk, facet, h_index, &
114 kappa, b, z0)
115 end subroutine rough_log_law_init
116
120 subroutine rough_log_law_partial_init(this, coef, json)
121 class(rough_log_law_t), intent(inout) :: this
122 type(coef_t), intent(in) :: coef
123 type(json_file), intent(inout) :: json
124 character(len=LOG_SIZE) :: log_buf
125
126 call this%partial_init_base(coef, json)
127 call json_get_or_lookup_or_default(json, "kappa", this%kappa, 0.4_rp)
128 call json_get_or_lookup_or_default(json, "B", this%B, 0.0_rp)
129 call json_get_or_lookup(json, "z0", this%z0)
130
131 call neko_log%section('Wall model')
132 write(log_buf, '(A)') 'Model : Rough log law'
133 call neko_log%message(log_buf)
134 write(log_buf, '(A, E15.7)') 'kappa : ', this%kappa
135 call neko_log%message(log_buf)
136 write(log_buf, '(A, E15.7)') 'B : ', this%B
137 call neko_log%message(log_buf)
138 write(log_buf, '(A, E15.7)') 'z0 : ', this%z0
139 call neko_log%message(log_buf)
140 call neko_log%end_section()
141
142 end subroutine rough_log_law_partial_init
143
147 subroutine rough_log_law_finalize(this, msk, facet)
148 class(rough_log_law_t), intent(inout) :: this
149 integer, intent(in) :: msk(:)
150 integer, intent(in) :: facet(:)
151
152 call this%finalize_base(msk, facet)
153
154 call this%rho_w%init(this%n_nodes)
155
156 end subroutine rough_log_law_finalize
157
160 class(rough_log_law_t), intent(inout) :: this
161
162 if (neko_bcknd_device .eq. 1) then
163 call device_masked_gather_copy_0(this%rho_w%x_d, this%rho%x_d, &
164 this%msk_d, &
165 this%rho%size(), this%rho_w%size())
166 else
167 call masked_gather_copy_0(this%rho_w%x, this%rho%x, this%msk, &
168 this%rho%size(), this%rho_w%size())
169 end if
171
181 subroutine rough_log_law_init_from_components(this, scheme_name, coef, msk, &
182 facet, h_index, kappa, B, z0)
183 class(rough_log_law_t), intent(inout) :: this
184 character(len=*), intent(in) :: scheme_name
185 type(coef_t), intent(in) :: coef
186 integer, intent(in) :: msk(:)
187 integer, intent(in) :: facet(:)
188 integer, intent(in) :: h_index
189 real(kind=rp), intent(in) :: kappa, b, z0
190
191 call this%free()
192 call this%init_base(scheme_name, coef, msk, facet, h_index)
193
194 this%kappa = kappa
195 this%B = b
196 this%z0 = z0
197
198 call this%rho_w%init(this%n_nodes)
199
200 ! Check that the sampling height is above the roughness length
201 if (any(this%h%x(1:this%n_nodes) .le. this%z0)) then
202 call neko_error("Roughlog WM: Sampling height h must be greater " // &
203 "than roughness z0. " // &
204 "Increase h_index or decrease z0.")
205 else if (this%z0 .eq. 0.0_rp) then
206 call neko_error("Roughlog WM: Roughness z0 must be greater than 0.")
207 end if
208
210
212 subroutine rough_log_law_free(this)
213 class(rough_log_law_t), intent(inout) :: this
214
215 call this%rho_w%free()
216 call this%free_base()
217
218 end subroutine rough_log_law_free
219
223 subroutine rough_log_law_compute(this, t, tstep)
224 class(rough_log_law_t), intent(inout) :: this
225 real(kind=rp), intent(in) :: t
226 integer, intent(in) :: tstep
227 type(field_t), pointer :: u
228 type(field_t), pointer :: v
229 type(field_t), pointer :: w
230
231 ! Extract boundary values for rho
232 call this%extract_properties()
233
234 u => neko_registry%get_field("u")
235 v => neko_registry%get_field("v")
236 w => neko_registry%get_field("w")
237
238 if (neko_bcknd_device .eq. 1) then
239 call rough_log_law_compute_device(u%x_d, v%x_d, w%x_d, this%ind_r_d, &
240 this%ind_s_d, this%ind_t_d, this%ind_e_d, &
241 this%n_x%x_d, this%n_y%x_d, this%n_z%x_d, &
242 this%h%x_d, this%tau_x%x_d, this%tau_y%x_d, &
243 this%tau_z%x_d, this%n_nodes, u%Xh%lx, this%kappa, &
244 this%rho_w%x_d, this%B, this%z0, tstep)
245 else
246 call rough_log_law_compute_cpu(u%x, v%x, w%x, this%ind_r, this%ind_s, &
247 this%ind_t, this%ind_e, this%n_x%x, this%n_y%x, this%n_z%x, &
248 this%h%x, this%tau_x%x, this%tau_y%x, this%tau_z%x, &
249 this%n_nodes, u%Xh%lx, u%msh%nelv, this%kappa, &
250 this%rho_w%x, this%B, this%z0, tstep)
251 end if
252
253 nullify(u, v, w)
254
255 end subroutine rough_log_law_compute
256
257
258end module rough_log_law
__global__ void rough_log_law_compute(const T *__restrict__ u_d, const T *__restrict__ v_d, const T *__restrict__ w_d, const int *__restrict__ ind_r_d, const int *__restrict__ ind_s_d, const int *__restrict__ ind_t_d, const int *__restrict__ ind_e_d, const T *__restrict__ n_x_d, const T *__restrict__ n_y_d, const T *__restrict__ n_z_d, const T *__restrict__ h_d, T *__restrict__ tau_x_d, T *__restrict__ tau_y_d, T *__restrict__ tau_z_d, const int n_nodes, const int lx, const T kappa, const T *__restrict__ rho_w_d, const T B, const T z0)
Coefficients.
Definition coef.f90:34
subroutine, public device_masked_gather_copy_0(a_d, b_d, mask_d, n, n_mask, strm)
Gather a masked vector .
Defines a field.
Definition field.f90:34
Utilities for retrieving parameters from the case files.
Logging routines.
Definition log.f90:34
type(log_t), public neko_log
Global log stream.
Definition log.f90:80
integer, parameter, public log_size
Definition log.f90:46
Definition math.f90:60
subroutine, public masked_gather_copy_0(a, b, mask, n, n_mask)
Gather a masked vector to reduced contigous vector .
Definition math.f90:360
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines a registry for storing solution fields.
Definition registry.f90:34
type(registry_t), target, public neko_registry
Global field registry.
Definition registry.f90:144
Implements the CPU kernel for the rough_log_law_t type.
subroutine, public rough_log_law_compute_cpu(u, v, w, ind_r, ind_s, ind_t, ind_e, n_x, n_y, n_z, h, tau_x, tau_y, tau_z, n_nodes, lx, nelv, kappa, rho_w, b, z0, tstep)
Compute the wall shear stress on CPU using the rough log-law model.
Implements the device kernel for the rough_log_law_t type.
subroutine, public rough_log_law_compute_device(u_d, v_d, w_d, ind_r_d, ind_s_d, ind_t_d, ind_e_d, n_x_d, n_y_d, n_z_d, h_d, tau_x_d, tau_y_d, tau_z_d, n_nodes, lx, kappa, rho_w_d, b, z0, tstep)
Compute the wall shear stress on device using the rough log-law model.
Implements rough_log_law_t.
subroutine rough_log_law_init_from_components(this, scheme_name, coef, msk, facet, h_index, kappa, b, z0)
Constructor from components.
subroutine rough_log_law_finalize(this, msk, facet)
Finalize the construction using the mask and facet arrays of the bc.
subroutine rough_log_law_extract_properties(this)
Extract the values of rho at the boundary.
subroutine rough_log_law_init(this, scheme_name, coef, msk, facet, h_index, json)
Constructor from JSON.
subroutine rough_log_law_partial_init(this, coef, json)
Constructor from JSON.
subroutine rough_log_law_free(this)
Destructor for the rough_log_law_t (base) class.
Defines a registry for storing and requesting temporary objects This can be used when you have a func...
type(scratch_registry_t), target, public neko_scratch_registry
Global scratch registry.
Utilities.
Definition utils.f90:35
Defines a vector.
Definition vector.f90:34
Implements wall_model_t.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:62
Wall model based on the log-law for a rough wall. The formula defining the law is ....
Base abstract type for wall-stress models for wall-modelled LES.