/home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/icns/icns_ops.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/equation_systems/icns/icns_ops.H Source File
AMR-Wind 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 amr_wind::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#ifdef AMREX_USE_OMP
97#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
98#endif
99 for (amrex::MFIter mfi(src_term, amrex::TilingIfNotGPU());
100 mfi.isValid(); ++mfi) {
101 const auto& bx = mfi.tilebox();
102 const auto& vf = src_term.array(mfi);
103 const auto& rho = density(lev).const_array(mfi);
104 const auto& gp = grad_p(lev).const_array(mfi);
105 amrex::Array4<amrex::Real const> fac =
106 mesh_mapping ? ((*mesh_fac)(lev).const_array(mfi))
107 : amrex::Array4<amrex::Real const>();
108
109 amrex::ParallelFor(
110 bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
111 amrex::Real rhoinv = 1.0_rt / rho(i, j, k);
112 amrex::Real fac_x =
113 mesh_mapping ? (fac(i, j, k, 0)) : 1.0_rt;
114 amrex::Real fac_y =
115 mesh_mapping ? (fac(i, j, k, 1)) : 1.0_rt;
116 amrex::Real fac_z =
117 mesh_mapping ? (fac(i, j, k, 2)) : 1.0_rt;
118
119 vf(i, j, k, 0) =
120 -(1.0_rt / fac_x * gp(i, j, k, 0)) * rhoinv;
121 vf(i, j, k, 1) =
122 -(1.0_rt / fac_y * gp(i, j, k, 1)) * rhoinv;
123 vf(i, j, k, 2) =
124 -(1.0_rt / fac_z * gp(i, j, k, 2)) * rhoinv;
125 });
126
127 for (const auto& src : this->sources) {
128 (*src)(lev, mfi, bx, fstate, vf);
129 }
130 }
131 }
132 // Multiply velocity src terms by density for momentum equation
133 this->multiply_rho(fstate);
134 }
135
137};
138
142template <>
144{
146 : m_tmodel(tmodel), m_fields(fields)
147 {}
148
149 void operator()() { m_tmodel.update_mueff(m_fields.mueff); }
150
153};
154
155} // namespace amr_wind::pde
156
157#endif /* ICNS_OPS_H */
Definition CFDSim.H:54
Definition FieldFillPatchOps.H:174
Definition Field.H:116
Definition SimTime.H:33
Definition TurbulenceModel.H:32
FieldState
Definition FieldDescTypes.H:14
@ CELL
Cell-centered (default)
Definition FieldDescTypes.H:28
@ NPH
State at (n + 1/2) (intermediate) timestep.
Definition FieldDescTypes.H:18
FieldState phi_state(const FieldState fstate)
Definition FieldUtils.H:115
Definition AdvOp_Godunov.H:21
PDEFields create_fields_instance(const SimTime &time, FieldRepo &repo, const FieldInterpolator itype=FieldInterpolator::CellConsLinear)
Definition PDEHelpers.H:49
FieldRegOp(CFDSim &sim_in)
Definition icns_ops.H:32
PDEFields operator()(const SimTime &time)
Definition icns_ops.H:34
CFDSim & sim
Definition icns_ops.H:71
Definition icns.H:34
static constexpr int ndim
Definition icns.H:40
Definition PDEFields.H:27
void operator()(const FieldState fstate, const bool mesh_mapping) override
Update source terms during time-integration procedure.
Definition icns_ops.H:84
SrcTermOp(PDEFields &fields_in)
Definition icns_ops.H:80
Field & grad_p
Definition icns_ops.H:136
amrex::Vector< std::unique_ptr< typename ICNS::SrcTerm > > sources
Definition PDEOps.H:152
PDEFields & fields
Definition PDEOps.H:150
void multiply_rho(const FieldState fstate)
Helper method to multiply the source terms with density.
Definition PDEOps.H:94
SrcTermOpBase(PDEFields &fields_in)
Definition PDEOps.H:73
Field & m_density
Definition PDEOps.H:151
TurbulenceOp(turbulence::TurbulenceModel &tmodel, PDEFields &fields)
Definition icns_ops.H:145
void operator()()
Definition icns_ops.H:149
turbulence::TurbulenceModel & m_tmodel
Definition icns_ops.H:151
PDEFields & m_fields
Definition icns_ops.H:152