Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
overset_interface_vector.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 comm, only : neko_global_comm
37 use registry, only : neko_registry
38 use num_types, only : rp
39 use coefs, only : coef_t
40 use dirichlet, only : dirichlet_t
43 use mask, only : mask_t
44 use dofmap, only : dofmap_t
45 use bc, only : bc_t, bc_dirichlet
46 use bc_list, only : bc_list_t
47 use utils, only : split_string
48 use field, only : field_t
49 use field_list, only : field_list_t
50 use math, only : masked_copy_0
52 use dofmap, only : dofmap_t
53 use vector, only : vector_t
54 use vector_list, only : vector_list_t
59 use math, only : copy
61 use vector_math, only : vector_copy
65 use stack, only : stack_i4_t
66 use json_module, only : json_file
68 use field_list, only : field_list_t
70 use, intrinsic :: iso_c_binding, only : c_ptr, c_size_t
71 use time_state, only : time_state_t
72 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_sum
74 use logger, only : neko_log, log_size
75
76
77 implicit none
78 private
79
81 ! for the application on a vector field.
82 type, public, extends(bc_t) :: overset_interface_vector_t
83 ! The bc for the first compoent.
84 type(field_dirichlet_t) :: bc_u
85 ! The bc for the second compoent.
86 type(field_dirichlet_t) :: bc_v
87 ! The bc for the third compoent.
88 type(field_dirichlet_t) :: bc_w
92 type(global_interpolation_t) :: interface_interpolator
94 type(mask_t) :: interface_dof_mask
95 type(mask_t) :: domain_element_mask
97 type(vector_t) :: x_dof, y_dof, z_dof
98 type(vector_t) :: x_interface_dof, y_interface_dof, z_interface_dof
99 type(vector_t) :: u_interface, v_interface, w_interface
100 type(vector_series_t) :: u_interface_lag, v_interface_lag, w_interface_lag
101 integer :: iextm_order = 1
102 integer :: last_tstep = -1
103 type(vector_list_t) :: interface_dof, interface_field
105 type(global_interpolation_settings_t) :: interpolation_settings
106 integer :: n_int_tot = 0
107 logical :: find_interface = .false.
108 logical :: setup = .false.
109 logical :: log = .false.
110
113 procedure(morph_overset_interface), nopass, pointer :: &
114 morph_interface => null()
115
116 contains
118 procedure, pass(this) :: init => overset_interface_vector_init
120 procedure, pass(this) :: init_from_components => &
123 procedure, pass(this) :: free => overset_interface_vector_free
125 procedure, pass(this) :: finalize => overset_interface_vector_finalize
127 procedure, pass(this) :: apply_scalar => &
130 procedure, pass(this) :: apply_vector => &
133 procedure, pass(this) :: apply_vector_dev => &
136 procedure, pass(this) :: apply_scalar_dev => &
138 procedure, pass(this) :: update => overset_interface_update
139
141 procedure, pass(this), private :: build_masks_ => build_masks_
143 procedure, pass(this), private :: gather_interface_dofs_ => &
146 procedure, pass(this), private :: setup_interpolator_ => &
149 procedure, pass(this), private :: log_interface_error_ => &
152
153contains
154
158 subroutine overset_interface_vector_init(this, coef, json)
159 class(overset_interface_vector_t), intent(inout), target :: this
160 type(coef_t), target, intent(in) :: coef
161 type(json_file), intent(inout) ::json
162 real(kind=rp) :: tol, pad
163 logical :: log
164
166 call json_get_or_default(json, "interpolation.tolerance", &
167 tol, -1.0_rp)
168 call json_get_or_default(json, "interpolation.padding", &
169 pad, -1.0_rp)
170 call json_get_or_default(json, "order", this%iextm_order, 1)
171 if (this%iextm_order .lt. 1 .or. this%iextm_order .gt. 3) then
172 call neko_error("The order of the IEXTm time scheme must be 1 to 3.")
173 end if
174 call json_get_or_default(json, "log", log, .false.)
175
176 call this%init_from_components(coef, tol, pad, log)
177
178 end subroutine overset_interface_vector_init
179
185 subroutine overset_interface_vector_init_from_components(this, coef, tol, pad, log)
186 class(overset_interface_vector_t), intent(inout), target :: this
187 type(coef_t), intent(in) :: coef
188 real(kind=rp), intent(in), optional :: tol, pad
189 logical, intent(in), optional :: log
190
192 call this%init_base(coef)
193
194 this%bc_type = bc_dirichlet
195
197 if (present(tol)) then
198 if (tol .gt. 0.0_rp) this%interpolation_settings%tolerance = tol
199 end if
200 if (present(pad)) then
201 if (pad .gt. 0.0_rp) this%interpolation_settings%padding = pad
202 end if
203 if (present(log)) then
204 this%log = log
205 end if
206
207 call this%bc_u%init_from_components(coef, "u")
208 call this%bc_v%init_from_components(coef, "v")
209 call this%bc_w%init_from_components(coef, "w")
210
211 call this%field_list%init(3)
212 call this%field_list%assign_to_field(1, this%bc_u%field_bc)
213 call this%field_list%assign_to_field(2, this%bc_v%field_bc)
214 call this%field_list%assign_to_field(3, this%bc_w%field_bc)
215
217 call this%x_dof%init(this%dof%size(), 'x')
218 call this%y_dof%init(this%dof%size(), 'y')
219 call this%z_dof%init(this%dof%size(), 'z')
220
223 if (neko_bcknd_device .eq. 1) then
224 ! copy
225 call device_copy(this%x_dof%x_d, this%dof%x_d, this%dof%size())
226 call device_copy(this%y_dof%x_d, this%dof%y_d, this%dof%size())
227 call device_copy(this%z_dof%x_d, this%dof%z_d, this%dof%size())
228 ! synchronize
229 call this%x_dof%copy_from(device_to_host, sync = .false.)
230 call this%y_dof%copy_from(device_to_host, sync = .false.)
231 call this%z_dof%copy_from(device_to_host, sync = .true.)
232 else
233 call copy(this%x_dof%x, this%dof%x, this%dof%size())
234 call copy(this%y_dof%x, this%dof%y, this%dof%size())
235 call copy(this%z_dof%x, this%dof%z, this%dof%size())
236 end if
237
239
243 class(overset_interface_vector_t), target, intent(inout) :: this
244
245 call this%bc_u%free()
246 call this%bc_v%free()
247 call this%bc_w%free()
248
249 call this%field_list%free()
250 call this%interface_dof%free()
251 call this%interface_field%free()
252
253 call this%x_dof%free()
254 call this%y_dof%free()
255 call this%z_dof%free()
256
257 call this%x_interface_dof%free()
258 call this%y_interface_dof%free()
259 call this%z_interface_dof%free()
260 call this%u_interface%free()
261 call this%v_interface%free()
262 call this%w_interface%free()
263 call this%u_interface_lag%free()
264 call this%v_interface_lag%free()
265 call this%w_interface_lag%free()
266 call this%interface_interpolator%free()
267 call this%interface_dof_mask%free()
268 call this%domain_element_mask%free()
269 call this%free_base()
270
271 !if (associated(this%update_)) then
272 ! nullify(this%update_)
273 !end if
274 end subroutine overset_interface_vector_free
275
280 subroutine overset_interface_vector_apply_scalar(this, x, n, time, strong)
281 class(overset_interface_vector_t), intent(inout) :: this
282 integer, intent(in) :: n
283 real(kind=rp), intent(inout), dimension(n) :: x
284 type(time_state_t), intent(in), optional :: time
285 logical, intent(in), optional :: strong
286
287 call neko_error("overset_interface_vector cannot apply scalar BCs.&
288 & Use overset_interface_vector::apply_vector instead!")
289
291
295 subroutine overset_interface_vector_apply_scalar_dev(this, x_d, time, &
296 strong, strm)
297 class(overset_interface_vector_t), intent(inout), target :: this
298 type(c_ptr), intent(inout) :: x_d
299 type(time_state_t), intent(in), optional :: time
300 logical, intent(in), optional :: strong
301 type(c_ptr), intent(inout) :: strm
302
303 call neko_error("overset_interface_vector cannot apply scalar BCs.&
304 & Use overset_interface_vector::apply_vector instead!")
305
307
314 subroutine overset_interface_vector_apply_vector(this, x, y, z, n, time, &
315 strong)
316 class(overset_interface_vector_t), intent(inout) :: this
317 integer, intent(in) :: n
318 real(kind=rp), intent(inout), dimension(n) :: x
319 real(kind=rp), intent(inout), dimension(n) :: y
320 real(kind=rp), intent(inout), dimension(n) :: z
321 type(time_state_t), intent(in), optional :: time
322 logical, intent(in), optional :: strong
323 logical :: strong_
324
325 if (present(strong)) then
326 strong_ = strong
327 else
328 strong_ = .true.
329 end if
330
331 if (strong_) then
332
333 ! We can send any of the 3 bcs we have as argument, since they are all
334 ! the same boundary.
335 if (.not. this%updated) then
336 call this%update(time)
337 this%updated = .true.
338 end if
339
341 call masked_copy_0(x, this%bc_u%field_bc%x, this%msk, n, this%msk(0))
342 call masked_copy_0(y, this%bc_v%field_bc%x, this%msk, n, this%msk(0))
343 call masked_copy_0(z, this%bc_w%field_bc%x, this%msk, n, this%msk(0))
344 end if
345
347
354 subroutine overset_interface_vector_apply_vector_dev(this, x_d, y_d, z_d, &
355 time, strong, strm)
356 class(overset_interface_vector_t), intent(inout), target :: this
357 type(c_ptr), intent(inout) :: x_d
358 type(c_ptr), intent(inout) :: y_d
359 type(c_ptr), intent(inout) :: z_d
360 type(time_state_t), intent(in), optional :: time
361 logical, intent(in), optional :: strong
362 type(c_ptr), intent(inout) :: strm
363 logical :: strong_
364
365 if (present(strong)) then
366 strong_ = strong
367 else
368 strong_ = .true.
369 end if
370
371 if (strong_) then
372 if (.not. this%updated) then
373 call this%update(time)
374 this%updated = .true.
375 end if
376
377 if (this%msk(0) .gt. 0) then
378 call device_masked_copy_0(x_d, this%bc_u%field_bc%x_d, &
379 this%bc_u%msk_d, this%bc_u%dof%size(), this%msk(0), &
380 strm) ! adperez: change the masks used here
381 call device_masked_copy_0(y_d, this%bc_v%field_bc%x_d, &
382 this%bc_v%msk_d, this%bc_v%dof%size(), this%msk(0), strm)
383 call device_masked_copy_0(z_d, this%bc_w%field_bc%x_d, &
384 this%bc_w%msk_d, this%bc_w%dof%size(), this%msk(0), strm)
385 end if
386 end if
387
389
392 class(overset_interface_vector_t), target, intent(inout) :: this
393
395 call this%finalize_base()
396
397 call this%bc_u%mark_facets(this%marked_facet)
398 call this%bc_v%mark_facets(this%marked_facet)
399 call this%bc_w%mark_facets(this%marked_facet)
400
401 call this%bc_u%finalize()
402 call this%bc_v%finalize()
403 call this%bc_w%finalize()
404
406 call this%build_masks_()
407
409 call this%x_interface_dof%init(this%interface_dof_mask%size(), &
410 'x_interface')
411 call this%y_interface_dof%init(this%interface_dof_mask%size(), &
412 'y_interface')
413 call this%z_interface_dof%init(this%interface_dof_mask%size(), &
414 'z_interface')
415 call this%gather_interface_dofs_()
416
418 call this%setup_interpolator_()
419
421 call this%u_interface%init(this%interface_dof_mask%size(), 'u_interface')
422 call this%v_interface%init(this%interface_dof_mask%size(), 'v_interface')
423 call this%w_interface%init(this%interface_dof_mask%size(), 'w_interface')
424
426 call this%interface_dof%init(3)
427 call this%interface_dof%assign_to_vector(1, this%x_interface_dof)
428 call this%interface_dof%assign_to_vector(2, this%y_interface_dof)
429 call this%interface_dof%assign_to_vector(3, this%z_interface_dof)
430
431 call this%interface_field%init(3)
432 call this%interface_field%assign_to_vector(1, this%u_interface)
433 call this%interface_field%assign_to_vector(2, this%v_interface)
434 call this%interface_field%assign_to_vector(3, this%w_interface)
435
437 call this%u_interface_lag%init(this%u_interface, this%iextm_order)
438 call this%v_interface_lag%init(this%v_interface, this%iextm_order)
439 call this%w_interface_lag%init(this%w_interface, this%iextm_order)
440
441 call mpi_allreduce(this%u_interface%size(), this%n_int_tot, 1, mpi_integer, &
442 mpi_sum, neko_global_comm)
443
444
446
448 subroutine overset_interface_update(this, time)
449 class(overset_interface_vector_t), intent(inout) :: this
450 type(time_state_t), intent(in) :: time
451 type(field_t), pointer :: u, v, w
452 type(iextm_time_scheme_t) :: time_scheme
453 integer :: nhist, ihist
454 real(kind=rp) :: iextm_coeffs(4)
455
456
458 call this%morph_interface(this%interface_dof, this%interface_field, &
459 this%interface_dof_mask, time, this%name, &
460 this%find_interface)
461
463 ! not implemented for now
464 ! if (substep .eq. 1) then
465 ! call this%extrapolate()
466 ! end if
467
469 if (this%find_interface) then
470
471 ! sync
472 call this%x_interface_dof%copy_from(device_to_host, sync = .false.)
473 call this%y_interface_dof%copy_from(device_to_host, sync = .false.)
474 call this%z_interface_dof%copy_from(device_to_host, sync = .true.)
475
476 call this%interface_interpolator%find_points(this%x_interface_dof%x, &
477 this%y_interface_dof%x, this%z_interface_dof%x, &
478 this%x_interface_dof%size())
479 this%find_interface = .false.
480
481 end if
482
484 u => neko_registry%get_field("u")
485 v => neko_registry%get_field("v")
486 w => neko_registry%get_field("w")
487
489 call this%interface_interpolator%evaluate_masked(this%u_interface%x, &
490 u%x, this%domain_element_mask, .false.)
491 call this%interface_interpolator%evaluate_masked(this%v_interface%x, &
492 v%x, this%domain_element_mask, .false.)
493 call this%interface_interpolator%evaluate_masked(this%w_interface%x, &
494 w%x, this%domain_element_mask, .false.)
495
496 if (this%log) then
497 call this%log_interface_error_(u, v, w)
498 end if
499
500
502 if (time%tstep .ne. this%last_tstep) then
503 ! Update the last steps
504 this%last_tstep = time%tstep
505
506 ! Update the lag arrays with the value just got from the last step
507 call this%u_interface_lag%update()
508 call this%v_interface_lag%update()
509 call this%w_interface_lag%update()
510
511 ! Get the coefficients for the extrapolation
512 nhist = min(time%tstep, this%iextm_order)
513 call time_scheme%compute_coeffs(iextm_coeffs, &
514 real(time%dtlag, kind=rp), nhist)
515
516 ! Perform the extrapolation using the lag arrays
517 call vector_cmult2(this%u_interface, this%u_interface_lag%lv(1), &
518 iextm_coeffs(1))
519 call vector_cmult2(this%v_interface, this%v_interface_lag%lv(1), &
520 iextm_coeffs(1))
521 call vector_cmult2(this%w_interface, this%w_interface_lag%lv(1), &
522 iextm_coeffs(1))
523 do ihist = 2, nhist
524 call vector_add2s2(this%u_interface, &
525 this%u_interface_lag%lv(ihist), iextm_coeffs(ihist))
526 call vector_add2s2(this%v_interface, &
527 this%v_interface_lag%lv(ihist), iextm_coeffs(ihist))
528 call vector_add2s2(this%w_interface, &
529 this%w_interface_lag%lv(ihist), iextm_coeffs(ihist))
530 end do
531
532 end if
533
534
536 call vector_masked_scatter_copy(this%bc_u%field_bc%x(:,1,1,1), &
537 this%u_interface, &
538 this%interface_dof_mask, this%bc_u%dof%size())
539 call vector_masked_scatter_copy(this%bc_v%field_bc%x(:,1,1,1), &
540 this%v_interface, &
541 this%interface_dof_mask, this%bc_v%dof%size())
542 call vector_masked_scatter_copy(this%bc_w%field_bc%x(:,1,1,1), &
543 this%w_interface, &
544 this%interface_dof_mask, this%bc_w%dof%size())
545
546
547 end subroutine overset_interface_update
548
550 subroutine log_interface_error_(this, u, v, w)
551 class(overset_interface_vector_t), intent(inout) :: this
552 type(field_t), pointer, intent(in) :: u, v, w
553 real(kind=rp) :: u_int_norm, v_int_norm, w_int_norm
554 type(vector_t), pointer :: error
555 integer :: ind(1)
556 logical :: clear_scratch = .false.
557 character(len=256) :: log_buf
558
559 call neko_scratch_registry%request_vector(error, ind(1), this%u_interface%size(), &
560 clear_scratch)
561
563 call vector_masked_gather_copy(error, u%x(:,1,1,1), this%interface_dof_mask, &
564 this%dof%size())
565 call vector_add2s2(error, this%u_interface, -1.0_rp)
566 u_int_norm = sqrt(vector_glsc2(error, error)) / sqrt(real(this%n_int_tot, kind=rp))
567
568 call vector_masked_gather_copy(error, v%x(:,1,1,1), this%interface_dof_mask, &
569 this%dof%size())
570 call vector_add2s2(error, this%v_interface, -1.0_rp)
571 v_int_norm = sqrt(vector_glsc2(error, error)) / sqrt(real(this%n_int_tot, kind=rp))
572
573 call vector_masked_gather_copy(error, w%x(:,1,1,1), this%interface_dof_mask, &
574 this%dof%size())
575 call vector_add2s2(error, this%w_interface, -1.0_rp)
576 w_int_norm = sqrt(vector_glsc2(error, error)) / sqrt(real(this%n_int_tot, kind=rp))
577
578 call neko_scratch_registry%relinquish(ind)
579
581 write(log_buf, '(A12,A3,A10,1x,A1,E15.7,A1,E15.7,A1,E15.7,A1)') &
582 'Interface BC', ' | ', 'L2 Error: ', '(', &
583 u_int_norm, ',', v_int_norm, ',', w_int_norm, ')'
584 call neko_log%message(log_buf)
585
586 end subroutine log_interface_error_
587
588 !===================
589 ! Helper subroutines
590 !===================
591
593 subroutine build_masks_(this)
594 class(overset_interface_vector_t), intent(inout) :: this
595 type(mask_t) :: temp_mask
596 logical, allocatable :: found(:)
597 integer :: i, j, k, e, new_size, nelems
598 integer :: lx, ly, lz
599 integer :: nonlinear_idx(4), linear_idx
600 type(stack_i4_t) :: stack
601
603 call this%interface_dof_mask%init(this%msk(1:this%msk(0)), this%msk(0))
604
607 lx = this%Xh%lx
608 ly = this%Xh%ly
609 lz = this%Xh%lz
610 allocate(found(this%msh%nelv))
611 found = .false.
612 !! Find sem elements that contain the boundary points
613 do i = 1, this%msk(0)
614 linear_idx = this%msk(i)
615 nonlinear_idx = nonlinear_index(linear_idx, lx, ly, lz)
616 found(nonlinear_idx(4)) = .true.
617 end do
618 !! fill the stack containing the gll indices
619 nelems = 0
620 call stack%init()
621 do e = 1, this%msh%nelv
622 if (found(e)) then
623 nelems = nelems + 1
624 do k = 1, this%Xh%lz
625 do j = 1, this%Xh%ly
626 do i = 1, this%Xh%lx
627 linear_idx = linear_index(i, j, k, e, lx, ly, lz)
628 call stack%push(linear_idx)
629 end do
630 end do
631 end do
632 end if
633 end do
634 deallocate(found)
635 call temp_mask%init(stack%array(), stack%size())
636 call stack%free()
637
639 call this%domain_element_mask%invert_mask(temp_mask, this%dof%size())
640
641 call temp_mask%free()
642
643 end subroutine build_masks_
644
646 subroutine gather_interface_dofs_(this)
647 class(overset_interface_vector_t), intent(inout) :: this
648
650 call vector_masked_gather_copy(this%x_interface_dof, &
651 this%dof%x(:,1,1,1), &
652 this%interface_dof_mask, &
653 this%dof%size())
654 call vector_masked_gather_copy(this%y_interface_dof, &
655 this%dof%y(:,1,1,1), &
656 this%interface_dof_mask, &
657 this%dof%size())
658 call vector_masked_gather_copy(this%z_interface_dof, &
659 this%dof%z(:,1,1,1), &
660 this%interface_dof_mask, &
661 this%dof%size())
663 call this%x_interface_dof%copy_from(device_to_host, sync = .false.)
664 call this%y_interface_dof%copy_from(device_to_host, sync = .false.)
665 call this%z_interface_dof%copy_from(device_to_host, sync = .true.)
666
667 end subroutine gather_interface_dofs_
668
669
671 subroutine setup_interpolator_(this)
672 class(overset_interface_vector_t), intent(inout) :: this
673
675 call this%interface_interpolator%init(this%dof, &
677 tol=this%interpolation_settings%tolerance, &
678 pad=this%interpolation_settings%padding, &
679 mask=this%domain_element_mask)
680
682 call this%interface_interpolator%find_points(this%x_interface_dof%x, &
683 this%y_interface_dof%x, &
684 this%z_interface_dof%x, &
685 this%x_interface_dof%size())
686
687 end subroutine setup_interpolator_
688
__inline__ __device__ void nonlinear_index(const int idx, const int lx, int *index)
Definition bc_utils.h:44
double real
Abstract interface defining a dirichlet condition on a list of fields.
Retrieves a parameter by name or assigns a provided default value. In the latter case also adds the m...
User callback for overset-interface morphing and boundary-value updates.
Defines a list of bc_t.
Definition bc_list.f90:34
Defines a boundary condition.
Definition bc.f90:34
integer, parameter, public bc_dirichlet
Supported boundary condition types. The values are set in order of precedence for global resolution....
Definition bc.f90:66
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_comm), public neko_global_comm
Definition comm.F90:47
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.
Definition device.F90:34
integer, parameter, public host_to_device
Definition device.F90:48
integer, parameter, public device_to_host
Definition device.F90:48
Defines a dirichlet boundary condition.
Definition dirichlet.f90:34
Defines a mapping of the degrees of freedom.
Definition dofmap.f90:35
Defines user dirichlet condition for a scalar field.
Defines a field.
Definition field.f90:34
Implements global_interpolation given a dofmap.
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
Object for handling masks in Neko.
Definition mask.f90:34
Definition math.f90:60
subroutine, public copy(a, b, n)
Copy a vector .
Definition math.f90:294
subroutine, public masked_copy_0(a, b, mask, n, n_mask)
Copy a masked vector .
Definition math.f90:315
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Defines overset interface vector boundary conditions.
subroutine overset_interface_vector_apply_scalar_dev(this, x_d, time, strong, strm)
No-op apply scalar (device).
subroutine overset_interface_vector_init_from_components(this, coef, tol, pad, log)
Constructor from components.
subroutine overset_interface_vector_free(this)
Destructor. Currently unused as is, all field_dirichlet attributes are freed in fluid_scheme_incompre...
subroutine overset_interface_vector_apply_vector_dev(this, x_d, y_d, z_d, time, strong, strm)
Apply the boundary condition to a vector field on the device.
subroutine overset_interface_vector_apply_scalar(this, x, n, time, strong)
No-op apply scalar.
subroutine overset_interface_vector_finalize(this)
Finalize by building the mask arrays and propagating to underlying bcs.
subroutine overset_interface_vector_init(this, coef, json)
Constructor.
subroutine overset_interface_vector_apply_vector(this, x, y, z, n, time, strong)
Apply the boundary condition to a vector field.
Defines overset interface scalar boundary conditions.
subroutine overset_interface_update(this, time)
Update values at the overset interface.
subroutine gather_interface_dofs_(this)
Gather interface dofs.
subroutine log_interface_error_(this, s)
Log interface RMSE for the scalar field.
subroutine setup_interpolator_(this)
Set up the global interpolator.
subroutine build_masks_(this)
Build masks.
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.
Implements a dynamic stack ADT.
Definition stack.f90:49
Base class for time integration schemes.
Module with things related to the simulation time.
Utilities.
Definition utils.f90:35
character(len=100) function, dimension(:), allocatable, public split_string(string, delimiter)
Split a string based on delimiter (tokenizer) OBS: very hacky, this should really be improved,...
Definition utils.f90:251
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, :)
Definition utils.f90:289
subroutine, public vector_copy(a, b, n)
Copy a vector .
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.
Defines a vector.
Definition vector.f90:34
Base type for a boundary condition.
Definition bc.f90:72
A list of allocatable `bc_t`. Follows the standard interface of lists.
Definition bc_list.f90:49
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:93
Generic Dirichlet boundary condition on .
Definition dirichlet.f90:49
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...
Definition mask.f90:51
Extension of the user defined dirichlet condition overset_interface
Integer based stack.
Definition stack.f90:77
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...