GInX
Geodesics Integrator tool for particles in GRMHD using Adaptive Mesh Refinement using AMReX.
BaseParticleContainer.hxx
Go to the documentation of this file.
1
14#ifndef BASEPARTICLESCONTAINER_HXX
15#define BASEPARTICLESCONTAINER_HXX
16
17// Include libraries
18#include "AMReX_CTOParallelForImpl.H"
19#include <AMReX_AmrParticles.H>
20#include <AMReX_Particles.H>
21#include <cctk.h>
22#include <cctk_Arguments.h>
23#include <cctk_Parameters.h>
24#include <cctk_core.h>
25#include <string>
26
27namespace GInX {
28
29template <typename StructType>
31 : public amrex::ParIter<0, 0, StructType::n_attributes, 0> {
32public:
33 using amrex::ParIter<0, 0, StructType::n_attributes, 0>::ParIter;
34 using RealVector = typename amrex::ParIter<
35 0, 0, StructType::n_attributes>::ContainerType::RealVector;
36
37 const std::array<RealVector, StructType::n_attributes> &GetAttribs() const {
38 return this->GetStructOfArrays().GetRealData();
39 }
40
41 std::array<RealVector, StructType::n_attributes> &GetAttributes() {
42 return this->GetStructOfArrays().GetRealData();
43 }
44
45 const RealVector &GetAttribs(int comp) const {
46 return this->GetStructOfArrays().GetRealData(comp);
47 }
48
50 return this->GetStructOfArrays().GetRealData(comp);
51 }
52}; // class ParicleIterator
53
65template <typename OtherContainer, typename StructType>
67 : public amrex::AmrParticleContainer<0, 0, StructType::n_attributes, 0> {
68public:
69 // Name of the particles
70 const std::string name = StructType::name;
71 // Number of attributes per each particle
72 static constexpr int n_attributes = StructType::n_attributes;
73
79 BaseParticleContainer(amrex::AmrCore *amr_core)
80 : amrex::AmrParticleContainer<0, 0, StructType::n_attributes, 0>(
81 amr_core) {}
82
83 virtual ~BaseParticleContainer() = default;
84
101 template <typename Function>
102 void initialize(Function initializer_function, const CCTK_REAL *real_params,
103 const CCTK_INT *int_params) {
104 initializer_function(static_cast<OtherContainer &>(*this), real_params,
105 int_params);
106 };
107
126 template <typename Function>
127 void initialize(Function initializer_function, const amrex::MultiFab &metric,
128 const int &level, const CCTK_REAL *real_params,
129 const CCTK_INT *int_params) {
130 initializer_function(static_cast<OtherContainer &>(*this), metric, level,
131 real_params, int_params);
132 };
133
146 virtual void evolve(const amrex::MultiFab &lapse,
147 const amrex::MultiFab &shift,
148 const amrex::MultiFab &metric,
149 const amrex::MultiFab &curv, const CCTK_REAL &dt,
150 const int &lev) = 0;
151
163 void check_banned_zones(const int &level, const CCTK_INT4 &zones,
164 const CCTK_REAL (&x)[10], const CCTK_REAL (&y)[10],
165 const CCTK_REAL (&z)[10],
166 const CCTK_REAL (&radius)[10]) {
167
168 if (!zones) {
169 return;
170 }
171
172 for (ParticleIterator<StructType> pti(*this, level); pti.isValid(); ++pti) {
173 const int np = pti.numParticles();
174 auto *AMREX_RESTRICT particles = &(pti.GetArrayOfStructs()[0]);
175
176 auto self = this;
177 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(int i) noexcept {
178 bool out = false;
179 for (int check = 0; check < zones; check++) {
180 const CCTK_REAL dx = particles[i].pos(0) - x[check];
181 const CCTK_REAL dy = particles[i].pos(1) - y[check];
182 const CCTK_REAL dz = particles[i].pos(2) - z[check];
183 out |= (dx * dx + dy * dy + dz * dz <= radius[check] * radius[check]);
184 }
185 if (out) {
186 particles[i].id() = -1;
187 return;
188 }
189 });
190 }
191 }
192
200 void outputParticlesAscii(const int &it, const int &plot_every,
201 const std::string &out_dir) {
202 if (plot_every > 0 && it % plot_every == 0) {
203 const std::string &file_name =
204 out_dir + "/" + amrex::Concatenate(this->name, it);
205 CCTK_VINFO(" Writing ascii file %s", file_name.c_str());
206
207 this->WriteAsciiFile(file_name);
208 }
209 };
210
218 void outputParticlesPlot(const int &it, const int &plot_every,
219 const std::string &out_dir) {
220 if (plot_every > 0 && it % plot_every == 0) {
221 const std::string file_name =
222 out_dir + "/" + amrex::Concatenate("plt", it);
223 CCTK_VINFO("Writing plot file %s", file_name.c_str());
224
225 this->WritePlotFile(file_name, this->name);
226 }
227 };
228
229}; // class BaseParticlesContainer
230
231} // namespace GInX
232
233#endif // !BASEPARTICLESCONTAINER_HXX
BaseParticleContainer abstract class definition.
Definition: BaseParticleContainer.hxx:67
void outputParticlesPlot(const int &it, const int &plot_every, const std::string &out_dir)
Definition: BaseParticleContainer.hxx:218
void check_banned_zones(const int &level, const CCTK_INT4 &zones, const CCTK_REAL(&x)[10], const CCTK_REAL(&y)[10], const CCTK_REAL(&z)[10], const CCTK_REAL(&radius)[10])
Definition: BaseParticleContainer.hxx:163
BaseParticleContainer(amrex::AmrCore *amr_core)
Definition: BaseParticleContainer.hxx:79
static constexpr int n_attributes
Definition: BaseParticleContainer.hxx:72
void initialize(Function initializer_function, const amrex::MultiFab &metric, const int &level, const CCTK_REAL *real_params, const CCTK_INT *int_params)
Initialize the particles given a custom initialization function.
Definition: BaseParticleContainer.hxx:127
virtual void evolve(const amrex::MultiFab &lapse, const amrex::MultiFab &shift, const amrex::MultiFab &metric, const amrex::MultiFab &curv, const CCTK_REAL &dt, const int &lev)=0
void outputParticlesAscii(const int &it, const int &plot_every, const std::string &out_dir)
Definition: BaseParticleContainer.hxx:200
const std::string name
Definition: BaseParticleContainer.hxx:70
virtual ~BaseParticleContainer()=default
void initialize(Function initializer_function, const CCTK_REAL *real_params, const CCTK_INT *int_params)
Initialize the particles given a custom initialization function.
Definition: BaseParticleContainer.hxx:102
Definition: BaseParticleContainer.hxx:31
typename amrex::ParIter< 0, 0, StructType::n_attributes >::ContainerType::RealVector RealVector
Definition: BaseParticleContainer.hxx:35
std::array< RealVector, StructType::n_attributes > & GetAttributes()
Definition: BaseParticleContainer.hxx:41
const RealVector & GetAttribs(int comp) const
Definition: BaseParticleContainer.hxx:45
const std::array< RealVector, StructType::n_attributes > & GetAttribs() const
Definition: BaseParticleContainer.hxx:37
RealVector & GetAttributes(int comp)
Definition: BaseParticleContainer.hxx:49
Interpolators namespace.
Definition: ParticlesContainer.hxx:39