/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_v<Scheme, fvm::Godunov> ? FieldState::New
25
26 const int nlevels = fields.repo.num_active_levels();
27 auto& field = fields.field;
28 const auto& field_old = field.state(FieldState::Old);
29 const auto& conv_term = fields.conv_term.state(fstate);
30
31 for (int lev = 0; lev < nlevels; ++lev) {
32 const auto& rho_arrs = field(lev).arrays();
33 const auto& rho_o_arrs = field_old(lev).const_arrays();
34 const auto& ddt_o_arrs = conv_term(lev).const_arrays();
35
36 amrex::ParallelFor(
37 field(lev), [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) {
38 rho_arrs[nbx](i, j, k) = rho_o_arrs[nbx](i, j, k) +
39 (dt * ddt_o_arrs[nbx](i, j, k));
40 // Defer n+1/2 update to the time-stepping algorithm
41 // rho_nph(i, j, k) = 0.5_rt * (rho(i, j, k) + rho_o(i, j,
42 // k));
43 });
44 }
45 amrex::Gpu::streamSynchronize();
46 }
47
49 const DiffusionType /*unused*/,
50 const amrex::Real dt,
51 bool /*mesh_mapping*/)
52 {
53 const int nlevels = fields.repo.num_active_levels();
54 auto& field = fields.field;
55 const auto& field_old = field.state(FieldState::Old);
56 const auto& conv_term = fields.conv_term;
57 const auto& conv_term_old = fields.conv_term.state(FieldState::Old);
58
59 for (int lev = 0; lev < nlevels; ++lev) {
60 const auto& rho_arrs = field(lev).arrays();
61 const auto& rho_o_arrs = field_old(lev).const_arrays();
62 const auto& ddt_arrs = conv_term(lev).const_arrays();
63 const auto& ddt_o_arrs = conv_term_old(lev).const_arrays();
64
65 amrex::ParallelFor(
66 field(lev), [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) {
67 rho_arrs[nbx](i, j, k) =
68 rho_o_arrs[nbx](i, j, k) +
69 (dt * 0.5_rt *
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_rt * (rho(i, j, k) + rho_o(i, j, k));
74 });
75 }
76 amrex::Gpu::streamSynchronize();
77 }
78
79 void improve_explicit_diff(const amrex::Real /*unused*/) {}
80
81 // data members
83};
84} // namespace amr_wind::pde
85
86#endif /* DENSITY_OPS_H */
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:22
@ Old
Same as FieldState::N.
Definition FieldDescTypes.H:23
DiffusionType
Definition incflo_enums.H:6
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:82
void corrector_rhs(const DiffusionType, const amrex::Real dt, bool)
Definition density_ops.H:48
ComputeRHSOp(PDEFields &fields_in)
Definition density_ops.H:14
void improve_explicit_diff(const amrex::Real)
Definition density_ops.H:79
Definition density.H:16
Definition PDEFields.H:27