Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
cai_sagaut_model_ii.f90
Go to the documentation of this file.
1! Copyright (c) 2026, 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!
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 wall_model, only : wall_model_t
44 use user_intf, only : user_t
45 use registry, only : neko_registry
49 use field_math, only : field_invcol3
50 use vector, only : vector_t
51 use math, only : masked_gather_copy_0
54
55 implicit none
56 private
57
60 type, public, extends(wall_model_t) :: cai_sagaut_model_ii_t
62 real(kind=rp) :: kappa = 0.41_rp
64 real(kind=rp) :: b = 5.2_rp
66 real(kind=rp) :: p = 1.138_rp
68 real(kind=rp) :: s = 217.8_rp
70 type(vector_t) :: nu
72 type(vector_t) :: rho_w
73 type(vector_t) :: u_s, v_s, w_s
74 contains
76 procedure, pass(this) :: init => cai_sagaut_model_ii_init
78 procedure, pass(this) :: partial_init => cai_sagaut_model_ii_partial_init
80 procedure, pass(this) :: finalize => cai_sagaut_model_ii_finalize
82 procedure, pass(this) :: init_from_components => &
85 procedure, pass(this) :: free => cai_sagaut_model_ii_free
87 procedure, pass(this) :: compute_nu_and_rho => &
90 procedure, pass(this) :: compute => cai_sagaut_model_ii_compute
92
93contains
100 subroutine cai_sagaut_model_ii_init(this, scheme_name, coef, msk, facet, &
101 json)
102 class(cai_sagaut_model_ii_t), intent(inout) :: this
103 character(len=*), intent(in) :: scheme_name
104 type(coef_t), intent(in) :: coef
105 integer, intent(in) :: msk(:)
106 integer, intent(in) :: facet(:)
107 type(json_file), intent(inout) :: json
108 real(kind=rp) :: kappa, b, p, s
109 class(wall_sampler_t), allocatable :: sampler
110
111 call json_get_or_lookup(json, "kappa", kappa)
112 call json_get_or_lookup(json, "B", b)
113 call json_get_or_lookup_or_default(json, "p", p, 1.138_rp)
114 call json_get_or_lookup_or_default(json, "s", s, 217.8_rp)
115
116 call wall_sampler_factory(sampler, json)
117 call this%init_from_components(scheme_name, coef, msk, facet, sampler, &
118 kappa, b, p, s)
119 end subroutine cai_sagaut_model_ii_init
120
124 subroutine cai_sagaut_model_ii_partial_init(this, coef, scheme_name, json)
125 class(cai_sagaut_model_ii_t), intent(inout) :: this
126 type(coef_t), intent(in) :: coef
127 character(len=*), intent(in) :: scheme_name
128 type(json_file), intent(inout) :: json
129 call this%partial_init_base(coef, scheme_name, json)
130 call json_get_or_lookup(json, "kappa", this%kappa)
131 call json_get_or_lookup(json, "B", this%B)
132 call json_get_or_lookup_or_default(json, "p", this%p, 1.138_rp)
133 call json_get_or_lookup_or_default(json, "s", this%s, 217.8_rp)
135
139 subroutine cai_sagaut_model_ii_finalize(this, msk, facet, bc_name, user)
140 class(cai_sagaut_model_ii_t), intent(inout) :: this
141 integer, intent(in) :: msk(:)
142 integer, intent(in) :: facet(:)
143 character(len=*), optional, intent(in) :: bc_name
144 type(user_t), target, optional, intent(in) :: user
145
146 call this%finalize_base(msk, facet, bc_name, user)
147 call this%nu%init(this%n_nodes)
148 call this%rho_w%init(this%n_nodes)
149 call this%validate_single_sample()
150 call this%u_s%init(this%n_nodes)
151 call this%v_s%init(this%n_nodes)
152 call this%w_s%init(this%n_nodes)
153 end subroutine cai_sagaut_model_ii_finalize
154
165 subroutine cai_sagaut_model_ii_init_from_components(this, scheme_name, coef, &
166 msk, facet, sampler, kappa, B, p, s)
167 class(cai_sagaut_model_ii_t), intent(inout) :: this
168 character(len=*), intent(in) :: scheme_name
169 type(coef_t), intent(in) :: coef
170 integer, intent(in) :: msk(:)
171 integer, intent(in) :: facet(:)
172 class(wall_sampler_t), allocatable, intent(inout) :: sampler
173 real(kind=rp), intent(in) :: kappa, b, p, s
174
175 call this%free()
176 call this%init_base(scheme_name, coef, msk, facet, sampler)
177
178 this%kappa = kappa
179 this%B = b
180 this%p = p
181 this%s = s
182
183 call this%nu%init(this%n_nodes)
184 call this%rho_w%init(this%n_nodes)
185 call this%validate_single_sample()
186 call this%u_s%init(this%n_nodes)
187 call this%v_s%init(this%n_nodes)
188 call this%w_s%init(this%n_nodes)
190
193 class(cai_sagaut_model_ii_t), intent(inout) :: this
194 type(field_t), pointer :: temp
195 integer :: idx
196
197 call neko_scratch_registry%request_field(temp, idx, .false.)
198 call field_invcol3(temp, this%mu, this%rho)
199
200 if (neko_bcknd_device .eq. 1) then
201 call device_masked_gather_copy_0(this%nu%x_d, temp%x_d, this%msk_d, &
202 temp%size(), this%nu%size())
203 call device_masked_gather_copy_0(this%rho_w%x_d, this%rho%x_d, &
204 this%msk_d, this%rho%size(), this%rho_w%size())
205 else
206 call masked_gather_copy_0(this%nu%x, temp%x, this%msk, temp%size(), &
207 this%nu%size())
208 call masked_gather_copy_0(this%rho_w%x, this%rho%x, this%msk, &
209 this%rho%size(), this%rho_w%size())
210 end if
211
212 call neko_scratch_registry%relinquish_field(idx)
214
217 class(cai_sagaut_model_ii_t), intent(inout) :: this
218
219 call this%rho_w%free()
220 call this%nu%free()
221 call this%u_s%free()
222 call this%v_s%free()
223 call this%w_s%free()
224 call this%free_base()
225 end subroutine cai_sagaut_model_ii_free
226
230 subroutine cai_sagaut_model_ii_compute(this, t, tstep)
231 class(cai_sagaut_model_ii_t), intent(inout) :: this
232 real(kind=rp), intent(in) :: t
233 integer, intent(in) :: tstep
234 type(field_t), pointer :: u
235 type(field_t), pointer :: v
236 type(field_t), pointer :: w
237
238 call this%compute_nu_and_rho()
239
240 u => neko_registry%get_field("u")
241 v => neko_registry%get_field("v")
242 w => neko_registry%get_field("w")
243
244 call this%sampler%sample(u, this%u_s)
245 call this%sampler%sample(v, this%v_s)
246 call this%sampler%sample(w, this%w_s)
247
248 if (neko_bcknd_device .eq. 1) then
249 call cai_sagaut_model_ii_compute_device(this%u_s%x_d, this%v_s%x_d, &
250 this%w_s%x_d, &
251 this%n_x%x_d, this%n_y%x_d, this%n_z%x_d, this%nu%x_d, &
252 this%rho_w%x_d, this%sampler%h%x_d, this%tau_x%x_d, &
253 this%tau_y%x_d, &
254 this%tau_z%x_d, this%n_nodes, this%kappa, this%B, &
255 this%p, this%s)
256 else
257 call cai_sagaut_model_ii_compute_cpu(this%u_s%x, this%v_s%x, &
258 this%w_s%x, this%n_x%x, this%n_y%x, &
259 this%n_z%x, this%nu%x, this%rho_w%x, this%sampler%h%x, &
260 this%tau_x%x, &
261 this%tau_y%x, this%tau_z%x, this%n_nodes, &
262 this%kappa, this%B, this%p, this%s)
263 end if
264
265 nullify(u, v, w)
266
267 end subroutine cai_sagaut_model_ii_compute
268end module cai_sagaut_model_ii
__global__ void cai_sagaut_model_ii_compute(const T *__restrict__ u_d, const T *__restrict__ v_d, const T *__restrict__ w_d, const T *__restrict__ n_x_d, const T *__restrict__ n_y_d, const T *__restrict__ n_z_d, const T *__restrict__ nu_d, const T *__restrict__ rho_w_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 T kappa, const T B, const T p, const T s)
CPU backend for cai_sagaut_model_ii_t.
subroutine, public cai_sagaut_model_ii_compute_cpu(u, v, w, n_x, n_y, n_z, nu, rho_w, h, tau_x, tau_y, tau_z, n_nodes, kappa, b, p, s)
Evaluate wall shear stresses with the CPU Model-II kernel.
Device dispatch for cai_sagaut_model_ii_t.
subroutine, public cai_sagaut_model_ii_compute_device(u_d, v_d, w_d, n_x_d, n_y_d, n_z_d, nu_d, rho_w_d, h_d, tau_x_d, tau_y_d, tau_z_d, n_nodes, kappa, b, p, s)
Evaluate the device wall-model kernel for Model-II.
Implements cai_sagaut_model_ii_t.
subroutine cai_sagaut_model_ii_compute_nu_and_rho(this)
Gather viscosity and density values at the wall-model points.
subroutine cai_sagaut_model_ii_finalize(this, msk, facet, bc_name, user)
Finalise allocation of derived data structures.
subroutine cai_sagaut_model_ii_init_from_components(this, scheme_name, coef, msk, facet, sampler, kappa, b, p, s)
Initialise the wall model from explicit components.
subroutine cai_sagaut_model_ii_free(this)
Destructor.
subroutine cai_sagaut_model_ii_init(this, scheme_name, coef, msk, facet, json)
Initialise the wall model from the case file.
subroutine cai_sagaut_model_ii_partial_init(this, coef, scheme_name, json)
Partially initialise the wall model from the case file.
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 .
subroutine, public field_invcol3(a, b, c, n)
Invert a vector .
Defines a field.
Definition field.f90:34
Utilities for retrieving parameters from the case files.
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:363
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
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
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.
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
Defines a vector.
Definition vector.f90:34
Implements wall_model_t.
Factory for wall-model samplers.
subroutine, public wall_sampler_factory(object, json)
Wall sampler factory.
Defines the abstract interface for wall-model field samplers.
Explicit wall model based on Model-II from Cai and Sagaut (2021).
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:93
A type collecting all the overridable user routines and flag to suppress type injection from custom m...
Base abstract type for wall-stress models for wall-modelled LES.
Base type for sampling solution fields at points associated with wall nodes. Samples belonging to one...