Skip to content

Commit a2c36bd

Browse files
committed
Automatically disable decomposition, remove Option
1 parent 6eb43f9 commit a2c36bd

File tree

10 files changed

+165
-77
lines changed

10 files changed

+165
-77
lines changed

pysplashsurf/src/pipeline.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,13 @@ fn reconstruction_pipeline_generic<I: Index, R: Real>(
6464
None
6565
};
6666

67-
let spatial_decomposition = use_custom_grid_decomposition.then(|| {
67+
let spatial_decomposition = if use_custom_grid_decomposition {
6868
let mut grid_params = GridDecompositionParameters::default();
6969
grid_params.subdomain_num_cubes_per_dim = subdomain_num_cubes_per_dim;
7070
SpatialDecomposition::UniformGrid(grid_params)
71-
});
71+
} else {
72+
SpatialDecomposition::None
73+
};
7274

7375
let params = splashsurf_lib::Parameters {
7476
particle_radius,

pysplashsurf/src/reconstruction.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,9 @@ pub fn reconstruct_surface_py<I: Index, R: Real>(
9999
if use_custom_grid_decomposition {
100100
let mut grid_params = GridDecompositionParameters::default();
101101
grid_params.subdomain_num_cubes_per_dim = subdomain_num_cubes_per_dim;
102-
spatial_decomposition = Some(SpatialDecomposition::UniformGrid(grid_params));
102+
spatial_decomposition = SpatialDecomposition::UniformGrid(grid_params);
103103
} else {
104-
spatial_decomposition = None;
104+
spatial_decomposition = SpatialDecomposition::None;
105105
}
106106

107107
let params = splashsurf_lib::Parameters {

splashsurf/src/reconstruct.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use std::path::PathBuf;
2424
static ARGS_IO: &str = "Input/output";
2525
static ARGS_BASIC: &str = "Numerical reconstruction parameters";
2626
static ARGS_ADV: &str = "Advanced parameters";
27-
static ARGS_OCTREE: &str = "Domain decomposition parameters";
27+
static ARGS_DECOMPOSITION: &str = "Domain decomposition parameters";
2828
static ARGS_DEBUG: &str = "Debug options";
2929
static ARGS_INTERP: &str = "Interpolation & normals";
3030
static ARGS_DECIMATE: &str = "Mesh decimation and cleanup";
@@ -125,18 +125,28 @@ pub(crate) struct ReconstructSubcommandArgs {
125125
#[arg(help_heading = ARGS_ADV, long, short = 'n')]
126126
pub num_threads: Option<usize>,
127127

128-
/// Enable spatial decomposition using a regular grid-based approach (for efficient multithreading)
128+
/// Enable automatic spatial decomposition using a regular grid-based approach (for efficient multithreading) if the domain is large enough
129129
#[arg(
130-
help_heading = ARGS_OCTREE,
130+
help_heading = ARGS_DECOMPOSITION,
131131
long,
132132
default_value = "on",
133133
value_name = "off|on",
134134
ignore_case = true,
135135
require_equals = true
136136
)]
137137
pub subdomain_grid: Switch,
138+
/// Whether to automatically disable the spatial decomposition if the domain is too small
139+
#[arg(
140+
help_heading = ARGS_DECOMPOSITION,
141+
long,
142+
default_value = "on",
143+
value_name = "off|on",
144+
ignore_case = true,
145+
require_equals = true
146+
)]
147+
pub subdomain_grid_auto_disable: Switch,
138148
/// Each subdomain will be a cube consisting of this number of MC grid cells along each coordinate axis
139-
#[arg(help_heading = ARGS_OCTREE, long, default_value="64")]
149+
#[arg(help_heading = ARGS_DECOMPOSITION, long, default_value="64")]
140150
pub subdomain_cubes: u32,
141151

