Skip to content

Commit 8c4fa42

Browse files
committed
refinement reserving capacity test
1 parent 04b1b69 commit 8c4fa42

File tree

4 files changed

+52
-26
lines changed

4 files changed

+52
-26
lines changed

src/amr/data/particles/refine/particles_data_split.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ namespace PHARE
2424
{
2525
namespace amr
2626
{
27-
enum class ParticlesDataSplitType {
28-
coarseBoundary,
27+
enum class ParticlesDataSplitType : std::uint8_t {
28+
coarseBoundary = 0,
2929
interior,
3030
coarseBoundaryOld,
3131
coarseBoundaryNew
@@ -191,6 +191,7 @@ namespace amr
191191
}
192192
return incoming_estimate;
193193
};
194+
194195
_reserve(destDomainParticles, count_expected);
195196

196197
Splitter split;

tests/amr/data/particles/refine/test_particle_data_refine_tag_strategy.hpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,14 @@ std::array<int, 3> boxBoundsUpper(Box const& box)
4242

4343

4444
template<std::size_t dimension>
45-
ParticleArray<dimension> loadCell(int iCellX, int iCellY, int iCellZ)
45+
void loadCell(ParticleArray<dimension>& particles, int iCellX, int iCellY, int iCellZ)
4646
{
47-
std::array<int, 3> _3diCell = {iCellX, iCellY, iCellZ};
47+
std::array<int, 3> const _3diCell = {iCellX, iCellY, iCellZ};
4848

49-
float middle = 0.5;
50-
float delta = 0.30f;
49+
float const middle = 0.5;
50+
float const delta = 0.30f;
5151

5252
Particle<dimension> particle;
53-
ParticleArray<dimension> particles;
5453

5554
particle.weight = 1.;
5655
particle.charge = 1.;
@@ -79,8 +78,6 @@ ParticleArray<dimension> loadCell(int iCellX, int iCellY, int iCellZ)
7978

8079
particle.delta[dirX] = middle + delta / 3;
8180
particles.push_back(particle);
82-
83-
return particles;
8481
}
8582

8683

@@ -156,17 +153,9 @@ class TagStrategy : public SAMRAI::mesh::StandardTagAndInitStrategy
156153
auto const upper = boxBoundsUpper<dimension>(particlesBox);
157154

158155
for (auto iCellX = lower[dirX]; iCellX <= upper[dirX]; ++iCellX)
159-
{
160156
for (auto iCellY = lower[dirY]; iCellY <= upper[dirY]; ++iCellY)
161-
{
162157
for (auto iCellZ = lower[dirZ]; iCellZ <= upper[dirZ]; ++iCellZ)
163-
{
164-
auto const particles = loadCell<dimension>(iCellX, iCellY, iCellZ);
165-
interior.insert(std::end(interior), std::begin(particles),
166-
std::end(particles));
167-
}
168-
}
169-
}
158+
loadCell<dimension>(interior, iCellX, iCellY, iCellZ);
170159
}
171160
}
172161
}
@@ -210,7 +199,19 @@ class TagStrategy : public SAMRAI::mesh::StandardTagAndInitStrategy
210199
// do nothing
211200
}
212201

213-
202+
auto domainParticlesForLevel(std::shared_ptr<SAMRAI::hier::PatchHierarchy> const& hierarchy,
203+
int levelNumber)
204+
{
205+
std::vector<ParticleArray<dimension>*> particle_arrays;
206+
auto level = hierarchy->getPatchLevel(levelNumber);
207+
for (auto& patch : *level)
208+
for (auto const& [name, dataId] : dataToAllocate_)
209+
particle_arrays.emplace_back(
210+
&std::dynamic_pointer_cast<ParticlesData<ParticleArray<dimension>>>(
211+
patch->getPatchData(dataId))
212+
->domainParticles);
213+
return particle_arrays;
214+
}
214215

215216
private:
216217
std::map<std::string, int> dataToAllocate_;

