Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
fluid_scheme_compressible_euler.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 math, only : col2
42 use device_math, only : device_col2
43 use field, only : field_t
47 use gather_scatter, only : gs_t
48 use num_types, only : rp
49 use mesh, only : mesh_t
50 use checkpoint, only : chkp_t
51 use json_module, only : json_file, json_core, json_value
54 use user_intf, only : user_t
56 use ax_product, only : ax_t, ax_helm_factory
57 use coefs, only : coef_t
58 use euler_residual, only : euler_rhs_t, euler_rhs_factory
61 use bc_list, only : bc_list_t
62 use bc, only : bc_t
64 use logger, only : log_size, neko_log
65 use time_state, only : time_state_t
72 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_max
73 use regularization, only : regularization_t, regularization_factory
74 implicit none
75 private
76
77 type, public, extends(fluid_scheme_compressible_t) &
79 type(field_t) :: rho_res, m_x_res, m_y_res, m_z_res, m_e_res
80 type(field_t) :: drho, dm_x, dm_y, dm_z, de
81 type(field_t) :: h
82 real(kind=rp) :: c_avisc_low
83 class(advection_t), allocatable :: adv
84 class(ax_t), allocatable :: ax
85 class(euler_rhs_t), allocatable :: euler_rhs
86 type(runge_kutta_time_scheme_t) :: rk_scheme
87
88 class(regularization_t), allocatable :: regularization
89
90 ! List of boundary conditions for velocity
91 type(bc_list_t) :: bcs_density
92 contains
93 procedure, pass(this) :: init => fluid_scheme_compressible_euler_init
94 procedure, pass(this) :: free => fluid_scheme_compressible_euler_free
95 procedure, pass(this) :: step => fluid_scheme_compressible_euler_step
96 procedure, pass(this) :: restart => fluid_scheme_compressible_euler_restart
98 procedure, pass(this) :: setup_bcs &
100 procedure, pass(this) :: compute_h
101 procedure, pass(this), private :: setup_regularization
103
104 interface
105
112 module subroutine density_bc_factory(object, scheme, json, coef, user)
113 class(bc_t), pointer, intent(inout) :: object
114 type(fluid_scheme_compressible_euler_t), intent(in) :: scheme
115 type(json_file), intent(inout) :: json
116 type(coef_t), intent(in) :: coef
117 type(user_t), intent(in) :: user
118 end subroutine density_bc_factory
119 end interface
120
121 interface
122
129 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
130 class(bc_t), pointer, intent(inout) :: object
131 type(fluid_scheme_compressible_euler_t), intent(inout) :: scheme
132 type(json_file), intent(inout) :: json
133 type(coef_t), intent(in) :: coef
134 type(user_t), intent(in) :: user
135 end subroutine pressure_bc_factory
136 end interface
137
138 interface
139
146 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
147 class(bc_t), pointer, intent(inout) :: object
148 type(fluid_scheme_compressible_euler_t), intent(in) :: scheme
149 type(json_file), intent(inout) :: json
150 type(coef_t), intent(in) :: coef
151 type(user_t), intent(in) :: user
152 end subroutine velocity_bc_factory
153 end interface
154
155contains
163 subroutine fluid_scheme_compressible_euler_init(this, msh, lx, params, user, &
164 chkp)
165 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
166 type(mesh_t), target, intent(inout) :: msh
167 integer, intent(in) :: lx
168 type(json_file), target, intent(inout) :: params
169 type(user_t), target, intent(in) :: user
170 type(chkp_t), target, intent(inout) :: chkp
171 character(len=12), parameter :: scheme = 'compressible'
172 integer :: rk_order
173
174 call this%free()
175
176 ! Initialize base class
177 call this%scheme_init(msh, lx, params, scheme, user)
178
179 call euler_rhs_factory(this%euler_rhs)
180
181 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
182 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
183
184 call this%drho%init(dm_xh, 'drho')
185 call this%dm_x%init(dm_xh, 'dm_x')
186 call this%dm_y%init(dm_xh, 'dm_y')
187 call this%dm_z%init(dm_xh, 'dm_z')
188 call this%dE%init(dm_xh, 'dE')
189 call this%h%init(dm_xh, 'h')
190
191 end associate
192
193 if (neko_bcknd_device .eq. 1) then
194 associate(p => this%p, rho => this%rho, &
195 u => this%u, v => this%v, w => this%w, &
196 m_x => this%m_x, m_y => this%m_y, m_z => this%m_z, &
197 effective_visc => this%effective_visc)
198 call device_memcpy(p%x, p%x_d, p%dof%size(), &
199 host_to_device, sync = .false.)
200 call device_memcpy(rho%x, rho%x_d, rho%dof%size(), &
201 host_to_device, sync = .false.)
202 call device_memcpy(u%x, u%x_d, u%dof%size(), &
203 host_to_device, sync = .false.)
204 call device_memcpy(v%x, v%x_d, v%dof%size(), &
205 host_to_device, sync = .false.)
206 call device_memcpy(w%x, w%x_d, w%dof%size(), &
207 host_to_device, sync = .false.)
208 call device_memcpy(m_x%x, m_x%x_d, m_x%dof%size(), &
209 host_to_device, sync = .false.)
210 call device_memcpy(m_y%x, m_y%x_d, m_y%dof%size(), &
211 host_to_device, sync = .false.)
212 call device_memcpy(m_z%x, m_z%x_d, m_z%dof%size(), &
213 host_to_device, sync = .false.)
214 call device_memcpy(effective_visc%x, effective_visc%x_d, &
215 effective_visc%dof%size(), host_to_device, sync = .false.)
216 end associate
217 end if
218
219 ! Initialize the diffusion operator
220 call ax_helm_factory(this%Ax, full_formulation = .false.)
221
222 ! Compute h
223 call this%compute_h()
224
225 ! Initialize regularization
226 call this%setup_regularization(params)
227
228 ! Initialize Runge-Kutta scheme
229 call json_get_or_default(params, 'case.numerics.time_order', rk_order, 4)
230 call this%rk_scheme%init(rk_order)
231
232 call neko_log%section("Fluid boundary conditions")
233 ! Set up boundary conditions
234 call this%setup_bcs(user, params)
235 call neko_log%end_section()
236
237 end subroutine fluid_scheme_compressible_euler_init
238
241 subroutine fluid_scheme_compressible_euler_free(this)
242 class(fluid_scheme_compressible_euler_t), intent(inout) :: this
243
244 call this%scheme_free()
245
246 if (allocated(this%Ax)) then
247 deallocate(this%Ax)
248 end if
249
250 if (allocated(this%euler_rhs)) then
251 deallocate(this%euler_rhs)
252 end if
253
254 call this%drho%free()
255 call this%dm_x%free()
256 call this%dm_y%free()
257 call this%dm_z%free()
258 call this%dE%free()
259 call this%h%free()
260
261 if (allocated(this%regularization)) then
262 call this%regularization%free()
263 deallocate(this%regularization)
264 end if
265
266 call this%bcs_density%free()
267
268 end subroutine fluid_scheme_compressible_euler_free
269
275 subroutine fluid_scheme_compressible_euler_step(this, time, dt_controller)
277 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
278 type(time_state_t), intent(in) :: time
279 type(time_step_controller_t), intent(in) :: dt_controller
280 type(field_t), pointer :: temp
281 integer :: temp_indices(1)
282 ! number of degrees of freedom
283 integer :: n
284 integer :: i
285 class(bc_t), pointer :: b
286
287 n = this%dm_Xh%size()
288 call neko_scratch_registry%request_field(temp, temp_indices(1), .false.)
289 b => null()
290
291 call profiler_start_region('Fluid compressible', 1)
292 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
293 m_x=> this%m_x, m_y => this%m_y, m_z => this%m_z, &
294 xh => this%Xh, msh => this%msh, ax => this%Ax, &
295 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
296 e => this%E, rho => this%rho, mu => this%mu, &
297 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
298 drho => this%drho, dm_x => this%dm_x, dm_y => this%dm_y, &
299 dm_z => this%dm_z, de => this%dE, &
300 euler_rhs => this%euler_rhs, h => this%h, &
301 t => time%t, tstep => time%tstep, dt => time%dt, &
302 c_avisc_low => this%c_avisc_low, rk_scheme => this%rk_scheme)
303
304 ! Compute artificial viscosity
305 call this%regularization%compute(time, time%tstep, time%dt)
306
307 ! Execute RHS step with effective viscosity field
308 call euler_rhs%step(rho, m_x, m_y, m_z, e, &
309 p, u, v, w, ax, &
310 c_xh, gs_xh, h, this%effective_visc, &
311 rk_scheme, dt)
312
314 call this%bcs_density%apply(rho, time)
315
317 ! Update u, v, w
318 if (neko_bcknd_device .eq. 1) then
319 call compressible_ops_device_update_uvw(u%x_d, v%x_d, w%x_d, &
320 m_x%x_d, m_y%x_d, m_z%x_d, rho%x_d, n)
321 else
322 call compressible_ops_cpu_update_uvw(u%x, v%x, w%x, &
323 m_x%x, m_y%x, m_z%x, rho%x, n)
324 end if
325
327 call this%bcs_vel%apply_vector(u%x, v%x, w%x, &
328 dm_xh%size(), time, strong = .true.)
329
331 if (neko_bcknd_device .eq. 1) then
332 call compressible_ops_device_update_mxyz_p_ruvw(m_x%x_d, m_y%x_d, &
333 m_z%x_d, p%x_d, temp%x_d, u%x_d, v%x_d, w%x_d, e%x_d, &
334 rho%x_d, this%gamma, n)
335 else
336 call compressible_ops_cpu_update_mxyz_p_ruvw(m_x%x, m_y%x, m_z%x, &
337 p%x, temp%x, u%x, v%x, w%x, e%x, rho%x, this%gamma, n)
338 end if
339
341 call this%bcs_prs%apply(p, time)
342
343
345 if (neko_bcknd_device .eq. 1) then
346 call compressible_ops_device_update_e(e%x_d, p%x_d, &
347 temp%x_d, this%gamma, n)
348 else
349 call compressible_ops_cpu_update_e(e%x, p%x, temp%x, this%gamma, n)
350 end if
351
352
354 call this%compute_entropy()
355
357 if (allocated(this%regularization)) then
358 select type (reg => this%regularization)
359 type is (entropy_viscosity_t)
360 call reg%update_lag()
361 end select
362 end if
363
365 call this%compute_max_wave_speed()
366
367 do i = 1, this%bcs_vel%size()
368 b => this%bcs_vel%get(i)
369 b%updated = .false.
370 end do
371
372 do i = 1, this%bcs_prs%size()
373 b => this%bcs_prs%get(i)
374 b%updated = .false.
375 end do
376
377 do i = 1, this%bcs_density%size()
378 b => this%bcs_density%get(i)
379 b%updated = .false.
380 end do
381 nullify(b)
382
383 end associate
384 call profiler_end_region('Fluid compressible', 1)
385
386 call neko_scratch_registry%relinquish_field(temp_indices)
387
388 end subroutine fluid_scheme_compressible_euler_step
389
394 subroutine fluid_scheme_compressible_euler_setup_bcs(this, user, params)
395 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
396 type(user_t), target, intent(in) :: user
397 type(json_file), intent(inout) :: params
398 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
399 class(bc_t), pointer :: bc_i
400 type(json_core) :: core
401 type(json_value), pointer :: bc_object
402 type(json_file) :: bc_subdict
403 logical :: found
404 integer, allocatable :: zone_indices(:)
405 character(len=LOG_SIZE) :: log_buf
406
407 ! Process boundary conditions
408 if (params%valid_path('case.fluid.boundary_conditions')) then
409 call params%info('case.fluid.boundary_conditions', n_children = n_bcs)
410 call params%get_core(core)
411 call params%get('case.fluid.boundary_conditions', bc_object, found)
412
413 !
414 ! Velocity bcs
415 !
416 call this%bcs_vel%init(n_bcs)
417
418 do i = 1, n_bcs
419 ! Extract BC configuration
420 call json_extract_item(core, bc_object, i, bc_subdict)
421 call json_get(bc_subdict, "zone_indices", zone_indices)
422
423 ! Validate zones
424 do j = 1, size(zone_indices)
425 zone_size = this%msh%labeled_zones(zone_indices(j))%size
426 call mpi_allreduce(zone_size, global_zone_size, 1, &
427 mpi_integer, mpi_max, neko_comm, ierr)
428
429 if (global_zone_size .eq. 0) then
430 write(log_buf, '(A,I0,A)') "Error: Zone ", zone_indices(j), &
431 " has zero size"
432 call neko_error(log_buf)
433 end if
434 end do
435
436 ! Create BC
437 bc_i => null()
438 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
439
440 ! Add to appropriate lists
441 if (associated(bc_i)) then
442 call this%bcs_vel%append(bc_i)
443 end if
444 end do
445
446 !
447 ! Pressure bcs
448 !
449 call this%bcs_prs%init(n_bcs)
450
451 do i = 1, n_bcs
452 ! Create a new json containing just the subdict for this bc
453 call json_extract_item(core, bc_object, i, bc_subdict)
454 bc_i => null()
455 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
456
457 ! Not all bcs require an allocation for pressure in particular,
458 ! so we check.
459 if (associated(bc_i)) then
460 call this%bcs_prs%append(bc_i)
461 end if
462 end do
463
464 !
465 ! Density bcs
466 !
467 call this%bcs_density%init(n_bcs)
468
469 do i = 1, n_bcs
470 ! Create a new json containing just the subdict for this bc
471 call json_extract_item(core, bc_object, i, bc_subdict)
472 bc_i => null()
473 call density_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
474
475 ! Not all bcs require an allocation for pressure in particular,
476 ! so we check.
477 if (associated(bc_i)) then
478 call this%bcs_density%append(bc_i)
479 end if
480 end do
481 else
482 ! Check that there are no labeled zones, i.e. all are periodic.
483 do i = 1, size(this%msh%labeled_zones)
484 if (this%msh%labeled_zones(i)%size .gt. 0) then
485 call neko_error("No boundary_conditions entry in the case file!")
486 end if
487 end do
488
489 ! For a pure periodic case, we still need to initilise the bc lists
490 ! to a zero size to avoid issues with apply() in step()
491 call this%bcs_prs%init()
492 call this%bcs_vel%init()
493 call this%bcs_density%init()
494
495 end if
496 end subroutine fluid_scheme_compressible_euler_setup_bcs
497
502 subroutine compute_h(this)
503 class(fluid_scheme_compressible_euler_t), intent(inout) :: this
504 integer :: lx, ly, lz
505
506 lx = this%c_Xh%Xh%lx
507 ly = this%c_Xh%Xh%ly
508 lz = this%c_Xh%Xh%lz
509 call compute_h_cpu(this%h%x, this%c_Xh%dof%x, this%c_Xh%dof%y, &
510 this%c_Xh%dof%z, lx, ly, lz, this%c_Xh%msh%nelv)
511
512 if (neko_bcknd_device .eq. 1) then
513 call device_memcpy(this%h%x, this%h%x_d, this%h%dof%size(),&
514 host_to_device, sync = .false.)
515 call this%gs_Xh%op(this%h, gs_op_add)
516 call device_col2(this%h%x_d, this%c_Xh%mult_d, this%h%dof%size())
517 else
518 call this%gs_Xh%op(this%h, gs_op_add)
519 call col2(this%h%x, this%c_Xh%mult, this%h%dof%size())
520 end if
521
522 end subroutine compute_h
523
524 subroutine compute_h_cpu(h, x, y, z, lx, ly, lz, nelv)
525 integer, intent(in) :: lx, ly, lz, nelv
526 real(kind=rp), intent(out) :: h(lx, ly, lz, nelv)
527 real(kind=rp), intent(in) :: x(lx, ly, lz, nelv)
528 real(kind=rp), intent(in) :: y(lx, ly, lz, nelv)
529 real(kind=rp), intent(in) :: z(lx, ly, lz, nelv)
530 integer :: e, i, j, k
531 integer :: im, ip, jm, jp, km, kp
532 real(kind=rp) :: di, dj, dk
533
534 !$omp parallel do private(i, j, k, im, ip, jm, jp, km, kp, di, dj, dk)
535 do e = 1, nelv
536 do k = 1, lz
537 km = max(1, k - 1)
538 kp = min(lz, k + 1)
539 do j = 1, ly
540 jm = max(1, j - 1)
541 jp = min(ly, j + 1)
542 do i = 1, lx
543 im = max(1, i - 1)
544 ip = min(lx, i + 1)
545
546 di = (x(ip, j, k, e) - x(im, j, k, e))**2 &
547 + (y(ip, j, k, e) - y(im, j, k, e))**2 &
548 + (z(ip, j, k, e) - z(im, j, k, e))**2
549
550 dj = (x(i, jp, k, e) - x(i, jm, k, e))**2 &
551 + (y(i, jp, k, e) - y(i, jm, k, e))**2 &
552 + (z(i, jp, k, e) - z(i, jm, k, e))**2
553
554 dk = (x(i, j, kp, e) - x(i, j, km, e))**2 &
555 + (y(i, j, kp, e) - y(i, j, km, e))**2 &
556 + (z(i, j, kp, e) - z(i, j, km, e))**2
557
558 di = sqrt(di) / (ip - im)
559 dj = sqrt(dj) / (jp - jm)
560 dk = sqrt(dk) / (kp - km)
561 h(i,j,k,e) = (di * dj * dk)**(1.0_rp / 3.0_rp)
562 end do
563 end do
564 end do
565 end do
566 !$omp end parallel do
567 end subroutine compute_h_cpu
568
573 subroutine fluid_scheme_compressible_euler_restart(this, chkp)
574 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
575 type(chkp_t), intent(inout) :: chkp
576 end subroutine fluid_scheme_compressible_euler_restart
577
578 subroutine setup_regularization(this, params)
581 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
582 type(json_file), intent(inout) :: params
583 type(json_file) :: reg_json
584 type(json_core) :: json_core_inst
585 type(json_value), pointer :: reg_params
586 character(len=:), allocatable :: buffer
587 real(kind=rp) :: c_avisc_entropy_val
588 character(len=:), allocatable :: regularization_type
589
590 call json_get_or_default(params, 'case.numerics.c_avisc_low', &
591 this%c_avisc_low, 0.5_rp)
592 call json_get_or_default(params, 'case.numerics.c_avisc_entropy', &
593 c_avisc_entropy_val, 1.0_rp)
594
595 call json_core_inst%initialize()
596 call json_core_inst%create_object(reg_params, '')
597 call json_core_inst%add(reg_params, 'c_avisc_entropy', c_avisc_entropy_val)
598 call json_core_inst%add(reg_params, 'c_avisc_low', this%c_avisc_low)
599 call json_core_inst%print_to_string(reg_params, buffer)
600 call json_core_inst%destroy(reg_params)
601
602 call reg_json%initialize()
603 call reg_json%load_from_string(buffer)
604
605 regularization_type = 'entropy_viscosity'
606
607 call regularization_factory(this%regularization, regularization_type, &
608 reg_json, this%c_Xh, this%dm_Xh, this%effective_visc)
609
610 select type (reg => this%regularization)
611 type is (entropy_viscosity_t)
612 call entropy_viscosity_set_fields(reg, this%S, this%u, this%v, this%w, &
613 this%h, this%max_wave_speed, this%msh, this%Xh, this%gs_Xh)
614 end select
615
616 call reg_json%destroy()
617
618 end subroutine setup_regularization
619
Copy data between host and device (or device and device)
Definition device.F90:72
Abstract interface to evaluate rhs.
Definition euler_res.f90:51
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:85
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.
Generic buffer that is extended with buffers of varying rank.
Definition buffer.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:45
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_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.
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:48
subroutine, public entropy_viscosity_set_fields(this, s, u, v, w, h, max_wave_speed, msh, xh, gs)
Contains the field_serties_t type.
Defines a field.
Definition field.f90:34
subroutine compute_h(this)
Copied from les_model_compute_delta in les_model.f90 TODO: move to a separate module Compute characte...
subroutine fluid_scheme_compressible_euler_init(this, msh, lx, params, user, chkp)
Boundary condition factory for density.
subroutine fluid_scheme_compressible_euler_step(this, time, dt_controller)
Advance the fluid simulation one timestep.
subroutine fluid_scheme_compressible_euler_free(this)
Free allocated memory and cleanup.
subroutine fluid_scheme_compressible_euler_restart(this, chkp)
Restart the simulation from saved state.
subroutine fluid_scheme_compressible_euler_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_add
Definition gs_ops.f90:36
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:80
integer, parameter, public log_size
Definition log.f90:46
Definition math.f90:60
subroutine, public col2(a, b, n)
Vector multiplication .
Definition math.f90:1044
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
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:365
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
Implicit backward-differencing scheme for time integration.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:63
Abstract type to compute rhs.
Definition euler_res.f90:44
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
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...
#define max(a, b)
Definition tensor.cu:40