142152
/// Enable computing surface normals at the mesh vertices and write them to the output file
@@ -608,14 +618,14 @@ pub(crate) mod arguments {
608618
let cube_size = args.particle_radius * args.cube_size;
609619

610620
let spatial_decomposition = if args.subdomain_grid.into_bool() {
611-
Some(splashsurf_lib::SpatialDecomposition::UniformGrid(
621+
splashsurf_lib::SpatialDecomposition::UniformGrid(
612622
splashsurf_lib::GridDecompositionParameters {
613623
subdomain_num_cubes_per_dim: args.subdomain_cubes,
614-
..Default::default()
624+
auto_disable: !args.subdomain_grid_auto_disable.into_bool(),
615625
},
616-
))
626+
)
617627
} else {
618-
None
628+
splashsurf_lib::SpatialDecomposition::None
619629
};
620630

621631
// Assemble all parameters for the surface reconstruction

splashsurf_lib/benches/benches/bench_full.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ pub fn surface_reconstruction_dam_break(c: &mut Criterion) {
102102
iso_surface_threshold: 0.6,
103103
particle_aabb: None,
104104
enable_multi_threading: true,
105-
spatial_decomposition: None,
105+
spatial_decomposition: SpatialDecomposition::None,
106106
global_neighborhood_list: false,
107107
};
108108

@@ -123,11 +123,11 @@ pub fn surface_reconstruction_dam_break(c: &mut Criterion) {
123123
group.bench_function("surface_reconstruction_dam_break_par_grid_64", |b| {
124124
b.iter(|| {
125125
let mut parameters = parameters.clone();
126-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
127-
GridDecompositionParameters {
126+
parameters.spatial_decomposition =
127+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
128128
subdomain_num_cubes_per_dim: 64,
129-
},
130-
));
129+
auto_disable: false,
130+
});
131131
reconstruction =
132132
reconstruct_surface::<i64, _>(particle_positions.as_slice(), &parameters).unwrap()
133133
})
@@ -161,7 +161,7 @@ pub fn surface_reconstruction_double_dam_break(c: &mut Criterion) {
161161
iso_surface_threshold: 0.6,
162162
particle_aabb: None,
163163
enable_multi_threading: true,
164-
spatial_decomposition: None,
164+
spatial_decomposition: SpatialDecomposition::None,
165165
global_neighborhood_list: false,
166166
};
167167

@@ -182,11 +182,11 @@ pub fn surface_reconstruction_double_dam_break(c: &mut Criterion) {
182182
group.bench_function("surface_reconstruction_double_dam_break_par_grid_64", |b| {
183183
b.iter(|| {
184184
let mut parameters = parameters.clone();
185-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
186-
GridDecompositionParameters {
185+
parameters.spatial_decomposition =
186+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
187187
subdomain_num_cubes_per_dim: 64,
188-
},
189-
));
188+
auto_disable: false,
189+
});
190190
reconstruction =
191191
reconstruct_surface::<i64, _>(particle_positions.as_slice(), &parameters).unwrap()
192192
})
@@ -220,7 +220,7 @@ pub fn surface_reconstruction_double_dam_break_inplace(c: &mut Criterion) {
220220
iso_surface_threshold: 0.6,
221221
particle_aabb: None,
222222
enable_multi_threading: true,
223-
spatial_decomposition: None,
223+
spatial_decomposition: SpatialDecomposition::None,
224224
global_neighborhood_list: false,
225225
};
226226

@@ -250,11 +250,11 @@ pub fn surface_reconstruction_double_dam_break_inplace(c: &mut Criterion) {
250250
|b| {
251251
b.iter(|| {
252252
let mut parameters = parameters.clone();
253-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
254-
GridDecompositionParameters {
253+
parameters.spatial_decomposition =
254+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
255255
subdomain_num_cubes_per_dim: 64,
256-
},
257-
));
256+
auto_disable: false,
257+
});
258258
reconstruct_surface_inplace::<i64, _>(
259259
particle_positions.as_slice(),
260260
&parameters,

splashsurf_lib/benches/benches/bench_mesh.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@ fn reconstruct_particles<P: AsRef<Path>>(particle_file: P) -> SurfaceReconstruct
2323
iso_surface_threshold: 0.6,
2424
particle_aabb: None,
2525
enable_multi_threading: true,
26-
spatial_decomposition: Some(SpatialDecomposition::UniformGrid(
27-
GridDecompositionParameters::default(),
28-
)),
26+
spatial_decomposition: SpatialDecomposition::UniformGrid(GridDecompositionParameters {
27+
subdomain_num_cubes_per_dim: 64,
28+
auto_disable: false,
29+
}),
2930
global_neighborhood_list: false,
3031
};
3132

