/home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/sdr/sdr_ops.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/sdr/sdr_ops.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
sdr_ops.H
Go to the documentation of this file.
1#ifndef SDR_OPS_H
2#define SDR_OPS_H
3
6#include "AMReX_REAL.H"
7
8using namespace amrex::literals;
9
10namespace amr_wind::pde {
11
15template <>
17{
19 : m_tmodel(tmodel), m_fields(fields)
20 {}
21
23 {
24 auto& mueff = m_fields.mueff;
25 m_tmodel.update_scalar_diff(mueff, SDR::var_name());
26 }
27
30};
31
35template <>
37{
38 PostSolveOp(CFDSim& /*unused*/, PDEFields& fields) : m_fields(fields) {}
39
40 void operator()(const amrex::Real time)
41 {
43 m_fields.field.fillpatch(time);
44 }
45
47 amrex::Real clip_value{std::numeric_limits<float>::epsilon()};
48};
49
50template <typename Scheme>
51struct FieldRegOp<SDR, Scheme>
52{
53 explicit FieldRegOp(CFDSim& sim_in) : sim(sim_in) {}
54
56 {
57 auto& repo = sim.repo();
58 auto fields = create_fields_instance<SDR, Scheme>(time, repo);
59
60 repo.declare_cc_field(
61 SDR::var_name() + "_lhs_src_term", SDR::ndim, 1, 1);
62
63 sim.io_manager().register_io_var(fields.field.name());
64
65 return fields;
66 }
67
69};
70
74template <typename Scheme>
75struct DiffusionOp<SDR, Scheme> : public DiffSolverIface<typename SDR::MLDiffOp>
76{
77 static_assert(
78 SDR::ndim == 1, "DiffusionOp invoked for non-scalar SDR type");
79 static_assert(
80 std::is_same_v<typename SDR::MLDiffOp, amrex::MLABecLaplacian>,
81 "Invalid linear operator for scalar diffusion operator");
82
84 PDEFields& fields, const bool has_overset, const bool mesh_mapping)
85 : DiffSolverIface<typename SDR::MLDiffOp>(
86 fields, has_overset, mesh_mapping)
88 fields.repo.get_field(SDR::var_name() + "_lhs_src_term"))
89 {
90 this->m_solver->setDomainBC(
92 this->m_pdefields.field, amrex::Orientation::low),
94 this->m_pdefields.field, amrex::Orientation::high));
95 this->m_applier->setDomainBC(
97 this->m_pdefields.field, amrex::Orientation::low),
99 this->m_pdefields.field, amrex::Orientation::high));
100
101 m_lhs_src_term.setVal(0.0_rt);
102 }
103
105 void compute_diff_term(const FieldState fstate)
106 {
107 this->setup_operator(*this->m_applier, 0.0_rt, -1.0_rt, fstate);
108
109 auto tau_state =
110 std::is_same_v<Scheme, fvm::Godunov> ? FieldState::New : fstate;
111 amrex::MLMG mlmg(*this->m_applier);
112 mlmg.apply(
113 this->m_pdefields.diff_term.state(tau_state).vec_ptrs(),
114 this->m_pdefields.field.vec_ptrs());
115 }
116
117 void
118 set_acoeffs(typename SDR::MLDiffOp& linop, const FieldState fstate) override
119 {
120 BL_PROFILE("amr-wind::pde::set_acoeffs");
121 auto& repo = m_pdefields.repo;
122
123 const int nlevels = repo.num_active_levels();
124 auto& density = m_density.state(fstate);
125 auto lhs_total = repo.create_scratch_field(1, 1);
127 *lhs_total, 1.0_rt, m_lhs_src_term, 0, 1.0_rt, density, 0, 0, 1, 1);
128
129 for (int lev = 0; lev < nlevels; ++lev) {
130 linop.setACoeffs(lev, (*lhs_total)(lev));
131 }
132 }
133
135};
136
137} // namespace amr_wind::pde
138
139#endif /* SDR_OPS_H */
Definition CFDSim.H:54
Definition Field.H:116
Definition SimTime.H:33
PDEFields & m_pdefields
Definition DiffusionOps.H:103
Field & m_density
Definition DiffusionOps.H:104
std::unique_ptr< SDR::MLDiffOp > m_applier
Definition DiffusionOps.H:111
virtual void setup_operator(SDR::MLDiffOp &linop, const amrex::Real alpha, const amrex::Real beta, const FieldState fstate)
Definition DiffusionOps.cpp:57
std::unique_ptr< SDR::MLDiffOp > m_solver
Definition DiffusionOps.H:110
DiffSolverIface(PDEFields &fields, const bool has_overset, const bool mesh_mapping, const std::string &prefix="diffusion")
Definition DiffusionOps.cpp:12
Definition TurbulenceModel.H:32
void lower_bound(FType &field, const amrex::Real min_value, const int icomp=0)
Definition field_ops.H:383
void lincomb(T1 &dst, const amrex::Real a, const T2 &x, const int xcomp, const amrex::Real b, const T3 &y, const int ycomp, const int dstcomp, const int numcomp, const amrex::IntVect &nghost)
Definition field_ops.H:320
FieldState
Definition FieldDescTypes.H:14
@ New
Same as FieldState::NP1.
Definition FieldDescTypes.H:20
Definition AdvOp_Godunov.H:21
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:49
amrex::Array< amrex::LinOpBCType, AMREX_SPACEDIM > get_diffuse_scalar_bc(amr_wind::Field &scalar, amrex::Orientation::Side side) noexcept
Definition incflo_diffusion.cpp:70
void set_acoeffs(typename SDR::MLDiffOp &linop, const FieldState fstate) override
Definition sdr_ops.H:118
Field & m_lhs_src_term
Definition sdr_ops.H:134
void compute_diff_term(const FieldState fstate)
Computes the diffusion term that goes in the RHS.
Definition sdr_ops.H:105
DiffusionOp(PDEFields &fields, const bool has_overset, const bool mesh_mapping)
Definition sdr_ops.H:83
CFDSim & sim
Definition sdr_ops.H:68
FieldRegOp(CFDSim &sim_in)
Definition sdr_ops.H:53
PDEFields operator()(const SimTime &time)
Definition sdr_ops.H:55
Definition PDEFields.H:27
amrex::Real clip_value
Definition sdr_ops.H:47
PDEFields & m_fields
Definition sdr_ops.H:46
PostSolveOp(CFDSim &, PDEFields &fields)
Definition sdr_ops.H:38
void operator()(const amrex::Real time)
Definition sdr_ops.H:40
Definition SDR.H:32
amrex::MLABecLaplacian MLDiffOp
Definition SDR.H:33
static constexpr int ndim
Definition SDR.H:41
static std::string var_name()
Definition SDR.H:37
void operator()()
Definition sdr_ops.H:22
turbulence::TurbulenceModel & m_tmodel
Definition sdr_ops.H:28
PDEFields & m_fields
Definition sdr_ops.H:29
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition sdr_ops.H:18