Neko 1.99.9
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
fluid_scheme_compressible_ns.f90
Go to the documentation of this file.
1! Copyright (c) 2025-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!
34 use comm, only : neko_comm
35 use advection, only : advection_t
37 use operators, only : div, rotate_cyc
41 use field, only : field_t
44 use gs_ops, only : gs_op_min, gs_op_max
45 use gather_scatter, only : gs_t
46 use num_types, only : rp
47 use mesh, only : mesh_t
48 use checkpoint, only : chkp_t
49 use json_module, only : json_file, json_core, json_value
52 use user_intf, only : user_t
54 use ax_product, only : ax_t, ax_helm_allocator
55 use coefs, only : coef_t
56 use compressible_residual, only : compressible_rhs_t, compressible_rhs_factory
59 use bc_list, only : bc_list_t
60 use bc, only : bc_t
62 use logger, only : log_size, neko_log
63 use time_state, only : time_state_t
72 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_max
74 viscous_regularization_factory
77 implicit none
78 private
79
80 type, public, extends(fluid_scheme_compressible_t) &
82 type(field_t) :: rho_res, m_x_res, m_y_res, m_z_res, m_e_res
83 type(field_t) :: drho, dm_x, dm_y, dm_z, de
84 class(advection_t), allocatable :: adv
85 class(ax_t), allocatable :: ax
86 class(ax_t), allocatable :: ax_stress
87 class(compressible_rhs_t), allocatable :: compressible_rhs
88 type(runge_kutta_time_scheme_t) :: rk_scheme
89
91 logical :: if_viscous_regularization
92
94 type(coupled_vector_bc_projector_t):: bcs_vel_projector
96 type(bc_list_t) :: bcs_density
97
98 contains
99 procedure, pass(this) :: init => fluid_scheme_compressible_ns_init
100 procedure, pass(this) :: free => fluid_scheme_compressible_ns_free
101 procedure, pass(this) :: step => fluid_scheme_compressible_ns_step
102 procedure, pass(this) :: restart => fluid_scheme_compressible_ns_restart
104 procedure, pass(this) :: setup_bcs &
106 procedure, pass(this), private :: setup_viscous_regularization
108
109 interface
110
117 module subroutine density_bc_factory(object, scheme, json, coef, user)
118 class(bc_t), pointer, intent(inout) :: object
119 type(fluid_scheme_compressible_ns_t), intent(in) :: scheme
120 type(json_file), intent(inout) :: json
121 type(coef_t), intent(in) :: coef
122 type(user_t), intent(in) :: user
123 end subroutine density_bc_factory
124 end interface
125
126 interface
127
134 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
135 class(bc_t), pointer, intent(inout) :: object
136 type(fluid_scheme_compressible_ns_t), intent(inout) :: scheme
137 type(json_file), intent(inout) :: json
138 type(coef_t), intent(in) :: coef
139 type(user_t), intent(in) :: user
140 end subroutine pressure_bc_factory
141 end interface
142
143 interface
144
151 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
152 class(bc_t), pointer, intent(inout) :: object
153 type(fluid_scheme_compressible_ns_t), intent(in) :: scheme
154 type(json_file), intent(inout) :: json
155 type(coef_t), intent(in) :: coef
156 type(user_t), intent(in) :: user
157 end subroutine velocity_bc_factory
158 end interface
159
160contains
168 subroutine fluid_scheme_compressible_ns_init(this, msh, lx, params, user, &
169 chkp)
170 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
171 type(mesh_t), target, intent(inout) :: msh
172 integer, intent(in) :: lx
173 type(json_file), target, intent(inout) :: params
174 type(user_t), target, intent(in) :: user
175 type(chkp_t), target, intent(inout) :: chkp
176 character(len=12), parameter :: scheme = 'compressible'
177 integer :: rk_order
178
179 call this%free()
180
181 ! Initialize base class
182 call this%scheme_init(msh, lx, params, scheme, user)
183
184 call compressible_rhs_factory(this%compressible_rhs, this%gamma)
185
186 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
187 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
188
189 call this%drho%init(dm_xh, 'drho')
190 call this%dm_x%init(dm_xh, 'dm_x')
191 call this%dm_y%init(dm_xh, 'dm_y')
192 call this%dm_z%init(dm_xh, 'dm_z')
193 call this%dE%init(dm_xh, 'dE')
194
195 end associate
196
197 if (neko_bcknd_device .eq. 1) then
198 associate(p => this%p, rho => this%rho, &
199 u => this%u, v => this%v, w => this%w, &
200 m_x => this%m_x, m_y => this%m_y, m_z => this%m_z, &
201 artificial_visc => this%artificial_visc)
202 call device_memcpy(p%x, p%x_d, p%dof%size(), &
203 host_to_device, sync = .false.)
204 call device_memcpy(rho%x, rho%x_d, rho%dof%size(), &
205 host_to_device, sync = .false.)
206 call device_memcpy(u%x, u%x_d, u%dof%size(), &
207 host_to_device, sync = .false.)
208 call device_memcpy(v%x, v%x_d, v%dof%size(), &
209 host_to_device, sync = .false.)
210 call device_memcpy(w%x, w%x_d, w%dof%size(), &
211 host_to_device, sync = .false.)
212 call device_memcpy(m_x%x, m_x%x_d, m_x%dof%size(), &
213 host_to_device, sync = .false.)
214 call device_memcpy(m_y%x, m_y%x_d, m_y%dof%size(), &
215 host_to_device, sync = .false.)
216 call device_memcpy(m_z%x, m_z%x_d, m_z%dof%size(), &
217 host_to_device, sync = .false.)
218 call device_memcpy(artificial_visc%x, artificial_visc%x_d, &
219 artificial_visc%dof%size(), host_to_device, sync = .false.)
220 end associate
221 end if
222
223 ! Initialize the diffusion operators
224 call ax_helm_allocator(this%Ax, type_name = "standard")
225 call ax_helm_allocator(this%Ax_stress, type_name = "full")
226
227 ! Initialize the velocity BC projector. The coupled projector builds the
228 ! local bases required by non-axis aligned mixed velocity conditions.
229 call this%bcs_vel_projector%init(this%c_Xh)
230
231 ! Initialize viscous regularization
232 call this%setup_viscous_regularization(params)
233
234 ! Initialize Runge-Kutta scheme
235 call json_get_or_default(params, 'case.numerics.time_order', rk_order, 4)
236 call this%rk_scheme%init(rk_order)
237
238 call neko_log%section("Fluid boundary conditions")
239 ! Set up boundary conditions
240 call this%setup_bcs(user, params)
241 call neko_log%end_section()
242
243 end subroutine fluid_scheme_compressible_ns_init
244
247 subroutine fluid_scheme_compressible_ns_free(this)
248 class(fluid_scheme_compressible_ns_t), intent(inout) :: this
249 class(bc_t), pointer :: bc
250 integer :: i
251
252 if (allocated(this%Ax)) then
253 call this%Ax%free()
254 deallocate(this%Ax)
255 end if
256
257 if (allocated(this%Ax_stress)) then
258 call this%Ax_stress%free()
259 deallocate(this%Ax_stress)
260 end if
261
262 call this%scheme_free()
263
264 if (allocated(this%compressible_rhs)) then
265 deallocate(this%compressible_rhs)
266 end if
267
268 call this%drho%free()
269 call this%dm_x%free()
270 call this%dm_y%free()
271 call this%dm_z%free()
272 call this%dE%free()
273
274 if (allocated(this%viscous_regularization)) then
275 call this%viscous_regularization%free()
276 deallocate(this%viscous_regularization)
277 end if
278
279 do i = 1, this%bcs_density%size()
280 bc => this%bcs_density%get(i)
281 if (associated(bc)) then
282 call bc%free()
283 deallocate(bc)
284 end if
285 end do
286 call this%bcs_density%free()
287 call this%bcs_vel_projector%free()
288
289 end subroutine fluid_scheme_compressible_ns_free
290
296 subroutine fluid_scheme_compressible_ns_step(this, time, dt_controller)
297 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
298 type(time_state_t), intent(in) :: time
299 type(time_step_controller_t), intent(in) :: dt_controller
300 type(field_t), pointer :: temp
301 integer :: temp_indices(1)
302 ! number of degrees of freedom
303 integer :: n
304 integer :: i
305 class(bc_t), pointer :: b
306
307 n = this%dm_Xh%size()
308 call neko_scratch_registry%request_field(temp, temp_indices(1), .false.)
309 b => null()
310
311 call profiler_start_region('Fluid compressible', 1)
312 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
313 m_x=> this%m_x, m_y => this%m_y, m_z => this%m_z, &
314 xh => this%Xh, msh => this%msh, ax => this%Ax, &
315 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
316 e => this%E, rho => this%rho, &
317 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
318 drho => this%drho, dm_x => this%dm_x, dm_y => this%dm_y, &
319 dm_z => this%dm_z, de => this%dE, &
320 compressible_rhs => this%compressible_rhs, &
321 t => time%t, tstep => time%tstep, dt => time%dt, &
322 rk_scheme => this%rk_scheme)
323
325 if (allocated(this%viscous_regularization)) then
326 call this%viscous_regularization%update(this%artificial_visc)
327 end if
328
329 ! Refresh user-specified physical viscosity/conductivity before RHS.
330 call this%update_material_properties(time)
331
332 ! Execute RHS step with artificial viscosity field
333 call compressible_rhs%step(rho, m_x, m_y, m_z, e, &
334 p, u, v, w, this%Ax, &
335 this%Ax_stress, c_xh, gs_xh, this%artificial_visc, this%mu, &
336 this%kappa, this%bcs_vel, time, rk_scheme, real(dt, kind=rp))
337
339 call this%bcs_density%apply(rho, time)
340
342 ! Update u, v, w
343 if (neko_bcknd_device .eq. 1) then
344 call compressible_ops_device_update_uvw(u%x_d, v%x_d, w%x_d, &
345 m_x%x_d, m_y%x_d, m_z%x_d, rho%x_d, n)
346 else
347 call compressible_ops_cpu_update_uvw(u%x, v%x, w%x, &
348 m_x%x, m_y%x, m_z%x, rho%x, n)
349 end if
350
352 call this%bcs_vel%apply_vector(u%x, v%x, w%x, &
353 dm_xh%size(), time, strong = .true.)
354
356 if (neko_bcknd_device .eq. 1) then
357 call compressible_ops_device_update_mxyz_p_ruvw(m_x%x_d, m_y%x_d, &
358 m_z%x_d, p%x_d, temp%x_d, u%x_d, v%x_d, w%x_d, e%x_d, &
359 rho%x_d, this%gamma, n)
360 else
361 call compressible_ops_cpu_update_mxyz_p_ruvw(m_x%x, m_y%x, m_z%x, &
362 p%x, temp%x, u%x, v%x, w%x, e%x, rho%x, this%gamma, n)
363 end if
364
366 call this%bcs_prs%apply(p, time)
367
368
370 if (neko_bcknd_device .eq. 1) then
371 call compressible_ops_device_update_e(e%x_d, p%x_d, &
372 temp%x_d, this%gamma, n)
373 else
374 call compressible_ops_cpu_update_e(e%x, p%x, temp%x, this%gamma, n)
375 end if
376
378 if (neko_bcknd_device .eq. 1) then
379 call compressible_ops_device_update_temperature( &
380 this%temperature%x_d, p%x_d, rho%x_d, this%gamma, n)
381 else
382 !OCL NORECURRENCE, NOVREC, NOALIAS
383 !DIR$ CONCURRENT
384 !DIR$ IVDEP
385 !GCC$ ivdep
386 !$omp parallel do simd
387 do i = 1, n
388 this%temperature%x(i,1,1,1) = p%x(i,1,1,1) / &
389 (rho%x(i,1,1,1) * (this%gamma - 1.0_rp))
390 end do
391 !$omp end parallel do simd
392 end if
393
395 call this%compute_max_wave_speed()
396
397 do i = 1, this%bcs_vel%size()
398 b => this%bcs_vel%get(i)
399 b%updated = .false.
400 end do
401
402 do i = 1, this%bcs_prs%size()
403 b => this%bcs_prs%get(i)
404 b%updated = .false.
405 end do
406
407 do i = 1, this%bcs_density%size()
408 b => this%bcs_density%get(i)
409 b%updated = .false.
410 end do
411 nullify(b)
412
413 end associate
414 call profiler_end_region('Fluid compressible', 1)
415
416 call neko_scratch_registry%relinquish_field(temp_indices)
417
418 end subroutine fluid_scheme_compressible_ns_step
419
424 subroutine fluid_scheme_compressible_ns_setup_bcs(this, user, params)
425 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
426 type(user_t), target, intent(in) :: user
427 type(json_file), intent(inout) :: params
428 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
429 class(bc_t), pointer :: bc_i
430 type(json_core) :: core
431 type(json_value), pointer :: bc_object
432 type(json_file) :: bc_subdict
433 logical :: found
434 integer, allocatable :: zone_indices(:)
435 character(len=LOG_SIZE) :: log_buf
436
437 ! Process boundary conditions
438 if (params%valid_path('case.fluid.boundary_conditions')) then
439 call params%info('case.fluid.boundary_conditions', n_children = n_bcs)
440 call params%get_core(core)
441 call params%get('case.fluid.boundary_conditions', bc_object, found)
442
443 !
444 ! Velocity bcs
445 !
446 call this%bcs_vel%init(n_bcs)
447
448 do i = 1, n_bcs
449 ! Extract BC configuration
450 call json_extract_item(core, bc_object, i, bc_subdict)
451 call json_get(bc_subdict, "zone_indices", zone_indices)
452
453 ! Validate zones
454 do j = 1, size(zone_indices)
455 zone_size = this%msh%labeled_zones(zone_indices(j))%size
456 call mpi_allreduce(zone_size, global_zone_size, 1, &
457 mpi_integer, mpi_max, neko_comm, ierr)
458
459 if (global_zone_size .eq. 0) then
460 write(log_buf, '(A,I0,A)') "Error: Zone ", zone_indices(j), &
461 " has zero size"
462 call neko_error(log_buf)
463 end if
464 end do
465
466 ! Create BC
467 bc_i => null()
468 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
469
470 ! Add to appropriate lists
471 if (associated(bc_i)) then
472 call this%bcs_vel_projector%mark(bc_i)
473 call this%bcs_vel%append(bc_i)
474 end if
475 end do
476
477 !
478 ! Pressure bcs
479 !
480 call this%bcs_prs%init(n_bcs)
481
482 do i = 1, n_bcs
483 ! Create a new json containing just the subdict for this bc
484 call json_extract_item(core, bc_object, i, bc_subdict)
485 bc_i => null()
486 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
487
488 ! Not all bcs require an allocation for pressure in particular,
489 ! so we check.
490 if (associated(bc_i)) then
491 call this%bcs_prs%append(bc_i)
492 end if
493 end do
494
495 !
496 ! Density bcs
497 !
498 call this%bcs_density%init(n_bcs)
499
500 do i = 1, n_bcs
501 ! Create a new json containing just the subdict for this bc
502 call json_extract_item(core, bc_object, i, bc_subdict)
503 bc_i => null()
504 call density_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
505
506 ! Not all bcs require an allocation for pressure in particular,
507 ! so we check.
508 if (associated(bc_i)) then
509 call this%bcs_density%append(bc_i)
510 end if
511 end do
512 else
513 ! Check that there are no labeled zones, i.e. all are periodic.
514 do i = 1, size(this%msh%labeled_zones)
515 if (this%msh%labeled_zones(i)%size .gt. 0) then
516 call neko_error("No boundary_conditions entry in the case file!")
517 end if
518 end do
519
520 ! For a pure periodic case, we still need to initilise the bc lists
521 ! to a zero size to avoid issues with apply() in step()
522 call this%bcs_prs%init()
523 call this%bcs_vel%init()
524 call this%bcs_density%init()
525
526 end if
527
528 call this%bcs_vel_projector%finalize(rebuild_mask = .true.)
529 end subroutine fluid_scheme_compressible_ns_setup_bcs
530
535 subroutine fluid_scheme_compressible_ns_restart(this, chkp)
536 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
537 type(chkp_t), intent(inout) :: chkp
538 end subroutine fluid_scheme_compressible_ns_restart
539
540 subroutine setup_viscous_regularization(this, params)
541 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
542 type(json_file), intent(inout) :: params
543 type(json_file) :: reg_json
544 logical :: found
545 character(len=:), allocatable :: viscous_regularization_type
546
547 found = .false.
548 if (this%params%valid_path('case.fluid.viscous_regularization')) then
549 call json_get(params, 'case.fluid.viscous_regularization', &
550 reg_json)
551 found = .true.
552 end if
553
554 if (.not. found) then
555 ! No viscous_regularization specified, so we skip setup
556 this%if_viscous_regularization = .false.
557 return
558 else
559 this%if_viscous_regularization = .true.
560 end if
561
562 call json_get(reg_json, 'type', viscous_regularization_type)
563 call viscous_regularization_factory(this%viscous_regularization, &
564 viscous_regularization_type, &
565 reg_json, this%c_Xh, this%dm_Xh)
566
567 call reg_json%destroy()
568
569 if (allocated(viscous_regularization_type)) &
570 deallocate(viscous_regularization_type)
571
572 end subroutine setup_viscous_regularization
573
double real
Abstract interface to evaluate rhs.
Copy data between host and device (or device and device)
Definition device.F90:72
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.
Compute the divergence of a vector field.
Definition operators.f90:86
Apply cyclic boundary condition to a vector field.
Subroutines to add advection terms to the RHS of a transport equation.
Definition advection.f90:34
Defines a Matrix-vector product.
Definition ax.f90:34
Defines a list of bc_t.
Definition bc_list.f90:34
Defines a boundary condition.
Definition bc.f90:34
Backward-differencing scheme for time integration.
Defines format-independent checkpoint registration and restart state.
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:46
CPU implementation of compressible flow operations.
subroutine, public compressible_ops_cpu_update_uvw(u, v, w, m_x, m_y, m_z, rho, n)
Update u,v,w fields.
subroutine, public compressible_ops_cpu_update_e(e, p, ruvw, gamma, n)
Update E field.
subroutine, public compressible_ops_cpu_update_mxyz_p_ruvw(m_x, m_y, m_z, p, ruvw, u, v, w, e, rho, gamma, n)
Update m_x, m_y, m_z, p, ruvw, fields.
Device implementation of compressible flow operations.
subroutine, public compressible_ops_device_update_uvw(u_d, v_d, w_d, m_x_d, m_y_d, m_z_d, rho_d, n)
Update u,v,w fields.
subroutine, public compressible_ops_device_update_temperature(t_d, p_d, rho_d, gamma, n)
Update temperature field.
subroutine, public compressible_ops_device_update_mxyz_p_ruvw(m_x_d, m_y_d, m_z_d, p_d, ruvw_d, u_d, v_d, w_d, e_d, rho_d, gamma, n)
Update m_x, m_y, m_z, p, ruvw, fields.
subroutine, public compressible_ops_device_update_e(e_d, p_d, ruvw_d, gamma, n)
Update E field.
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public host_to_device
Definition device.F90:48
Contains the field_serties_t type.
Defines a field.
Definition field.f90:34
subroutine fluid_scheme_compressible_ns_restart(this, chkp)
Restart the simulation from saved state.
subroutine setup_viscous_regularization(this, params)
subroutine fluid_scheme_compressible_ns_step(this, time, dt_controller)
Advance the fluid simulation one timestep.
subroutine fluid_scheme_compressible_ns_free(this)
Free allocated memory and cleanup.
subroutine fluid_scheme_compressible_ns_init(this, msh, lx, params, user, chkp)
Boundary condition factory for density.
subroutine fluid_scheme_compressible_ns_setup_bcs(this, user, params)
Set up boundary conditions for the fluid scheme.
Gather-scatter.
Defines Gather-scatter operations.
Definition gs_ops.f90:34
integer, parameter, public gs_op_max
Definition gs_ops.f90:36
integer, parameter, public gs_op_min
Definition gs_ops.f90:36
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:91
integer, parameter, public log_size
Definition log.f90:46
Defines a mesh.
Definition mesh.f90:34
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:14
Operators.
Definition operators.f90:34
Profiling interface.
Definition profiler.F90:34
subroutine, public profiler_start_region(name, region_id)
Started a named (name) profiler region.
Definition profiler.F90:79
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
Definition profiler.F90:116
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.
Compound scheme for the advection and diffusion operators in a transport equation.
Module with things related to the simulation time.
Implements type time_step_controller.
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
Utilities.
Definition utils.f90:35
subroutine, public neko_type_error(base_type, wrong_type, known_types)
Reports an error allocating a type for a particular base pointer class.
Definition utils.f90:413
Implements boundary condition projectors for vector fields. Two types concrete types are provided: se...
Defines the base interface for viscous regularization methods.
Base abstract type for computing the advection operator.
Definition advection.f90:46
Base type for a matrix-vector product providing .
Definition ax.f90:43
Base type for a boundary condition.
Definition bc.f90:73
A list of allocatable `bc_t`. Follows the standard interface of lists.
Definition bc_list.f90:49
Implicit backward-differencing scheme for time integration.
Collection of live simulation data registered for checkpointing.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:135
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
Gather-scatter kernel.
Implements the logic to compute the time coefficients for the advection and diffusion operators in a ...
A struct that contains all info about the time, expand as needed.
A type collecting all the overridable user routines and flag to suppress type injection from custom m...
A coupled projector for vector fields, suitable for mixed boundary conditions.
Abstract type for resolving vector boundary conditions.
Base abstract type for viscous regularization methods.