splashsurf_lib/benches/benches/bench_subdomain_grid.rs

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,10 @@ fn parameters_canyon() -> Parameters<f32> {
2222
iso_surface_threshold: 0.6,
2323
particle_aabb: None,
2424
enable_multi_threading: true,
25-
spatial_decomposition: Some(SpatialDecomposition::UniformGrid(
26-
GridDecompositionParameters {
27-
subdomain_num_cubes_per_dim: 32,
28-
..Default::default()
29-
},
30-
)),
25+
spatial_decomposition: SpatialDecomposition::UniformGrid(GridDecompositionParameters {
26+
subdomain_num_cubes_per_dim: 32,
27+
auto_disable: false,
28+
}),
3129
global_neighborhood_list: false,
3230
}
3331
}
@@ -48,12 +46,11 @@ pub fn grid_canyon(c: &mut Criterion) {
4846
b.iter(|| {
4947
let mut parameters = parameters.clone();
5048
parameters.cube_size = 1.5 * parameters.particle_radius;
51-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
52-
GridDecompositionParameters {
49+
parameters.spatial_decomposition =
50+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
5351
subdomain_num_cubes_per_dim: 32,
54-
..Default::default()
55-
},
56-
));
52+
auto_disable: false,
53+
});
5754
reconstruction =
5855
reconstruct_surface::<i64, _>(particle_positions.as_slice(), &parameters).unwrap()
5956
})
@@ -63,12 +60,11 @@ pub fn grid_canyon(c: &mut Criterion) {
6360
b.iter(|| {
6461
let mut parameters = parameters.clone();
6562
parameters.cube_size = 1.0 * parameters.particle_radius;
66-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
67-
GridDecompositionParameters {
63+
parameters.spatial_decomposition =
64+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
6865
subdomain_num_cubes_per_dim: 48,
69-
..Default::default()
70-
},
71-
));
66+
auto_disable: false,
67+
});
7268
reconstruction =
7369
reconstruct_surface::<i64, _>(particle_positions.as_slice(), &parameters).unwrap()
7470
})
@@ -78,12 +74,11 @@ pub fn grid_canyon(c: &mut Criterion) {
7874
b.iter(|| {
7975
let mut parameters = parameters.clone();
8076
parameters.cube_size = 0.75 * parameters.particle_radius;
81-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
82-
GridDecompositionParameters {
77+
parameters.spatial_decomposition =
78+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
8379
subdomain_num_cubes_per_dim: 64,
84-
..Default::default()
85-
},
86-
));
80+
auto_disable: false,
81+
});
8782
reconstruction =
8883
reconstruct_surface::<i64, _>(particle_positions.as_slice(), &parameters).unwrap()
8984
})
@@ -112,12 +107,11 @@ pub fn grid_optimal_num_cubes_canyon(c: &mut Criterion) {
112107
group.bench_function(format!("subdomain_num_cubes_{}", num_cubes), |b| {
113108
b.iter(|| {
114109
let mut parameters = parameters.clone();
115-
parameters.spatial_decomposition = Some(SpatialDecomposition::UniformGrid(
116-
GridDecompositionParameters {
110+
parameters.spatial_decomposition =
111+
SpatialDecomposition::UniformGrid(GridDecompositionParameters {
117112
subdomain_num_cubes_per_dim: num_cubes,
118-
..Default::default()
119-
},
120-
));
113+
auto_disable: false,
114+
});
121115
reconstruction =
122116
reconstruct_surface::<i64, _>(particle_positions.as_slice(), &parameters)
123117
.unwrap()

splashsurf_lib/src/dense_subdomains.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ pub(crate) fn initialize_parameters<I: Index, R: Real>(
8888
) -> Result<ParametersSubdomainGrid<I, R>, anyhow::Error> {
8989
let chunk_size = 500;
9090

91-
let Some(SpatialDecomposition::UniformGrid(grid_parameters)) =
92-
&parameters.spatial_decomposition
91+
let SpatialDecomposition::UniformGrid(grid_parameters) = &parameters.spatial_decomposition
9392
else {
9493
return Err(anyhow!(
9594
"spatial decomposition parameters for uniform grid are missing"

0 commit comments

Comments
 (0)