/home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/density/density_ops.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/density/density_ops.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
density_ops.H
Go to the documentation of this file.
1#ifndef DENSITY_OPS_H
2#define DENSITY_OPS_H
3
5
6namespace amr_wind::pde {
7
8template <typename Scheme>
9struct ComputeRHSOp<Density, Scheme>
10{
11 explicit ComputeRHSOp(PDEFields& fields_in) : fields(fields_in) {}
12
14 const DiffusionType /*unused*/,
15 const amrex::Real dt,
16 bool /*mesh_mapping*/)
17 {
18 // Field states for diffusion and advection terms. In Godunov scheme
19 // these terms only have one state.
20 auto fstate = std::is_same<Scheme, fvm::Godunov>::value
23
24 const int nlevels = fields.repo.num_active_levels();
25 auto& field = fields.field;
26 const auto& field_old = field.state(FieldState::Old);
27 const auto& conv_term = fields.conv_term.state(fstate);
28
29 for (int lev = 0; lev < nlevels; ++lev) {
30 const auto& rho_arrs = field(lev).arrays();
31 const auto& rho_o_arrs = field_old(lev).const_arrays();
32 const auto& ddt_o_arrs = conv_term(lev).const_arrays();
33
34 amrex::ParallelFor(
35 field(lev),
36 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
37 rho_arrs[nbx](i, j, k) = rho_o_arrs[nbx](i, j, k) +
38 dt * ddt_o_arrs[nbx](i, j, k);
39 // Defer n+1/2 update to the time-stepping algorithm
40 // rho_nph(i, j, k) = 0.5 * (rho(i, j, k) + rho_o(i, j,
41 // k));
42 });
43 }
44 amrex::Gpu::streamSynchronize();
45 }
46
48 const DiffusionType /*unused*/,
49 const amrex::Real dt,
50 bool /*mesh_mapping*/)
51 {
52 const int nlevels = fields.repo.num_active_levels();
53 auto& field = fields.field;
54 const auto& field_old = field.state(FieldState::Old);
55 const auto& conv_term = fields.conv_term;
56 const auto& conv_term_old = fields.conv_term.state(FieldState::Old);
57
58 for (int lev = 0; lev < nlevels; ++lev) {
59 const auto& rho_arrs = field(lev).arrays();
60 const auto& rho_o_arrs = field_old(lev).const_arrays();
61 const auto& ddt_arrs = conv_term(lev).const_arrays();
62 const auto& ddt_o_arrs = conv_term_old(lev).const_arrays();
63
64 amrex::ParallelFor(
65 field(lev),
66 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
67 rho_arrs[nbx](i, j, k) =
68 rho_o_arrs[nbx](i, j, k) +
69 dt * 0.5 *
70 (ddt_o_arrs[nbx](i, j, k) + ddt_arrs[nbx](i, j, k));
71 // Defer n+1/2 update to time-stepping algorithm
72 // rho_nph(i, j, k) =
73 // 0.5 * (rho(i, j, k) + rho_o(i, j, k));
74 });
75 }
76 amrex::Gpu::streamSynchronize();
77 }
78
79 // data members
81};
82} // namespace amr_wind::pde
83
84#endif /* DENSITY_OPS_H */
Field & state(const FieldState fstate)
Return field at a different time state.
Definition Field.cpp:114
int num_active_levels() const noexcept
Total number of levels currently active in the AMR mesh.
Definition FieldRepo.H:361
@ New
Same as FieldState::NP1.
@ Old
Same as FieldState::N.
DiffusionType
Definition incflo_enums.H:4
Definition AdvOp_Godunov.H:16
void predictor_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition density_ops.H:13
PDEFields & fields
Definition density_ops.H:80
void corrector_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition density_ops.H:47
ComputeRHSOp(PDEFields &fields_in)
Definition density_ops.H:11
Definition CompRHSOps.H:18
PDEFields & fields
Definition CompRHSOps.H:266
Definition density.H:13
Definition PDEFields.H:27
Field & conv_term
Convective term for this PDE.
Definition PDEFields.H:43
FieldRepo & repo
Reference to the field repository instance.
Definition PDEFields.H:31
Field & field
Solution variable (e.g., velocity, temperature)
Definition PDEFields.H:34