/home/runner/work/kynema-sgf/kynema-sgf/src/turbulence/LES/AMD.H Source File

Kynema-SGF API: /home/runner/work/kynema-sgf/kynema-sgf/src/turbulence/LES/AMD.H Source File
Kynema-SGF API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
AMD.H
Go to the documentation of this file.
1#ifndef AMD_H
2#define AMD_H
3
4#include <AMReX_GpuContainers.H>
5#include <string>
10#include "src/fvm/stencils.H"
13#include "AMReX_REAL.H"
14
15using namespace amrex::literals;
16
17namespace kynema_sgf::turbulence {
21template <typename Transport>
22class AMD : public TurbModelBase<Transport>
23{
24public:
25 static std::string identifier() { return "AMD-" + Transport::identifier(); }
26
27 explicit AMD(CFDSim& sim);
28
30 [[nodiscard]] std::string model_name() const override { return "AMD"; }
31
34 FieldState fstate, DiffusionType /*unused*/) override;
35
36 template <typename IndexSelector>
37 void
38 update_turbulent_viscosity(FieldState fstate, const IndexSelector& idxOp);
39
41 void update_alphaeff(Field& alphaeff) override;
42
44 [[nodiscard]] TurbulenceModel::CoeffsDictType model_coeffs() const override;
45
47 void parse_model_coeffs() override;
48
50 void post_advance_work() override {};
51
53 void post_init_actions() override;
54
56 void post_regrid_actions() override;
57
58private:
61 amrex::Real m_C{0.333333333333333_rt};
62
65
66 const Field& m_vel;
68 const Field& m_rho;
70 amrex::Vector<amrex::Real> m_gravity{0.0_rt, 0.0_rt, -9.81_rt};
71
72 std::unique_ptr<ScratchField> m_gradVel;
73 std::unique_ptr<ScratchField> m_gradT;
74};
75
76AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real amd_muvel(
77 int i,
78 int j,
79 int k,
80 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx, // Grid spacing
81 const amrex::Real beta, // Thermal expansion coefficient
82 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& gravity,
83 const amrex::Real C, // Poincare const
84 const amrex::Array4<amrex::Real const>& gradVel,
85 const amrex::Array4<amrex::Real const>& gradT,
86 const amrex::Real* gradTbar_coord_begin,
87 const amrex::Real* gradTbar_coord_end,
88 const amrex::Real* gradTbar,
89 const int normal_dir,
90 const amrex::Real nlo)
91{
92 amrex::Real num_shear = 0.0_rt;
93 amrex::Real num_buoy = 0.0_rt;
94 amrex::Real denom = 0.0_rt;
95 const int n_ind = kynema_sgf::direction_selector(i, j, k, normal_dir);
96 const amrex::Real h = nlo + ((n_ind + 0.5_rt) * dx[normal_dir]);
97 const amrex::Real gradTbar_h = kynema_sgf::interp::linear(
98 gradTbar_coord_begin, gradTbar_coord_end, gradTbar, h);
99 for (int ii = 0; ii < AMREX_SPACEDIM; ++ii) {
100 // This should operate only on the wall normal velocity
101 num_buoy +=
102 gradVel(i, j, k, (normal_dir * AMREX_SPACEDIM) + ii) *
103 (gradT(i, j, k, ii) - ((ii == normal_dir) ? gradTbar_h : 0.0_rt)) *
104 dx[ii] * dx[ii];
105
106 for (int jj = 0; jj < AMREX_SPACEDIM; ++jj) {
107 const amrex::Real diuj =
108 gradVel(i, j, k, (ii * AMREX_SPACEDIM) + jj);
109 const amrex::Real djui =
110 gradVel(i, j, k, (jj * AMREX_SPACEDIM) + ii);
111 denom += diuj * diuj;
112 const amrex::Real sij = 0.5_rt * (diuj + djui);
113 for (int kk = 0; kk < AMREX_SPACEDIM; ++kk) {
114 const amrex::Real dkui =
115 gradVel(i, j, k, (ii * AMREX_SPACEDIM) + kk);
116 const amrex::Real dkuj =
117 gradVel(i, j, k, (jj * AMREX_SPACEDIM) + kk);
118 num_shear += dkui * dkuj * dx[kk] * dx[kk] * sij;
119 }
120 }
121 }
122 denom = amrex::max<amrex::Real>(
123 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt, denom);
124 num_shear *= -C;
125 num_buoy *= C * beta * std::abs(gravity[normal_dir]);
126 return amrex::max<amrex::Real>(
127 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt,
128 (num_shear + num_buoy) / denom);
129}
130
131AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real amd_thermal_diff(
132 int i,
133 int j,
134 int k,
135 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx, // Grid spacing
136 const amrex::Real C, // Poincare const
137 const amrex::Array4<amrex::Real const>& gradVel,
138 const amrex::Array4<amrex::Real const>& gradT)
139{
140 amrex::Real num = 0;
141 amrex::Real denom = 0;
142 for (int ii = 0; ii < AMREX_SPACEDIM; ++ii) {
143 const amrex::Real diT = gradT(i, j, k, ii);
144 denom += diT * diT;
145 for (int kk = 0; kk < AMREX_SPACEDIM; ++kk) {
146 const amrex::Real dkui =
147 gradVel(i, j, k, (ii * AMREX_SPACEDIM) + kk);
148 const amrex::Real dkT = gradT(i, j, k, kk);
149 num += dkui * diT * dkT * dx[kk] * dx[kk];
150 }
151 }
152
153 denom = amrex::max<amrex::Real>(
154 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt, denom);
155 num *= -C;
156 return amrex::max<amrex::Real>(
157 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt, num / denom);
158}
159
160} // namespace kynema_sgf::turbulence
161
162#endif /* AMD_H */
Definition CFDSim.H:55
Definition Field.H:112
void post_init_actions() override
Actions to perform post initialization.
Definition AMD.cpp:43
amrex::Vector< amrex::Real > m_gravity
Definition AMD.H:70
amrex::Real m_C
Poincare coefficient (default value set for 2nd order Kynema-SGF discretization)
Definition AMD.H:61
static std::string identifier()
Definition AMD.H:25
TurbulenceModel::CoeffsDictType model_coeffs() const override
Return model coefficients dictionary.
Definition AMD.cpp:171
AMD(CFDSim &sim)
Definition AMD.cpp:21
void parse_model_coeffs() override
Parse turbulence model coefficients for this model.
Definition AMD.cpp:35
FieldPlaneAveraging m_pa_temp
Definition AMD.H:69
void post_advance_work() override
No post advance work for this model.
Definition AMD.H:50
const Field & m_rho
Definition AMD.H:68
std::unique_ptr< ScratchField > m_gradT
Definition AMD.H:73
std::string model_name() const override
Model name for debugging purposes.
Definition AMD.H:30
void update_turbulent_viscosity(FieldState fstate, const IndexSelector &idxOp)
const Field & m_temperature
Definition AMD.H:67
int m_normal_dir
Wall-normal direction axis.
Definition AMD.H:64
void post_regrid_actions() override
Actions to perform post regrid.
Definition AMD.cpp:51
const Field & m_vel
Definition AMD.H:66
std::unique_ptr< ScratchField > m_gradVel
Definition AMD.H:72
void update_alphaeff(Field &alphaeff) override
Update the effective thermal diffusivity field.
Definition AMD.cpp:135
void update_turbulent_viscosity(FieldState fstate, DiffusionType) override
Update the turbulent viscosity field.
Definition AMD.cpp:59
TurbModelBase(CFDSim &sim)
Definition TurbModelBase.H:95
Field & alphaeff() override
Return the effective thermal diffusivity field.
Definition TurbModel.H:53
std::unordered_map< std::string, amrex::Real > CoeffsDictType
Default identifier used by factor methods.
Definition TurbulenceModel.H:35
FieldState
Definition FieldDescTypes.H:16
DiffusionType
Definition incflo_enums.H:6
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE std::iterator_traits< C2 >::value_type linear(const C1 xbegin, const C1 xend, const C2 yinp, const typename std::iterator_traits< C1 >::value_type &xout, const int ncomp=1, const int comp=0)
Definition linear_interpolation.H:130
Definition CFDSim.H:31
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real amd_thermal_diff(int i, int j, int k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::Real C, const amrex::Array4< amrex::Real const > &gradVel, const amrex::Array4< amrex::Real const > &gradT)
Definition AMD.H:131
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real amd_muvel(int i, int j, int k, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &dx, const amrex::Real beta, const amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > &gravity, const amrex::Real C, const amrex::Array4< amrex::Real const > &gradVel, const amrex::Array4< amrex::Real const > &gradT, const amrex::Real *gradTbar_coord_begin, const amrex::Real *gradTbar_coord_end, const amrex::Real *gradTbar, const int normal_dir, const amrex::Real nlo)
Definition AMD.H:76
FPlaneAveraging< Field > FieldPlaneAveraging
Definition FieldPlaneAveraging.H:143
AMREX_GPU_DEVICE AMREX_FORCE_INLINE int direction_selector(const int i, const int j, const int k, const int dir)
Definition DirectionSelector.H:105
Second-order finite volume discretization stencil coefficients.