57 use json_module,
only : json_file
62 use mpi_f08,
only : mpi_allreduce, mpi_integer, mpi_sum
63 use,
intrinsic :: iso_c_binding, only : c_ptr
75 character(len=:),
allocatable :: field_name
83 type(
vector_t) :: x_interface_dof, y_interface_dof, z_interface_dof
87 integer :: iextm_order = 1
88 integer :: last_tstep = -1
92 integer :: n_int_tot = 0
93 logical :: find_interface = .false.
94 logical :: setup = .false.
95 logical :: log = .false.
100 morph_interface => null()
106 procedure, pass(this) :: init_from_components => &
117 procedure, pass(this) :: apply_vector_dev => &
120 procedure, pass(this) :: apply_scalar_dev => &
154 interface_mask, time, bc_name, &
159 type(
mask_t),
intent(in) :: interface_mask
161 character(len=*),
intent(in) :: bc_name
162 logical,
intent(inout) :: find_interface
175 type(
coef_t),
target,
intent(in) :: coef
176 type(json_file),
intent(inout) :: json
177 character(len=:),
allocatable :: field_name
178 real(kind=
rp) :: tol, pad
181 call json_get(json,
"field_name", field_name)
185 if (this%iextm_order .lt. 1 .or. this%iextm_order .gt. 3)
then
186 call neko_error(
"The order of the IEXTm time scheme must be 1 to 3.")
190 call this%init_from_components(coef, field_name, tol, pad, log)
191 if (
allocated(field_name))
deallocate(field_name)
200 type(
coef_t),
intent(in) :: coef
201 character(len=*),
intent(in) :: field_name
202 real(kind=
rp),
intent(in),
optional :: tol, pad
203 logical,
intent(in),
optional :: log
204 character(len=256) :: log_buf
206 call this%init_base(coef)
209 if (
present(tol))
then
210 if (tol .gt. 0.0_rp)
then
211 this%interpolation_settings%tolerance = tol
215 if (
present(pad))
then
216 if (pad .gt. 0.0_rp)
then
217 this%interpolation_settings%padding = pad
221 if (
present(log))
then
225 this%field_name = field_name
226 write (log_buf,
'(A,A)')
"Coupling overset interface for: ", &
227 trim(this%field_name)
230 call this%bc_s%init_from_components(coef, this%field_name)
231 call this%field_list%init(1)
232 call this%field_list%assign_to_field(1, this%bc_s%field_bc)
234 call this%x_dof%init(this%dof%size(),
'x')
235 call this%y_dof%init(this%dof%size(),
'y')
236 call this%z_dof%init(this%dof%size(),
'z')
239 call device_copy(this%x_dof%x_d, this%dof%x_d, this%dof%size())
240 call device_copy(this%y_dof%x_d, this%dof%y_d, this%dof%size())
241 call device_copy(this%z_dof%x_d, this%dof%z_d, this%dof%size())
247 call copy(this%x_dof%x, this%dof%x, this%dof%size())
248 call copy(this%y_dof%x, this%dof%y, this%dof%size())
249 call copy(this%z_dof%x, this%dof%z, this%dof%size())
258 call this%bc_s%free()
259 call this%field_list%free()
260 call this%interface_dof%free()
261 call this%interface_field%free()
263 call this%x_dof%free()
264 call this%y_dof%free()
265 call this%z_dof%free()
267 call this%x_interface_dof%free()
268 call this%y_interface_dof%free()
269 call this%z_interface_dof%free()
270 call this%s_interface%free()
271 call this%s_interface_lag%free()
273 if (
allocated(this%field_name))
then
274 deallocate(this%field_name)
277 call this%interface_interpolator%free()
279 call this%interface_dof_mask%free()
280 call this%domain_element_mask%free()
282 call this%free_base()
291 integer,
intent(in) :: n
292 real(kind=
rp),
intent(inout),
dimension(n) :: x
294 logical,
intent(in),
optional :: strong
297 if (
present(strong))
then
304 if (.not. this%updated)
then
305 call this%update(time)
306 this%updated = .true.
309 call masked_copy_0(x, this%bc_s%field_bc%x, this%msk, n, this%msk(0))
320 type(c_ptr),
intent(inout) :: x_d
322 logical,
intent(in),
optional :: strong
323 type(c_ptr),
intent(inout) :: strm
326 if (
present(strong))
then
333 if (.not. this%updated)
then
334 call this%update(time)
335 this%updated = .true.
338 if (this%msk(0) .gt. 0)
then
340 this%bc_s%msk_d, this%bc_s%dof%size(), this%msk(0), strm)
349 integer,
intent(in) :: n
350 real(kind=
rp),
intent(inout),
dimension(n) :: x
351 real(kind=
rp),
intent(inout),
dimension(n) :: y
352 real(kind=
rp),
intent(inout),
dimension(n) :: z
354 logical,
intent(in),
optional :: strong
356 call neko_error(
"overset_interface cannot apply vector BCs.&
357 & Use overset_interface_vector instead!")
365 type(c_ptr),
intent(inout) :: x_d
366 type(c_ptr),
intent(inout) :: y_d
367 type(c_ptr),
intent(inout) :: z_d
369 logical,
intent(in),
optional :: strong
370 type(c_ptr),
intent(inout) :: strm
372 call neko_error(
"overset_interface cannot apply vector BCs.&
373 & Use overset_interface_vector instead!")
381 call this%finalize_base()
383 call this%bc_s%mark_facets(this%marked_facet)
384 call this%bc_s%finalize()
386 call this%build_masks_()
388 call this%x_interface_dof%init(this%interface_dof_mask%size(), &
390 call this%y_interface_dof%init(this%interface_dof_mask%size(), &
392 call this%z_interface_dof%init(this%interface_dof_mask%size(), &
394 call this%gather_interface_dofs_()
396 call this%setup_interpolator_()
398 call this%s_interface%init(this%interface_dof_mask%size(),
's_interface')
400 call this%interface_dof%init(3)
401 call this%interface_dof%assign_to_vector(1, this%x_interface_dof)
402 call this%interface_dof%assign_to_vector(2, this%y_interface_dof)
403 call this%interface_dof%assign_to_vector(3, this%z_interface_dof)
405 call this%interface_field%init(1)
406 call this%interface_field%assign_to_vector(1, this%s_interface)
408 call this%s_interface_lag%init(this%s_interface, this%iextm_order)
410 call mpi_allreduce(this%s_interface%size(), this%n_int_tot, 1, mpi_integer, &
421 integer :: nhist, ihist
422 real(kind=
rp) :: iextm_coeffs(4)
425 call this%morph_interface(this%interface_dof, this%interface_field, &
426 this%interface_dof_mask, time, this%name, &
430 if (this%find_interface)
then
433 call this%x_interface_dof%copy_from(
device_to_host, sync = .false.)
434 call this%y_interface_dof%copy_from(
device_to_host, sync = .false.)
435 call this%z_interface_dof%copy_from(
device_to_host, sync = .true.)
437 call this%interface_interpolator%find_points(this%x_interface_dof%x, &
438 this%y_interface_dof%x, this%z_interface_dof%x, &
439 this%x_interface_dof%size())
440 this%find_interface = .false.
446 call this%interface_interpolator%evaluate_masked(this%s_interface%x, s%x, &
447 this%domain_element_mask, .false.)
450 call this%log_interface_error_(s)
453 if (time%tstep .ne. this%last_tstep)
then
454 this%last_tstep = time%tstep
456 call this%s_interface_lag%update()
458 nhist = min(time%tstep, this%iextm_order)
460 real(time%dtlag, kind=
rp), nhist)
462 call vector_cmult2(this%s_interface, this%s_interface_lag%lv(1), &
465 call vector_add2s2(this%s_interface, this%s_interface_lag%lv(ihist), &
471 this%s_interface, this%interface_dof_mask, this%bc_s%dof%size())
480 type(
field_t),
pointer,
intent(in) :: s
481 real(kind=
rp) :: s_int_norm
484 logical :: clear_scratch = .false.
485 character(len=256) :: log_buf
495 write(log_buf,
'(A12,A3,A10,1x,E15.7)')
'Interface BC',
' | ', &
496 'L2 Error: ', s_int_norm
509 logical,
allocatable :: found(:)
510 integer :: i, j, k, e, nelems
511 integer :: lx, ly, lz
512 integer :: nonlinear_idx(4), linear_idx
515 call this%interface_dof_mask%init(this%msk(1:this%msk(0)), this%msk(0))
521 allocate(found(this%msh%nelv))
524 do i = 1, this%msk(0)
525 linear_idx = this%msk(i)
527 found(nonlinear_idx(4)) = .true.
531 call idx_stack%init()
532 do e = 1, this%msh%nelv
539 call idx_stack%push(linear_idx)
548 call temp_mask%init(idx_stack%array(), idx_stack%size())
549 call idx_stack%free()
551 call this%domain_element_mask%invert_mask(temp_mask, this%dof%size())
552 call temp_mask%free()
561 this%interface_dof_mask, this%dof%size())
563 this%interface_dof_mask, this%dof%size())
565 this%interface_dof_mask, this%dof%size())
567 call this%x_interface_dof%copy_from(
device_to_host, sync = .false.)
568 call this%y_interface_dof%copy_from(
device_to_host, sync = .false.)
569 call this%z_interface_dof%copy_from(
device_to_host, sync = .true.)
577 call this%interface_interpolator%init(this%dof, &
579 tol = this%interpolation_settings%tolerance, &
580 pad = this%interpolation_settings%padding, &
581 mask = this%domain_element_mask)
583 call this%interface_interpolator%find_points(this%x_interface_dof%x, &
584 this%y_interface_dof%x, this%z_interface_dof%x, &
585 this%x_interface_dof%size())
__inline__ __device__ void nonlinear_index(const int idx, const int lx, int *index)
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.
User callback for overset-interface morphing and boundary-value updates.
Defines a boundary condition.
integer, parameter, public bc_dirichlet
Supported boundary condition types. The values are set in order of precedence for global resolution....
type(mpi_comm), public neko_global_comm
subroutine, public device_copy(a_d, b_d, n, strm)
Copy a vector .
subroutine, public device_masked_copy_0(a_d, b_d, mask_d, n, n_mask, strm)
Copy a masked vector .
Device abstraction, common interface for various accelerators.
integer, parameter, public device_to_host
Defines user dirichlet condition for a scalar field.
Implements global_interpolation given a dofmap.
Utilities for retrieving parameters from the case files.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
Object for handling masks in Neko.
subroutine, public copy(a, b, n)
Copy a vector .
subroutine, public masked_copy_0(a, b, mask, n, n_mask)
Copy a masked vector .
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Defines overset interface scalar boundary conditions.
subroutine overset_interface_finalize(this)
Finalize by building the mask arrays and preparing interpolation data.
subroutine overset_interface_update(this, time)
Update values at the overset interface.
subroutine overset_interface_apply_scalar(this, x, n, time, strong)
Apply scalar.
subroutine gather_interface_dofs_(this)
Gather interface dofs.
subroutine overset_interface_apply_vector(this, x, y, z, n, time, strong)
(No-op) Apply vector.
subroutine overset_interface_free(this)
Destructor.
subroutine overset_interface_apply_scalar_dev(this, x_d, time, strong, strm)
Apply scalar (device).
subroutine log_interface_error_(this, s)
Log interface RMSE for the scalar field.
subroutine overset_interface_init(this, coef, json)
Constructor.
subroutine setup_interpolator_(this)
Set up the global interpolator.
subroutine build_masks_(this)
Build masks.
subroutine overset_interface_apply_vector_dev(this, x_d, y_d, z_d, time, strong, strm)
(No-op) Apply vector (device).
subroutine overset_interface_init_from_components(this, coef, field_name, tol, pad, log)
Constructor from components.
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.
Implements a dynamic stack ADT.
Base class for time integration schemes.
Module with things related to the simulation time.
pure integer function, public linear_index(i, j, k, l, lx, ly, lz)
Compute the address of a (i,j,k,l) array with sizes (1:lx, 1:ly, 1:lz, :)
subroutine, public vector_masked_gather_copy(a, b, mask, n)
Gather a vector to reduced contigous array .
real(kind=rp) function, public vector_glsc2(a, b, n)
subroutine, public vector_add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
subroutine, public vector_masked_scatter_copy(a, b, mask, n)
Scatter a contiguous vector into an array .
subroutine, public vector_cmult2(a, b, c, n)
Multiplication by constant c .
Contains the vector_series_t type.
Base type for a boundary condition.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
User defined dirichlet condition, for which the user can work with an entire field....
field_list_t, To be able to group fields together
Implements the settings helper data container for global interpolation.
Implements global interpolation for arbitrary points in the domain.
Explicit interface extrapolation scheme for overset grids.
Type for consistently handling masks in Neko. This type encapsulates the mask array and its associate...
Overset interface BC for a scalar field.
A struct that contains all info about the time, expand as needed.
vector_list_t, To be able to group vectors together
Stores a series (sequence) of vectors, logically connected to a base vector, and arranged according t...