Neko 1.99.6
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 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 compressible_residual, only : compressible_rhs_t, compressible_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
74 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_max
75 use regularization, only : regularization_t, regularization_factory
76 implicit none
77 private
78
79 type, public, extends(fluid_scheme_compressible_t) &
81 type(field_t) :: rho_res, m_x_res, m_y_res, m_z_res, m_e_res
82 type(field_t) :: drho, dm_x, dm_y, dm_z, de
83 type(field_t) :: h
84 real(kind=rp) :: c_avisc_low
85 class(advection_t), allocatable :: adv
86 class(ax_t), allocatable :: ax
87 class(ax_t), allocatable :: ax_stress
88 class(compressible_rhs_t), allocatable :: compressible_rhs
89 type(runge_kutta_time_scheme_t) :: rk_scheme
90
91 class(regularization_t), allocatable :: regularization
92
93 ! List of boundary conditions for velocity
94 type(bc_list_t) :: bcs_density
95
96 contains
97 procedure, pass(this) :: init => fluid_scheme_compressible_ns_init
98 procedure, pass(this) :: free => fluid_scheme_compressible_ns_free
99 procedure, pass(this) :: step => fluid_scheme_compressible_ns_step
100 procedure, pass(this) :: restart => fluid_scheme_compressible_ns_restart
102 procedure, pass(this) :: setup_bcs &
104 procedure, pass(this) :: compute_h
105 procedure, pass(this), private :: setup_regularization
107
108 interface
109
116 module subroutine density_bc_factory(object, scheme, json, coef, user)
117 class(bc_t), pointer, intent(inout) :: object
118 type(fluid_scheme_compressible_ns_t), intent(in) :: scheme
119 type(json_file), intent(inout) :: json
120 type(coef_t), intent(in) :: coef
121 type(user_t), intent(in) :: user
122 end subroutine density_bc_factory
123 end interface
124
125 interface
126
133 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
134 class(bc_t), pointer, intent(inout) :: object
135 type(fluid_scheme_compressible_ns_t), intent(inout) :: scheme
136 type(json_file), intent(inout) :: json
137 type(coef_t), intent(in) :: coef
138 type(user_t), intent(in) :: user
139 end subroutine pressure_bc_factory
140 end interface
141
142 interface
143
150 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
151 class(bc_t), pointer, intent(inout) :: object
152 type(fluid_scheme_compressible_ns_t), intent(in) :: scheme
153 type(json_file), intent(inout) :: json
154 type(coef_t), intent(in) :: coef
155 type(user_t), intent(in) :: user
156 end subroutine velocity_bc_factory
157 end interface
158
159contains
167 subroutine fluid_scheme_compressible_ns_init(this, msh, lx, params, user, &
168 chkp)
169 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
170 type(mesh_t), target, intent(inout) :: msh
171 integer, intent(in) :: lx
172 type(json_file), target, intent(inout) :: params
173 type(user_t), target, intent(in) :: user
174 type(chkp_t), target, intent(inout) :: chkp
175 character(len=12), parameter :: scheme = 'compressible'
176 integer :: rk_order
177
178 call this%free()
179
180 ! Initialize base class
181 call this%scheme_init(msh, lx, params, scheme, user)
182
183 call compressible_rhs_factory(this%compressible_rhs, this%gamma)
184
185 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
186 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
187
188 call this%drho%init(dm_xh, 'drho')
189 call this%dm_x%init(dm_xh, 'dm_x')
190 call this%dm_y%init(dm_xh, 'dm_y')
191 call this%dm_z%init(dm_xh, 'dm_z')
192 call this%dE%init(dm_xh, 'dE')
193 call this%h%init(dm_xh, 'h')
194
195 end associate
196
197 if (neko_bcknd_device .eq. 1) then
198 associate(p => this%p, rho => this%rho, &
199 u => this%u, v => this%v, w => this%w, &
200 m_x => this%m_x, m_y => this%m_y, m_z => this%m_z, &
201 artificial_visc => this%artificial_visc)
202 call device_memcpy(p%x, p%x_d, p%dof%size(), &
203 host_to_device, sync = .false.)
204 call device_memcpy(rho%x, rho%x_d, rho%dof%size(), &
205 host_to_device, sync = .false.)
206 call device_memcpy(u%x, u%x_d, u%dof%size(), &
207 host_to_device, sync = .false.)
208 call device_memcpy(v%x, v%x_d, v%dof%size(), &
209 host_to_device, sync = .false.)
210 call device_memcpy(w%x, w%x_d, w%dof%size(), &
211 host_to_device, sync = .false.)
212 call device_memcpy(m_x%x, m_x%x_d, m_x%dof%size(), &
213 host_to_device, sync = .false.)
214 call device_memcpy(m_y%x, m_y%x_d, m_y%dof%size(), &
215 host_to_device, sync = .false.)
216 call device_memcpy(m_z%x, m_z%x_d, m_z%dof%size(), &
217 host_to_device, sync = .false.)
218 call device_memcpy(artificial_visc%x, artificial_visc%x_d, &
219 artificial_visc%dof%size(), host_to_device, sync = .false.)
220 end associate
221 end if
222
223 ! Initialize the diffusion operators
224 call ax_helm_factory(this%Ax, full_formulation = .false.)
225 call ax_helm_factory(this%Ax_stress, full_formulation = .true.)
226
227 ! Compute h
228 call this%compute_h()
229
230 ! Initialize regularization
231 call this%setup_regularization(params)
232
233 ! Initialize Runge-Kutta scheme
234 call json_get_or_default(params, 'case.numerics.time_order', rk_order, 4)
235 call this%rk_scheme%init(rk_order)
236
237 call neko_log%section("Fluid boundary conditions")
238 ! Set up boundary conditions
239 call this%setup_bcs(user, params)
240 call neko_log%end_section()
241
242 end subroutine fluid_scheme_compressible_ns_init
243
246 subroutine fluid_scheme_compressible_ns_free(this)
247 class(fluid_scheme_compressible_ns_t), intent(inout) :: this
248 class(bc_t), pointer :: bc
249 integer :: i
250
251 call this%scheme_free()
252
253 if (allocated(this%Ax)) then
254 deallocate(this%Ax)
255 end if
256
257 if (allocated(this%Ax_stress)) then
258 deallocate(this%Ax_stress)
259 end if
260
261 if (allocated(this%compressible_rhs)) then
262 deallocate(this%compressible_rhs)
263 end if
264
265 call this%drho%free()
266 call this%dm_x%free()
267 call this%dm_y%free()
268 call this%dm_z%free()
269 call this%dE%free()
270 call this%h%free()
271
272 if (allocated(this%regularization)) then
273 call this%regularization%free()
274 deallocate(this%regularization)
275 end if
276
277 do i = 1, this%bcs_density%size()
278 bc => this%bcs_density%get(i)
279 if (associated(bc)) then
280 call bc%free()
281 deallocate(bc)
282 end if
283 end do
284 call this%bcs_density%free()
285
286 end subroutine fluid_scheme_compressible_ns_free
287
293 subroutine fluid_scheme_compressible_ns_step(this, time, dt_controller)
295 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
296 type(time_state_t), intent(in) :: time
297 type(time_step_controller_t), intent(in) :: dt_controller
298 type(field_t), pointer :: temp
299 integer :: temp_indices(1)
300 ! number of degrees of freedom
301 integer :: n
302 integer :: i
303 class(bc_t), pointer :: b
304
305 n = this%dm_Xh%size()
306 call neko_scratch_registry%request_field(temp, temp_indices(1), .false.)
307 b => null()
308
309 call profiler_start_region('Fluid compressible', 1)
310 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
311 m_x=> this%m_x, m_y => this%m_y, m_z => this%m_z, &
312 xh => this%Xh, msh => this%msh, ax => this%Ax, &
313 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
314 e => this%E, rho => this%rho, mu => this%mu, &
315 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
316 drho => this%drho, dm_x => this%dm_x, dm_y => this%dm_y, &
317 dm_z => this%dm_z, de => this%dE, &
318 compressible_rhs => this%compressible_rhs, h => this%h, &
319 t => time%t, tstep => time%tstep, dt => time%dt, &
320 c_avisc_low => this%c_avisc_low, rk_scheme => this%rk_scheme)
321
322 ! Compute artificial viscosity
323 call this%regularization%compute(time, time%tstep, time%dt)
324
325 ! Refresh user-specified physical viscosity/conductivity before RHS.
326 call this%update_material_properties(time)
327
328 ! Execute RHS step with artificial viscosity field
329 call compressible_rhs%step(rho, m_x, m_y, m_z, e, &
330 p, u, v, w, this%Ax, &
331 this%Ax_stress, c_xh, gs_xh, h, this%artificial_visc, this%mu, &
332 this%kappa, this%bcs_vel, time, rk_scheme, dt)
333
335 call this%bcs_density%apply(rho, time)
336
338 ! Update u, v, w
339 if (neko_bcknd_device .eq. 1) then
340 call compressible_ops_device_update_uvw(u%x_d, v%x_d, w%x_d, &
341 m_x%x_d, m_y%x_d, m_z%x_d, rho%x_d, n)
342 else
343 call compressible_ops_cpu_update_uvw(u%x, v%x, w%x, &
344 m_x%x, m_y%x, m_z%x, rho%x, n)
345 end if
346
348 call this%bcs_vel%apply_vector(u%x, v%x, w%x, &
349 dm_xh%size(), time, strong = .true.)
350
352 if (neko_bcknd_device .eq. 1) then
353 call compressible_ops_device_update_mxyz_p_ruvw(m_x%x_d, m_y%x_d, &
354 m_z%x_d, p%x_d, temp%x_d, u%x_d, v%x_d, w%x_d, e%x_d, &
355 rho%x_d, this%gamma, n)
356 else
357 call compressible_ops_cpu_update_mxyz_p_ruvw(m_x%x, m_y%x, m_z%x, &
358 p%x, temp%x, u%x, v%x, w%x, e%x, rho%x, this%gamma, n)
359 end if
360
362 call this%bcs_prs%apply(p, time)
363
364
366 if (neko_bcknd_device .eq. 1) then
367 call compressible_ops_device_update_e(e%x_d, p%x_d, &
368 temp%x_d, this%gamma, n)
369 else
370 call compressible_ops_cpu_update_e(e%x, p%x, temp%x, this%gamma, n)
371 end if
372
374 if (neko_bcknd_device .eq. 1) then
375 call compressible_ops_device_update_temperature( &
376 this%temperature%x_d, p%x_d, rho%x_d, this%gamma, n)
377 else
378 !OCL NORECURRENCE, NOVREC, NOALIAS
379 !DIR$ CONCURRENT
380 !DIR$ IVDEP
381 !GCC$ ivdep
382 !$omp parallel do simd
383 do i = 1, n
384 this%temperature%x(i,1,1,1) = p%x(i,1,1,1) / &
385 (rho%x(i,1,1,1) * (this%gamma - 1.0_rp))
386 end do
387 !$omp end parallel do simd
388 end if
389
393 if (allocated(this%regularization)) then
394 select type (reg => this%regularization)
395 type is (entropy_viscosity_t)
396 call reg%update_lag()
397 end select
398 end if
399
401 call this%compute_entropy()
402
404 call this%compute_max_wave_speed()
405
406 do i = 1, this%bcs_vel%size()
407 b => this%bcs_vel%get(i)
408 b%updated = .false.
409 end do
410
411 do i = 1, this%bcs_prs%size()
412 b => this%bcs_prs%get(i)
413 b%updated = .false.
414 end do
415
416 do i = 1, this%bcs_density%size()
417 b => this%bcs_density%get(i)
418 b%updated = .false.
419 end do
420 nullify(b)
421
422 end associate
423 call profiler_end_region('Fluid compressible', 1)
424
425 call neko_scratch_registry%relinquish_field(temp_indices)
426
427 end subroutine fluid_scheme_compressible_ns_step
428
433 subroutine fluid_scheme_compressible_ns_setup_bcs(this, user, params)
434 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
435 type(user_t), target, intent(in) :: user
436 type(json_file), intent(inout) :: params
437 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
438 class(bc_t), pointer :: bc_i
439 type(json_core) :: core
440 type(json_value), pointer :: bc_object
441 type(json_file) :: bc_subdict
442 logical :: found
443 integer, allocatable :: zone_indices(:)
444 character(len=LOG_SIZE) :: log_buf
445
446 ! Process boundary conditions
447 if (params%valid_path('case.fluid.boundary_conditions')) then
448 call params%info('case.fluid.boundary_conditions', n_children = n_bcs)
449 call params%get_core(core)
450 call params%get('case.fluid.boundary_conditions', bc_object, found)
451
452 !
453 ! Velocity bcs
454 !
455 call this%bcs_vel%init(n_bcs)
456
457 do i = 1, n_bcs
458 ! Extract BC configuration
459 call json_extract_item(core, bc_object, i, bc_subdict)
460 call json_get(bc_subdict, "zone_indices", zone_indices)
461
462 ! Validate zones
463 do j = 1, size(zone_indices)
464 zone_size = this%msh%labeled_zones(zone_indices(j))%size
465 call mpi_allreduce(zone_size, global_zone_size, 1, &
466 mpi_integer, mpi_max, neko_comm, ierr)
467
468 if (global_zone_size .eq. 0) then
469 write(log_buf, '(A,I0,A)') "Error: Zone ", zone_indices(j), &
470 " has zero size"
471 call neko_error(log_buf)
472 end if
473 end do
474
475 ! Create BC
476 bc_i => null()
477 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
478
479 ! Add to appropriate lists
480 if (associated(bc_i)) then
481 call this%bcs_vel%append(bc_i)
482 end if
483 end do
484
485 !
486 ! Pressure bcs
487 !
488 call this%bcs_prs%init(n_bcs)
489
490 do i = 1, n_bcs
491 ! Create a new json containing just the subdict for this bc
492 call json_extract_item(core, bc_object, i, bc_subdict)
493 bc_i => null()
494 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
495
496 ! Not all bcs require an allocation for pressure in particular,
497 ! so we check.
498 if (associated(bc_i)) then
499 call this%bcs_prs%append(bc_i)
500 end if
501 end do
502
503 !
504 ! Density bcs
505 !
506 call this%bcs_density%init(n_bcs)
507
508 do i = 1, n_bcs
509 ! Create a new json containing just the subdict for this bc
510 call json_extract_item(core, bc_object, i, bc_subdict)
511 bc_i => null()
512 call density_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
513
514 ! Not all bcs require an allocation for pressure in particular,
515 ! so we check.
516 if (associated(bc_i)) then
517 call this%bcs_density%append(bc_i)
518 end if
519 end do
520 else
521 ! Check that there are no labeled zones, i.e. all are periodic.
522 do i = 1, size(this%msh%labeled_zones)
523 if (this%msh%labeled_zones(i)%size .gt. 0) then
524 call neko_error("No boundary_conditions entry in the case file!")
525 end if
526 end do
527
528 ! For a pure periodic case, we still need to initilise the bc lists
529 ! to a zero size to avoid issues with apply() in step()
530 call this%bcs_prs%init()
531 call this%bcs_vel%init()
532 call this%bcs_density%init()
533
534 end if
535 end subroutine fluid_scheme_compressible_ns_setup_bcs
536
541 subroutine compute_h(this)
542 class(fluid_scheme_compressible_ns_t), intent(inout) :: this
543 integer :: lx, ly, lz
544
545 lx = this%c_Xh%Xh%lx
546 ly = this%c_Xh%Xh%ly
547 lz = this%c_Xh%Xh%lz
548 call compute_h_cpu(this%h%x, this%c_Xh%dof%x, this%c_Xh%dof%y, &
549 this%c_Xh%dof%z, lx, ly, lz, this%c_Xh%msh%nelv)
550
551 if (neko_bcknd_device .eq. 1) then
552 call device_memcpy(this%h%x, this%h%x_d, this%h%dof%size(),&
553 host_to_device, sync = .false.)
554 call this%gs_Xh%op(this%h, gs_op_add)
555 call device_col2(this%h%x_d, this%c_Xh%mult_d, this%h%dof%size())
556 else
557 call this%gs_Xh%op(this%h, gs_op_add)
558 call col2(this%h%x, this%c_Xh%mult, this%h%dof%size())
559 end if
560
561 end subroutine compute_h
562
563 subroutine compute_h_cpu(h, x, y, z, lx, ly, lz, nelv)
564 integer, intent(in) :: lx, ly, lz, nelv
565 real(kind=rp), intent(out) :: h(lx, ly, lz, nelv)
566 real(kind=rp), intent(in) :: x(lx, ly, lz, nelv)
567 real(kind=rp), intent(in) :: y(lx, ly, lz, nelv)
568 real(kind=rp), intent(in) :: z(lx, ly, lz, nelv)
569 integer :: e, i, j, k
570 integer :: im, ip, jm, jp, km, kp
571 real(kind=rp) :: di, dj, dk
572
573 !$omp parallel do private(i, j, k, im, ip, jm, jp, km, kp, di, dj, dk)
574 do e = 1, nelv
575 do k = 1, lz
576 km = max(1, k - 1)
577 kp = min(lz, k + 1)
578 do j = 1, ly
579 jm = max(1, j - 1)
580 jp = min(ly, j + 1)
581 do i = 1, lx
582 im = max(1, i - 1)
583 ip = min(lx, i + 1)
584
585 di = (x(ip, j, k, e) - x(im, j, k, e))**2 &
586 + (y(ip, j, k, e) - y(im, j, k, e))**2 &
587 + (z(ip, j, k, e) - z(im, j, k, e))**2
588
589 dj = (x(i, jp, k, e) - x(i, jm, k, e))**2 &
590 + (y(i, jp, k, e) - y(i, jm, k, e))**2 &
591 + (z(i, jp, k, e) - z(i, jm, k, e))**2
592
593 dk = (x(i, j, kp, e) - x(i, j, km, e))**2 &
594 + (y(i, j, kp, e) - y(i, j, km, e))**2 &
595 + (z(i, j, kp, e) - z(i, j, km, e))**2
596
597 di = sqrt(di) / (ip - im)
598 dj = sqrt(dj) / (jp - jm)
599 dk = sqrt(dk) / (kp - km)
600 h(i,j,k,e) = (di * dj * dk)**(1.0_rp / 3.0_rp)
601 end do
602 end do
603 end do
604 end do
605 !$omp end parallel do
606 end subroutine compute_h_cpu
607
612 subroutine fluid_scheme_compressible_ns_restart(this, chkp)
613 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
614 type(chkp_t), intent(inout) :: chkp
615 end subroutine fluid_scheme_compressible_ns_restart
616
617 subroutine setup_regularization(this, params)
620 class(fluid_scheme_compressible_ns_t), target, intent(inout) :: this
621 type(json_file), intent(inout) :: params
622 type(json_file) :: reg_json
623 type(json_core) :: json_core_inst
624 type(json_value), pointer :: reg_params
625 character(len=:), allocatable :: buffer
626 real(kind=rp) :: c_avisc_entropy_val
627 character(len=:), allocatable :: regularization_type
628
629 call json_get_or_default(params, 'case.numerics.c_avisc_low', &
630 this%c_avisc_low, 0.5_rp)
631 call json_get_or_default(params, 'case.numerics.c_avisc_entropy', &
632 c_avisc_entropy_val, 1.0_rp)
633
634 call json_core_inst%initialize()
635 call json_core_inst%create_object(reg_params, '')
636 call json_core_inst%add(reg_params, 'c_avisc_entropy', c_avisc_entropy_val)
637 call json_core_inst%add(reg_params, 'c_avisc_low', this%c_avisc_low)
638 call json_core_inst%print_to_string(reg_params, buffer)
639 call json_core_inst%destroy(reg_params)
640
641 call reg_json%initialize()
642 call reg_json%load_from_string(buffer)
643
644 regularization_type = 'entropy_viscosity'
645
646 call regularization_factory(this%regularization, regularization_type, &
647 reg_json, this%c_Xh, this%dm_Xh, this%artificial_visc)
648
649 select type (reg => this%regularization)
650 type is (entropy_viscosity_t)
651 call entropy_viscosity_set_fields(reg, this%S, this%u, this%v, this%w, &
652 this%h, this%max_wave_speed, this%msh, this%Xh, this%gs_Xh)
653 end select
654
655 call reg_json%destroy()
656
657 end subroutine setup_regularization
658
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: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: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.
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_ns_restart(this, chkp)
Restart the simulation from saved state.
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_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:1046
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
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...
#define max(a, b)
Definition tensor.cu:40