116 const size_t nlocal = 0;
117 const size_t nNew = 100000;
119 pc->createParticles(nNew);
122 auto Rview_d = pc->R.getView();
123 auto Pview_d = pc->P.getView();
125 auto Rview = Kokkos::create_mirror_view(Rview_d);
126 auto Pview = Kokkos::create_mirror_view(Pview_d);
127 Kokkos::deep_copy(Rview, Rview_d);
128 Kokkos::deep_copy(Pview, Pview_d);
130 double sumx = 0.0, sumy = 0.0;
131 double sumx2 = 0.0, sumy2 = 0.0;
133 for (
size_t i = 0; i < nNew; ++i) {
134 const double x = Rview(i)[0];
135 const double y = Rview(i)[1];
136 const double z = Rview(i)[2];
139 EXPECT_DOUBLE_EQ(z, 0.0);
142 EXPECT_DOUBLE_EQ(Pview(i)[0], 0.0);
143 EXPECT_DOUBLE_EQ(Pview(i)[1], 0.0);
144 EXPECT_DOUBLE_EQ(Pview(i)[2], 0.0);
147 const double r2 = (x * x) / (sigmaR[0] * sigmaR[0]) + (y * y) / (sigmaR[1] * sigmaR[1]);
149 EXPECT_LE(r2, 1.0 + 1e-14);
157 const double meanx = sumx / nNew;
158 const double meany = sumy / nNew;
159 const double varx = sumx2 / nNew;
160 const double vary = sumy2 / nNew;
163 EXPECT_NEAR(meanx, 0.0, 1e-2);
164 EXPECT_NEAR(meany, 0.0, 1e-2);
168 EXPECT_NEAR(varx, sigmaR[0] * sigmaR[0] / 4.0, 1e-2);
169 EXPECT_NEAR(vary, sigmaR[1] * sigmaR[1] / 4.0, 1e-2);
266 const size_t totalN = 100000;
270 const int nranksConst = std::max(1, ippl::Comm->size());
271 const size_t nranksU =
static_cast<size_t>(nranksConst);
272 const size_t maxLocalNum = totalN / nranksU + 2 * nranksU + 1;
273 pc->allocateParticles(maxLocalNum);
275 const double t0 = 2.0;
276 const double tf = 2.1;
283 double tArea = 0.5 * (f0 + f1) * (tf - t0);
285 double expectedTotalNewD = std::floor(totalN * tArea / sampler.
getDistArea());
286 const size_t expectedTotalNew =
static_cast<size_t>(expectedTotalNewD);
289 MPI_Comm_size(MPI_COMM_WORLD, &nranks);
292 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
296 size_t base = expectedTotalNew /
static_cast<size_t>(nranks);
297 size_t rem = expectedTotalNew %
static_cast<size_t>(nranks);
298 size_t expectedLocal = base + ((
static_cast<size_t>(rank) < rem) ? 1 : 0);
300 EXPECT_EQ(nlocal, expectedLocal);
302 size_t globalEmitted = 0;
303 MPI_Allreduce(&nlocal, &globalEmitted, 1, MPI_UNSIGNED_LONG, MPI_SUM, MPI_COMM_WORLD);
305 EXPECT_EQ(globalEmitted, expectedTotalNew);
void generateUniformDisk(size_type nlocal, size_t nNew, double dt)
Generates particles (x,y) uniformly on a disk distribution.