51 use json_module,
only : json_file, json_core, json_value
71 use mpi_f08,
only : mpi_allreduce, mpi_integer, mpi_max
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
81 real(kind=
rp) :: c_avisc_low
83 class(
ax_t),
allocatable :: ax
97 procedure, pass(this) :: setup_bcs &
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
117 end subroutine density_bc_factory
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
134 end subroutine pressure_bc_factory
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
151 end subroutine velocity_bc_factory
162 subroutine fluid_scheme_compressible_euler_init(this, msh, lx, params, user, &
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'
176 call this%scheme_init(msh, lx, params, scheme,
user)
178 call euler_rhs_factory(this%euler_rhs)
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)
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')
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)
213 call device_memcpy(effective_visc%x, effective_visc%x_d, effective_visc%dof%size(), &
219 call ax_helm_factory(this%Ax, full_formulation = .false.)
222 call this%compute_h()
225 call this%setup_regularization(params)
228 call json_get_or_default(params,
'case.numerics.time_order', rk_order, 4)
229 call this%rk_scheme%init(rk_order)
232 call this%setup_bcs(
user, params)
234 end subroutine fluid_scheme_compressible_euler_init
238 subroutine fluid_scheme_compressible_euler_free(this)
239 class(fluid_scheme_compressible_euler_t),
intent(inout) :: this
241 call this%scheme_free()
243 if (
allocated(this%Ax))
then
247 if (
allocated(this%euler_rhs))
then
248 deallocate(this%euler_rhs)
251 call this%drho%free()
252 call this%dm_x%free()
253 call this%dm_y%free()
254 call this%dm_z%free()
258 if (
allocated(this%regularization))
then
259 call this%regularization%free()
260 deallocate(this%regularization)
263 call this%bcs_density%free()
265 end subroutine fluid_scheme_compressible_euler_free
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)
282 class(bc_t),
pointer :: b
284 n = this%dm_Xh%size()
285 call neko_scratch_registry%request_field(temp, temp_indices(1), .false.)
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)
302 call this%regularization%compute(time, time%tstep, time%dt)
305 call euler_rhs%step(rho, m_x, m_y, m_z, e, &
307 c_xh, gs_xh, h, this%effective_visc, &
311 call this%bcs_density%apply(rho, time)
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)
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)
324 call this%bcs_vel%apply_vector(u%x, v%x, w%x, &
325 dm_xh%size(), time, strong = .true.)
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)
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)
338 call this%bcs_prs%apply(p, time)
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)
346 call compressible_ops_cpu_update_e(e%x, p%x, temp%x, this%gamma, n)
351 call this%compute_entropy()
354 if (
allocated(this%regularization))
then
355 select type (reg => this%regularization)
357 call reg%update_lag()
362 call this%compute_max_wave_speed()
364 do i = 1, this%bcs_vel%size()
365 b => this%bcs_vel%get(i)
369 do i = 1, this%bcs_prs%size()
370 b => this%bcs_prs%get(i)
374 do i = 1, this%bcs_density%size()
375 b => this%bcs_density%get(i)
381 call profiler_end_region(
'Fluid compressible', 1)
383 call neko_scratch_registry%relinquish_field(temp_indices)
385 end subroutine fluid_scheme_compressible_euler_step
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
401 integer,
allocatable :: zone_indices(:)
402 character(len=LOG_SIZE) :: log_buf
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)
413 call this%bcs_vel%init(n_bcs)
417 call json_extract_item(core, bc_object, i, bc_subdict)
418 call json_get(bc_subdict,
"zone_indices", zone_indices)
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)
426 if (global_zone_size .eq. 0)
then
427 write(log_buf,
'(A,I0,A)')
"Error: Zone ", zone_indices(j), &
429 call neko_error(log_buf)
435 call velocity_bc_factory(bc_i, this, bc_subdict, this%c_Xh,
user)
438 if (
associated(bc_i))
then
439 call this%bcs_vel%append(bc_i)
446 call this%bcs_prs%init(n_bcs)
450 call json_extract_item(core, bc_object, i, bc_subdict)
452 call pressure_bc_factory(bc_i, this, bc_subdict, this%c_Xh,
user)
456 if (
associated(bc_i))
then
457 call this%bcs_prs%append(bc_i)
464 call this%bcs_density%init(n_bcs)
468 call json_extract_item(core, bc_object, i, bc_subdict)
470 call density_bc_factory(bc_i, this, bc_subdict, this%c_Xh,
user)
474 if (
associated(bc_i))
then
475 call this%bcs_density%append(bc_i)
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!")
488 call this%bcs_prs%init()
489 call this%bcs_vel%init()
490 call this%bcs_density%init()
493 end subroutine fluid_scheme_compressible_euler_setup_bcs
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
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
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)
514 kp = min(this%c_Xh%Xh%lz, k+1)
517 jp = min(this%c_Xh%Xh%ly, j+1)
520 ip = min(this%c_Xh%Xh%lx, i+1)
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
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
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
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)
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())
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())
561 end subroutine compute_h
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
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
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)
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)
595 call reg_json%initialize()
596 call reg_json%load_from_string(
buffer)
598 regularization_type =
'entropy_viscosity'
600 call regularization_factory(this%regularization, regularization_type, reg_json, &
601 this%c_Xh, this%dm_Xh, this%effective_visc)
603 select type (reg => this%regularization)
606 this%h, this%max_wave_speed, this%msh, this%Xh, this%gs_Xh)
609 call reg_json%destroy()
611 end subroutine setup_regularization
Copy data between host and device (or device and device)
Abstract interface to evaluate rhs.
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.
Defines a Matrix-vector product.
Defines a boundary condition.
Backward-differencing scheme for time integration.
Generic buffer that is extended with buffers of varying rank.
type(mpi_comm), public neko_comm
MPI communicator.
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.
integer, parameter, public host_to_device
subroutine, public entropy_viscosity_set_fields(this, s, u, v, w, h, max_wave_speed, msh, xh, gs)
Contains the field_serties_t type.
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.
subroutine setup_regularization(this, params)
Defines Gather-scatter operations.
integer, parameter, public gs_op_add
integer, parameter, public gs_op_max
integer, parameter, public gs_op_min
Utilities for retrieving parameters from the case files.
integer, parameter, public log_size
subroutine, public col2(a, b, n)
Vector multiplication .
integer, parameter neko_bcknd_device
integer, parameter, public rp
Global precision used in computations.
subroutine, public div(res, ux, uy, uz, coef)
Compute the divergence of a vector field.
subroutine, public profiler_start_region(name, region_id)
Started a named (name) profiler region.
subroutine, public profiler_end_region(name, region_id)
End the most recently started profiler region.
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.
subroutine, public neko_type_error(base_type, wrong_type, known_types)
Reports an error allocating a type for a particular base pointer class.
Base abstract type for computing the advection operator.
Base type for a matrix-vector product providing .
Base type for a boundary condition.
A list of allocatable `bc_t`. Follows the standard interface of lists.
Implicit backward-differencing scheme for time integration.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Abstract type to compute rhs.
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
Base type of compressible fluid formulations.
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.
Provides a tool to set time step dt.
A type collecting all the overridable user routines and flag to suppress type injection from custom m...