/home/runner/work/amr-wind/amr-wind/amr-wind/turbulence/LES/AMD.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/turbulence/LES/AMD.H Source File
AMR-Wind 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>
12#include "AMReX_REAL.H"
13
14using namespace amrex::literals;
15
16namespace amr_wind::turbulence {
20template <typename Transport>
21class AMD : public TurbModelBase<Transport>
22{
23public:
24 static std::string identifier() { return "AMD-" + Transport::identifier(); }
25
26 explicit AMD(CFDSim& sim);
27
29 std::string model_name() const override { return "AMD"; }
30
33 const FieldState fstate, const DiffusionType /*unused*/) override;
34
35 template <typename IndexSelector>
37 const FieldState fstate, const IndexSelector& idxOp);
38
40 void update_alphaeff(Field& alphaeff) override;
41
44
46 void parse_model_coeffs() override;
47
49 void post_advance_work() override {};
50
51private:
54 amrex::Real m_C{0.333333333333333_rt};
55
58
59 const Field& m_vel;
61 const Field& m_rho;
63 amrex::Vector<amrex::Real> m_gravity{0.0_rt, 0.0_rt, -9.81_rt};
64};
65
66AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real amd_muvel(
67 int i,
68 int j,
69 int k,
70 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx, // Grid spacing
71 const amrex::Real beta, // Thermal expansion coefficient
72 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& gravity,
73 const amrex::Real C, // Poincare const
74 const amrex::Array4<amrex::Real const>& gradVel,
75 const amrex::Array4<amrex::Real const>& gradT,
76 const amrex::Real* gradTbar_coord_begin,
77 const amrex::Real* gradTbar_coord_end,
78 const amrex::Real* gradTbar,
79 const int normal_dir,
80 const amrex::Real nlo) noexcept
81{
82 amrex::Real num_shear = 0.0_rt;
83 amrex::Real num_buoy = 0.0_rt;
84 amrex::Real denom = 0.0_rt;
85 const int n_ind = amr_wind::direction_selector(i, j, k, normal_dir);
86 const amrex::Real h = nlo + (n_ind + 0.5_rt) * dx[normal_dir];
87 const amrex::Real gradTbar_h = amr_wind::interp::linear(
88 gradTbar_coord_begin, gradTbar_coord_end, gradTbar, h);
89 for (int ii = 0; ii < AMREX_SPACEDIM; ++ii) {
90 // This should operate only on the wall normal velocity
91 num_buoy +=
92 gradVel(i, j, k, normal_dir * AMREX_SPACEDIM + ii) *
93 (gradT(i, j, k, ii) - ((ii == normal_dir) ? gradTbar_h : 0.0_rt)) *
94 dx[ii] * dx[ii];
95
96 for (int jj = 0; jj < AMREX_SPACEDIM; ++jj) {
97 const amrex::Real diuj = gradVel(i, j, k, ii * AMREX_SPACEDIM + jj);
98 const amrex::Real djui = gradVel(i, j, k, jj * AMREX_SPACEDIM + ii);
99 denom += diuj * diuj;
100 const amrex::Real sij = 0.5_rt * (diuj + djui);
101 for (int kk = 0; kk < AMREX_SPACEDIM; ++kk) {
102 const amrex::Real dkui =
103 gradVel(i, j, k, ii * AMREX_SPACEDIM + kk);
104 const amrex::Real dkuj =
105 gradVel(i, j, k, jj * AMREX_SPACEDIM + kk);
106 num_shear += dkui * dkuj * dx[kk] * dx[kk] * sij;
107 }
108 }
109 }
110 denom = amrex::max<amrex::Real>(
111 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt, denom);
112 num_shear *= -C;
113 num_buoy *= C * beta * std::abs(gravity[normal_dir]);
114 return amrex::max<amrex::Real>(
115 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt,
116 (num_shear + num_buoy) / denom);
117}
118
119AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real amd_thermal_diff(
120 int i,
121 int j,
122 int k,
123 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM>& dx, // Grid spacing
124 const amrex::Real C, // Poincare const
125 const amrex::Array4<amrex::Real const>& gradVel,
126 const amrex::Array4<amrex::Real const>& gradT) noexcept
127{
128 amrex::Real num = 0;
129 amrex::Real denom = 0;
130 for (int ii = 0; ii < AMREX_SPACEDIM; ++ii) {
131 const amrex::Real diT = gradT(i, j, k, ii);
132 denom += diT * diT;
133 for (int kk = 0; kk < AMREX_SPACEDIM; ++kk) {
134 const amrex::Real dkui = gradVel(i, j, k, ii * AMREX_SPACEDIM + kk);
135 const amrex::Real dkT = gradT(i, j, k, kk);
136 num += dkui * diT * dkT * dx[kk] * dx[kk];
137 }
138 }
139
140 denom = amrex::max<amrex::Real>(
141 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt, denom);
142 num *= -C;
143 return amrex::max<amrex::Real>(
144 std::numeric_limits<amrex::Real>::epsilon() * 1.0e1_rt, num / denom);
145}
146
147} // namespace amr_wind::turbulence
148
149#endif /* AMD_H */
Definition CFDSim.H:54
Definition Field.H:116
amrex::Vector< amrex::Real > m_gravity
Definition AMD.H:63
void update_turbulent_viscosity(const FieldState fstate, const IndexSelector &idxOp)
void update_turbulent_viscosity(const FieldState fstate, const DiffusionType) override
Update the turbulent viscosity field.
Definition AMD.cpp:43
const Field & m_temperature
Definition AMD.H:60
AMD(CFDSim &sim)
Definition AMD.cpp:21
std::string model_name() const override
Model name for debugging purposes.
Definition AMD.H:29
void parse_model_coeffs() override
Parse turbulence model coefficients for this model.
Definition AMD.cpp:35
amrex::Real m_C
Poincare coefficient (default value set for 2nd order AMR-wind discretization)
Definition AMD.H:54
void update_alphaeff(Field &alphaeff) override
Update the effective thermal diffusivity field.
Definition AMD.cpp:120
TurbulenceModel::CoeffsDictType model_coeffs() const override
Return model coefficients dictionary.
Definition AMD.cpp:156
static std::string identifier()
Definition AMD.H:24
const Field & m_rho
Definition AMD.H:61
const Field & m_vel
Definition AMD.H:59
int m_normal_dir
Wall-normal direction axis.
Definition AMD.H:57
FieldPlaneAveragingFine m_pa_temp
Definition AMD.H:62
void post_advance_work() override
No post advance work for this model.
Definition AMD.H:49
TurbModelBase(CFDSim &sim)
Definition TurbModelBase.H:101
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:14
DiffusionType
Definition incflo_enums.H:4
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:129
Definition CFDSim.H:30
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) noexcept
Definition AMD.H:119
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) noexcept
Definition AMD.H:66
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
FPlaneAveragingFine< Field > FieldPlaneAveragingFine
Definition FieldPlaneAveragingFine.H:131
Second-order finite volume discretization stencil coefficients.