55 RP::add(
"MultiPeak.Bx",
"Magnetic field x component (T)", 0.0);
56 RP::add(
"MultiPeak.By",
"Magnetic field y component (T)", 0.0);
57 RP::add(
"MultiPeak.Bz",
"Magnetic field z component (T)", 0.0);
58 RP::add(
"MultiPeak.dBx",
"Magnetic field x component cosine perturbation amplitude (T)", 0.0);
59 RP::add(
"MultiPeak.dBy",
"Magnetic field y component cosine perturbation amplitude (T)", 0.0);
60 RP::add(
"MultiPeak.dBz",
"Magnetic field z component cosine perturbation amplitude (T)", 0.0);
61 RP::add(
"MultiPeak.magXPertAbsAmp",
"Absolute amplitude of the random magnetic perturbation along x (T)", 1.0e-9);
62 RP::add(
"MultiPeak.magYPertAbsAmp",
"Absolute amplitude of the random magnetic perturbation along y (T)", 1.0e-9);
63 RP::add(
"MultiPeak.magZPertAbsAmp",
"Absolute amplitude of the random magnetic perturbation along z (T)", 1.0e-9);
64 RP::add(
"MultiPeak.lambda",
"B cosine perturbation wavelength (m)", 1.0);
65 RP::add(
"MultiPeak.densityModel",
"Which spatial density model is used?",
string(
"uniform"));
70 RP::add(pop+
"_MultiPeak.n",
"Number of peaks to create", 0);
71 RP::addComposing(pop+
"_MultiPeak.rho",
"Number density (m^-3)");
72 RP::addComposing(pop+
"_MultiPeak.Tx",
"Temperature (K)");
73 RP::addComposing(pop+
"_MultiPeak.Ty",
"Temperature");
74 RP::addComposing(pop+
"_MultiPeak.Tz",
"Temperature");
75 RP::addComposing(pop+
"_MultiPeak.Vx",
"Bulk velocity x component (m/s)");
76 RP::addComposing(pop+
"_MultiPeak.Vy",
"Bulk velocity y component (m/s)");
77 RP::addComposing(pop+
"_MultiPeak.Vz",
"Bulk velocity z component (m/s)");
78 RP::addComposing(pop+
"_MultiPeak.rhoPertAbsAmp",
"Absolute amplitude of the density perturbation");
86 RP::get(
"MultiPeak.Bx", this->
Bx);
87 RP::get(
"MultiPeak.By", this->
By);
88 RP::get(
"MultiPeak.Bz", this->
Bz);
92 RP::get(
"MultiPeak.dBx", this->
dBx);
93 RP::get(
"MultiPeak.dBy", this->
dBy);
94 RP::get(
"MultiPeak.dBz", this->
dBz);
95 RP::get(
"MultiPeak.lambda", this->
lambda);
103 RP::get(pop +
"_MultiPeak.rho",sP.
rho);
104 RP::get(pop +
"_MultiPeak.Tx", sP.
Tx);
105 RP::get(pop +
"_MultiPeak.Ty", sP.
Ty);
106 RP::get(pop +
"_MultiPeak.Tz", sP.
Tz);
107 RP::get(pop +
"_MultiPeak.Vx", sP.
Vx);
108 RP::get(pop +
"_MultiPeak.Vy", sP.
Vy);
109 RP::get(pop +
"_MultiPeak.Vz", sP.
Vz);
113 cerr <<
"You should define all parameters (MultiPeak.rho, MultiPeak.Tx, MultiPeak.Ty, MultiPeak.Tz, MultiPeak.Vx, MultiPeak.Vy, MultiPeak.Vz, MultiPeak.rhoPertAbsAmp) for all " << sP.
numberOfPeaks <<
" peaks of population " << pop <<
"." << endl;
120 string densModelString;
121 RP::get(
"MultiPeak.densityModel",densModelString);
129 const uint nRequested
139 Real rhoFactor = 1.0;
146 if ((x >= 3.9e5 && x <= 6.1e5) && (y >= 3.9e5 && y <= 6.1e5)) {
159 std::cerr<<
" ERROR in "<<__FILE__<<
":"<<__LINE__<<
": max number of supported peaks is "<<
MAXPEAKS<<
" (got "<<nPeaks<<
")"<<std::endl;
160 std::cerr<<
" Truncating peaks at "<<
MAXPEAKS<<
"!"<<std::endl;
174 rhoDev[
i] = sP.
rho[
i];
195 vmesh->getBlockInfo(blockGID,&blockCoords[0]);
196 creal vxBlock = blockCoords[0];
197 creal vyBlock = blockCoords[1];
198 creal vzBlock = blockCoords[2];
199 creal dvxCell = blockCoords[3];
200 creal dvyCell = blockCoords[4];
201 creal dvzCell = blockCoords[5];
204 for (uint ipeak=0; ipeak<nPeaks; ++ipeak) {
205 creal vx = vxBlock + (
i+0.5)*dvxCell - VxDev[ipeak];
206 creal vy = vyBlock + (
j+0.5)*dvyCell - VyDev[ipeak];
207 creal vz = vzBlock + (
k+0.5)*dvzCell - VzDev[ipeak];
210 TxDev[ipeak],TyDev[ipeak],TzDev[ipeak],
211 (rhoDev[ipeak] + rhoPertAbsAmpDev[ipeak] * rhoRndDev) * rhoFactor,
237 Real rhoFactor = 1.0;
244 if ((x >= 3.9e5 && x <= 6.1e5) && (y >= 3.9e5 && y <= 6.1e5)) {
268 std::default_random_engine rndState;
287 const auto dBx_l = this->
dBx;
288 const auto dBy_l = this->
dBy;
289 const auto dBz_l = this->
dBz;
290 const auto lambda_l = this->
lambda;
296 fsgrid.parallel_for([](
int timerId) -> phiprof::Timer {
return phiprof::Timer{timerId}; },
297 phiprof::initializeTimer(
"setProjectBField-loop"), technical,
298 [=](
const fsgrid::Coordinates &coordinates,
const fsgrid::FsStencil& stencil,
cuint sysBoundaryFlag,
cuint sysBoundaryLayer) {
299 const std::array<Real, 3> xyz = coordinates.getPhysicalCoords(stencil.i, stencil.j, stencil.k);
300 auto& cell = perb[stencil.ooo()];
302 const auto seedmodifier = coordinates.globalIDFromLocalCoordinates(stencil.i, stencil.j, stencil.k);
303 std::default_random_engine rndState_l;
304 rndState_l.seed(
seed+seedmodifier);
306 rndBuffer[0] = std::uniform_real_distribution<>(-0.5,0.5)(rndState_l);
307 rndBuffer[1] = std::uniform_real_distribution<>(-0.5,0.5)(rndState_l);
308 rndBuffer[2] = std::uniform_real_distribution<>(-0.5,0.5)(rndState_l);
310 cell[
fsgrids::bfield::PERBX] = dBx_l * cos(2.0 * M_PI * xyz[0] / lambda_l) + magXPertAbsAmp_l * rndBuffer[0];
311 cell[
fsgrids::bfield::PERBY] = dBy_l * sin(2.0 * M_PI * xyz[0] / lambda_l) + magYPertAbsAmp_l * rndBuffer[1];
312 cell[
fsgrids::bfield::PERBZ] = dBz_l * cos(2.0 * M_PI * xyz[0] / lambda_l) + magZPertAbsAmp_l * rndBuffer[2];
324 vector<std::array<Real, 3> > centerPoints;
326 array<Real, 3> point {{sP.
Vx[
i], sP.
Vy[
i], sP.
Vz[
i]}};
327 centerPoints.push_back(point);
#define ARCH_INNER_BODY(...)
void setBackgroundField(const FieldFunction &bgFunction, fsgrids::bgbspan bgb, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid, bool append)
void initialize(const double Bx, const double By, const double Bz)
virtual std::vector< std::array< Real, 3 > > getV0(creal x, creal y, creal z, const uint popID) const override
Return a vector containing the velocity coordinate of the centre of each ion population in the distri...
static void addParameters(void)
virtual void calcCellParameters(spatial_cell::SpatialCell *cell, creal &t) override
std::vector< MultiPeakSpeciesParameters > speciesParams
virtual Realf fillPhaseSpace(spatial_cell::SpatialCell *cell, const uint popID, const uint nRequested) const override
enum projects::MultiPeak::densitymodel densityModel
virtual bool initialize(void) override
virtual Realf probePhaseSpace(spatial_cell::SpatialCell *cell, const uint popID, Real vx_in, Real vy_in, Real vz_in) const override
virtual void setProjectBField(fsgrids::perbspan perb, fsgrids::bgbspan bgb, fsgrids::technicalspan technical, FieldSolverGrid &fsgrid) override
virtual void getParameters(void) override
Real getRandomNumber(std::default_random_engine &randGen) const
virtual bool initialize()
virtual void getParameters()
void setRandomCellSeed(spatial_cell::SpatialCell *cell, std::default_random_engine &randGen) const
vmesh::VelocityMesh * get_velocity_mesh(const size_t &popID)
vmesh::VelocityBlockContainer * get_velocity_blocks(const size_t &popID)
std::array< Real, CellParams::N_SPATIAL_CELL_PARAMS > parameters
vmesh::VelocityBlockContainer * dev_get_velocity_blocks(const size_t &popID)
vmesh::VelocityMesh * dev_get_velocity_mesh(const size_t &popID)
ARCH_HOSTDEV Realf * getData()
fsgrid::FsGrid< FS_STENCIL_WIDTH > FieldSolverGrid
ObjectWrapper & getObjectWrapper()
static void parallel_reduce(const uint(&limits)[NDim], Lambda loop_body, T &sum)
std::span< std::array< Real, fsgrids::bfield::N_BFIELD > > perbspan
std::span< technical > technicalspan
std::span< std::array< Real, bgbfield::N_BGB > > bgbspan
ARCH_HOSTDEV Realf TriMaxwellianPhaseSpaceDensity(creal &vx, creal &vy, creal &vz, creal &Tx, creal &Ty, creal &Tz, creal &rho, creal &mass)
std::vector< species::Species > particleSpecies
std::vector< Real > rhoPertAbsAmp