Neko 1.99.7
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
48 use gather_scatter, only : gs_t, gs_op_add, gs_op_min, gs_op_max
49 use scalar_residual, only : scalar_residual_t, scalar_residual_factory
50 use ax_product, only : ax_t, ax_helm_factory
53 use krylov, only : ksp_monitor_t
56 use projection, only : projection_t
57 use math, only : glsc2, col2, add2s2
61 use advection, only : advection_t, advection_factory
64 use json_module, only : json_file, json_core, json_value
65 use user_intf, only : user_t
69 use time_state, only : time_state_t
70 use bc, only : bc_t
71 use comm, only : neko_comm
72 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_max
73 implicit none
74 private
75
76
77 type, public, extends(scalar_scheme_t) :: scalar_pnpn_t
78
80 type(field_t) :: s_res
81
83 type(field_t) :: ds
84
86 class(ax_t), allocatable :: ax
87
89 type(projection_t) :: proj_s
90
94 type(zero_dirichlet_t) :: bc_res
95
100 type(bc_list_t) :: bclst_ds
101
103 class(advection_t), allocatable :: adv
104
105 ! Time interpolation scheme
106 logical :: oifs
107
108 ! Advection terms for the oifs method
109 type(field_t) :: advs
110
112 class(scalar_residual_t), allocatable :: res
113
115 class(rhs_maker_ext_t), allocatable :: makeext
116
118 class(rhs_maker_bdf_t), allocatable :: makebdf
119
121 class(rhs_maker_oifs_t), allocatable :: makeoifs
122
124 type(field_t) :: abx1, abx2
125
126 contains
128 procedure, pass(this) :: init => scalar_pnpn_init
130 procedure, pass(this) :: restart => scalar_pnpn_restart
132 procedure, pass(this) :: free => scalar_pnpn_free
134 procedure, pass(this) :: step => scalar_pnpn_step
136 procedure, pass(this) :: apply_strong_bcs => scalar_scheme_apply_strong_bcs
138 procedure, pass(this) :: setup_bcs_ => scalar_pnpn_setup_bcs_
140 end type scalar_pnpn_t
141
142 interface
143
149 module subroutine bc_factory(object, scheme, json, coef, user)
150 class(bc_t), pointer, intent(inout) :: object
151 type(scalar_pnpn_t), intent(in) :: scheme
152 type(json_file), intent(inout) :: json
153 type(coef_t), target, intent(in) :: coef
154 type(user_t), intent(in) :: user
155 end subroutine bc_factory
156 end interface
157
158contains
159
172 subroutine scalar_pnpn_init(this, msh, coef, gs, params, numerics_params, &
173 user, chkp, ulag, vlag, wlag, time_scheme, rho)
174 class(scalar_pnpn_t), target, intent(inout) :: this
175 type(mesh_t), target, intent(in) :: msh
176 type(coef_t), target, intent(in) :: coef
177 type(gs_t), target, intent(inout) :: gs
178 type(json_file), target, intent(inout) :: params
179 type(json_file), target, intent(inout) :: numerics_params
180 type(user_t), target, intent(in) :: user
181 type(chkp_t), target, intent(inout) :: chkp
182 type(field_series_t), target, intent(in) :: ulag, vlag, wlag
183 type(time_scheme_controller_t), target, intent(in) :: time_scheme
184 type(field_t), target, intent(in) :: rho
185 integer :: i
186 class(bc_t), pointer :: bc_i
187 character(len=15), parameter :: scheme = 'Modular (Pn/Pn)'
188 logical :: advection
189
190 call this%free()
191
192 ! Initiliaze base type.
193 call this%scheme_init(msh, coef, gs, params, scheme, user, rho)
194
195 ! Setup backend dependent Ax routines
196 call ax_helm_factory(this%ax, full_formulation = .false.)
197
198 ! Setup backend dependent scalar residual routines
199 call scalar_residual_factory(this%res)
200
201 ! Setup backend dependent summation of extrapolation scheme
202 call rhs_maker_ext_fctry(this%makeext)
203
204 ! Setup backend dependent contributions to F from lagged BD terms
205 call rhs_maker_bdf_fctry(this%makebdf)
206
207 ! Setup backend dependent contributions of the OIFS scheme
208 call rhs_maker_oifs_fctry(this%makeoifs)
209
210 ! Initialize variables specific to this plan
211 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
212 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
213
214 call this%s_res%init(dm_xh, "s_res")
215
216 call this%abx1%init(dm_xh, trim(this%name) // "_abx1")
217
218 call this%abx2%init(dm_xh, trim(this%name) // "_abx2")
219
220 call this%advs%init(dm_xh, "advs")
221
222 call this%ds%init(dm_xh, 'ds')
223
224 end associate
225
226 ! Set up boundary conditions
227 call this%setup_bcs_(user)
228
229 ! Initialize dirichlet bcs for scalar residual
230 call this%bc_res%init(this%c_Xh, params)
231 do i = 1, this%bcs%size()
232 if (this%bcs%strong(i)) then
233 bc_i => this%bcs%get(i)
234 call this%bc_res%mark_facets(bc_i%marked_facet)
235 end if
236 end do
237
238! call this%bc_res%mark_zones_from_list('d_s', this%bc_labels)
239 call this%bc_res%finalize()
240
241 call this%bclst_ds%init()
242 call this%bclst_ds%append(this%bc_res)
243
244
245 ! Initialize projection space
246 call this%proj_s%init(this%dm_Xh%size(), this%projection_dim, &
247 this%projection_activ_step)
248
249 ! Determine the time-interpolation scheme
250 call json_get_or_default(numerics_params, 'oifs', this%oifs, .false.)
251 ! Point to case checkpoint
252 this%chkp => chkp
253 ! Initialize advection factory
254 call json_get_or_default(params, 'advection', advection, .true.)
255
256 call advection_factory(this%adv, numerics_params, this%c_Xh, &
257 ulag, vlag, wlag, this%chkp%dtlag, &
258 this%chkp%tlag, time_scheme, .not. advection, &
259 this%slag)
260 end subroutine scalar_pnpn_init
261
262 ! Restarts the scalar from a checkpoint
263 subroutine scalar_pnpn_restart(this, chkp)
264 class(scalar_pnpn_t), target, intent(inout) :: this
265 type(chkp_t), intent(inout) :: chkp
266 real(kind=rp) :: dtlag(10), tlag(10)
267 integer :: n
268 type(field_t), pointer :: temp_field
269 dtlag = chkp%dtlag
270 tlag = chkp%tlag
271
272 n = this%s%dof%size()
273
274 ! Lag fields are restored through the checkpoint's fsp mechanism
275
276 call col2(this%s%x, this%c_Xh%mult, n)
277 call col2(this%slag%lf(1)%x, this%c_Xh%mult, n)
278 call col2(this%slag%lf(2)%x, this%c_Xh%mult, n)
279 if (neko_bcknd_device .eq. 1) then
280 call device_memcpy(this%s%x, this%s%x_d, &
281 n, host_to_device, sync = .false.)
282 call device_memcpy(this%slag%lf(1)%x, this%slag%lf(1)%x_d, &
283 n, host_to_device, sync = .false.)
284 call device_memcpy(this%slag%lf(2)%x, this%slag%lf(2)%x_d, &
285 n, host_to_device, sync = .false.)
286 call device_memcpy(this%abx1%x, this%abx1%x_d, &
287 n, host_to_device, sync = .false.)
288 call device_memcpy(this%abx2%x, this%abx2%x_d, &
289 n, host_to_device, sync = .false.)
290 call device_memcpy(this%advs%x, this%advs%x_d, &
291 n, host_to_device, sync = .false.)
292 end if
293
294 call this%gs_Xh%op(this%s, gs_op_add)
295 call this%gs_Xh%op(this%slag%lf(1), gs_op_add)
296 call this%gs_Xh%op(this%slag%lf(2), gs_op_add)
297
298 end subroutine scalar_pnpn_restart
299
300 subroutine scalar_pnpn_free(this)
301 class(scalar_pnpn_t), intent(inout) :: this
302
303 !Deallocate scalar field
304 call this%scheme_free()
305
306 call this%bc_res%free()
307 call this%bclst_ds%free()
308 call this%proj_s%free()
309
310 call this%s_res%free()
311
312 call this%ds%free()
313
314 call this%abx1%free()
315 call this%abx2%free()
316
317 call this%advs%free()
318
319 if (allocated(this%adv)) then
320 call this%adv%free()
321 deallocate(this%adv)
322 end if
323
324 if (allocated(this%Ax)) then
325 deallocate(this%Ax)
326 end if
327
328 if (allocated(this%res)) then
329 deallocate(this%res)
330 end if
331
332 if (allocated(this%makeext)) then
333 deallocate(this%makeext)
334 end if
335
336 if (allocated(this%makebdf)) then
337 deallocate(this%makebdf)
338 end if
339
340 if (allocated(this%makeoifs)) then
341 deallocate(this%makeoifs)
342 end if
343
344 end subroutine scalar_pnpn_free
345
346 subroutine scalar_pnpn_step(this, time, ext_bdf, dt_controller, &
347 ksp_results)
348 class(scalar_pnpn_t), intent(inout) :: this
349 type(time_state_t), intent(in) :: time
350 type(time_scheme_controller_t), intent(in) :: ext_bdf
351 type(time_step_controller_t), intent(in) :: dt_controller
352 type(ksp_monitor_t), intent(inout) :: ksp_results
353 type(field_t), pointer :: rho_cp
354 integer :: rho_cp_index
355 ! Number of degrees of freedom
356 integer :: n
357
358 if (this%freeze) return
359
360 n = this%dm_Xh%size()
361 call neko_scratch_registry%request_field(rho_cp, rho_cp_index, .false.)
362
363 call profiler_start_region(trim(this%name), 2)
364 associate(u => this%u, v => this%v, w => this%w, s => this%s, &
365 cp => this%cp, rho => this%rho, lambda_tot => this%lambda_tot, &
366 ds => this%ds, &
367 s_res => this%s_res, &
368 ax => this%Ax, f_xh => this%f_Xh, xh => this%Xh, &
369 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
370 slag => this%slag, oifs => this%oifs, &
371 projection_dim => this%projection_dim, &
372 msh => this%msh, res => this%res, makeoifs => this%makeoifs, &
373 makeext => this%makeext, makebdf => this%makebdf, &
374 t => time%t, tstep => time%tstep, dt => time%dt)
375
376 ! Logs extra information the log level is NEKO_LOG_DEBUG or above.
377 call print_debug(this)
378
379 ! Update material properties and their pointwise product.
380 call this%update_material_properties(time)
381 call field_col3(rho_cp, rho, cp, n)
382
383 ! Compute the source terms
384 call this%source_term%compute(time)
385
386 if (oifs) then
387 ! Add the advection operators to the right-hans-side.
388 call this%adv%compute_scalar(u, v, w, s, this%advs, &
389 xh, this%c_Xh, dm_xh%size())
390 else
391 ! Add the advection operators to the right-hans-side.
392 call this%adv%compute_scalar(u, v, w, s, f_xh, &
393 xh, this%c_Xh, dm_xh%size())
394 end if
395
396 ! Scale the volumetric source and advection terms by rho * cp.
397 call field_col2(f_xh, rho_cp, n)
398
399 ! Add weak boundary fluxes without scaling them by rho * cp.
400 call this%bcs%apply_scalar(f_xh%x, n, time, .false.)
401
402 ! Extrapolate the already scaled explicit right-hand side.
403 call makeext%compute_scalar(this%abx1, this%abx2, f_xh%x, &
404 ext_bdf%advection_coeffs%x, n)
405
406 if (oifs) then
407 call makeoifs%compute_scalar(this%advs%x, f_xh%x, &
408 rho_cp, dt, n)
409 else
410
411 ! Add the RHS contributions coming from the BDF scheme.
412 call makebdf%compute_scalar(slag, f_xh%x, s, c_xh%B, &
413 rho_cp, dt, ext_bdf%diffusion_coeffs%x, ext_bdf%ndiff, n)
414 end if
415
416 call slag%update()
417
419 call this%apply_strong_bcs(time)
420
421 ! Compute scalar residual.
422 call profiler_start_region(trim(this%name) // '_residual', 20)
423 call res%compute(ax, s, s_res, f_xh, c_xh, msh, xh, lambda_tot, &
424 rho_cp, ext_bdf%diffusion_coeffs%x(1), dt, &
425 dm_xh%size())
426
427 call gs_xh%op(s_res, gs_op_add)
428
429 ! Apply a 0-valued Dirichlet boundary conditions on the ds.
430 call this%bclst_ds%apply_scalar(s_res%x, dm_xh%size())
431
432 call profiler_end_region(trim(this%name) // '_residual', 20)
433
434 call this%proj_s%pre_solving(s_res%x, tstep, c_xh, n, dt_controller)
435
436 call this%pc%update()
437 call profiler_start_region(trim(this%name) // '_solve', 21)
438 ksp_results = this%ksp%solve(ax, ds, s_res%x, n, &
439 c_xh, this%bclst_ds, gs_xh)
440 ksp_results%name = trim(this%name)
441 call profiler_end_region(trim(this%name) // '_solve', 21)
442
443 call this%proj_s%post_solving(ds%x, ax, c_xh, this%bclst_ds, gs_xh, &
444 n, tstep, dt_controller)
445
446 ! Update the solution
447 if (neko_bcknd_device .eq. 1) then
448 call device_add2s2(s%x_d, ds%x_d, 1.0_rp, n)
449 else
450 call add2s2(s%x, ds%x, 1.0_rp, n)
451 end if
452
453 end associate
454 call neko_scratch_registry%relinquish_field(rho_cp_index)
455 call profiler_end_region(trim(this%name), 2)
456 end subroutine scalar_pnpn_step
457
458 subroutine print_debug(this)
459 class(scalar_pnpn_t), intent(inout) :: this
460 character(len=LOG_SIZE) :: log_buf
461 integer :: n
462
463 n = this%dm_Xh%size()
464
465 write(log_buf, '(A, A, E15.7, A, E15.7, A, E15.7)') 'Scalar debug', &
466 ' l2norm s', glsc2(this%s%x, this%s%x, n), &
467 ' slag1', glsc2(this%slag%lf(1)%x, this%slag%lf(1)%x, n), &
468 ' slag2', glsc2(this%slag%lf(2)%x, this%slag%lf(2)%x, n)
469 call neko_log%message(log_buf, lvl = neko_log_debug)
470 write(log_buf, '(A, A, E15.7, A, E15.7)') 'Scalar debug2', &
471 ' l2norm abx1', glsc2(this%abx1%x, this%abx1%x, n), &
472 ' abx2', glsc2(this%abx2%x, this%abx2%x, n)
473 call neko_log%message(log_buf, lvl = neko_log_debug)
474 end subroutine print_debug
475
478 subroutine scalar_pnpn_setup_bcs_(this, user)
479 class(scalar_pnpn_t), target, intent(inout) :: this
480 type(user_t), target, intent(in) :: user
481 integer :: i, j, n_bcs, zone_size, global_zone_size, ierr
482 type(json_core) :: core
483 type(json_value), pointer :: bc_object
484 type(json_file) :: bc_subdict
485 class(bc_t), pointer :: bc_i
486 logical :: found
487 ! Monitor which boundary zones have been marked
488 logical, allocatable :: marked_zones(:)
489 integer, allocatable :: zone_indices(:)
490
491 if (this%params%valid_path('boundary_conditions')) then
492 call this%params%info('boundary_conditions', &
493 n_children = n_bcs)
494 call this%params%get_core(core)
495 call this%params%get('boundary_conditions', bc_object, found)
496
497 call this%bcs%init(n_bcs)
498
499 allocate(marked_zones(size(this%msh%labeled_zones)))
500 marked_zones = .false.
501
502 do i = 1, n_bcs
503 ! Create a new json containing just the subdict for this bc
504 call json_extract_item(core, bc_object, i, bc_subdict)
505
506 ! Check that we are not trying to assing a bc to zone, for which one
507 ! has already been assigned and that the zone has more than 0 size
508 ! in the mesh.
509 call json_get(bc_subdict, "zone_indices", zone_indices)
510
511 do j = 1, size(zone_indices)
512 zone_size = this%msh%labeled_zones(zone_indices(j))%size
513 call mpi_allreduce(zone_size, global_zone_size, 1, &
514 mpi_integer, mpi_max, neko_comm, ierr)
515
516 if (global_zone_size .eq. 0) then
517 write(error_unit, '(A, A, I0, A, A, I0, A)') &
518 "*** ERROR ***: ", "Zone index ", zone_indices(j), &
519 " is invalid as this zone has 0 size, meaning it ", &
520 "does not exist in the mesh. Check scalar boundary ", &
521 "condition ", i, "."
522 error stop
523 end if
524
525 if (marked_zones(zone_indices(j))) then
526 write(error_unit, '(A, A, I0, A, A, A, A)') "*** ERROR ***: ", &
527 "Zone with index ", zone_indices(j), &
528 " has already been assigned a boundary condition. ", &
529 "Please check your boundary_conditions entry for the ", &
530 "scalar and make sure that each zone index appears only ",&
531 "in a single boundary condition."
532 error stop
533 else
534 marked_zones(zone_indices(j)) = .true.
535 end if
536 end do
537
538 bc_i => null()
539
540 call bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
541 call this%bcs%append(bc_i)
542 end do
543
544 ! Make sure all labeled zones with non-zero size have been marked
545 do i = 1, size(this%msh%labeled_zones)
546 if ((this%msh%labeled_zones(i)%size .gt. 0) .and. &
547 (.not. marked_zones(i))) then
548 write(error_unit, '(A, A, I0)') "*** ERROR ***: ", &
549 "No scalar boundary condition assigned to zone ", i
550 error stop
551 end if
552 end do
553 else
554 ! Check that there are no labeled zones, i.e. all are periodic.
555 do i = 1, size(this%msh%labeled_zones)
556 if (this%msh%labeled_zones(i)%size .gt. 0) then
557 write(error_unit, '(A, A, A)') "*** ERROR ***: ", &
558 "No boundary_conditions entry in the case file for scalar ", &
559 this%s%name
560 error stop
561 end if
562 end do
563
564 ! For a pure periodic case, we still need to initilise the bc lists
565 ! to a zero size to avoid issues with apply() in step()
566 call this%bcs%init()
567
568 end if
569 end subroutine scalar_pnpn_setup_bcs_
570
573 subroutine scalar_scheme_apply_strong_bcs(this, time)
574 class(scalar_pnpn_t), intent(inout) :: this
575 type(time_state_t), intent(in) :: time
576
577 integer :: i
578 class(bc_t), pointer :: bc_i
579 bc_i => null()
580
581 ! First apply call, sets the Dirichlet value, let's call it d.
582 call this%bcs%apply(this%s, time = time, strong = .true.)
583 ! If we now have local nodes sharing the same global node, and with
584 ! some nodes not masked as Dirichlet, the node which *is* masked
585 ! will have the value d, and the the other ones just some value u.
586 ! Take a nodewise minimum between the local nodes.
587 ! Now, all local nodes store m = min(d, u)
588 call this%gs_Xh%op(this%s, gs_op_min, glb_cmd_event)
589 call device_event_sync(glb_cmd_event)
590
591 ! Second apply call, so Dirichlet nodes again store d, the rest still store
592 ! m, where m < d by construction.
593 call this%bcs%apply(this%s, time = time, strong = .true.)
594 ! Now apply a max, which guarantees that d wins and gets stored in all the
595 ! local nodes.
596 call this%gs_Xh%op(this%s, gs_op_max, glb_cmd_event)
597 call device_event_sync(glb_cmd_event)
598
599 ! Reset updated flags
600 do i = 1, this%bcs%size()
601 bc_i => this%bcs%get(i)
602 bc_i%updated = .false.
603 end do
604 nullify(bc_i)
605
606 end subroutine scalar_scheme_apply_strong_bcs
607
608
609end module scalar_pnpn
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.
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:46
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
subroutine, public device_event_sync(event)
Synchronize an event.
Definition device.F90:1667
integer, parameter, public host_to_device
Definition device.F90:48
type(c_ptr), bind(C), public glb_cmd_event
Event for the global command queue.
Definition device.F90:63
Dirichlet condition applied in the facet normal direction.
subroutine, public field_col2(a, b, n)
Vector multiplication .
subroutine, public field_col3(a, b, c, n)
Vector multiplication with 3 vectors .
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:90
type(log_t), public neko_log
Global log stream.
Definition log.f90:80
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:1266
subroutine, public col2(a, b, n)
Vector multiplication .
Definition math.f90:1046
subroutine, public add2s2(a, b, c1, n)
Vector addition with scalar multiplication (multiplication on second argument)
Definition math.f90:998
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:79
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
Definition profiler.F90:116
Project x onto X, the space of old solutions and back again.
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_scheme_apply_strong_bcs(this, time)
Apply strong 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.
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.
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:62
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:63
Dirichlet condition in facet normal direction.
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
Gather-scatter kernel.
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...