/home/runner/work/kynema-sgf/kynema-sgf/src/equation_systems/AdvOp_MOL.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/equation_systems/AdvOp_MOL.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
AdvOp_MOL.H
Go to the documentation of this file.
1#ifndef ADVOP_MOL_H
2#define ADVOP_MOL_H
3
4#include <type_traits>
5
10
11#include "AMReX_Gpu.H"
12#include "AMReX_ParmParse.H"
13
14namespace kynema_sgf::pde {
15
19template <typename PDE>
21 PDE,
22 fvm::MOL,
23 typename std::enable_if_t<std::is_base_of_v<ScalarTransport, PDE>>>
24{
26 CFDSim& /* sim */,
27 PDEFields& fields_in,
28 bool /* has_overset */,
29 bool /* variable density */,
30 bool /* mesh mapping */,
31 bool /* is_anelastic */)
32 : fields(fields_in)
33 , density(fields_in.repo.get_field("density"))
34 , u_mac(fields_in.repo.get_field("u_mac"))
35 , v_mac(fields_in.repo.get_field("v_mac"))
36 , w_mac(fields_in.repo.get_field("w_mac"))
37 {}
38
40 const FieldState /*unused*/,
41 const amrex::Real /*unused*/,
42 const amrex::Real /*unused*/)
43 {}
44
45 void operator()(const FieldState fstate, const amrex::Real /*unused*/)
46 {
47 static_assert(
48 PDE::ndim == 1, "Invalid number of components for scalar");
49
50 const auto& repo = fields.repo;
51 const auto& geom = repo.mesh().Geom();
52
53 auto& conv_term = fields.conv_term.state(fstate);
54 const auto& dof_field = fields.field.state(fstate);
55 const auto& den = density.state(fstate);
56
57 for (int lev = 0; lev < repo.num_active_levels(); ++lev) {
58 amrex::MFItInfo mfi_info;
59 // if (amrex::Gpu::notInLaunchRegion())
60 // mfi_info.EnableTiling(amrex::IntVect(1024,16,16)).SetDynamic(true);
61 if (amrex::Gpu::notInLaunchRegion()) {
62 mfi_info.EnableTiling(amrex::IntVect(1024, 1024, 1024))
63 .SetDynamic(true);
64 }
65#ifdef AMREX_USE_OMP
66#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
67#endif
68 for (amrex::MFIter mfi(density(lev), mfi_info); mfi.isValid();
69 ++mfi) {
70
71 amrex::Box const& bx = mfi.tilebox();
72 auto rho_arr = den(lev).const_array(mfi);
73 auto tra_arr = dof_field(lev).const_array(mfi);
74 amrex::FArrayBox rhotracfab;
75 amrex::Array4<amrex::Real> rhotrac;
76
77 if (PDE::multiply_rho) {
78
79 amrex::Box rhotrac_box =
80 amrex::grow(bx, fvm::MOL::nghost_state);
81 rhotracfab.resize(
82 rhotrac_box, PDE::ndim, amrex::The_Async_Arena());
83 rhotrac = rhotracfab.array();
84
85 amrex::ParallelFor(
86 rhotrac_box, PDE::ndim,
87 [=] AMREX_GPU_DEVICE(int i, int j, int k, int n) {
88 rhotrac(i, j, k, n) =
89 rho_arr(i, j, k) * tra_arr(i, j, k, n);
90 });
91 }
92
93 {
94 const int nmaxcomp = PDE::ndim;
95
96 amrex::Box tmpbox = amrex::surroundingNodes(bx);
97 const int tmpcomp = nmaxcomp * AMREX_SPACEDIM;
98
99 amrex::FArrayBox tmpfab(
100 tmpbox, tmpcomp, amrex::The_Async_Arena());
101
102 amrex::Array4<amrex::Real> fx = tmpfab.array(0);
103 amrex::Array4<amrex::Real> fy = tmpfab.array(nmaxcomp);
104 amrex::Array4<amrex::Real> fz = tmpfab.array(nmaxcomp * 2);
105
107 lev, bx, PDE::ndim, fx, fy, fz,
108 (PDE::multiply_rho ? rhotrac : tra_arr),
109 u_mac(lev).const_array(mfi),
110 v_mac(lev).const_array(mfi),
111 w_mac(lev).const_array(mfi), dof_field.bcrec().data(),
112 dof_field.bcrec_device().data(), geom);
113
115 bx, PDE::ndim, conv_term(lev).array(mfi), fx, fy, fz,
116 geom[lev].InvCellSizeArray());
117 }
118 }
119 }
120 }
121
127};
128
129} // namespace kynema_sgf::pde
130
131#endif /* ADVOP_MOL_H */
Definition CFDSim.H:55
Definition Field.H:115
FieldState
Definition FieldDescTypes.H:16
Definition SchemeTraits.H:6
Definition AdvOp_Godunov.H:22
void compute_convective_rate(amrex::Box const &bx, int ncomp, amrex::Array4< amrex::Real > const &dUdt, amrex::Array4< amrex::Real const > const &fx, amrex::Array4< amrex::Real const > const &fy, amrex::Array4< amrex::Real const > const &fz, amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > dxi)
Definition incflo_mol_fluxes.cpp:9
void compute_convective_fluxes(int lev, amrex::Box const &bx, int ncomp, amrex::Array4< amrex::Real > const &fx, amrex::Array4< amrex::Real > const &fy, amrex::Array4< amrex::Real > const &fz, amrex::Array4< amrex::Real const > const &q, amrex::Array4< amrex::Real const > const &umac, amrex::Array4< amrex::Real const > const &vmac, amrex::Array4< amrex::Real const > const &wmac, amrex::BCRec const *h_bcrec, amrex::BCRec const *d_bcrec, amrex::Vector< amrex::Geometry > geom)
Definition incflo_mol_fluxes.cpp:29
static constexpr int nghost_state
Number of ghost cells in the state variable.
Definition SchemeTraits.H:41
AdvectionOp(CFDSim &, PDEFields &fields_in, bool, bool, bool, bool)
Definition AdvOp_MOL.H:25
void preadvect(const FieldState, const amrex::Real, const amrex::Real)
Definition AdvOp_MOL.H:39
Definition PDEFields.H:27