/home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/tke/tke_ops.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/tke/tke_ops.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
tke_ops.H
Go to the documentation of this file.
1#ifndef TKE_OPS_H
2#define TKE_OPS_H
3
6
7namespace amr_wind::pde {
8
12template <>
28
32template <>
34{
35 PostSolveOp(CFDSim& /*unused*/, PDEFields& fields) : m_fields(fields) {}
36
37 void operator()(const amrex::Real time)
38 {
39 // cppcheck-suppress constVariableReference
40 auto& field = m_fields.field;
41 const auto& repo = field.repo();
42 const int nlevels = repo.num_active_levels();
43 const auto clip_value = m_clip_value;
44 for (int lev = 0; lev < nlevels; ++lev) {
45 const auto& field_arrs = field(lev).arrays();
46 amrex::ParallelFor(
47 field(lev),
48 [=] AMREX_GPU_DEVICE(int nbx, int i, int j, int k) noexcept {
49 field_arrs[nbx](i, j, k) = (field_arrs[nbx](i, j, k) < 0.0)
50 ? clip_value
51 : field_arrs[nbx](i, j, k);
52 });
53 }
54 amrex::Gpu::streamSynchronize();
56 }
57
59 amrex::Real m_clip_value{1.0e-8};
60};
61
62template <typename Scheme>
63struct FieldRegOp<TKE, Scheme>
64{
65 explicit FieldRegOp(CFDSim& sim_in) : sim(sim_in)
66 {
67 amrex::ParmParse pp("TKE");
68
69 std::string interpolation;
70 pp.query("interpolation", interpolation);
71
72 if (interpolation == "PiecewiseConstant") {
74 amrex::Print()
75 << "using PiecewiseConstant interpolation for TKE fillpatch"
76 << std::endl;
77 } else {
78 amrex::Print() << "using default CellConsLinear interpolation for "
79 "TKE fillpatch"
80 << std::endl;
81 }
82 }
83
85 {
86 auto& repo = sim.repo();
87 auto fields = create_fields_instance<TKE, Scheme>(time, repo, m_itype);
88
89 repo.declare_cc_field(
90 TKE::var_name() + "_lhs_src_term", TKE::ndim, 1, 1);
91
92 sim.io_manager().register_io_var(fields.field.name());
93
94 return fields;
95 }
96
99};
100
104template <typename Scheme>
105struct DiffusionOp<TKE, Scheme> : public DiffSolverIface<typename TKE::MLDiffOp>
106{
107 static_assert(
108 TKE::ndim == 1, "DiffusionOp invoked for non-scalar TKE type");
109 static_assert(
110 std::is_same_v<typename TKE::MLDiffOp, amrex::MLABecLaplacian>,
111 "Invalid linear operator for scalar diffusion operator");
112
114 PDEFields& fields, const bool has_overset, const bool mesh_mapping)
115 : DiffSolverIface<typename TKE::MLDiffOp>(
116 fields, has_overset, mesh_mapping)
117 , m_lhs_src_term(
118 fields.repo.get_field(TKE::var_name() + "_lhs_src_term"))
119 {
120 this->m_solver->setDomainBC(
122 this->m_pdefields.field, amrex::Orientation::low),
124 this->m_pdefields.field, amrex::Orientation::high));
125 this->m_applier->setDomainBC(
127 this->m_pdefields.field, amrex::Orientation::low),
129 this->m_pdefields.field, amrex::Orientation::high));
130
131 m_lhs_src_term.setVal(0.0);
132 }
133
135 void compute_diff_term(const FieldState fstate)
136 {
137 this->setup_operator(*this->m_applier, 0.0, -1.0, fstate);
138
139 auto tau_state = std::is_same<Scheme, fvm::Godunov>::value
141 : fstate;
142 amrex::MLMG mlmg(*this->m_applier);
143 mlmg.apply(
144 this->m_pdefields.diff_term.state(tau_state).vec_ptrs(),
145 this->m_pdefields.field.vec_ptrs());
146 }
147
148 void
149 set_acoeffs(typename TKE::MLDiffOp& linop, const FieldState fstate) override
150 {
151 BL_PROFILE("amr-wind::pde::set_acoeffs");
152 auto& repo = m_pdefields.repo;
153
154 const int nlevels = repo.num_active_levels();
155 auto& density = m_density.state(fstate);
156 auto lhs_total = repo.create_scratch_field(1, 1);
158 *lhs_total, 1.0, m_lhs_src_term, 0, 1.0, density, 0, 0, 1, 1);
159
160 for (int lev = 0; lev < nlevels; ++lev) {
161 linop.setACoeffs(lev, (*lhs_total)(lev));
162 }
163 }
164
166};
167
168} // namespace amr_wind::pde
169
170#endif /* TKE_OPS_H */
Definition CFDSim.H:54
FieldRepo & repo()
Return the field repository.
Definition CFDSim.H:75
IOManager & io_manager()
Definition CFDSim.H:102
Definition Field.H:116
FieldRepo & repo() const
FieldRepo instance that manages this field.
Definition Field.H:159
void fillpatch(const amrex::Real time) noexcept
Definition Field.cpp:206
int num_active_levels() const noexcept
Total number of levels currently active in the AMR mesh.
Definition FieldRepo.H:361
void register_io_var(const std::string &fname)
Convenience function to register a variable for both output and restart.
Definition IOManager.H:76
Definition SimTime.H:30
Definition DiffusionOps.H:30
Definition TurbulenceModel.H:32
virtual void update_scalar_diff(Field &deff, const std::string &name)=0
Interface to update scalar diffusivity based on Schmidt number.
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:317
FieldState
Definition FieldDescTypes.H:14
FieldInterpolator
Definition FieldDescTypes.H:37
@ New
Same as FieldState::NP1.
@ PiecewiseConstant
Constant across cell.
@ CellConsLinear
Linear interpolation.
Definition AdvOp_Godunov.H:16
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
void compute_diff_term(const FieldState fstate)
Computes the diffusion term that goes in the RHS.
Definition tke_ops.H:135
Field & m_lhs_src_term
Definition tke_ops.H:165
void set_acoeffs(typename TKE::MLDiffOp &linop, const FieldState fstate) override
Definition tke_ops.H:149
DiffusionOp(PDEFields &fields, const bool has_overset, const bool mesh_mapping)
Definition tke_ops.H:113
Definition PDEOps.H:167
CFDSim & sim
Definition tke_ops.H:97
PDEFields operator()(const SimTime &time)
Definition tke_ops.H:84
FieldRegOp(CFDSim &sim_in)
Definition tke_ops.H:65
Definition PDEOps.H:35
CFDSim & sim
Definition PDEOps.H:53
Definition PDEFields.H:27
Field & mueff
Effective visocity field (e.g., velocity_mueff)
Definition PDEFields.H:36
Field & field
Solution variable (e.g., velocity, temperature)
Definition PDEFields.H:34
PostSolveOp(CFDSim &, PDEFields &fields)
Definition tke_ops.H:35
void operator()(const amrex::Real time)
Definition tke_ops.H:37
PDEFields & m_fields
Definition tke_ops.H:58
Definition PDEOps.H:200
PDEFields & m_fields
Definition PDEOps.H:208
Definition TKE.H:33
static std::string var_name()
Definition TKE.H:38
static constexpr int ndim
Definition TKE.H:42
amrex::MLABecLaplacian MLDiffOp
Definition TKE.H:34
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition tke_ops.H:15
void operator()()
Definition tke_ops.H:19
PDEFields & m_fields
Definition tke_ops.H:26
turbulence::TurbulenceModel & m_tmodel
Definition tke_ops.H:25
Definition PDEOps.H:174
turbulence::TurbulenceModel & m_tmodel
Definition PDEOps.H:185
PDEFields & m_fields
Definition PDEOps.H:186