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 if (this%c_Xh%geo_compression) then
225 call ax_helm_allocator(this%Ax, type_name = "standard_compr")
226 else
227 call ax_helm_allocator(this%Ax, type_name = "standard")
228 end if
229 call ax_helm_allocator(this%Ax_stress, type_name = "full")
230
231 ! Initialize the velocity BC projector. The coupled projector builds the
232 ! local bases required by non-axis aligned mixed velocity conditions.
233 call this%bcs_vel_projector%init(this%c_Xh)
234
235 ! Initialize viscous regularization
236 call this%setup_viscous_regularization(params)
237
238 ! Initialize Runge-Kutta scheme
239 call json_get_or_default(params, 'case.numerics.time_order', rk_order, 4)
240 call this%rk_scheme%init(rk_order)
241
242 call neko_log%section("Fluid boundary conditions")
243 ! Set up boundary conditions
244 call this%setup_bcs(user, params)
245 call neko_log%end_section()
246
247 end subroutine fluid_scheme_compressible_ns_init
248
251 subroutine fluid_scheme_compressible_ns_free(this)
252 class(fluid_scheme_compressible_ns_t), intent(inout) :: this
253 class(bc_t), pointer :: bc
254 integer :: i
255
256 if (allocated(this%Ax)) then
257 call this%Ax%free()
258 deallocate(this%Ax)
259 end if
260
261 if (allocated(this%Ax_stress)) then
262 call this%Ax_stress%free()
263 deallocate(this%Ax_stress)
264 end if
265
266 call this%scheme_free()
267
268 if (allocated(this%compressible_rhs)) then
269 deallocate(this%compressible_rhs)
270 end if
271
272 call this%drho%free()
273 call this%dm_x%free()
274 call this%dm_y%free()
275 call this%dm_z%free()
276 call this%dE%free()
277 call this%rk_scheme%free()
278
279 if (allocated(this%viscous_regularization)) then
280 call this%viscous_regularization%free()
281 deallocate(this%viscous_regularization)
282 end if
283
284 do i = 1, this%bcs_density%size()
285 bc => this%bcs_density%get(i)
286 if (associated(bc)) then
287 call bc%free()
288 deallocate(bc)
289 end if
290 end do
291 call this%bcs_density%free()
292 call this%bcs_vel_projector%free()
293
294 end subroutine fluid_scheme_compressible_ns_free
295
301 subroutine fluid_scheme_compressible_ns_step(this, time, dt_controller)
302 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
303 type(time_state_t), intent(in) :: time
304 type(time_step_controller_t), intent(in) :: dt_controller
305 type(field_t), pointer :: temp
306 integer :: temp_indices(1)
307 ! number of degrees of freedom
308 integer :: n
309 integer :: i
310 class(bc_t), pointer :: b
311
312 n = this%dm_Xh%size()
313 call neko_scratch_registry%request_field(temp, temp_indices(1), .false.)
314 b => null()
315
316 call profiler_start_region('Fluid compressible', 1)
317 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
318 m_x=> this%m_x, m_y => this%m_y, m_z => this%m_z, &
319 xh => this%Xh, msh => this%msh, ax => this%Ax, &
320 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
321 e => this%E, rho => this%rho, &
322 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
323 drho => this%drho, dm_x => this%dm_x, dm_y => this%dm_y, &
324 dm_z => this%dm_z, de => this%dE, &
325 compressible_rhs => this%compressible_rhs, &
326 t => time%t, tstep => time%tstep, dt => time%dt, &
327 rk_scheme => this%rk_scheme)
328
330 if (allocated(this%viscous_regularization)) then
331 call this%viscous_regularization%update(this%artificial_visc)
332 end if
333
334 ! Refresh user-specified physical viscosity/conductivity before RHS.
335 call this%update_material_properties(time)
336
337 ! Execute RHS step with artificial viscosity field
338 call compressible_rhs%step(rho, m_x, m_y, m_z, e, &
339 p, u, v, w, this%Ax, &
340 this%Ax_stress, c_xh, gs_xh, this%artificial_visc, this%mu, &
341 this%kappa, this%bcs_vel, time, rk_scheme, real(dt, kind=rp))
342
344 call this%bcs_density%apply(rho, time)
345
347 ! Update u, v, w
348 if (neko_bcknd_device .eq. 1) then
349 call compressible_ops_device_update_uvw(u%x_d, v%x_d, w%x_d, &
350 m_x%x_d, m_y%x_d, m_z%x_d, rho%x_d, n)
351 else
352 call compressible_ops_cpu_update_uvw(u%x, v%x, w%x, &
353 m_x%x, m_y%x, m_z%x, rho%x, n)
354 end if
355
357 call this%bcs_vel%apply_vector(u%x, v%x, w%x, &
358 dm_xh%size(), time, strong = .true.)
359
361 if (neko_bcknd_device .eq. 1) then
362 call compressible_ops_device_update_mxyz_p_ruvw(m_x%x_d, m_y%x_d, &
363 m_z%x_d, p%x_d, temp%x_d, u%x_d, v%x_d, w%x_d, e%x_d, &
364 rho%x_d, this%gamma, n)
365 else
366 call compressible_ops_cpu_update_mxyz_p_ruvw(m_x%x, m_y%x, m_z%x, &
367 p%x, temp%x, u%x, v%x, w%x, e%x, rho%x, this%gamma, n)
368 end if
369
371 call this%bcs_prs%apply(p, time)
372
373
375 if (neko_bcknd_device .eq. 1) then
376 call compressible_ops_device_update_e(e%x_d, p%x_d, &
377 temp%x_d, this%gamma, n)
378 else
379 call compressible_ops_cpu_update_e(e%x, p%x, temp%x, this%gamma, n)
380 end if
381
383 if (neko_bcknd_device .eq. 1) then
384 call compressible_ops_device_update_temperature( &
385 this%temperature%x_d, p%x_d, rho%x_d, this%gamma, n)
386 else
387 !OCL NORECURRENCE, NOVREC, NOALIAS
388 !DIR$ CONCURRENT
389 !DIR$ IVDEP
390 !GCC$ ivdep
391 !$omp parallel do simd
392 do i = 1, n
393 this%temperature%x(i,1,1,1) = p%x(i,1,1,1) / &
394 (rho%x(i,1,1,1) * (this%gamma - 1.0_rp))
395 end do
396 !$omp end parallel do simd
397 end if
398
400 call this%compute_max_wave_speed()
401
402 do i = 1, this%bcs_vel%size()
403 b => this%bcs_vel%get(i)
404 b%updated = .false.
405 end do
406
407 do i = 1, this%bcs_prs%size()
408 b => this%bcs_prs%get(i)
409 b%updated = .false.
410 end do
411
412 do i = 1, this%bcs_density%size()
413 b => this%bcs_density%get(i)
414 b%updated = .false.
415 end do
416 nullify(b)
417
418 end associate
419 call profiler_end_region('Fluid compressible', 1)
420
421 call neko_scratch_registry%relinquish_field(temp_indices)
422
423 end subroutine fluid_scheme_compressible_ns_step
424
429 subroutine fluid_scheme_compressible_ns_setup_bcs(this, user, params)
430 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
431 type(user_t), target, intent(in) :: user
432 type(json_file), intent(inout) :: params
433 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
434 class(bc_t), pointer :: bc_i
435 type(json_core) :: core
436 type(json_value), pointer :: bc_object
437 type(json_file) :: bc_subdict
438 logical :: found
439 integer, allocatable :: zone_indices(:)
440 character(len=LOG_SIZE) :: log_buf
441
442 ! Process boundary conditions
443 if (params%valid_path('case.fluid.boundary_conditions')) then
444 call params%info('case.fluid.boundary_conditions', n_children = n_bcs)
445 call params%get_core(core)
446 call params%get('case.fluid.boundary_conditions', bc_object, found)
447
448 !
449 ! Velocity bcs
450 !
451 call this%bcs_vel%init(n_bcs)
452
453 do i = 1, n_bcs
454 ! Extract BC configuration
455 call json_extract_item(core, bc_object, i, bc_subdict)
456 call json_get(bc_subdict, "zone_indices", zone_indices)
457
458 ! Validate zones
459 do j = 1, size(zone_indices)
460 zone_size = this%msh%labeled_zones(zone_indices(j))%size
461 call mpi_allreduce(zone_size, global_zone_size, 1, &
462 mpi_integer, mpi_max, neko_comm, ierr)
463
464 if (global_zone_size .eq. 0) then
465 write(log_buf, '(A,I0,A)') "Error: Zone ", zone_indices(j), &
466 " has zero size"
467 call neko_error(log_buf)
468 end if
469 end do
470
471 ! Create BC
472 bc_i => null()
473 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
474
475 ! Add to appropriate lists
476 if (associated(bc_i)) then
477 call this%bcs_vel_projector%mark(bc_i)
478 call this%bcs_vel%append(bc_i)
479 end if
480 end do
481
482 !
483 ! Pressure bcs
484 !
485 call this%bcs_prs%init(n_bcs)
486
487 do i = 1, n_bcs
488 ! Create a new json containing just the subdict for this bc
489 call json_extract_item(core, bc_object, i, bc_subdict)
490 bc_i => null()
491 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
492
493 ! Not all bcs require an allocation for pressure in particular,
494 ! so we check.
495 if (associated(bc_i)) then
496 call this%bcs_prs%append(bc_i)
497 end if
498 end do
499
500 !
501 ! Density bcs
502 !
503 call this%bcs_density%init(n_bcs)
504
505 do i = 1, n_bcs
506 ! Create a new json containing just the subdict for this bc
507 call json_extract_item(core, bc_object, i, bc_subdict)
508 bc_i => null()
509 call density_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
510
511 ! Not all bcs require an allocation for pressure in particular,
512 ! so we check.
513 if (associated(bc_i)) then
514 call this%bcs_density%append(bc_i)
515 end if
516 end do
517 else
518 ! Check that there are no labeled zones, i.e. all are periodic.
519 do i = 1, size(this%msh%labeled_zones)
520 if (this%msh%labeled_zones(i)%size .gt. 0) then
521 call neko_error("No boundary_conditions entry in the case file!")
522 end if
523 end do
524
525 ! For a pure periodic case, we still need to initilise the bc lists
526 ! to a zero size to avoid issues with apply() in step()
527 call this%bcs_prs%init()
528 call this%bcs_vel%init()
529 call this%bcs_density%init()
530
531 end if
532
533 call this%bcs_vel_projector%finalize(rebuild_mask = .true.)
534 end subroutine fluid_scheme_compressible_ns_setup_bcs
535
540 subroutine fluid_scheme_compressible_ns_restart(this, chkp)
541 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
542 type(chkp_t), intent(inout) :: chkp
543 end subroutine fluid_scheme_compressible_ns_restart
544
545 subroutine setup_viscous_regularization(this, params)
546 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
547 type(json_file), intent(inout) :: params
548 type(json_file) :: reg_json
549 logical :: found
550 character(len=:), allocatable :: viscous_regularization_type
551
552 found = .false.
553 if (this%params%valid_path('case.fluid.viscous_regularization')) then
554 call json_get(params, 'case.fluid.viscous_regularization', &
555 reg_json)
556 found = .true.
557 end if
558
559 if (.not. found) then
560 ! No viscous_regularization specified, so we skip setup
561 this%if_viscous_regularization = .false.
562 return
563 else
564 this%if_viscous_regularization = .true.
565 end if
566
567 call json_get(reg_json, 'type', viscous_regularization_type)
568 call viscous_regularization_factory(this%viscous_regularization, &
569 viscous_regularization_type, &
570 reg_json, this%c_Xh, this%dm_Xh)
571
572 call reg_json%destroy()
573
574 if (allocated(viscous_regularization_type)) &
575 deallocate(viscous_regularization_type)
576
577 end subroutine setup_viscous_regularization
578
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:92
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:415
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:44
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:136
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.