/home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/ActSrcLineOp.H Source File

AMR-Wind API: /home/runner/work/amr-wind/amr-wind/amr-wind/wind_energy/actuator/ActSrcLineOp.H Source File
AMR-Wind API v0.1.0
CFD solver for wind plant simulations
Loading...
Searching...
No Matches
ActSrcLineOp.H
Go to the documentation of this file.
1#ifndef ACTSRCLINEOP_H_
2#define ACTSRCLINEOP_H_
3
4#include "AMReX_REAL.H"
9
10using namespace amrex::literals;
11
13
14template <typename ActTrait>
15class ActSrcOp<ActTrait, ActSrcLine>
16{
17private:
18 typename ActTrait::DataType& m_data;
20
26
27 bool m_init_old{false};
28
29 void copy_to_device();
30
31public:
32 explicit ActSrcOp(typename ActTrait::DataType& data)
33 : m_data(data)
34 , m_act_src(m_data.sim().repo().get_field("actuator_src_term"))
35 {}
36
37 void initialize();
38
40
41 void operator()(
42 const int lev, const amrex::MFIter& mfi, const amrex::Geometry& geom);
43};
44
45template <typename ActTrait>
47{
48 const auto& grid = m_data.grid();
49 m_pos.resize(grid.pos.size());
50 m_pos_old.resize(grid.pos.size());
51 m_force.resize(grid.force.size());
52 m_epsilon.resize(grid.epsilon.size());
53 m_orientation.resize(grid.orientation.size());
54}
55
56template <typename ActTrait>
58{
59 const auto& grid = m_data.grid();
60
61 // Populate old positions before new positions are updated
62 if (m_init_old) {
63 amrex::Gpu::copy(
64 amrex::Gpu::deviceToDevice, m_pos.begin(), m_pos.end(),
65 m_pos_old.begin());
66 }
67
68 amrex::Gpu::copy(
69 amrex::Gpu::hostToDevice, grid.pos.begin(), grid.pos.end(),
70 m_pos.begin());
71 amrex::Gpu::copy(
72 amrex::Gpu::hostToDevice, grid.force.begin(), grid.force.end(),
73 m_force.begin());
74 amrex::Gpu::copy(
75 amrex::Gpu::hostToDevice, grid.epsilon.begin(), grid.epsilon.end(),
76 m_epsilon.begin());
77 amrex::Gpu::copy(
78 amrex::Gpu::hostToDevice, grid.orientation.begin(),
79 grid.orientation.end(), m_orientation.begin());
80
81 if (!m_init_old) {
82 amrex::Gpu::copy(
83 amrex::Gpu::hostToDevice, grid.pos.begin(), grid.pos.end(),
84 m_pos_old.begin());
85 m_init_old = true;
86 }
87}
88
89template <typename ActTrait>
91 const int lev, const amrex::MFIter& mfi, const amrex::Geometry& geom)
92{
93 BL_PROFILE(
94 "amr-wind::ActSrcOp<" + ActTrait::identifier() +
96
97 const auto& bx = mfi.tilebox();
98
99 const auto bxa =
100 amr_wind::utils::realbox_to_box(m_data.info().bound_box, geom);
101 const auto& bxi = bx & bxa;
102 if (bxi.isEmpty()) {
103 return;
104 }
105
106 const auto& sarr = m_act_src(lev).array(mfi);
107 const auto& problo = geom.ProbLoArray();
108 const auto& dx = geom.CellSizeArray();
109
110 const int npts = m_pos.size();
111 const auto* pos = m_pos.data();
112 const auto* opos = m_pos_old.data();
113 const auto* force = m_force.data();
114 const auto* eps = m_epsilon.data();
115 const auto* tmat = m_orientation.data();
116
117 const auto dcoord_flags = m_data.grid().dcoord_flags;
118
119 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept {
120 const vs::Vector cc{
121 problo[0] + (i + 0.5_rt) * dx[0],
122 problo[1] + (j + 0.5_rt) * dx[1],
123 problo[2] + (k + 0.5_rt) * dx[2],
124 };
125
126 amrex::RealArray src_force = {0.0_rt};
127 for (int ip = 0; ip < npts; ++ip) {
128 // Put force at n+1/2 location for Godunov
129 constexpr amrex::Real wt = 0.5_rt;
130 const auto pos_ip = wt * pos[ip] + (1.0_rt - wt) * opos[ip];
131 const auto dist = cc - pos_ip;
132 // Convert to local (chord, span, thickness) coords
133 const auto dist_local_3D = tmat[ip] & dist;
134 // In local coords, zero disabled distances (e.g., for 2D)
135 const auto dist_local = dist_local_3D * dcoord_flags;
136 const auto gauss_fac = utils::gaussian3d(dist_local, eps[ip]);
137 const auto& pforce = force[ip];
138
139 src_force[0] += gauss_fac * pforce.x();
140 src_force[1] += gauss_fac * pforce.y();
141 src_force[2] += gauss_fac * pforce.z();
142 }
143
144 sarr(i, j, k, 0) += src_force[0];
145 sarr(i, j, k, 1) += src_force[1];
146 sarr(i, j, k, 2) += src_force[2];
147 });
148}
149} // namespace amr_wind::actuator::ops
150
151#endif /* ACTSRCLINEOP_H_ */
Definition Field.H:116
ActTrait::DataType & m_data
Definition ActSrcLineOp.H:18
DeviceVecList m_force
Definition ActSrcLineOp.H:23
void copy_to_device()
Definition ActSrcLineOp.H:57
DeviceVecList m_epsilon
Definition ActSrcLineOp.H:24
DeviceVecList m_pos
Definition ActSrcLineOp.H:21
ActSrcOp(typename ActTrait::DataType &data)
Definition ActSrcLineOp.H:32
DeviceVecList m_pos_old
Definition ActSrcLineOp.H:22
DeviceTensorList m_orientation
Definition ActSrcLineOp.H:25
Definition ActSrcLineOp.H:12
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real gaussian3d(const vs::Vector &dist, const vs::Vector &eps)
Definition actuator_utils.H:45
amrex::Gpu::DeviceVector< amr_wind::vs::Tensor > DeviceTensorList
Definition actuator_types.H:70
amrex::Gpu::DeviceVector< amr_wind::vs::Vector > DeviceVecList
Definition actuator_types.H:69
amrex::Box realbox_to_box(const amrex::RealBox &rbx, const amrex::Geometry &geom)
Definition index_operations.cpp:5
VectorT< amrex::Real > Vector
Definition vector.H:148
Definition actuator_types.H:41
static std::string identifier()
Definition actuator_types.H:42