Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
richardson.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!
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
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) :: richardson_t
66 real(kind=rp) :: kappa
68 real(kind=rp) :: pr
70 real(kind=rp) :: z0
72 real(kind=rp) :: z0h_in
74 real(kind=rp) :: g(3)
75 ! The dynamic viscosity at the boundary
76 type(vector_t) :: mu_w
77 ! The fluid density at the boundary
78 type(vector_t) :: rho_w
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
87 type(vector_t) :: u_s, v_s, w_s, temp_s, temp_w
88 contains
90 procedure, pass(this) :: init => richardson_init
93 procedure, pass(this) :: partial_init => richardson_partial_init
95 procedure, pass(this) :: finalize => richardson_finalize
97 procedure, pass(this) :: init_from_components => &
100 procedure, pass(this) :: free => richardson_free
102 procedure, pass(this) :: compute => richardson_compute
103 ! Extract fluid properties at the wall (mu and rho)
104 procedure, pass(this) :: extract_properties => &
106 end type richardson_t
107
108contains
115 subroutine richardson_init(this, scheme_name, coef, msk, facet, &
116 json)
117 class(richardson_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("Richardson WM: The gravity vector should " &
156 // "have 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, &
162 msk, facet, sampler, kappa, g, pr, z0, z0h_in, bc_type, bc_value)
163 deallocate(bc_type)
164 deallocate(scalar_name)
165 end subroutine richardson_init
166
170 subroutine richardson_partial_init(this, coef, scheme_name, json)
171 class(richardson_t), intent(inout) :: this
172 type(coef_t), intent(in) :: coef
173 character(len=*), intent(in) :: scheme_name
174 type(json_file), intent(inout) :: json
175 real(kind=rp), allocatable :: g_tmp(:)
176 character(len=LOG_SIZE) :: log_buf
177 logical :: if_time_dependent
178
179 call this%partial_init_base(coef, scheme_name, json)
180 call json_get_or_lookup_or_default(json, "kappa", this%kappa, 0.4_rp)
181 call json_get_or_lookup_or_default(json, "Pr", this%Pr, 1.0_rp)
182 call json_get_or_lookup(json, "z0", this%z0)
183 call json_get_or_lookup_or_default(json, "z0h", this%z0h_in, this%z0)
184 call json_get(json, "type_of_temp_bc", this%bc_type)
185 call json_get(json, "scalar_field", this%scalar_name)
186 call json_get_or_lookup(json, "bottom_bc_flux_or_temp", this%bc_value)
187 call json_get_or_default(json, "time_dependent_temp_bc", &
188 if_time_dependent, .false.)
189
190 if (if_time_dependent) then
191 call neko_const_registry%add_real_scalar(this%bc_value, "bc_value")
192 end if
193
194
195 call json_get_or_lookup(json, "g", g_tmp)
196 if (size(g_tmp) == 3) then
197 this%g = g_tmp
198 else
199 call neko_error("Richardson WM: The gravity vector should " &
200 // "have exactly 3 components")
201 end if
202 deallocate(g_tmp)
203
204 call neko_log%section('Wall model')
205 write(log_buf, '(A, A)') 'Model : Richardson'
206 call neko_log%message(log_buf)
207 write(log_buf, '(A, A)') 'scalar_name : ', trim(this%scalar_name)
208 call neko_log%message(log_buf)
209 write(log_buf, '(A, A)') 'bc_type : ', trim(this%bc_type)
210 call neko_log%message(log_buf)
211 write(log_buf, '(A, E15.7)') 'bc_value : ', this%bc_value
212 call neko_log%message(log_buf)
213 write(log_buf, '(A, E15.7)') 'kappa : ', this%kappa
214 call neko_log%message(log_buf)
215 write(log_buf, '(A, E15.7)') 'z0 : ', this%z0
216 call neko_log%message(log_buf)
217 write(log_buf, '(A, E15.7)') 'z0h : ', this%z0h_in
218 call neko_log%message(log_buf)
219 write(log_buf, '(A, E15.7)') 'Pr : ', this%Pr
220 call neko_log%message(log_buf)
221 write(log_buf, '(A, 3(E15.7,1X))') 'g : ', this%g
222 call neko_log%message(log_buf)
223 call neko_log%end_section()
224
225 end subroutine richardson_partial_init
226
230 subroutine richardson_finalize(this, msk, facet, bc_name, user)
231 class(richardson_t), intent(inout) :: this
232 integer, intent(in) :: msk(:)
233 integer, intent(in) :: facet(:)
234 character(len=*), optional, intent(in) :: bc_name
235 type(user_t), target, optional, intent(in) :: user
236 call this%finalize_base(msk, facet, bc_name, user)
237 call this%validate_single_sample()
238
239 call this%Ri_b%init(this%n_nodes)
240 call this%L_ob%init(this%n_nodes)
241 call this%utau%init(this%n_nodes)
242 call this%magu%init(this%n_nodes)
243 call this%ti%init(this%n_nodes)
244 call this%ts%init(this%n_nodes)
245 call this%q%init(this%n_nodes)
246
247 call this%mu_w%init(this%n_nodes)
248 call this%rho_w%init(this%n_nodes)
249 call this%u_s%init(this%n_nodes)
250 call this%v_s%init(this%n_nodes)
251 call this%w_s%init(this%n_nodes)
252 call this%temp_s%init(this%n_nodes)
253 call this%temp_w%init(this%n_nodes)
255 end subroutine richardson_finalize
256
259 class(richardson_t), intent(inout) :: this
260
261 if (neko_bcknd_device .eq. 1) then
262 call device_masked_gather_copy_0(this%mu_w%x_d, this%mu%x_d, &
263 this%msk_d, &
264 this%mu%size(), this%mu_w%size())
265 call device_masked_gather_copy_0(this%rho_w%x_d, this%rho%x_d, &
266 this%msk_d, &
267 this%rho%size(), this%rho_w%size())
268 else
269 call masked_gather_copy_0(this%mu_w%x, this%mu%x, this%msk, &
270 this%mu%size(), this%mu_w%size())
271 call masked_gather_copy_0(this%rho_w%x, this%rho%x, this%msk, &
272 this%rho%size(), this%rho_w%size())
273 end if
274 end subroutine richardson_extract_properties
275
291 subroutine richardson_init_from_components(this, scheme_name, &
292 scalar_name, coef, msk, facet, sampler, kappa, g, Pr, z0, &
293 z0h_in, bc_type, bc_value)
294 class(richardson_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("Richardson WM: Gravity magnitude is zero. " &
334 // "Check 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)') "Richardson WM: Significant " &
348 // "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
356
358 class(richardson_t), intent(in) :: this
359
360 if (any(this%sampler%h%x(1:this%n_nodes) .le. this%z0)) then
361 call neko_error("Richardson 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("Richardson 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("Richardson WM: Roughness z0 must be greater than 0.")
369 else if (this%z0h_in .eq. 0.0_rp) then
370 call neko_error("Richardson WM: Thermal roughness z0h must " // &
371 "be greater than 0.")
372 end if
374
376 subroutine richardson_free(this)
377 class(richardson_t), intent(inout) :: this
378
379 if (allocated(this%bc_type)) then
380 deallocate(this%bc_type)
381 end if
382
383 if (allocated(this%scalar_name)) then
384 deallocate(this%scalar_name)
385 end if
386
387 call this%mu_w%free()
388 call this%rho_w%free()
389 call this%u_s%free()
390 call this%v_s%free()
391 call this%w_s%free()
392 call this%temp_s%free()
393 call this%temp_w%free()
394 call this%free_base()
395
396 call this%Ri_b%free()
397 call this%L_ob%free()
398 call this%utau%free()
399 call this%magu%free()
400 call this%ti%free()
401 call this%ts%free()
402 call this%q%free()
403
404 end subroutine richardson_free
405
409 subroutine richardson_compute(this, t, tstep)
410 class(richardson_t), intent(inout) :: this
411 real(kind=rp), intent(in) :: t
412 integer, intent(in) :: tstep
413 type(field_t), pointer :: u
414 type(field_t), pointer :: v
415 type(field_t), pointer :: w
416 type(field_t), pointer :: temp
417 real(kind=rp), pointer :: updated_bc_value
418
419 ! Extract boundary values for mu and rho
420 call this%extract_properties()
421
422 u => neko_registry%get_field("u")
423 v => neko_registry%get_field("v")
424 w => neko_registry%get_field("w")
425 temp => neko_registry%get_field(this%scalar_name)
426
427 call this%sampler%sample(u, this%u_s)
428 call this%sampler%sample(v, this%v_s)
429 call this%sampler%sample(w, this%w_s)
430 call this%sampler%sample(temp, this%temp_s)
431 if (neko_bcknd_device .eq. 1) then
432 call device_masked_gather_copy_0(this%temp_w%x_d, temp%x_d, &
433 this%msk_d, temp%size(), this%n_nodes)
434 else
435 call masked_gather_copy_0(this%temp_w%x, temp%x, this%msk, &
436 temp%size(), this%n_nodes)
437 end if
438
439 if (neko_const_registry%real_scalar_exists("bc_value")) then
440 updated_bc_value => neko_const_registry%get_real_scalar("bc_value")
441 this%bc_value = updated_bc_value
442 end if
443
444 if (neko_bcknd_device .eq. 1) then
445 call richardson_compute_device(this%u_s%x_d, this%v_s%x_d, &
446 this%w_s%x_d, this%temp_s%x_d, this%temp_w%x_d, &
447 this%n_x%x_d, this%n_y%x_d, this%n_z%x_d, &
448 this%sampler%h%x_d, this%tau_x%x_d, this%tau_y%x_d, &
449 this%tau_z%x_d, this%n_nodes, this%kappa, &
450 this%mu_w%x_d, this%rho_w%x_d, this%g, this%Pr, this%z0, &
451 this%z0h_in, &
452 this%bc_type, this%bc_value, tstep, this%Ri_b%x_d, &
453 this%L_ob%x_d, this%utau%x_d, this%magu%x_d, this%ti%x_d, &
454 this%ts%x_d, this%q%x_d)
455 else
456 call richardson_compute_cpu(this%u_s%x, this%v_s%x, this%w_s%x, &
457 this%temp_s%x, this%temp_w%x, this%n_x%x, &
458 this%n_y%x, this%n_z%x, this%sampler%h%x, this%tau_x%x, &
459 this%tau_y%x, this%tau_z%x, this%n_nodes, &
460 this%kappa, this%mu_w%x, this%rho_w%x, &
461 this%g, this%Pr, this%z0, this%z0h_in, this%bc_type, &
462 this%bc_value, tstep, this%Ri_b%x, this%L_ob%x, &
463 this%utau%x, this%magu%x, this%ti%x, this%ts%x, &
464 this%q%x)
465 end if
466
467 call richardson_log_diagnostics(this%Ri_b, this%L_ob, &
468 this%utau, this%magu, this%ti, this%ts, this%q, &
469 this%n_nodes, this%bc_value)
470
471 nullify(u, v, w, temp, updated_bc_value)
472
473 end subroutine richardson_compute
474
475 subroutine richardson_log_diagnostics(Ri_b, L_ob, utau, magu, &
476 ti, ts, q, n_nodes, bc_value)
477 character(len=LOG_SIZE) :: log_buf
478 integer, intent(in) :: n_nodes
479 real(kind=rp), intent(in) :: bc_value
480 type(vector_t), intent(in) :: ri_b, l_ob, utau
481 type(vector_t), intent(in) :: magu, ti, ts, q
482
483 call neko_log%section("Wall model diagnostics")
484 write(log_buf, '(A)') '--- sum --- ' ! min max ---'
485 call neko_log%message(trim(log_buf))
486 write(log_buf, '(A, E15.7)') "Ri_b: ", &
487 vector_glsum(ri_b, n_nodes) !, &
488 ! vector_glmin(Ri_b, n_nodes), vector_glmax(Ri_b, n_nodes)
489 call neko_log%message(trim(log_buf))
490
491 write(log_buf, '(A, E15.7)') "L_ob: ", &
492 vector_glsum(l_ob, n_nodes) !, &
493 ! vector_glmin(L_ob, n_nodes), vector_glmax(L_ob, n_nodes)
494 call neko_log%message(trim(log_buf))
495
496 write(log_buf, '(A, E15.7)') "utau: ", &
497 vector_glsum(utau, n_nodes) !, &
498 ! vector_glmin(utau, n_nodes), vector_glmax(utau, n_nodes)
499 call neko_log%message(trim(log_buf))
500
501 write(log_buf, '(A, E15.7)') "magu: ", &
502 vector_glsum(magu, n_nodes) !, &
503 ! vector_glmin(magu, n_nodes), vector_glmax(magu, n_nodes)
504 call neko_log%message(trim(log_buf))
505
506 write(log_buf, '(A, E15.7)') "ti: ", &
507 vector_glsum(ti, n_nodes) !, &
508 ! vector_glmin(ti, n_nodes), vector_glmax(ti, n_nodes)
509 call neko_log%message(trim(log_buf))
510
511 write(log_buf, '(A, E15.7)') "ts: ", &
512 vector_glsum(ts, n_nodes) !, &
513 ! vector_glmin(ts, n_nodes), vector_glmax(ts, n_nodes)
514 call neko_log%message(trim(log_buf))
515
516 write(log_buf, '(A, E15.7)') "q: ", &
517 vector_glsum(q, n_nodes) !, &
518 ! vector_glmin(q, n_nodes), vector_glmax(q, n_nodes)
519 call neko_log%message(trim(log_buf))
520
521 write(log_buf, '(A, E15.7)') "bc_value: ", bc_value
522 call neko_log%message(trim(log_buf))
523
524 call neko_log%end_section()
525
526 end subroutine richardson_log_diagnostics
527
528
529end module richardson
__inline__ __device__ void nonlinear_index(const int idx, const int lx, int *index)
Definition bc_utils.h:44
__global__ void richardson_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
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
Implements the CPU kernel for the richardson_t type.
subroutine, public richardson_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 richardson.
Implements the device kernel for the richardson_t type.
subroutine, public richardson_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 richardson_t.
subroutine richardson_extract_properties(this)
Extract the values of rho and mu at the boundary.
subroutine richardson_log_diagnostics(ri_b, l_ob, utau, magu, ti, ts, q, n_nodes, bc_value)
subroutine richardson_finalize(this, msk, facet, bc_name, user)
Finalize the construction using the mask and facet arrays of the bc.
subroutine richardson_validate_sampling_height(this)
subroutine richardson_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.
subroutine richardson_init(this, scheme_name, coef, msk, facet, json)
Constructor from JSON.
subroutine richardson_partial_init(this, coef, scheme_name, json)
Constructor from JSON.
subroutine richardson_free(this)
Destructor for the richardson_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.
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 similar to the Monin-Obukhov Similarity Theory for atmospheric boundary layer flows,...
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