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

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/equation_systems/icns/icns_ops.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
icns_ops.H
Go to the documentation of this file.
1#ifndef ICNS_OPS_H
2#define ICNS_OPS_H
3
11#include "AMReX_MultiFabUtil.H"
12#include "AMReX_REAL.H"
13
14using namespace amrex::literals;
15
16namespace kynema_sgf::pde {
17
29template <typename Scheme>
30struct FieldRegOp<ICNS, Scheme>
31{
32 explicit FieldRegOp(CFDSim& sim_in) : sim(sim_in) {}
33
35 {
36 auto& repo = sim.repo();
37 auto fields = create_fields_instance<ICNS, Scheme>(time, repo);
38
39 auto& rho = repo.declare_cc_field(
40 "density", 1, Scheme::nghost_state, Scheme::num_states);
41 auto& grad_p = repo.declare_cc_field("gp", ICNS::ndim, 0, 1);
42 auto& pressure = repo.declare_nd_field("p", 1, Scheme::nghost_state, 1);
43 repo.declare_face_normal_field(
44 {"u_mac", "v_mac", "w_mac"}, 1, Scheme::nghost_mac, 1);
45
46 rho.template register_fill_patch_op<
47 FieldFillPatchOps<FieldBCDirichlet>>(repo.mesh(), time);
48 grad_p.template register_fill_patch_op<FieldFillPatchOps<FieldBCNoOp>>(
49 repo.mesh(), time);
50 // pressure.template
51 // register_fill_patch_op<FieldFillConstScalar>(0.0_rt); fixme this is
52 // only necessary since tioga does not fill in ghosts convert back later
53 pressure
54 .template register_fill_patch_op<FieldFillPatchOps<FieldBCNoOp>>(
55 repo.mesh(), time);
56 rho.fillpatch_on_regrid() = true;
57 grad_p.fillpatch_on_regrid() = true;
58
59 // Density always requires half state
60 rho.create_state(FieldState::NPH);
61
62 // Register fields for output/restart
63 auto& iomgr = sim.io_manager();
64 iomgr.register_io_var(fields.field.name());
65 iomgr.register_io_var(rho.name());
66 iomgr.register_io_var(pressure.name());
67 iomgr.register_io_var(grad_p.name());
68 return fields;
69 }
70
72};
73
77template <>
79{
80 explicit SrcTermOp(PDEFields& fields_in)
81 : SrcTermOpBase<ICNS>(fields_in), grad_p(fields_in.repo.get_field("gp"))
82 {}
83
84 void operator()(const FieldState fstate, const bool mesh_mapping) override
85 {
86 const auto rhostate = field_impl::phi_state(fstate);
87 const auto& density = m_density.state(rhostate);
88 Field const* mesh_fac =
89 mesh_mapping
90 ? &(this->fields.repo.get_mesh_mapping_field(FieldLoc::CELL))
91 : nullptr;
92
93 const int nlevels = this->fields.repo.num_active_levels();
94 for (int lev = 0; lev < nlevels; ++lev) {
95 auto& src_term = this->fields.src_term(lev);
96
97 auto const& src_arrs = src_term.arrays();
98 auto const& rho_arrs = density(lev).const_arrays();
99 auto const& gp_arrs = grad_p(lev).const_arrays();
100 auto const& fac_arrs =
101 mesh_mapping ? (*mesh_fac)(lev).const_arrays()
102 : amrex::MultiArray4<amrex::Real const>();
103
104 amrex::ParallelFor(
105 src_term, amrex::IntVect(0), AMREX_SPACEDIM,
106 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k, int n) {
107 const amrex::Real rhoinv = 1.0_rt / rho_arrs[nbx](i, j, k);
108 const amrex::Real fac_n =
109 mesh_mapping ? fac_arrs[nbx](i, j, k, n) : 1.0_rt;
110 src_arrs[nbx](i, j, k, n) =
111 -(1.0_rt / fac_n * gp_arrs[nbx](i, j, k, n)) * rhoinv;
112 });
113 amrex::Gpu::streamSynchronize();
114
115 for (const auto& src : this->sources) {
116 (*src)(lev, fstate, src_term);
117 }
118 amrex::Gpu::streamSynchronize();
119 }
120 this->multiply_rho(fstate);
121 }
122
124};
125
129template <>
131{
133 : m_tmodel(tmodel), m_fields(fields)
134 {}
135
136 void operator()() { m_tmodel.update_mueff(m_fields.mueff); }
137
140};
141
142} // namespace kynema_sgf::pde
143
144#endif /* ICNS_OPS_H */
Definition CFDSim.H:55
Definition FieldFillPatchOps.H:184
Definition Field.H:112
Definition SimTime.H:33
Definition TurbulenceModel.H:32
FieldState
Definition FieldDescTypes.H:16
@ CELL
Cell-centered (default)
Definition FieldDescTypes.H:30
@ NPH
State at (n + 1/2) (intermediate) timestep.
Definition FieldDescTypes.H:20
AMREX_INLINE FieldState phi_state(const FieldState fstate)
Definition FieldUtils.H:115
Definition AdvOp_Godunov.H:22
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:52
PDEFields operator()(const SimTime &time)
Definition icns_ops.H:34
CFDSim & sim
Definition icns_ops.H:71
FieldRegOp(CFDSim &sim_in)
Definition icns_ops.H:32
Definition icns.H:34
static constexpr int ndim
Definition icns.H:40
Definition PDEFields.H:27
SrcTermOp(PDEFields &fields_in)
Definition icns_ops.H:80
Field & grad_p
Definition icns_ops.H:123
void operator()(const FieldState fstate, const bool mesh_mapping) override
Update source terms during time-integration procedure.
Definition icns_ops.H:84
Field & m_density
Definition PDEOps.H:143
PDEFields & fields
Definition PDEOps.H:142
amrex::Vector< std::unique_ptr< typename ICNS::SrcTerm > > sources
Definition PDEOps.H:144
SrcTermOpBase(PDEFields &fields_in)
Definition PDEOps.H:73
void multiply_rho(const FieldState fstate)
Helper method to multiply the source terms with density.
Definition PDEOps.H:94
void operator()()
Definition icns_ops.H:136
turbulence::TurbulenceModel & m_tmodel
Definition icns_ops.H:138
PDEFields & m_fields
Definition icns_ops.H:139
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition icns_ops.H:132