/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
Loading...
Searching...
No Matches
density_ops.H
Go to the documentation of this file.
1#ifndef DENSITY_OPS_H
2#define DENSITY_OPS_H
3
5#include "AMReX_REAL.H"
6
7using namespace amrex::literals;
8
9namespace amr_wind::pde {
10
11template <typename Scheme>
12struct ComputeRHSOp<Density, Scheme>
13{
14 explicit ComputeRHSOp(PDEFields& fields_in) : fields(fields_in) {}
15
17 const DiffusionType /*unused*/,
18 const amrex::Real dt,
19 bool /*mesh_mapping*/)
20 {
21 // Field states for diffusion and advection terms. In Godunov scheme
22 // these terms only have one state.
23 auto fstate = std::is_same<Scheme, fvm::Godunov>::value
26
27 const int nlevels = fields.repo.num_active_levels();
28 auto& field = fields.field;
29 const auto& field_old = field.state(FieldState::Old);
30 const auto& conv_term = fields.conv_term.state(fstate);
31
32 for (int lev = 0; lev < nlevels; ++lev) {
33 const auto& rho_arrs = field(lev).arrays();
34 const auto& rho_o_arrs = field_old(lev).const_arrays();
35 const auto& ddt_o_arrs = conv_term(lev).const_arrays();
36
37 amrex::ParallelFor(
38 field(lev),
39 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
40 rho_arrs[nbx](i, j, k) = rho_o_arrs[nbx](i, j, k) +
41 dt * ddt_o_arrs[nbx](i, j, k);
42 // Defer n+1/2 update to the time-stepping algorithm
43 // rho_nph(i, j, k) = 0.5_rt * (rho(i, j, k) + rho_o(i, j,
44 // k));
45 });
46 }
47 amrex::Gpu::streamSynchronize();
48 }
49
51 const DiffusionType /*unused*/,
52 const amrex::Real dt,
53 bool /*mesh_mapping*/)
54 {
55 const int nlevels = fields.repo.num_active_levels();
56 auto& field = fields.field;
57 const auto& field_old = field.state(FieldState::Old);
58 const auto& conv_term = fields.conv_term;
59 const auto& conv_term_old = fields.conv_term.state(FieldState::Old);
60
61 for (int lev = 0; lev < nlevels; ++lev) {
62 const auto& rho_arrs = field(lev).arrays();
63 const auto& rho_o_arrs = field_old(lev).const_arrays();
64 const auto& ddt_arrs = conv_term(lev).const_arrays();
65 const auto& ddt_o_arrs = conv_term_old(lev).const_arrays();
66
67 amrex::ParallelFor(
68 field(lev),
69 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
70 rho_arrs[nbx](i, j, k) =
71 rho_o_arrs[nbx](i, j, k) +
72 dt * 0.5_rt *
73 (ddt_o_arrs[nbx](i, j, k) + ddt_arrs[nbx](i, j, k));
74 // Defer n+1/2 update to time-stepping algorithm
75 // rho_nph(i, j, k) =
76 // 0.5_rt * (rho(i, j, k) + rho_o(i, j, k));
77 });
78 }
79 amrex::Gpu::streamSynchronize();
80 }
81
82 void improve_explicit_diff(const amrex::Real /*unused*/) {}
83
84 // data members
86};
87} // namespace amr_wind::pde
88
89#endif /* DENSITY_OPS_H */
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:20
@ Old
Same as FieldState::N.
Definition FieldDescTypes.H:21
DiffusionType
Definition incflo_enums.H:4
Definition AdvOp_Godunov.H:21
void predictor_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition density_ops.H:16
PDEFields & fields
Definition density_ops.H:85
void corrector_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition density_ops.H:50
ComputeRHSOp(PDEFields &fields_in)
Definition density_ops.H:14
void improve_explicit_diff(const amrex::Real)
Definition density_ops.H:82
Definition density.H:16
Definition PDEFields.H:27