Neko 1.99.2
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
scalar_pnpn.f90
Go to the documentation of this file.
1! Copyright (c) 2022-2024, 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
36 use num_types, only: rp
37 use, intrinsic :: iso_fortran_env, only: error_unit
39 rhs_maker_ext_fctry, rhs_maker_bdf_fctry, rhs_maker_oifs_fctry
41 use checkpoint, only : chkp_t
42 use field, only : field_t
43 use bc_list, only : bc_list_t
44 use mesh, only : mesh_t
45 use coefs, only : coef_t
47 use gather_scatter, only : gs_t, gs_op_add
48 use scalar_residual, only : scalar_residual_t, scalar_residual_factory
49 use ax_product, only : ax_t, ax_helm_factory
51 use registry, only: neko_registry
53 use krylov, only : ksp_monitor_t
56 use projection, only : projection_t
57 use math, only : glsc2, col2, add2s2
59 use advection, only : advection_t, advection_factory
62 use json_module, only : json_file, json_core, json_value
63 use user_intf, only : user_t
67 use time_state, only : time_state_t
68 use bc, only : bc_t
69 use comm, only : neko_comm
70 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_max
71 implicit none
72 private
73
74
75 type, public, extends(scalar_scheme_t) :: scalar_pnpn_t
76
78 type(field_t) :: s_res
79
81 type(field_t) :: ds
82
84 class(ax_t), allocatable :: ax
85
87 type(projection_t) :: proj_s
88
92 type(zero_dirichlet_t) :: bc_res
93
98 type(bc_list_t) :: bclst_ds
99
101 class(advection_t), allocatable :: adv
102
103 ! Time interpolation scheme
104 logical :: oifs
105
106 ! Advection terms for the oifs method
107 type(field_t) :: advs
108
110 class(scalar_residual_t), allocatable :: res
111
113 class(rhs_maker_ext_t), allocatable :: makeext
114
116 class(rhs_maker_bdf_t), allocatable :: makebdf
117
119 class(rhs_maker_oifs_t), allocatable :: makeoifs
120
122 type(field_t) :: abx1, abx2
123
124 contains
126 procedure, pass(this) :: init => scalar_pnpn_init
128 procedure, pass(this) :: restart => scalar_pnpn_restart
130 procedure, pass(this) :: free => scalar_pnpn_free
132 procedure, pass(this) :: step => scalar_pnpn_step
134 procedure, pass(this) :: setup_bcs_ => scalar_pnpn_setup_bcs_
136 end type scalar_pnpn_t
137
138 interface
139
145 module subroutine bc_factory(object, scheme, json, coef, user)
146 class(bc_t), pointer, intent(inout) :: object
147 type(scalar_pnpn_t), intent(in) :: scheme
148 type(json_file), intent(inout) :: json
149 type(coef_t), intent(in) :: coef
150 type(user_t), intent(in) :: user
151 end subroutine bc_factory
152 end interface
153
154contains
155
168 subroutine scalar_pnpn_init(this, msh, coef, gs, params, numerics_params, &
169 user, chkp, ulag, vlag, wlag, time_scheme, rho)
170 class(scalar_pnpn_t), target, intent(inout) :: this
171 type(mesh_t), target, intent(in) :: msh
172 type(coef_t), target, intent(in) :: coef
173 type(gs_t), target, intent(inout) :: gs
174 type(json_file), target, intent(inout) :: params
175 type(json_file), target, intent(inout) :: numerics_params
176 type(user_t), target, intent(in) :: user
177 type(chkp_t), target, intent(inout) :: chkp
178 type(field_series_t), target, intent(in) :: ulag, vlag, wlag
179 type(time_scheme_controller_t), target, intent(in) :: time_scheme
180 type(field_t), target, intent(in) :: rho
181 integer :: i
182 class(bc_t), pointer :: bc_i
183 character(len=15), parameter :: scheme = 'Modular (Pn/Pn)'
184 logical :: advection
185
186 call this%free()
187
188 ! Initiliaze base type.
189 call this%scheme_init(msh, coef, gs, params, scheme, user, rho)
190
191 ! Setup backend dependent Ax routines
192 call ax_helm_factory(this%ax, full_formulation = .false.)
193
194 ! Setup backend dependent scalar residual routines
195 call scalar_residual_factory(this%res)
196
197 ! Setup backend dependent summation of extrapolation scheme
198 call rhs_maker_ext_fctry(this%makeext)
199
200 ! Setup backend dependent contributions to F from lagged BD terms
201 call rhs_maker_bdf_fctry(this%makebdf)
202
203 ! Setup backend dependent contributions of the OIFS scheme
204 call rhs_maker_oifs_fctry(this%makeoifs)
205
206 ! Initialize variables specific to this plan
207 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
208 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
209
210 call this%s_res%init(dm_xh, "s_res")
211
212 call this%abx1%init(dm_xh, trim(this%name)//"_abx1")
213 call neko_registry%add_field(dm_xh, trim(this%name)//"_abx1", ignore_existing = .true.)
214
215 call this%abx2%init(dm_xh, trim(this%name)//"_abx2")
216 call neko_registry%add_field(dm_xh, trim(this%name)//"_abx2", ignore_existing = .true.)
217
218 call this%advs%init(dm_xh, "advs")
219
220 call this%ds%init(dm_xh, 'ds')
221
222 end associate
223
224 ! Set up boundary conditions
225 call this%setup_bcs_(user)
226
227 ! Initialize dirichlet bcs for scalar residual
228 call this%bc_res%init(this%c_Xh, params)
229 do i = 1, this%bcs%size()
230 if (this%bcs%strong(i)) then
231 bc_i => this%bcs%get(i)
232 call this%bc_res%mark_facets(bc_i%marked_facet)
233 end if
234 end do
235
236! call this%bc_res%mark_zones_from_list('d_s', this%bc_labels)
237 call this%bc_res%finalize()
238
239 call this%bclst_ds%init()
240 call this%bclst_ds%append(this%bc_res)
241
242
243 ! Initialize projection space
244 call this%proj_s%init(this%dm_Xh%size(), this%projection_dim, &
245 this%projection_activ_step)
246
247 ! Determine the time-interpolation scheme
248 call json_get_or_default(params, 'case.numerics.oifs', this%oifs, .false.)
249 ! Point to case checkpoint
250 this%chkp => chkp
251 ! Initialize advection factory
252 call json_get_or_default(params, 'advection', advection, .true.)
253
254 call advection_factory(this%adv, numerics_params, this%c_Xh, &
255 ulag, vlag, wlag, this%chkp%dtlag, &
256 this%chkp%tlag, time_scheme, .not. advection, &
257 this%slag)
258 end subroutine scalar_pnpn_init
259
260 ! Restarts the scalar from a checkpoint
261 subroutine scalar_pnpn_restart(this, chkp)
262 class(scalar_pnpn_t), target, intent(inout) :: this
263 type(chkp_t), intent(inout) :: chkp
264 real(kind=rp) :: dtlag(10), tlag(10)
265 integer :: n
266 type(field_t), pointer :: temp_field
267 dtlag = chkp%dtlag
268 tlag = chkp%tlag
269
270 n = this%s%dof%size()
271
272 ! Lag fields are restored through the checkpoint's fsp mechanism
273
274 call col2(this%s%x, this%c_Xh%mult, n)
275 call col2(this%slag%lf(1)%x, this%c_Xh%mult, n)
276 call col2(this%slag%lf(2)%x, this%c_Xh%mult, n)
277 if (neko_bcknd_device .eq. 1) then
278 call device_memcpy(this%s%x, this%s%x_d, &
279 n, host_to_device, sync = .false.)
280 call device_memcpy(this%slag%lf(1)%x, this%slag%lf(1)%x_d, &
281 n, host_to_device, sync = .false.)
282 call device_memcpy(this%slag%lf(2)%x, this%slag%lf(2)%x_d, &
283 n, host_to_device, sync = .false.)
284 call device_memcpy(this%abx1%x, this%abx1%x_d, &
285 n, host_to_device, sync = .false.)
286 call device_memcpy(this%abx2%x, this%abx2%x_d, &
287 n, host_to_device, sync = .false.)
288 call device_memcpy(this%advs%x, this%advs%x_d, &
289 n, host_to_device, sync = .false.)
290 end if
291
292 call this%gs_Xh%op(this%s, gs_op_add)
293 call this%gs_Xh%op(this%slag%lf(1), gs_op_add)
294 call this%gs_Xh%op(this%slag%lf(2), gs_op_add)
295
296 end subroutine scalar_pnpn_restart
297
298 subroutine scalar_pnpn_free(this)
299 class(scalar_pnpn_t), intent(inout) :: this
300
301 !Deallocate scalar field
302 call this%scheme_free()
303
304 call this%bc_res%free()
305 call this%bclst_ds%free()
306 call this%proj_s%free()
307
308 call this%s_res%free()
309
310 call this%ds%free()
311
312 call this%abx1%free()
313 call this%abx2%free()
314
315 call this%advs%free()
316
317 if (allocated(this%adv)) then
318 call this%adv%free()
319 deallocate(this%adv)
320 end if
321
322 if (allocated(this%Ax)) then
323 deallocate(this%Ax)
324 end if
325
326 if (allocated(this%res)) then
327 deallocate(this%res)
328 end if
329
330 if (allocated(this%makeext)) then
331 deallocate(this%makeext)
332 end if
333
334 if (allocated(this%makebdf)) then
335 deallocate(this%makebdf)
336 end if
337
338 if (allocated(this%makeoifs)) then
339 deallocate(this%makeoifs)
340 end if
341
342 end subroutine scalar_pnpn_free
343
344 subroutine scalar_pnpn_step(this, time, ext_bdf, dt_controller, &
345 ksp_results)
346 class(scalar_pnpn_t), intent(inout) :: this
347 type(time_state_t), intent(in) :: time
348 type(time_scheme_controller_t), intent(in) :: ext_bdf
349 type(time_step_controller_t), intent(in) :: dt_controller
350 type(ksp_monitor_t), intent(inout) :: ksp_results
351 ! Number of degrees of freedom
352 integer :: n
353
354 if (this%freeze) return
355
356 n = this%dm_Xh%size()
357
358 call profiler_start_region(trim(this%name), 2)
359 associate(u => this%u, v => this%v, w => this%w, s => this%s, &
360 cp => this%cp, rho => this%rho, lambda_tot => this%lambda_tot, &
361 ds => this%ds, &
362 s_res => this%s_res, &
363 ax => this%Ax, f_xh => this%f_Xh, xh => this%Xh, &
364 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
365 slag => this%slag, oifs => this%oifs, &
366 projection_dim => this%projection_dim, &
367 msh => this%msh, res => this%res, makeoifs => this%makeoifs, &
368 makeext => this%makeext, makebdf => this%makebdf, &
369 t => time%t, tstep => time%tstep, dt => time%dt)
370
371 ! Logs extra information the log level is NEKO_LOG_DEBUG or above.
372 call print_debug(this)
373 ! Compute the source terms
374 call this%source_term%compute(time)
375
376 ! Apply weak boundary conditions, that contribute to the source terms.
377 call this%bcs%apply_scalar(this%f_Xh%x, dm_xh%size(), time, .false.)
378
379 if (oifs) then
380 ! Add the advection operators to the right-hans-side.
381 call this%adv%compute_scalar(u, v, w, s, this%advs, &
382 xh, this%c_Xh, dm_xh%size())
383
384 call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, &
385 rho%x(1,1,1,1), ext_bdf%advection_coeffs, n)
386
387 call makeoifs%compute_scalar(this%advs%x, f_xh%x, rho%x(1,1,1,1), dt,&
388 n)
389 else
390 ! Add the advection operators to the right-hans-side.
391 call this%adv%compute_scalar(u, v, w, s, f_xh, &
392 xh, this%c_Xh, dm_xh%size())
393
394 ! At this point the RHS contains the sum of the advection operator,
395 ! Neumann boundary sources and additional source terms, evaluated using
396 ! the scalar field from the previous time-step. Now, this value is used in
397 ! the explicit time scheme to advance these terms in time.
398 call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, &
399 rho%x(1,1,1,1), ext_bdf%advection_coeffs, n)
400
401 ! Add the RHS contributions coming from the BDF scheme.
402 call makebdf%compute_scalar(slag, f_xh%x, s, c_xh%B, rho%x(1,1,1,1), &
403 dt, ext_bdf%diffusion_coeffs, ext_bdf%ndiff, n)
404 end if
405
406 call slag%update()
407
409 call this%bcs%apply_scalar(this%s%x, this%dm_Xh%size(), time, .true.)
410
411 ! Update material properties if necessary
412 call this%update_material_properties(time)
413
414 ! Compute scalar residual.
415 call profiler_start_region(trim(this%name) // '_residual', 20)
416 call res%compute(ax, s, s_res, f_xh, c_xh, msh, xh, lambda_tot, &
417 rho%x(1,1,1,1)*cp%x(1,1,1,1), ext_bdf%diffusion_coeffs(1), dt, &
418 dm_xh%size())
419
420 call gs_xh%op(s_res, gs_op_add)
421
422 ! Apply a 0-valued Dirichlet boundary conditions on the ds.
423 call this%bclst_ds%apply_scalar(s_res%x, dm_xh%size())
424
425 call profiler_end_region(trim(this%name) // '_residual', 20)
426
427 call this%proj_s%pre_solving(s_res%x, tstep, c_xh, n, dt_controller)
428
429 call this%pc%update()
430 call profiler_start_region(trim(this%name) // '_solve', 21)
431 ksp_results = this%ksp%solve(ax, ds, s_res%x, n, &
432 c_xh, this%bclst_ds, gs_xh)
433 ksp_results%name = trim(this%name)
434 call profiler_end_region(trim(this%name) // '_solve', 21)
435
436 call this%proj_s%post_solving(ds%x, ax, c_xh, this%bclst_ds, gs_xh, &
437 n, tstep, dt_controller)
438
439 ! Update the solution
440 if (neko_bcknd_device .eq. 1) then
441 call device_add2s2(s%x_d, ds%x_d, 1.0_rp, n)
442 else
443 call add2s2(s%x, ds%x, 1.0_rp, n)
444 end if
445
446 end associate
447 call profiler_end_region(trim(this%name), 2)
448 end subroutine scalar_pnpn_step
449
450 subroutine print_debug(this)
451 class(scalar_pnpn_t), intent(inout) :: this
452 character(len=LOG_SIZE) :: log_buf
453 integer :: n
454
455 n = this%dm_Xh%size()
456
457 write(log_buf, '(A, A, E15.7, A, E15.7, A, E15.7)') 'Scalar debug', &
458 ' l2norm s', glsc2(this%s%x, this%s%x, n), &
459 ' slag1', glsc2(this%slag%lf(1)%x, this%slag%lf(1)%x, n), &
460 ' slag2', glsc2(this%slag%lf(2)%x, this%slag%lf(2)%x, n)
461 call neko_log%message(log_buf, lvl = neko_log_debug)
462 write(log_buf, '(A, A, E15.7, A, E15.7)') 'Scalar debug2', &
463 ' l2norm abx1', glsc2(this%abx1%x, this%abx1%x, n), &
464 ' abx2', glsc2(this%abx2%x, this%abx2%x, n)
465 call neko_log%message(log_buf, lvl = neko_log_debug)
466 end subroutine print_debug
467
470 subroutine scalar_pnpn_setup_bcs_(this, user)
471 class(scalar_pnpn_t), intent(inout) :: this
472 type(user_t), target, intent(in) :: user
473 integer :: i, j, n_bcs, zone_size, global_zone_size, ierr
474 type(json_core) :: core
475 type(json_value), pointer :: bc_object
476 type(json_file) :: bc_subdict
477 class(bc_t), pointer :: bc_i
478 logical :: found
479 ! Monitor which boundary zones have been marked
480 logical, allocatable :: marked_zones(:)
481 integer, allocatable :: zone_indices(:)
482
483 if (this%params%valid_path('boundary_conditions')) then
484 call this%params%info('boundary_conditions', &
485 n_children = n_bcs)
486 call this%params%get_core(core)
487 call this%params%get('boundary_conditions', bc_object, found)
488
489 call this%bcs%init(n_bcs)
490
491 allocate(marked_zones(size(this%msh%labeled_zones)))
492 marked_zones = .false.
493
494 do i = 1, n_bcs
495 ! Create a new json containing just the subdict for this bc
496 call json_extract_item(core, bc_object, i, bc_subdict)
497
498 ! Check that we are not trying to assing a bc to zone, for which one
499 ! has already been assigned and that the zone has more than 0 size
500 ! in the mesh.
501 call json_get(bc_subdict, "zone_indices", zone_indices)
502
503 do j = 1, size(zone_indices)
504 zone_size = this%msh%labeled_zones(zone_indices(j))%size
505 call mpi_allreduce(zone_size, global_zone_size, 1, &
506 mpi_integer, mpi_max, neko_comm, ierr)
507
508 if (global_zone_size .eq. 0) then
509 write(error_unit, '(A, A, I0, A, A, I0, A)') "*** ERROR ***: ",&
510 "Zone index ", zone_indices(j), &
511 " is invalid as this zone has 0 size, meaning it ", &
512 "does not exist in the mesh. Check scalar boundary condition ", &
513 i, "."
514 error stop
515 end if
516
517 if (marked_zones(zone_indices(j)) .eqv. .true.) then
518 write(error_unit, '(A, A, I0, A, A, A, A)') "*** ERROR ***: ", &
519 "Zone with index ", zone_indices(j), &
520 " has already been assigned a boundary condition. ", &
521 "Please check your boundary_conditions entry for the ", &
522 "scalar and make sure that each zone index appears only ",&
523 "in a single boundary condition."
524 error stop
525 else
526 marked_zones(zone_indices(j)) = .true.
527 end if
528 end do
529
530 bc_i => null()
531
532 call bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
533 call this%bcs%append(bc_i)
534 end do
535
536 ! Make sure all labeled zones with non-zero size have been marked
537 do i = 1, size(this%msh%labeled_zones)
538 if ((this%msh%labeled_zones(i)%size .gt. 0) .and. &
539 (marked_zones(i) .eqv. .false.)) then
540 write(error_unit, '(A, A, I0)') "*** ERROR ***: ", &
541 "No scalar boundary condition assigned to zone ", i
542 error stop
543 end if
544 end do
545 else
546 ! Check that there are no labeled zones, i.e. all are periodic.
547 do i = 1, size(this%msh%labeled_zones)
548 if (this%msh%labeled_zones(i)%size .gt. 0) then
549 write(error_unit, '(A, A, A)') "*** ERROR ***: ", &
550 "No boundary_conditions entry in the case file for scalar ", &
551 this%s%name
552 error stop
553 end if
554 end do
555
556 ! For a pure periodic case, we still need to initilise the bc lists
557 ! to a zero size to avoid issues with apply() in step()
558 call this%bcs%init()
559
560 end if
561 end subroutine scalar_pnpn_setup_bcs_
562
563
564end module scalar_pnpn
Copy data between host and device (or device and device)
Definition device.F90:71
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.
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
Defines a checkpoint.
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:43
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.
Definition device.F90:34
integer, parameter, public host_to_device
Definition device.F90:47
Dirichlet condition applied in the facet normal direction.
Contains the field_serties_t type.
Defines a field.
Definition field.f90:34
Gather-scatter.
Utilities for retrieving parameters from the case files.
Implements the base abstract type for Krylov solvers plus helper types.
Definition krylov.f90:34
Logging routines.
Definition log.f90:34
integer, parameter, public neko_log_debug
Debug log level.
Definition log.f90:84
type(log_t), public neko_log
Global log stream.
Definition log.f90:76
integer, parameter, public log_size
Definition log.f90:46
Definition math.f90:60
real(kind=rp) function, public glsc2(a, b, n)
Weighted inner product .
Definition math.f90:1048
subroutine, public col2(a, b, n)
Vector multiplication .
Definition math.f90:854
subroutine, public add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
Definition math.f90:812
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:12
Profiling interface.
Definition profiler.F90:34
subroutine, public profiler_start_region(name, region_id)
Started a named (name) profiler region.
Definition profiler.F90:78
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
Definition profiler.F90:107
Project x onto X, the space of old solutions and back again.
Defines a registry for storing solution fields.
Definition registry.f90:34
type(registry_t), target, public neko_registry
Global field registry.
Definition registry.f90:128
Routines to generate the right-hand sides for the convection-diffusion equation. Employs the EXT/BDF ...
Definition rhs_maker.f90:38
Contains the scalar_pnpn_t type.
subroutine scalar_pnpn_step(this, time, ext_bdf, dt_controller, ksp_results)
subroutine scalar_pnpn_setup_bcs_(this, user)
Initialize boundary conditions.
subroutine scalar_pnpn_restart(this, chkp)
subroutine scalar_pnpn_init(this, msh, coef, gs, params, numerics_params, user, chkp, ulag, vlag, wlag, time_scheme, rho)
Boundary condition factory. Both constructs and initializes the object.
subroutine scalar_pnpn_free(this)
Defines the residual for the scalar transport equation.
Contains the scalar_scheme_t type.
Compound scheme for the advection and diffusion operators in a transport equation.
Base class for time integration schemes.
Module with things related to the simulation time.
Implements type time_step_controller.
Interfaces for user interaction with NEKO.
Definition user_intf.f90:34
Defines a zero-valued Dirichlet boundary condition.
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:61
A list of allocatable `bc_t`. Follows the standard interface of lists.
Definition bc_list.f90:48
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:56
Dirichlet condition in facet normal direction.
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
Type for storing initial and final residuals in a Krylov solver.
Definition krylov.f90:56
Abstract type to add contributions to F from lagged BD terms.
Definition rhs_maker.f90:59
Abstract type to sum up contributions to kth order extrapolation scheme.
Definition rhs_maker.f90:52
Abstract type to add contributions of kth order OIFS scheme.
Definition rhs_maker.f90:66
Abstract type to compute scalar residual.
Base type for a scalar advection-diffusion solver.
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...
Zero-valued Dirichlet boundary condition. Used for no-slip walls, but also for various auxillary cond...