Neko 1.99.3
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!
35 use field, only : field_t
36 use num_types, only : rp
37 use json_module, only : json_file
38 use coefs, only : coef_t
40 use wall_model, only : wall_model_t
41 use registry, only : neko_registry
45 use field_math, only : field_invcol3
46 use vector, only : vector_t
47 use math, only : masked_gather_copy_0
50
51 implicit none
52 private
53
56 type, public, extends(wall_model_t) :: cai_sagaut_model_ii_t
58 real(kind=rp) :: kappa = 0.41_rp
60 real(kind=rp) :: b = 5.2_rp
62 real(kind=rp) :: p = 1.138_rp
64 real(kind=rp) :: s = 217.8_rp
66 type(vector_t) :: nu
68 type(vector_t) :: rho_w
69 contains
71 procedure, pass(this) :: init => cai_sagaut_model_ii_init
73 procedure, pass(this) :: partial_init => cai_sagaut_model_ii_partial_init
75 procedure, pass(this) :: finalize => cai_sagaut_model_ii_finalize
77 procedure, pass(this) :: init_from_components => &
80 procedure, pass(this) :: free => cai_sagaut_model_ii_free
82 procedure, pass(this) :: compute_nu_and_rho => &
85 procedure, pass(this) :: compute => cai_sagaut_model_ii_compute
87
88contains
96 subroutine cai_sagaut_model_ii_init(this, scheme_name, coef, msk, facet, &
97 h_index, json)
98 class(cai_sagaut_model_ii_t), intent(inout) :: this
99 character(len=*), intent(in) :: scheme_name
100 type(coef_t), intent(in) :: coef
101 integer, intent(in) :: msk(:)
102 integer, intent(in) :: facet(:)
103 integer, intent(in) :: h_index
104 type(json_file), intent(inout) :: json
105 real(kind=rp) :: kappa, b, p, s
106
107 call json_get_or_lookup(json, "kappa", kappa)
108 call json_get_or_lookup(json, "B", b)
109 call json_get_or_lookup_or_default(json, "p", p, 1.138_rp)
110 call json_get_or_lookup_or_default(json, "s", s, 217.8_rp)
111
112 call this%init_from_components(scheme_name, coef, msk, facet, h_index, &
113 kappa, b, p, s)
114 end subroutine cai_sagaut_model_ii_init
115
119 subroutine cai_sagaut_model_ii_partial_init(this, coef, json)
120 class(cai_sagaut_model_ii_t), intent(inout) :: this
121 type(coef_t), intent(in) :: coef
122 type(json_file), intent(inout) :: json
123 call this%partial_init_base(coef, json)
124 call json_get_or_lookup(json, "kappa", this%kappa)
125 call json_get_or_lookup(json, "B", this%B)
126 call json_get_or_lookup_or_default(json, "p", this%p, 1.138_rp)
127 call json_get_or_lookup_or_default(json, "s", this%s, 217.8_rp)
129
133 subroutine cai_sagaut_model_ii_finalize(this, msk, facet)
134 class(cai_sagaut_model_ii_t), intent(inout) :: this
135 integer, intent(in) :: msk(:)
136 integer, intent(in) :: facet(:)
137
138 call this%finalize_base(msk, facet)
139 call this%nu%init(this%n_nodes)
140 call this%rho_w%init(this%n_nodes)
141 end subroutine cai_sagaut_model_ii_finalize
142
153 subroutine cai_sagaut_model_ii_init_from_components(this, scheme_name, coef, &
154 msk, facet, h_index, kappa, B, p, s)
155 class(cai_sagaut_model_ii_t), intent(inout) :: this
156 character(len=*), intent(in) :: scheme_name
157 type(coef_t), intent(in) :: coef
158 integer, intent(in) :: msk(:)
159 integer, intent(in) :: facet(:)
160 integer, intent(in) :: h_index
161 real(kind=rp), intent(in) :: kappa, b, p, s
162
163 call this%free()
164 call this%init_base(scheme_name, coef, msk, facet, h_index)
165
166 this%kappa = kappa
167 this%B = b
168 this%p = p
169 this%s = s
170
171 call this%nu%init(this%n_nodes)
172 call this%rho_w%init(this%n_nodes)
174
177 class(cai_sagaut_model_ii_t), intent(inout) :: this
178 type(field_t), pointer :: temp
179 integer :: idx
180
181 call neko_scratch_registry%request_field(temp, idx, .false.)
182 call field_invcol3(temp, this%mu, this%rho)
183
184 if (neko_bcknd_device .eq. 1) then
185 call device_masked_gather_copy_0(this%nu%x_d, temp%x_d, this%msk_d, &
186 temp%size(), this%nu%size())
187 call device_masked_gather_copy_0(this%rho_w%x_d, this%rho%x_d, &
188 this%msk_d, this%rho%size(), this%rho_w%size())
189 else
190 call masked_gather_copy_0(this%nu%x, temp%x, this%msk, temp%size(), &
191 this%nu%size())
192 call masked_gather_copy_0(this%rho_w%x, this%rho%x, this%msk, &
193 this%rho%size(), this%rho_w%size())
194 end if
195
196 call neko_scratch_registry%relinquish_field(idx)
198
201 class(cai_sagaut_model_ii_t), intent(inout) :: this
202
203 call this%rho_w%free()
204 call this%nu%free()
205 call this%free_base()
206 end subroutine cai_sagaut_model_ii_free
207
211 subroutine cai_sagaut_model_ii_compute(this, t, tstep)
212 class(cai_sagaut_model_ii_t), intent(inout) :: this
213 real(kind=rp), intent(in) :: t
214 integer, intent(in) :: tstep
215 type(field_t), pointer :: u
216 type(field_t), pointer :: v
217 type(field_t), pointer :: w
218
219 call this%compute_nu_and_rho()
220
221 u => neko_registry%get_field("u")
222 v => neko_registry%get_field("v")
223 w => neko_registry%get_field("w")
224
225 if (neko_bcknd_device .eq. 1) then
226 call cai_sagaut_model_ii_compute_device(u%x_d, v%x_d, w%x_d, &
227 this%ind_r_d, this%ind_s_d, this%ind_t_d, this%ind_e_d, &
228 this%n_x%x_d, this%n_y%x_d, this%n_z%x_d, this%nu%x_d, &
229 this%rho_w%x_d, this%h%x_d, this%tau_x%x_d, this%tau_y%x_d, &
230 this%tau_z%x_d, this%n_nodes, u%Xh%lx, this%kappa, this%B, &
231 this%p, this%s)
232 else
233 call cai_sagaut_model_ii_compute_cpu(u%x, v%x, w%x, this%ind_r, &
234 this%ind_s, this%ind_t, this%ind_e, this%n_x%x, this%n_y%x, &
235 this%n_z%x, this%nu%x, this%rho_w%x, this%h%x, this%tau_x%x, &
236 this%tau_y%x, this%tau_z%x, this%n_nodes, u%Xh%lx, u%msh%nelv, &
237 this%kappa, this%B, this%p, this%s)
238 end if
239 end subroutine cai_sagaut_model_ii_compute
240end 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 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__ 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 int lx, 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, ind_r, ind_s, ind_t, ind_e, n_x, n_y, n_z, nu, rho_w, h, tau_x, tau_y, tau_z, n_nodes, lx, nelv, 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, ind_r_d, ind_s_d, ind_t_d, ind_e_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, lx, kappa, b, p, s)
Evaluate the device wall-model kernel for Model-II.
Implements cai_sagaut_model_ii_t.
subroutine cai_sagaut_model_ii_init(this, scheme_name, coef, msk, facet, h_index, json)
Initialise the wall model from the case file.
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_partial_init(this, coef, json)
Partially initialise the wall model from the case file.
subroutine cai_sagaut_model_ii_init_from_components(this, scheme_name, coef, msk, facet, h_index, kappa, b, p, s)
Initialise the wall model from explicit components.
subroutine cai_sagaut_model_ii_free(this)
Destructor.
subroutine cai_sagaut_model_ii_finalize(this, msk, facet)
Finalise allocation of derived data structures.
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:358
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
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.
Defines a vector.
Definition vector.f90:34
Implements wall_model_t.
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:63
Base abstract type for wall-stress models for wall-modelled LES.