14#ifndef BASEPARTICLESCONTAINER_HXX
15#define BASEPARTICLESCONTAINER_HXX
18#include "AMReX_CTOParallelForImpl.H"
19#include <AMReX_AmrParticles.H>
20#include <AMReX_Particles.H>
22#include <cctk_Arguments.h>
23#include <cctk_Parameters.h>
29template <
typename StructType>
31 :
public amrex::ParIter<0, 0, StructType::n_attributes, 0> {
33 using amrex::ParIter<0, 0, StructType::n_attributes, 0>::ParIter;
35 0, 0, StructType::n_attributes>::ContainerType::RealVector;
37 const std::array<RealVector, StructType::n_attributes> &
GetAttribs()
const {
38 return this->GetStructOfArrays().GetRealData();
42 return this->GetStructOfArrays().GetRealData();
46 return this->GetStructOfArrays().GetRealData(comp);
50 return this->GetStructOfArrays().GetRealData(comp);
65template <
typename OtherContainer,
typename StructType>
67 :
public amrex::AmrParticleContainer<0, 0, StructType::n_attributes, 0> {
70 const std::string
name = StructType::name;
80 : amrex::AmrParticleContainer<0, 0, StructType::
n_attributes, 0>(
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,
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);
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,
164 const CCTK_REAL (&x)[10],
const CCTK_REAL (&y)[10],
165 const CCTK_REAL (&z)[10],
166 const CCTK_REAL (&radius)[10]) {
173 const int np = pti.numParticles();
174 auto *AMREX_RESTRICT particles = &(pti.GetArrayOfStructs()[0]);
177 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(
int i)
noexcept {
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]);
186 particles[i].id() = -1;
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());
207 this->WriteAsciiFile(file_name);
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());
225 this->WritePlotFile(file_name, this->name);
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