tests/amr/data/particles/refine/test_particledata_refine_basic_hierarchy.hpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ template<std::size_t dimension, std::size_t interpOrder, ParticlesDataSplitType
4848
class BasicHierarchy
4949
{
5050
using ParticlesVariable_t = ParticlesVariable<ParticleArray<dimension>, interpOrder>;
51+
using Splitter_t = Splitter<DimConst<dimension>, InterpConst<interpOrder>,
52+
RefinedParticlesConst<refinedParticlesNbr>>;
53+
using ParticlesRefineOperator_t
54+
= ParticlesRefineOperator<ParticleArray<dimension>, splitType, Splitter_t>;
5155

5256
public:
5357
/**
@@ -74,7 +78,7 @@ class BasicHierarchy
7478
}
7579

7680

77-
explicit BasicHierarchy(int _ratio)
81+
explicit BasicHierarchy(int _ratio = 2)
7882
: ratio{SAMRAI::tbox::Dimension{dimension}, _ratio}
7983
, inputDatabase_{SAMRAI::tbox::InputManager::getManager()->parseInputFile(
8084
inputString(_ratio))}
@@ -97,10 +101,7 @@ class BasicHierarchy
97101
dimension_, "ChopAndPackLoadBalancer",
98102
inputDatabase_->getDatabase("ChopAndPackLoadBalancer"))}
99103

100-
, refineOperator_{std::make_shared<
101-
ParticlesRefineOperator<ParticleArray<dimension>, splitType,
102-
Splitter<DimConst<dimension>, InterpConst<interpOrder>,
103-
RefinedParticlesConst<refinedParticlesNbr>>>>()}
104+
, refineOperator_{std::make_shared<ParticlesRefineOperator_t>()}
104105

105106

106107
, tagStrategy_{std::make_shared<TagStrategy<dimension>>(variablesIds_, refineOperator_,
@@ -167,6 +168,11 @@ class BasicHierarchy
167168

168169
SAMRAI::hier::IntVector const ratio;
169170

171+
auto domainParticlesForLevel(int levelNumber) const
172+
{
173+
return tagStrategy_->domainParticlesForLevel(hierarchy_, levelNumber);
174+
}
175+
170176
private:
171177
std::map<std::string, int> getVariablesIds_()
172178
{

tests/amr/data/particles/refine/test_split.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
#include "core/utilities/types.hpp"
66
#include "amr/data/particles/refine/split.hpp"
77

8+
#include "test_particledata_refine_basic_hierarchy.hpp"
9+
810
#include "gmock/gmock.h"
911
#include "gtest/gtest.h"
1012

1113

1214
namespace
1315
{
1416
template<std::size_t dimension, std::size_t interpOrder, std::size_t refineParticlesNbr>
15-
using Splitter
17+
using Splitter_t
1618
= PHARE::amr::Splitter<PHARE::core::DimConst<dimension>, PHARE::core::InterpConst<interpOrder>,
1719
PHARE::core::RefinedParticlesConst<refineParticlesNbr>>;
1820

@@ -22,7 +24,7 @@ struct SplitterTest : public ::testing::Test
2224
SplitterTest() { Splitter splitter; }
2325
};
2426

25-
using Splitters = testing::Types<Splitter<1, 1, 2>, Splitter<2, 1, 8> /*, Splitter<3, 1, 27>*/>;
27+
using Splitters = testing::Types<Splitter_t<1, 1, 2>, Splitter_t<2, 1, 8> /*, Splitter<3, 1, 27>*/>;
2628

2729
TYPED_TEST_SUITE(SplitterTest, Splitters);
2830

@@ -31,4 +33,20 @@ TYPED_TEST(SplitterTest, constexpr_init)
3133
constexpr TypeParam param{};
3234
}
3335

36+
37+
3438
} // namespace
39+
40+
41+
using BasicHierarchy_t = BasicHierarchy<2, 3, ParticlesDataSplitType::interior, 4>;
42+
struct Hierarchy_t : public ::testing::Test, public BasicHierarchy_t
43+
{
44+
};
45+
46+
TEST_F(Hierarchy_t, checkCapacityPostRefinement)
47+
{ // without reserve the capacity is 4096 and will likely have multiple allocations
48+
auto domainParticles = domainParticlesForLevel(1);
49+
ASSERT_EQ(domainParticles.size(), 1);
50+
EXPECT_EQ(domainParticles[0]->size(), 2800);
51+
EXPECT_EQ(domainParticles[0]->capacity(), 4032);
52+
}

0 commit comments

Comments
 (0)