Neko 1.99.2
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, 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
65 use time_state, only : time_state_t
71 use mpi_f08, only : mpi_allreduce, mpi_integer, mpi_max
72 use regularization, only: regularization_t, regularization_factory
73 implicit none
74 private
75
76 type, public, extends(fluid_scheme_compressible_t) &
78 type(field_t) :: rho_res, m_x_res, m_y_res, m_z_res, m_e_res
79 type(field_t) :: drho, dm_x, dm_y, dm_z, de
80 type(field_t) :: h
81 real(kind=rp) :: c_avisc_low
82 class(advection_t), allocatable :: adv
83 class(ax_t), allocatable :: ax
84 class(euler_rhs_t), allocatable :: euler_rhs
85 type(runge_kutta_time_scheme_t) :: rk_scheme
86
87 class(regularization_t), allocatable :: regularization
88
89 ! List of boundary conditions for velocity
90 type(bc_list_t) :: bcs_density
91 contains
92 procedure, pass(this) :: init => fluid_scheme_compressible_euler_init
93 procedure, pass(this) :: free => fluid_scheme_compressible_euler_free
94 procedure, pass(this) :: step => fluid_scheme_compressible_euler_step
95 procedure, pass(this) :: restart => fluid_scheme_compressible_euler_restart
97 procedure, pass(this) :: setup_bcs &
99 procedure, pass(this) :: compute_h
100 procedure, pass(this), private :: setup_regularization
102
103 interface
104
111 module subroutine density_bc_factory(object, scheme, json, coef, user)
112 class(bc_t), pointer, intent(inout) :: object
113 type(fluid_scheme_compressible_euler_t), intent(in) :: scheme
114 type(json_file), intent(inout) :: json
115 type(coef_t), intent(in) :: coef
116 type(user_t), intent(in) :: user
117 end subroutine density_bc_factory
118 end interface
119
120 interface
121
128 module subroutine pressure_bc_factory(object, scheme, json, coef, user)
129 class(bc_t), pointer, intent(inout) :: object
130 type(fluid_scheme_compressible_euler_t), intent(inout) :: scheme
131 type(json_file), intent(inout) :: json
132 type(coef_t), intent(in) :: coef
133 type(user_t), intent(in) :: user
134 end subroutine pressure_bc_factory
135 end interface
136
137 interface
138
145 module subroutine velocity_bc_factory(object, scheme, json, coef, user)
146 class(bc_t), pointer, intent(inout) :: object
147 type(fluid_scheme_compressible_euler_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 velocity_bc_factory
152 end interface
153
154contains
162 subroutine fluid_scheme_compressible_euler_init(this, msh, lx, params, user, &
163 chkp)
164 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
165 type(mesh_t), target, intent(inout) :: msh
166 integer, intent(in) :: lx
167 type(json_file), target, intent(inout) :: params
168 type(user_t), target, intent(in) :: user
169 type(chkp_t), target, intent(inout) :: chkp
170 character(len=12), parameter :: scheme = 'compressible'
171 integer :: rk_order
172
173 call this%free()
174
175 ! Initialize base class
176 call this%scheme_init(msh, lx, params, scheme, user)
177
178 call euler_rhs_factory(this%euler_rhs)
179
180 associate(xh_lx => this%Xh%lx, xh_ly => this%Xh%ly, xh_lz => this%Xh%lz, &
181 dm_xh => this%dm_Xh, nelv => this%msh%nelv)
182
183 call this%drho%init(dm_xh, 'drho')
184 call this%dm_x%init(dm_xh, 'dm_x')
185 call this%dm_y%init(dm_xh, 'dm_y')
186 call this%dm_z%init(dm_xh, 'dm_z')
187 call this%dE%init(dm_xh, 'dE')
188 call this%h%init(dm_xh, 'h')
189
190 end associate
191
192 if (neko_bcknd_device .eq. 1) then
193 associate(p => this%p, rho => this%rho, &
194 u => this%u, v => this%v, w => this%w, &
195 m_x => this%m_x, m_y => this%m_y, m_z => this%m_z, &
196 effective_visc => this%effective_visc)
197 call device_memcpy(p%x, p%x_d, p%dof%size(), &
198 host_to_device, sync = .false.)
199 call device_memcpy(rho%x, rho%x_d, rho%dof%size(), &
200 host_to_device, sync = .false.)
201 call device_memcpy(u%x, u%x_d, u%dof%size(), &
202 host_to_device, sync = .false.)
203 call device_memcpy(v%x, v%x_d, v%dof%size(), &
204 host_to_device, sync = .false.)
205 call device_memcpy(w%x, w%x_d, w%dof%size(), &
206 host_to_device, sync = .false.)
207 call device_memcpy(m_x%x, m_x%x_d, m_x%dof%size(), &
208 host_to_device, sync = .false.)
209 call device_memcpy(m_y%x, m_y%x_d, m_y%dof%size(), &
210 host_to_device, sync = .false.)
211 call device_memcpy(m_z%x, m_z%x_d, m_z%dof%size(), &
212 host_to_device, sync = .false.)
213 call device_memcpy(effective_visc%x, effective_visc%x_d, effective_visc%dof%size(), &
214 host_to_device, sync = .false.)
215 end associate
216 end if
217
218 ! Initialize the diffusion operator
219 call ax_helm_factory(this%Ax, full_formulation = .false.)
220
221 ! Compute h
222 call this%compute_h()
223
224 ! Initialize regularization
225 call this%setup_regularization(params)
226
227 ! Initialize Runge-Kutta scheme
228 call json_get_or_default(params, 'case.numerics.time_order', rk_order, 4)
229 call this%rk_scheme%init(rk_order)
230
231 ! Set up boundary conditions
232 call this%setup_bcs(user, params)
233
234 end subroutine fluid_scheme_compressible_euler_init
235
238 subroutine fluid_scheme_compressible_euler_free(this)
239 class(fluid_scheme_compressible_euler_t), intent(inout) :: this
240
241 call this%scheme_free()
242
243 if (allocated(this%Ax)) then
244 deallocate(this%Ax)
245 end if
246
247 if (allocated(this%euler_rhs)) then
248 deallocate(this%euler_rhs)
249 end if
250
251 call this%drho%free()
252 call this%dm_x%free()
253 call this%dm_y%free()
254 call this%dm_z%free()
255 call this%dE%free()
256 call this%h%free()
257
258 if (allocated(this%regularization)) then
259 call this%regularization%free()
260 deallocate(this%regularization)
261 end if
262
263 call this%bcs_density%free()
264
265 end subroutine fluid_scheme_compressible_euler_free
266
272 subroutine fluid_scheme_compressible_euler_step(this, time, dt_controller)
274 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
275 type(time_state_t), intent(in) :: time
276 type(time_step_controller_t), intent(in) :: dt_controller
277 type(field_t), pointer :: temp
278 integer :: temp_indices(1)
279 ! number of degrees of freedom
280 integer :: n
281 integer :: i
282 class(bc_t), pointer :: b
283
284 n = this%dm_Xh%size()
285 call neko_scratch_registry%request_field(temp, temp_indices(1), .false.)
286 b => null()
287
288 call profiler_start_region('Fluid compressible', 1)
289 associate(u => this%u, v => this%v, w => this%w, p => this%p, &
290 m_x=> this%m_x, m_y => this%m_y, m_z => this%m_z, &
291 xh => this%Xh, msh => this%msh, ax => this%Ax, &
292 c_xh => this%c_Xh, dm_xh => this%dm_Xh, gs_xh => this%gs_Xh, &
293 e => this%E, rho => this%rho, mu => this%mu, &
294 f_x => this%f_x, f_y => this%f_y, f_z => this%f_z, &
295 drho => this%drho, dm_x => this%dm_x, dm_y => this%dm_y, &
296 dm_z => this%dm_z, de => this%dE, &
297 euler_rhs => this%euler_rhs, h => this%h, &
298 t => time%t, tstep => time%tstep, dt => time%dt, &
299 c_avisc_low => this%c_avisc_low, rk_scheme => this%rk_scheme)
300
301 ! Compute artificial viscosity
302 call this%regularization%compute(time, time%tstep, time%dt)
303
304 ! Execute RHS step with effective viscosity field
305 call euler_rhs%step(rho, m_x, m_y, m_z, e, &
306 p, u, v, w, ax, &
307 c_xh, gs_xh, h, this%effective_visc, &
308 rk_scheme, dt)
309
311 call this%bcs_density%apply(rho, time)
312
314 ! Update u, v, w
315 if (neko_bcknd_device .eq. 1) then
316 call compressible_ops_device_update_uvw(u%x_d, v%x_d, w%x_d, &
317 m_x%x_d, m_y%x_d, m_z%x_d, rho%x_d, n)
318 else
319 call compressible_ops_cpu_update_uvw(u%x, v%x, w%x, &
320 m_x%x, m_y%x, m_z%x, rho%x, n)
321 end if
322
324 call this%bcs_vel%apply_vector(u%x, v%x, w%x, &
325 dm_xh%size(), time, strong = .true.)
326
328 if (neko_bcknd_device .eq. 1) then
329 call compressible_ops_device_update_mxyz_p_ruvw(m_x%x_d, m_y%x_d, &
330 m_z%x_d, p%x_d, temp%x_d, u%x_d, v%x_d, w%x_d, e%x_d, &
331 rho%x_d, this%gamma, n)
332 else
333 call compressible_ops_cpu_update_mxyz_p_ruvw(m_x%x, m_y%x, m_z%x, &
334 p%x, temp%x, u%x, v%x, w%x, e%x, rho%x, this%gamma, n)
335 end if
336
338 call this%bcs_prs%apply(p, time)
339
340
342 if (neko_bcknd_device .eq. 1) then
343 call compressible_ops_device_update_e(e%x_d, p%x_d, &
344 temp%x_d, this%gamma, n)
345 else
346 call compressible_ops_cpu_update_e(e%x, p%x, temp%x, this%gamma, n)
347 end if
348
349
351 call this%compute_entropy()
352
354 if (allocated(this%regularization)) then
355 select type (reg => this%regularization)
356 type is (entropy_viscosity_t)
357 call reg%update_lag()
358 end select
359 end if
360
362 call this%compute_max_wave_speed()
363
364 do i = 1, this%bcs_vel%size()
365 b => this%bcs_vel%get(i)
366 b%updated = .false.
367 end do
368
369 do i = 1, this%bcs_prs%size()
370 b => this%bcs_prs%get(i)
371 b%updated = .false.
372 end do
373
374 do i = 1, this%bcs_density%size()
375 b => this%bcs_density%get(i)
376 b%updated = .false.
377 end do
378 nullify(b)
379
380 end associate
381 call profiler_end_region('Fluid compressible', 1)
382
383 call neko_scratch_registry%relinquish_field(temp_indices)
384
385 end subroutine fluid_scheme_compressible_euler_step
386
391 subroutine fluid_scheme_compressible_euler_setup_bcs(this, user, params)
392 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
393 type(user_t), target, intent(in) :: user
394 type(json_file), intent(inout) :: params
395 integer :: i, n_bcs, zone_index, j, zone_size, global_zone_size, ierr
396 class(bc_t), pointer :: bc_i
397 type(json_core) :: core
398 type(json_value), pointer :: bc_object
399 type(json_file) :: bc_subdict
400 logical :: found
401 integer, allocatable :: zone_indices(:)
402 character(len=LOG_SIZE) :: log_buf
403
404 ! Process boundary conditions
405 if (params%valid_path('case.fluid.boundary_conditions')) then
406 call params%info('case.fluid.boundary_conditions', n_children = n_bcs)
407 call params%get_core(core)
408 call params%get('case.fluid.boundary_conditions', bc_object, found)
409
410 !
411 ! Velocity bcs
412 !
413 call this%bcs_vel%init(n_bcs)
414
415 do i = 1, n_bcs
416 ! Extract BC configuration
417 call json_extract_item(core, bc_object, i, bc_subdict)
418 call json_get(bc_subdict, "zone_indices", zone_indices)
419
420 ! Validate zones
421 do j = 1, size(zone_indices)
422 zone_size = this%msh%labeled_zones(zone_indices(j))%size
423 call mpi_allreduce(zone_size, global_zone_size, 1, &
424 mpi_integer, mpi_max, neko_comm, ierr)
425
426 if (global_zone_size .eq. 0) then
427 write(log_buf,'(A,I0,A)') "Error: Zone ", zone_indices(j), &
428 " has zero size"
429 call neko_error(log_buf)
430 end if
431 end do
432
433 ! Create BC
434 bc_i => null()
435 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
436
437 ! Add to appropriate lists
438 if (associated(bc_i)) then
439 call this%bcs_vel%append(bc_i)
440 end if
441 end do
442
443 !
444 ! Pressure bcs
445 !
446 call this%bcs_prs%init(n_bcs)
447
448 do i = 1, n_bcs
449 ! Create a new json containing just the subdict for this bc
450 call json_extract_item(core, bc_object, i, bc_subdict)
451 bc_i => null()
452 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
453
454 ! Not all bcs require an allocation for pressure in particular,
455 ! so we check.
456 if (associated(bc_i)) then
457 call this%bcs_prs%append(bc_i)
458 end if
459 end do
460
461 !
462 ! Density bcs
463 !
464 call this%bcs_density%init(n_bcs)
465
466 do i = 1, n_bcs
467 ! Create a new json containing just the subdict for this bc
468 call json_extract_item(core, bc_object, i, bc_subdict)
469 bc_i => null()
470 call density_bc_factory(bc_i, this, bc_subdict, this%c_Xh, user)
471
472 ! Not all bcs require an allocation for pressure in particular,
473 ! so we check.
474 if (associated(bc_i)) then
475 call this%bcs_density%append(bc_i)
476 end if
477 end do
478 else
479 ! Check that there are no labeled zones, i.e. all are periodic.
480 do i = 1, size(this%msh%labeled_zones)
481 if (this%msh%labeled_zones(i)%size .gt. 0) then
482 call neko_error("No boundary_conditions entry in the case file!")
483 end if
484 end do
485
486 ! For a pure periodic case, we still need to initilise the bc lists
487 ! to a zero size to avoid issues with apply() in step()
488 call this%bcs_prs%init()
489 call this%bcs_vel%init()
490 call this%bcs_density%init()
491
492 end if
493 end subroutine fluid_scheme_compressible_euler_setup_bcs
494
499 subroutine compute_h(this)
500 class(fluid_scheme_compressible_euler_t), intent(inout) :: this
501 integer :: e, i, j, k
502 integer :: im, ip, jm, jp, km, kp
503 real(kind=rp) :: di, dj, dk, ndim_inv
504 integer :: lx_half, ly_half, lz_half
505
506 lx_half = this%c_Xh%Xh%lx / 2
507 ly_half = this%c_Xh%Xh%ly / 2
508 lz_half = this%c_Xh%Xh%lz / 2
509
510 do concurrent(e = 1:this%c_Xh%msh%nelv)
511 do concurrent(k = 1:this%c_Xh%Xh%lz, &
512 j = 1:this%c_Xh%Xh%ly, i = 1:this%c_Xh%Xh%lx)
513 km = max(1, k-1)
514 kp = min(this%c_Xh%Xh%lz, k+1)
515
516 jm = max(1, j-1)
517 jp = min(this%c_Xh%Xh%ly, j+1)
518
519 im = max(1, i-1)
520 ip = min(this%c_Xh%Xh%lx, i+1)
521
522 di = (this%c_Xh%dof%x(ip, j, k, e) - &
523 this%c_Xh%dof%x(im, j, k, e))**2 &
524 + (this%c_Xh%dof%y(ip, j, k, e) - &
525 this%c_Xh%dof%y(im, j, k, e))**2 &
526 + (this%c_Xh%dof%z(ip, j, k, e) - &
527 this%c_Xh%dof%z(im, j, k, e))**2
528
529 dj = (this%c_Xh%dof%x(i, jp, k, e) - &
530 this%c_Xh%dof%x(i, jm, k, e))**2 &
531 + (this%c_Xh%dof%y(i, jp, k, e) - &
532 this%c_Xh%dof%y(i, jm, k, e))**2 &
533 + (this%c_Xh%dof%z(i, jp, k, e) - &
534 this%c_Xh%dof%z(i, jm, k, e))**2
535
536 dk = (this%c_Xh%dof%x(i, j, kp, e) - &
537 this%c_Xh%dof%x(i, j, km, e))**2 &
538 + (this%c_Xh%dof%y(i, j, kp, e) - &
539 this%c_Xh%dof%y(i, j, km, e))**2 &
540 + (this%c_Xh%dof%z(i, j, kp, e) - &
541 this%c_Xh%dof%z(i, j, km, e))**2
542
543 di = sqrt(di) / (ip - im)
544 dj = sqrt(dj) / (jp - jm)
545 dk = sqrt(dk) / (kp - km)
546 this%h%x(i,j,k,e) = (di * dj * dk)**(1.0_rp / 3.0_rp)
547
548 end do
549 end do
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
567 subroutine fluid_scheme_compressible_euler_restart(this, chkp)
568 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
569 type(chkp_t), intent(inout) :: chkp
570 end subroutine fluid_scheme_compressible_euler_restart
571
572 subroutine setup_regularization(this, params)
574 class(fluid_scheme_compressible_euler_t), target, intent(inout) :: this
575 type(json_file), intent(inout) :: params
576 type(json_file) :: reg_json
577 type(json_core) :: json_core_inst
578 type(json_value), pointer :: reg_params
579 character(len=:), allocatable :: buffer
580 real(kind=rp) :: c_avisc_entropy_val
581 character(len=:), allocatable :: regularization_type
582
583 call json_get_or_default(params, 'case.numerics.c_avisc_low', &
584 this%c_avisc_low, 0.5_rp)
585 call json_get_or_default(params, 'case.numerics.c_avisc_entropy', &
586 c_avisc_entropy_val, 1.0_rp)
587
588 call json_core_inst%initialize()
589 call json_core_inst%create_object(reg_params, '')
590 call json_core_inst%add(reg_params, 'c_avisc_entropy', c_avisc_entropy_val)
591 call json_core_inst%add(reg_params, 'c_avisc_low', this%c_avisc_low)
592 call json_core_inst%print_to_string(reg_params, buffer)
593 call json_core_inst%destroy(reg_params)
594
595 call reg_json%initialize()
596 call reg_json%load_from_string(buffer)
597
598 regularization_type = 'entropy_viscosity'
599
600 call regularization_factory(this%regularization, regularization_type, reg_json, &
601 this%c_Xh, this%dm_Xh, this%effective_visc)
602
603 select type (reg => this%regularization)
604 type is (entropy_viscosity_t)
605 call entropy_viscosity_set_fields(reg, this%S, this%u, this%v, this%w, &
606 this%h, this%max_wave_speed, this%msh, this%Xh, this%gs_Xh)
607 end select
608
609 call reg_json%destroy()
610
611 end subroutine setup_regularization
612
Copy data between host and device (or device and device)
Definition device.F90:71
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.
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:43
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:47
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
integer, parameter, public log_size
Definition log.f90:46
Definition math.f90:60
subroutine, public col2(a, b, n)
Vector multiplication .
Definition math.f90:854
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
subroutine, public div(res, ux, uy, uz, coef)
Compute the divergence of a vector field.
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
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:313
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
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:56
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