37 use json_module,
only : json_file
74 character(len=1024) :: bf_rgstry_pref
76 logical :: baseflow_set = .false.
79 logical :: baseflow_is_ic = .false.
82 type(
field_t),
pointer :: fringe => null()
84 real(kind=
rp) :: amplitudes(3)
86 character(len=1024) :: fringe_registry_name
88 logical :: dump_fields = .false.
90 character(NEKO_FNAME_LEN) :: dump_fname
92 logical :: check = .true.
97 procedure, pass(this) :: init_constant => &
100 procedure, pass(this) :: init_user => &
103 procedure, pass(this) :: init_field => &
106 procedure, pass(this) :: init_common => &
119 type(json_file),
intent(inout) :: json
121 type(
coef_t),
intent(in),
target :: coef
122 character(len=*),
intent(in) :: variable_name
124 real(kind=
rp),
allocatable :: amplitudes(:)
125 character(len=:),
allocatable :: baseflow_method
126 character(len=:),
allocatable :: read_str, fringe_registry_name, &
127 bf_registry_pref, dump_fname
128 character(len=NEKO_FNAME_LEN) :: fname, mesh_fname
129 logical :: interpolate, dump_fields
130 real(kind=
rp),
allocatable :: constant_value(:)
131 real(kind=
rp) :: start_time, end_time, tolerance
134 type(json_file) :: baseflow_subdict
143 fringe_registry_name,
"sponge_fringe")
146 if (
size(amplitudes) .ne. 3)
then
147 call neko_error(
"(SPONGE) Expected 3 elements for 'amplitudes'")
156 call json_get(baseflow_subdict,
"method", baseflow_method)
158 bf_registry_pref,
"sponge_bf")
160 select case (trim(baseflow_method))
172 call json_get(baseflow_subdict,
'file_name', read_str)
173 fname = trim(read_str)
178 mesh_fname = trim(read_str)
181 type(json_file) :: interp_subdict
185 call this%init_field(fields, coef, start_time, end_time, amplitudes, &
186 fringe_registry_name, bf_registry_pref, dump_fields, dump_fname, &
187 fname, interpolate, mesh_fname, interp_subdict)
194 if (
size(constant_value) .lt. 3)
then
195 call neko_error(
"(SPONGE) Expected 3 elements for 'value'")
198 call this%init_constant(fields, coef, start_time, end_time, &
199 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
200 dump_fname, constant_value)
205 call this%init_user(fields, coef, start_time, end_time, amplitudes, &
206 fringe_registry_name, bf_registry_pref, dump_fields, dump_fname)
209 call neko_error(
"(SPONGE) " // trim(baseflow_method) // &
210 " is not a valid method")
219 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
220 dump_fname, constant_values)
222 type(field_list_t),
intent(in),
target :: fields
223 type(coef_t),
intent(in),
target :: coef
224 real(kind=rp),
intent(in) :: start_time, end_time
225 real(kind=rp),
intent(in) :: amplitudes(:)
226 character(len=*),
intent(in) :: fringe_registry_name, dump_fname, &
228 logical,
intent(in) :: dump_fields
229 real(kind=rp),
intent(in) :: constant_values(:)
230 character(len=LOG_SIZE) :: log_buf
237 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
243 call neko_registry%add_field(this%u%dof, &
244 trim(bf_registry_pref) //
"_u")
245 call neko_registry%add_field(this%v%dof, &
246 trim(bf_registry_pref) //
"_v")
247 call neko_registry%add_field(this%w%dof, &
248 trim(bf_registry_pref) //
"_w")
250 this%u_bf => neko_registry%get_field(trim(bf_registry_pref) //
"_u")
251 this%v_bf => neko_registry%get_field(trim(bf_registry_pref) //
"_v")
252 this%w_bf => neko_registry%get_field(trim(bf_registry_pref) //
"_w")
257 this%u_bf = constant_values(1)
258 this%v_bf = constant_values(2)
259 this%w_bf = constant_values(3)
261 call neko_log%message(
"Baseflow : constant", lvl = neko_log_info)
262 write (log_buf,
'(A, 3(ES12.6, A))')
"Value : [", &
263 (constant_values(i),
", ", i = 1, 2), constant_values(3),
"]"
264 call neko_log%message(log_buf, lvl = neko_log_info)
266 this%baseflow_set = .true.
272 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
273 dump_fname, file_name, interpolate, mesh_file_name, interp_subdict)
275 type(field_list_t),
intent(in),
target :: fields
276 type(coef_t),
intent(in),
target :: coef
277 real(kind=rp),
intent(in) :: start_time, end_time
278 real(kind=rp),
intent(in) :: amplitudes(:)
279 character(len=*),
intent(in) :: fringe_registry_name, dump_fname, &
281 logical,
intent(in) :: dump_fields
282 character(len=*),
intent(in) :: file_name
283 logical,
intent(in) :: interpolate
284 character(len=*),
intent(inout) :: mesh_file_name
285 type(json_file),
intent(inout) :: interp_subdict
294 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
297 call neko_log%message(
"Baseflow : field", lvl = neko_log_info)
302 call neko_registry%add_field(this%u%dof, &
303 trim(bf_registry_pref) //
"_u")
304 call neko_registry%add_field(this%v%dof, &
305 trim(bf_registry_pref) //
"_v")
306 call neko_registry%add_field(this%w%dof, &
307 trim(bf_registry_pref) //
"_w")
309 this%u_bf => neko_registry%get_field(trim(bf_registry_pref) //
"_u")
310 this%v_bf => neko_registry%get_field(trim(bf_registry_pref) //
"_v")
311 this%w_bf => neko_registry%get_field(trim(bf_registry_pref) //
"_w")
316 if (trim(mesh_file_name) .eq.
'none')
then
317 call import_fields(file_name, interp_subdict, &
318 u = this%u_bf, v = this%v_bf, w = this%w_bf, &
319 interpolate = interpolate)
321 call import_fields(file_name, interp_subdict, mesh_file_name, &
322 u = this%u_bf, v = this%v_bf, w = this%w_bf, &
323 interpolate = interpolate)
326 this%baseflow_set = .true.
332 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
335 type(field_list_t),
intent(in),
target :: fields
336 type(coef_t),
intent(in),
target :: coef
337 real(kind=rp),
intent(in) :: start_time, end_time
338 real(kind=rp),
intent(in) :: amplitudes(:)
339 character(len=*),
intent(in) :: fringe_registry_name, dump_fname, &
341 logical,
intent(in) :: dump_fields
347 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
350 call neko_log%message(
"Baseflow : user", lvl = neko_log_info)
356 amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, &
359 type(field_list_t),
intent(in),
target :: fields
360 type(coef_t),
intent(in),
target :: coef
361 real(kind=rp),
intent(in) :: start_time, end_time
362 real(kind=rp),
intent(in) :: amplitudes(:)
363 character(len=*),
intent(in) :: fringe_registry_name, dump_fname, &
365 logical,
intent(in) :: dump_fields
367 character(len=LOG_SIZE) :: log_buf
371 call neko_log%message(
"Initializing sponge", lvl = neko_log_debug)
374 call this%init_base(fields, coef, start_time, end_time)
376 this%amplitudes(1) = amplitudes(1)
377 this%amplitudes(2) = amplitudes(2)
378 this%amplitudes(3) = amplitudes(3)
380 write (log_buf,
'(A, 3(ES12.6, A))')
"Amplitudes : [", &
381 (amplitudes(i),
", ", i = 1, 2), amplitudes(3),
"]"
382 call neko_log%message(log_buf, lvl=neko_log_info)
384 this%fringe_registry_name = trim(fringe_registry_name)
385 this%bf_rgstry_pref = trim(bf_registry_pref)
386 this%dump_fields = dump_fields
387 this%dump_fname = trim(dump_fname)
389 call neko_log%message(
"Fringe name : " // trim(fringe_registry_name), &
391 call neko_log%message(
"Baseflow prefix: " // trim(bf_registry_pref), &
394 write (log_buf,
"(A,L1)")
"Dump fields: ", this%dump_fields
395 call neko_log%message(log_buf, lvl=neko_log_info)
397 this%u => neko_registry%get_field_by_name(
"u")
398 this%v => neko_registry%get_field_by_name(
"v")
399 this%w => neko_registry%get_field_by_name(
"w")
407 call this%free_base()
417 this%fringe_registry_name =
""
418 this%bf_rgstry_pref =
""
419 this%baseflow_set = .false.
437 type(time_state_t),
intent(in) :: time
439 integer :: i, nfields
440 type(field_t),
pointer :: fu, fv, fw
442 type(json_file) :: json_subdict
443 character(len=:),
allocatable :: string_val
445 character(len=1024) :: u_name, v_name, w_name
446 type(fld_file_output_t) :: fout
448 type(field_t),
pointer :: wk
455 u_name = trim(this%bf_rgstry_pref) //
"_u"
456 v_name = trim(this%bf_rgstry_pref) //
"_v"
457 w_name = trim(this%bf_rgstry_pref) //
"_w"
460 this%baseflow_set = neko_registry%field_exists(trim(u_name)) &
461 .and. neko_registry%field_exists(trim(v_name)) .and. &
462 neko_registry%field_exists(trim(w_name))
464 if (.not. this%baseflow_set)
then
465 call neko_error(
"SPONGE: No baseflow set (searching for " // &
466 trim(this%bf_rgstry_pref) //
"_u)")
470 if (.not. neko_registry%field_exists( &
471 trim(this%fringe_registry_name)))
then
472 call neko_error(
"SPONGE: No fringe field set (" // &
473 trim(this%fringe_registry_name) //
" not found)")
479 neko_registry%get_field(trim(this%fringe_registry_name))
483 this%u_bf => neko_registry%get_field(trim(u_name))
484 this%v_bf => neko_registry%get_field(trim(v_name))
485 this%w_bf => neko_registry%get_field(trim(w_name))
493 if (this%dump_fields)
then
494 call fout%init(sp, trim(this%dump_fname), 4)
495 call fout%fields%assign_to_ptr(1, this%fringe)
496 call fout%fields%assign_to_field(2, this%u_bf)
497 call fout%fields%assign_to_field(3, this%v_bf)
498 call fout%fields%assign_to_field(4, this%w_bf)
499 call fout%sample(time%t)
509 fu => this%fields%get(1)
510 fv => this%fields%get(2)
511 fw => this%fields%get(3)
513 call neko_scratch_registry%request_field(wk, tmp_index, .false.)
515 if (neko_bcknd_device .eq. 1)
then
517 call device_sub3(wk%x_d, this%u_bf%x_d, this%u%x_d, this%u%size())
519 call device_col2(wk%x_d, this%fringe%x_d, this%fringe%size())
521 call device_add2s2(fu%x_d, wk%x_d, this%amplitudes(1), &
524 call device_sub3(wk%x_d, this%v_bf%x_d, this%v%x_d, this%v%size())
525 call device_col2(wk%x_d, this%fringe%x_d, this%fringe%size())
526 call device_add2s2(fv%x_d, wk%x_d, this%amplitudes(2), &
529 call device_sub3(wk%x_d, this%w_bf%x_d, this%w%x_d, this%w%size())
530 call device_col2(wk%x_d, this%fringe%x_d, this%fringe%size())
531 call device_add2s2(fw%x_d, wk%x_d, this%amplitudes(3), &
534 call sub3(wk%x, this%u_bf%x, this%u%x, this%u%size())
535 call col2(wk%x, this%fringe%x, this%fringe%size())
536 call add2s2(fu%x, wk%x, this%amplitudes(1), fu%dof%size())
538 call sub3(wk%x, this%v_bf%x, this%v%x, this%v%size())
539 call col2(wk%x, this%fringe%x, this%fringe%size())
540 call add2s2(fv%x, wk%x, this%amplitudes(2), fv%dof%size())
542 call sub3(wk%x, this%w_bf%x, this%w%x, this%w%size())
543 call col2(wk%x, this%fringe%x, this%fringe%size())
544 call add2s2(fw%x, wk%x, this%amplitudes(3), fw%dof%size())
547 call neko_scratch_registry%relinquish_field(tmp_index)
Copy data between host and device (or device and device)
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.
Defines a simulation case.
integer, public pe_rank
MPI rank.
subroutine, public device_sub3(a_d, b_d, c_d, n, strm)
Vector subtraction .
subroutine, public device_add2s2(a_d, b_d, c1, n, strm)
Vector addition with scalar multiplication (multiplication on first argument)
subroutine, public device_col2(a_d, b_d, n, strm)
Vector multiplication .
Device abstraction, common interface for various accelerators.
integer, parameter, public host_to_device
Module for file I/O operations.
Implements fld_file_output_t.
Importation of fields from fld files.
Utilities for retrieving parameters from the case files.
subroutine, public json_get_subdict_or_empty(json, key, output)
Extract a sub-object from a json object and returns an empty object if the key is missing.
integer, parameter, public neko_log_debug
Debug.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
integer, parameter, public neko_log_info
Default.
subroutine, public sub3(a, b, c, n)
Vector subtraction .
subroutine, public col2(a, b, n)
Vector multiplication .
subroutine, public add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
integer, parameter neko_bcknd_device
integer, parameter, public dp
integer, parameter, public sp
integer, parameter, public rp
Global precision used in computations.
Defines a registry for storing solution fields.
type(registry_t), target, public neko_registry
Global field registry.
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.
Contains the simcomp_executor_t type.
type(simcomp_executor_t), target, public neko_simcomps
Global variable for the simulation component driver.
Implements the source_term_t type and a wrapper source_term_wrapper_t.
Implements the sponge_t type.
subroutine sponge_init_from_json(this, json, fields, coef, variable_name)
Constructor from json.
subroutine sponge_init_user(this, fields, coef, start_time, end_time, amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, dump_fname)
Initialize a sponge with a baseflow set by the user.
subroutine sponge_free(this)
Destructor.
subroutine sponge_compute(this, time)
Compute the sponge field. The sponge is applied according to the following definition: f_x = amp_x * ...
subroutine sponge_init_constant(this, fields, coef, start_time, end_time, amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, dump_fname, constant_values)
Initialize a sponge with a constant baseflow.
subroutine sponge_init_field(this, fields, coef, start_time, end_time, amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, dump_fname, file_name, interpolate, mesh_file_name, interp_subdict)
Initialize a sponge with a baseflow imported from a field file.
subroutine sponge_init_common(this, fields, coef, start_time, end_time, amplitudes, fringe_registry_name, bf_registry_pref, dump_fields, dump_fname)
Common constructor.
Module with things related to the simulation time.
integer, parameter, public neko_fname_len
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
field_list_t, To be able to group fields together
A wrapper around a polymorphic generic_file_t that handles its init. This is essentially a factory fo...
A simple output saving a list of fields to a .fld file.
Base abstract type for source terms.
A struct that contains all info about the time, expand as needed.