1#ifndef DISK_SPREADING_H
2#define DISK_SPREADING_H
9using namespace amrex::literals;
30 const amrex::MFIter& mfi,
31 const amrex::Geometry& geom)
43 const amrex::Geometry&);
48 const amrex::MFIter& mfi,
49 const amrex::Geometry& geom)
51 const auto& bx = mfi.tilebox();
54 actObj.m_data.info().bound_box, geom);
55 const auto& bxi = bx & bxa;
60 const auto& sarr = actObj.m_act_src(lev).array(mfi);
61 const auto& problo = geom.ProbLoArray();
62 const auto& dx = geom.CellSizeArray();
64 const auto& data = actObj.m_data.meta();
68 const auto* pos = actObj.m_pos.data();
69 const auto* force = actObj.m_force.data();
70 const int npts = data.num_force_pts;
71 const int nForceTheta = data.num_force_theta_pts;
74 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
76 problo[0] + ((i + 0.5_rt) * dx[0]),
77 problo[1] + ((j + 0.5_rt) * dx[1]),
78 problo[2] + ((k + 0.5_rt) * dx[2]),
81 amrex::RealArray src_force = {0.0_rt};
82 for (
int ip = 0; ip < npts; ++ip) {
83 const auto& pforce = force[ip] / nForceTheta;
84 const auto pLoc = pos[ip];
86 for (
int it = 0; it < nForceTheta; ++it) {
87 const amrex::Real angle =
90 const auto diskPoint = pLoc & rotMatrix;
91 const auto distance = diskPoint - cc;
92 const auto projection_weight =
95 src_force[0] += projection_weight * pforce.x();
96 src_force[1] += projection_weight * pforce.y();
97 src_force[2] += projection_weight * pforce.z();
101 sarr(i, j, k, 0) += src_force[0];
102 sarr(i, j, k, 1) += src_force[1];
103 sarr(i, j, k, 2) += src_force[2];
110 const amrex::MFIter& mfi,
111 const amrex::Geometry& geom)
113 const auto& bx = mfi.tilebox();
116 actObj.m_data.info().bound_box, geom);
117 const auto& bxi = bx & bxa;
122 const auto& sarr = actObj.m_act_src(lev).array(mfi);
123 const auto& problo = geom.ProbLoArray();
124 const auto& dx = geom.CellSizeArray();
126 const auto& data = actObj.m_data.meta();
128 const amrex::Real dR = data.dr;
129 const amrex::Real epsilon = data.epsilon;
132 const auto* pos = actObj.m_pos.data();
133 const auto* force = actObj.m_force.data();
134 const int npts = data.num_force_pts;
136 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
138 problo[0] + ((i + 0.5_rt) * dx[0]),
139 problo[1] + ((j + 0.5_rt) * dx[1]),
140 problo[2] + ((k + 0.5_rt) * dx[2]),
143 amrex::RealArray src_force = {0.0_rt};
144 for (
int ip = 0; ip < npts; ++ip) {
148 const auto dist_on_disk =
150 const auto& pforce = force[ip];
152 const amrex::Real weight_R =
154 const amrex::Real weight_T =
156 const amrex::Real weight_N =
158 const auto projection_weight = weight_R * weight_T * weight_N;
160 src_force[0] += projection_weight * pforce.x();
161 src_force[1] += projection_weight * pforce.y();
162 src_force[2] += projection_weight * pforce.z();
165 sarr(i, j, k, 0) += src_force[0];
166 sarr(i, j, k, 1) += src_force[1];
167 sarr(i, j, k, 2) += src_force[2];
173 const amrex::MFIter& mfi,
174 const amrex::Geometry& geom)
176 const auto& bx = mfi.tilebox();
179 actObj.m_data.info().bound_box, geom);
180 const auto& bxi = bx & bxa;
185 const auto& sarr = actObj.m_act_src(lev).array(mfi);
186 const auto& problo = geom.ProbLoArray();
187 const auto& dx = geom.CellSizeArray();
189 const auto& data = actObj.m_data.meta();
191 const amrex::Real dR = data.dr;
192 const amrex::Real dTheta =
194 const amrex::Real epsilon = data.epsilon;
197 const auto* pos = actObj.m_pos.data();
198 const auto* force = actObj.m_force.data();
199 const int npts = data.num_force_pts;
201 amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(
int i,
int j,
int k) {
203 problo[0] + ((i + 0.5_rt) * dx[0]),
204 problo[1] + ((j + 0.5_rt) * dx[1]),
205 problo[2] + ((k + 0.5_rt) * dx[2]),
208 amrex::RealArray src_force = {0.0_rt};
209 for (
int ip = 0; ip < npts; ++ip) {
213 const auto dArc = radius * dTheta;
214 const auto dist_on_disk =
216 const amrex::Real arclength = dist_on_disk.y() * radius;
217 const auto& pforce = force[ip];
219 const amrex::Real weight_R =
221 const amrex::Real weight_T =
223 const amrex::Real weight_N =
225 const auto projection_weight = weight_R * weight_T * weight_N;
227 src_force[0] += projection_weight * pforce.x();
228 src_force[1] += projection_weight * pforce.y();
229 src_force[2] += projection_weight * pforce.z();
232 sarr(i, j, k, 0) += src_force[0];
233 sarr(i, j, k, 1) += src_force[1];
234 sarr(i, j, k, 2) += src_force[2];
242 if (std::is_same_v<UniformCt, typename OwnerType::TraitType>) {
243 if (key ==
"UniformGaussian") {
245 }
else if (key ==
"LinearBasis") {
248 amrex::Abort(
"Invalid spreading type");
void linear_basis_spreading(const T &actObj, const int lev, const amrex::MFIter &mfi, const amrex::Geometry &geom)
Definition disk_spreading.H:107
SpreadingFunction()
Definition disk_spreading.H:238
void linear_basis_in_theta(const T &actObj, const int lev, const amrex::MFIter &mfi, const amrex::Geometry &geom)
Definition disk_spreading.H:170
void uniform_gaussian_spreading(const T &actObj, const int lev, const amrex::MFIter &mfi, const amrex::Geometry &geom)
Definition disk_spreading.H:45
MyType< ActTrait > OwnerType
Definition disk_spreading.H:25
void initialize(const std::string &key)
Definition disk_spreading.H:240
SpreadingFunction(const SpreadingFunction &)=delete
void operator()(const T &actObj, const int lev, const amrex::MFIter &mfi, const amrex::Geometry &geom)
Definition disk_spreading.H:27
void(SpreadingFunction::* m_function)(const MyType< ActTrait > &actObj, const int, const amrex::MFIter &, const amrex::Geometry &)
Definition disk_spreading.H:39
void operator=(const SpreadingFunction &)=delete
Definition ActSrcLineOp.H:12
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE vs::Vector delta_pnts_cyl(const vs::Vector &origin, const vs::Vector &normal, const vs::Vector &point1, const vs::Vector &point2)
Definition actuator_utils.H:89
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real gaussian1d(const amrex::Real &dist, const amrex::Real &eps)
Definition actuator_utils.H:71
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real gaussian3d(const vs::Vector &dist, const vs::Vector &eps)
Definition actuator_utils.H:45
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real linear_basis_1d(const amrex::Real distance, const amrex::Real dX)
Definition actuator_utils.H:129
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE constexpr amrex::Real two_pi()
Return .
Definition trig_ops.H:19
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::Real degrees(const amrex::Real rad_val)
Convert from radians to degrees.
Definition trig_ops.H:39
amrex::Box realbox_to_box(const amrex::RealBox &rbx, const amrex::Geometry &geom)
Definition index_operations.cpp:5
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE Tensor quaternion(const Vector &axis, const amrex::Real angle)
Definition tensorI.H:218
VectorT< amrex::Real > Vector
Definition vector.H:145
AMREX_GPU_HOST_DEVICE static AMREX_FORCE_INLINE constexpr VectorT< amrex::Real > one()
Definition vector.H:50
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE T & x() &
Definition vector.H:97