Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
most.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!
33!
35module most
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
49 use most_cpu, only : most_compute_cpu
52 use logger, only : log_size, neko_log
53 use vector, only : vector_t
55 use math, only: masked_gather_copy_0
57 implicit none
58 private
59
64 type, public, extends(wall_model_t) :: most_t
66 real(kind=rp) :: kappa
68 real(kind=rp) :: pr
70 real(kind=rp) :: z0
72 real(kind=rp) :: z0h_in
73 ! The dynamic viscosity at the boundary
74 type(vector_t) :: mu_w
75 ! The fluid density at the boundary
76 type(vector_t) :: rho_w
78 real(kind=rp) :: g(3)
80 character(len=:), allocatable :: bc_type
82 real(kind=rp) :: bc_value
84 character(len=:), allocatable :: scalar_name
86 type(vector_t) :: ri_b, l_ob, utau, magu, ti, ts, q
88 type(vector_t) :: u_s, v_s, w_s, temp_s, temp_w
89 contains
91 procedure, pass(this) :: init => most_init
94 procedure, pass(this) :: partial_init => most_partial_init
96 procedure, pass(this) :: finalize => most_finalize
98 procedure, pass(this) :: init_from_components => &
101 procedure, pass(this) :: free => most_free
103 procedure, pass(this) :: compute => most_compute
104 ! Extract fluid properties at the wall (mu and rho)
105 procedure, pass(this) :: extract_properties => most_extract_properties
106 end type most_t
107
108contains
115 subroutine most_init(this, scheme_name, coef, msk, facet, &
116 json)
117 class(most_t), intent(inout) :: this
118 character(len=*), intent(in) :: scheme_name
119 type(coef_t), intent(in) :: coef
120 integer, intent(in) :: msk(:)
121 integer, intent(in) :: facet(:)
122 type(json_file), intent(inout) :: json
123 real(kind=rp) :: kappa, z0, z0h_in, pr
124 character(len=:), allocatable :: bc_type
125 character(len=:), allocatable :: scalar_name
126 real(kind=rp) :: bc_value
127 real(kind=rp), allocatable :: g_tmp(:)
128 real(kind=rp) :: g(3)
129 logical :: if_time_dependent
130 class(wall_sampler_t), allocatable :: sampler
131
132 call json_get_or_lookup_or_default(json, "kappa", kappa, 0.4_rp)
133 call json_get_or_lookup_or_default(json, "Pr", pr, 1.0_rp)
134 call json_get_or_lookup(json, "z0", z0)
135 ! If z0h is specified and positive, z0h will be constant and equal to
136 ! what's specified in the case file.
137 ! If z0h is specified and negative, the Zilitinkevich 1995 formulation
138 ! is used, with the specified value acting as -C_Zil.
139 ! If z0h is not specified, assign to have the same value as z0.
140 call json_get_or_lookup_or_default(json, "z0h", z0h_in, z0)
141 call json_get(json, "type_of_temp_bc", bc_type)
142 call json_get(json, "scalar_field", scalar_name)
143 call json_get_or_lookup(json, "bottom_bc_flux_or_temp", bc_value)
144 call json_get_or_default(json, "time_dependent_temp_bc", &
145 if_time_dependent, .false.)
146
147 if (if_time_dependent) then
148 call neko_const_registry%add_real_scalar(bc_value, "bc_value")
149 end if
150
151 call json_get_or_lookup(json, "g", g_tmp)
152 if (size(g_tmp) == 3) then
153 g = g_tmp
154 else
155 call neko_error("MOST WM: The gravity vector should have " // &
156 "exactly 3 components")
157 end if
158 deallocate(g_tmp)
159
160 call wall_sampler_factory(sampler, json)
161 call this%init_from_components(scheme_name, scalar_name, coef, msk, &
162 facet, sampler, &
163 kappa, g, pr, z0, z0h_in, bc_type, bc_value)
164 deallocate(bc_type)
165 deallocate(scalar_name)
166 end subroutine most_init
167
171 subroutine most_partial_init(this, coef, scheme_name, json)
172 class(most_t), intent(inout) :: this
173 type(coef_t), intent(in) :: coef
174 character(len=*), intent(in) :: scheme_name
175 type(json_file), intent(inout) :: json
176 real(kind=rp), allocatable :: g_tmp(:)
177 character(len=LOG_SIZE) :: log_buf
178 logical :: if_time_dependent
179
180 call this%partial_init_base(coef, scheme_name, json)
181 call json_get_or_lookup_or_default(json, "kappa", this%kappa, 0.4_rp)
182 call json_get_or_lookup_or_default(json, "Pr", this%Pr, 1.0_rp)
183 call json_get_or_lookup(json, "z0", this%z0)
184 call json_get_or_lookup_or_default(json, "z0h", this%z0h_in, this%z0)
185 call json_get(json, "type_of_temp_bc", this%bc_type)
186 call json_get(json, "scalar_field", this%scalar_name)
187 call json_get_or_lookup(json, "bottom_bc_flux_or_temp", this%bc_value)
188 call json_get_or_default(json, "time_dependent_temp_bc", &
189 if_time_dependent, .false.)
190
191 if (if_time_dependent) then
192 call neko_const_registry%add_real_scalar(this%bc_value, "bc_value")
193 end if
194
195
196 call json_get_or_lookup(json, "g", g_tmp)
197 if (size(g_tmp) == 3) then
198 this%g = g_tmp
199 else
200 call neko_error("MOST WM: The gravity vector should have " // &
201 "exactly 3 components")
202 end if
203 deallocate(g_tmp)
204
205 call neko_log%section('Wall model')
206 write(log_buf, '(A, A)') 'Model : MOST'
207 call neko_log%message(log_buf)
208 write(log_buf, '(A, A)') 'scalar_name : ', trim(this%scalar_name)
209 call neko_log%message(log_buf)
210 write(log_buf, '(A, A)') 'bc_type : ', trim(this%bc_type)
211 call neko_log%message(log_buf)
212 write(log_buf, '(A, E15.7)') 'bc_value : ', this%bc_value
213 call neko_log%message(log_buf)
214 write(log_buf, '(A, E15.7)') 'kappa : ', this%kappa
215 call neko_log%message(log_buf)
216 write(log_buf, '(A, E15.7)') 'z0 : ', this%z0
217 call neko_log%message(log_buf)
218 write(log_buf, '(A, E15.7)') 'z0h : ', this%z0h_in
219 call neko_log%message(log_buf)
220 write(log_buf, '(A, E15.7)') 'Pr : ', this%Pr
221 call neko_log%message(log_buf)
222 write(log_buf, '(A, 3(E15.7,1X))') 'g : ', this%g
223 call neko_log%message(log_buf)
224 call neko_log%end_section()
225
226 end subroutine most_partial_init
227
231 subroutine most_finalize(this, msk, facet, bc_name, user)
232 class(most_t), intent(inout) :: this
233 integer, intent(in) :: msk(:)
234 integer, intent(in) :: facet(:)
235 character(len=*), optional, intent(in) :: bc_name
236 type(user_t), target, optional, intent(in) :: user
237 call this%finalize_base(msk, facet, bc_name, user)
238 call this%validate_single_sample()
239
240 call this%Ri_b%init(this%n_nodes)
241 call this%L_ob%init(this%n_nodes)
242 call this%utau%init(this%n_nodes)
243 call this%magu%init(this%n_nodes)
244 call this%ti%init(this%n_nodes)
245 call this%ts%init(this%n_nodes)
246 call this%q%init(this%n_nodes)
247
248 call this%mu_w%init(this%n_nodes)
249 call this%rho_w%init(this%n_nodes)
250 call this%u_s%init(this%n_nodes)
251 call this%v_s%init(this%n_nodes)
252 call this%w_s%init(this%n_nodes)
253 call this%temp_s%init(this%n_nodes)
254 call this%temp_w%init(this%n_nodes)
256 end subroutine most_finalize
257
259 subroutine most_extract_properties(this)
260 class(most_t), intent(inout) :: this
261
262 if (neko_bcknd_device .eq. 1) then
263 call device_masked_gather_copy_0(this%mu_w%x_d, this%mu%x_d, &
264 this%msk_d, &
265 this%mu%size(), this%mu_w%size())
266 call device_masked_gather_copy_0(this%rho_w%x_d, this%rho%x_d, &
267 this%msk_d, &
268 this%rho%size(), this%rho_w%size())
269 else
270 call masked_gather_copy_0(this%mu_w%x, this%mu%x, this%msk, &
271 this%mu%size(), this%mu_w%size())
272 call masked_gather_copy_0(this%rho_w%x, this%rho%x, this%msk, &
273 this%rho%size(), this%rho_w%size())
274 end if
275 end subroutine most_extract_properties
276
291 subroutine most_init_from_components(this, scheme_name, scalar_name, &
292 coef, msk, facet, sampler, kappa, g, Pr, z0, &
293 z0h_in, bc_type, bc_value)
294 class(most_t), intent(inout) :: this
295 character(len=*), intent(in) :: scheme_name
296 character(len=*), intent(in) :: bc_type
297 character(len=*), intent(in) :: scalar_name
298 type(coef_t), intent(in) :: coef
299 integer, intent(in) :: msk(:)
300 integer, intent(in) :: facet(:)
301 class(wall_sampler_t), allocatable, intent(inout) :: sampler
302 real(kind=rp), intent(in) :: g(3)
303 real(kind=rp) :: g_mag, g_dot_n, cos_alpha, max_ang
304 integer :: i
305 real(kind=rp), intent(in) :: kappa
306 real(kind=rp), intent(in) :: z0, z0h_in, bc_value, pr
307 character(len=LOG_SIZE) :: log_buf
308
309 call this%free()
310 call this%init_base(scheme_name, coef, msk, facet, sampler)
311
312 this%kappa = kappa
313 this%g = g
314 this%Pr = pr
315 this%z0 = z0
316 this%z0h_in = z0h_in
317 this%bc_type = bc_type
318 this%bc_value = bc_value
319 this%scalar_name = scalar_name
320
321 call this%mu_w%init(this%n_nodes)
322 call this%rho_w%init(this%n_nodes)
323 call this%validate_single_sample()
324 call this%u_s%init(this%n_nodes)
325 call this%v_s%init(this%n_nodes)
326 call this%w_s%init(this%n_nodes)
327 call this%temp_s%init(this%n_nodes)
328 call this%temp_w%init(this%n_nodes)
329
331 g_mag = sqrt(sum(g**2))
332 if (g_mag < 1.0e-6_rp) then
333 call neko_error("MOST WM: Gravity magnitude is zero. Check " // &
334 "your input configuration.")
335 end if
336
338 max_ang = 0.0_rp
339 do i = 1, this%n_nodes
340 g_dot_n = abs(g(1) * this%n_x%x(i) + g(2) * this%n_y%x(i) + &
341 g(3) * this%n_z%x(i))
342 cos_alpha = g_dot_n / g_mag
343 max_ang = max(max_ang, acos(min(1.0_rp, cos_alpha)))
344 end do
345 max_ang = max_ang * 180.0_rp / (4.0_rp * atan(1.0_rp))
346 if (max_ang > 8.0_rp) then
347 write(log_buf, '(A, F6.2, A)') &
348 "MOST WM: Significant gravity-normal misalignment (max ", &
349 max_ang, " deg). Stability corrections will use projected gravity."
350 call neko_warning(trim(log_buf))
351 end if
352
354
355 end subroutine most_init_from_components
356
358 class(most_t), intent(in) :: this
359
360 if (any(this%sampler%h%x(1:this%n_nodes) .le. this%z0)) then
361 call neko_error("MOST WM: Sampling height h must be greater " // &
362 "than roughness z0.")
363 else if ((this%z0h_in .gt. 0.0_rp) .and. &
364 any(this%sampler%h%x(1:this%n_nodes) .le. this%z0h_in)) then
365 call neko_error("MOST WM: Sampling height h must be greater " // &
366 "than thermal roughness z0h.")
367 else if (this%z0 .eq. 0.0_rp) then
368 call neko_error("MOST WM: Roughness z0 must be greater than 0.")
369 else if (this%z0h_in .eq. 0.0_rp) then
370 call neko_error("MOST WM: Thermal roughness z0h must be greater than 0.")
371 end if
372 end subroutine most_validate_sampling_height
373
375 subroutine most_free(this)
376 class(most_t), intent(inout) :: this
377
378 if (allocated(this%bc_type)) then
379 deallocate(this%bc_type)
380 end if
381
382 if (allocated(this%scalar_name)) then
383 deallocate(this%scalar_name)
384 end if
385
386 call this%mu_w%free()
387 call this%rho_w%free()
388 call this%u_s%free()
389 call this%v_s%free()
390 call this%w_s%free()
391 call this%temp_s%free()
392 call this%temp_w%free()
393 call this%free_base()
394
395 call this%Ri_b%free()
396 call this%L_ob%free()
397 call this%utau%free()
398 call this%magu%free()
399 call this%ti%free()
400 call this%ts%free()
401 call this%q%free()
402
403 end subroutine most_free
404
408 subroutine most_compute(this, t, tstep)
409 class(most_t), intent(inout) :: this
410 real(kind=rp), intent(in) :: t
411 integer, intent(in) :: tstep
412 type(field_t), pointer :: u
413 type(field_t), pointer :: v
414 type(field_t), pointer :: w
415 type(field_t), pointer :: temp
416 real(kind=rp), pointer :: updated_bc_value
417
418 ! Extract boundary values for mu and rho
419 call this%extract_properties()
420
421 u => neko_registry%get_field("u")
422 v => neko_registry%get_field("v")
423 w => neko_registry%get_field("w")
424 temp => neko_registry%get_field(this%scalar_name)
425
426 call this%sampler%sample(u, this%u_s)
427 call this%sampler%sample(v, this%v_s)
428 call this%sampler%sample(w, this%w_s)
429 call this%sampler%sample(temp, this%temp_s)
430 if (neko_bcknd_device .eq. 1) then
431 call device_masked_gather_copy_0(this%temp_w%x_d, temp%x_d, &
432 this%msk_d, temp%size(), this%n_nodes)
433 else
434 call masked_gather_copy_0(this%temp_w%x, temp%x, this%msk, &
435 temp%size(), this%n_nodes)
436 end if
437
438 if (neko_const_registry%real_scalar_exists("bc_value")) then
439 updated_bc_value => neko_const_registry%get_real_scalar("bc_value")
440 this%bc_value = updated_bc_value
441 end if
442
443 if (neko_bcknd_device .eq. 1) then
444 call most_compute_device(this%u_s%x_d, this%v_s%x_d, this%w_s%x_d, &
445 this%temp_s%x_d, this%temp_w%x_d, this%n_x%x_d, &
446 this%n_y%x_d, this%n_z%x_d, this%sampler%h%x_d, &
447 this%tau_x%x_d, this%tau_y%x_d, &
448 this%tau_z%x_d, this%n_nodes, this%kappa, &
449 this%mu_w%x_d, this%rho_w%x_d, this%g, this%Pr, this%z0, &
450 this%z0h_in, &
451 this%bc_type, this%bc_value, tstep, this%Ri_b%x_d, &
452 this%L_ob%x_d, this%utau%x_d, this%magu%x_d, this%ti%x_d, &
453 this%ts%x_d, this%q%x_d)
454 else
455 call most_compute_cpu(this%u_s%x, this%v_s%x, this%w_s%x, &
456 this%temp_s%x, this%temp_w%x, this%n_x%x, &
457 this%n_y%x, this%n_z%x, this%sampler%h%x, this%tau_x%x, &
458 this%tau_y%x, this%tau_z%x, this%n_nodes, &
459 this%kappa, this%mu_w%x, this%rho_w%x, &
460 this%g, this%Pr, this%z0, this%z0h_in, this%bc_type, &
461 this%bc_value, tstep, this%Ri_b%x, this%L_ob%x, &
462 this%utau%x, this%magu%x, this%ti%x, this%ts%x, &
463 this%q%x)
464 end if
465
466 call most_log_diagnostics(this%Ri_b, this%L_ob, &
467 this%utau, this%magu, this%ti, this%ts, this%q, &
468 this%n_nodes, this%bc_value)
469
470 nullify(u, v, w, temp, updated_bc_value)
471
472 end subroutine most_compute
473
474 subroutine most_log_diagnostics(Ri_b, L_ob, utau, magu, ti, ts, q, &
475 n_nodes, bc_value)
476 character(len=LOG_SIZE) :: log_buf
477 integer, intent(in) :: n_nodes
478 real(kind=rp), intent(in) :: bc_value
479 type(vector_t), intent(in) :: ri_b, l_ob, utau
480 type(vector_t), intent(in) :: magu, ti, ts, q
481
482 call neko_log%section("Wall model diagnostics")
483 write(log_buf, '(A)') '--- sum --- ' !min max ---'
484 call neko_log%message(trim(log_buf))
485 write(log_buf,'(A,3E15.7)') "Ri_b: ",&
486 vector_glsum(ri_b, n_nodes) !, &
487 ! vector_glmin(Ri_b, n_nodes), vector_glmax(Ri_b, n_nodes)
488 call neko_log%message(trim(log_buf))
489
490 write(log_buf,'(A,3E15.7)') "L_ob: ", &
491 vector_glsum(l_ob, n_nodes)!, &
492 ! vector_glmin(L_ob, n_nodes), vector_glmax(L_ob, n_nodes)
493 call neko_log%message(trim(log_buf))
494
495 write(log_buf,'(A,3E15.7)') "utau: ", &
496 vector_glsum(utau, n_nodes)!, &
497 ! vector_glmin(utau, n_nodes), vector_glmax(utau, n_nodes)
498 call neko_log%message(trim(log_buf))
499
500 write(log_buf,'(A,3E15.7)') "magu: ", &
501 vector_glsum(magu, n_nodes)!, &
502 ! vector_glmin(magu, n_nodes), vector_glmax(magu, n_nodes)
503 call neko_log%message(trim(log_buf))
504
505 write(log_buf,'(A,3E15.7)') "ti: ", &
506 vector_glsum(ti, n_nodes)!, &
507 ! vector_glmin(ti, n_nodes), vector_glmax(ti, n_nodes)
508 call neko_log%message(trim(log_buf))
509
510 write(log_buf,'(A,3E15.7)') "ts: ", &
511 vector_glsum(ts, n_nodes)!, &
512 ! vector_glmin(ts, n_nodes), vector_glmax(ts, n_nodes)
513 call neko_log%message(trim(log_buf))
514
515 write(log_buf,'(A,3E15.7)') "q: ", &
516 vector_glsum(q, n_nodes)!, &
517 ! vector_glmin(q, n_nodes), vector_glmax(q, n_nodes)
518 call neko_log%message(trim(log_buf))
519
520 write(log_buf,'(A,E15.7)') "bc_value: ", bc_value
521 call neko_log%message(trim(log_buf))
522
523 call neko_log%end_section()
524
525 end subroutine most_log_diagnostics
526
527
528end module most
__inline__ __device__ void nonlinear_index(const int idx, const int lx, int *index)
Definition bc_utils.h:44
__global__ void most_compute(const T *__restrict__ u_d, const T *__restrict__ v_d, const T *__restrict__ w_d, const T *__restrict__ temp_d, const T *__restrict__ temp_w_d, const T *__restrict__ h_d, const T *__restrict__ n_x_d, const T *__restrict__ n_y_d, const T *__restrict__ n_z_d, T *__restrict__ tau_x_d, T *__restrict__ tau_y_d, T *__restrict__ tau_z_d, int n_nodes, T kappa, const T *__restrict__ mu_w_d, const T *__restrict__ rho_w_d, T g1, T g2, T g3, T Pr, T z0, T z0h_in, T bc_value, T *__restrict__ Ri_b_diagn, T *__restrict__ L_ob_diagn, T *__restrict__ utau_diagn, T *__restrict__ magu_diagn, T *__restrict__ ti_diagn, T *__restrict__ ts_diagn, T *__restrict__ q_diagn)
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
Retrieves a parameter by name or throws an error.
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:363
Implements the CPU kernel for the most_t type.
Definition most_cpu.f90:34
subroutine, public most_compute_cpu(u, v, w, temp, temp_w, n_x, n_y, n_z, h, tau_x, tau_y, tau_z, n_nodes, kappa, mu_w, rho_w, g_vec, pr, z0, z0h_in, bc_type, bc_value, tstep, ri_b_diagn, l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, ts_diagn, q_diagn)
Main routine to compute the surface stresses based on MOST.
Definition most_cpu.f90:174
Implements the device kernel for the most_t type.
subroutine, public most_compute_device(u_d, v_d, w_d, temp_d, temp_w_d, n_x_d, n_y_d, n_z_d, h_d, tau_x_d, tau_y_d, tau_z_d, n_nodes, kappa, mu_w_d, rho_w_d, g, pr, z0, z0h_in, bc_type, bc_value, tstep, ri_b_diagn, l_ob_diagn, utau_diagn, magu_diagn, ti_diagn, ts_diagn, q_diagn)
Compute the wall shear stress on device using the rough log-law model.
Implements most_t.
Definition most.f90:35
subroutine most_validate_sampling_height(this)
Definition most.f90:358
subroutine most_init_from_components(this, scheme_name, scalar_name, coef, msk, facet, sampler, kappa, g, pr, z0, z0h_in, bc_type, bc_value)
Constructor from components.
Definition most.f90:294
subroutine most_free(this)
Destructor for the most_t (base) class.
Definition most.f90:376
subroutine most_log_diagnostics(ri_b, l_ob, utau, magu, ti, ts, q, n_nodes, bc_value)
Definition most.f90:476
subroutine most_partial_init(this, coef, scheme_name, json)
Constructor from JSON.
Definition most.f90:172
subroutine most_init(this, scheme_name, coef, msk, facet, json)
Constructor from JSON.
Definition most.f90:117
subroutine most_extract_properties(this)
Extract the values of rho and mu at the boundary.
Definition most.f90:260
subroutine most_finalize(this, msk, facet, bc_name, user)
Finalize the construction using the mask and facet arrays of the bc.
Definition most.f90:232
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
type(registry_t), target, public neko_const_registry
This registry is used to store user-defined scalars and vectors, provided under the constants section...
Definition registry.f90:150
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
Utilities.
Definition utils.f90:35
subroutine, public neko_warning(warning_msg)
Reports a warning to standard output.
Definition utils.f90:398
real(kind=rp) function, public vector_glmin(a, n)
Global minimum of all elements in a vector .
real(kind=rp) function, public vector_glsum(a, n)
real(kind=rp) function, public vector_glmax(a, n)
Global maximum of all elements in a vector .
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.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:93
Wall model based on the Monin-Obukhov Similarity Theory for atmospheric boundary layer flows....
Definition most.f90:64
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...
#define max(a, b)
Definition tensor.cu:40