Skip to content

Commit 5bae1ad

Browse files
committed
Refactor neighborhood search and update functions for improved clarity and performance. Remove redundant checks and streamline system interactions. Update function signatures for consistency across modules.
1 parent c4cef51 commit 5bae1ad

File tree

10 files changed

+259
-319
lines changed

10 files changed

+259
-319
lines changed

src/callbacks/split_integration.jl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ function update_systems_split!(semi, v_ode, u_ode, t)
218218
# a lot of the speedup that we can gain with split integration.
219219
# We assume that the TLSPH particles move so little during the substeps
220220
# that the extrapolated pressure/density values can be treated as constant.
221-
update_systems!(v_ode, u_ode, semi, t;
222-
update_nhs=false,
223-
update_boundary_interpolation=false,
224-
update_inter_system=false)
221+
return update_systems!(v_ode, u_ode, semi, t;
222+
update_nhs=false,
223+
update_implicit_sph=false,
224+
update_boundary_interpolation=false)
225225
end
226226

227227
function system_interaction_split!(dv_ode_split, v_ode, u_ode, semi,

src/general/neighborhood_search.jl

Lines changed: 68 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# === PointNeighbors integration ===
21
# Loop over all pairs of particles and neighbors within the kernel cutoff.
32
# `f(particle, neighbor, pos_diff, distance)` is called for every particle-neighbor pair.
43
# By default, loop over `eachparticle(system)`.
@@ -11,15 +10,44 @@ function PointNeighbors.foreach_point_neighbor(f, system, neighbor_system,
1110
points, parallelization_backend)
1211
end
1312

14-
# === Compact support selection ===
15-
# -- Generic
13+
# For non-TLSPH systems, do nothing
14+
function initialize_self_interaction_nhs(system, neighborhood_search,
15+
parallelization_backend)
16+
return system
17+
end
18+
19+
function create_neighborhood_search(::Nothing, system, neighbor)
20+
nhs = TrivialNeighborhoodSearch{ndims(system)}()
21+
22+
return create_neighborhood_search(nhs, system, neighbor)
23+
end
24+
25+
# Avoid method ambiguity
26+
function create_neighborhood_search(::Nothing, system::TotalLagrangianSPHSystem,
27+
neighbor::TotalLagrangianSPHSystem)
28+
nhs = TrivialNeighborhoodSearch{ndims(system)}()
29+
30+
return create_neighborhood_search(nhs, system, neighbor)
31+
end
32+
33+
function create_neighborhood_search(neighborhood_search, system, neighbor)
34+
return copy_neighborhood_search(neighborhood_search, compact_support(system, neighbor),
35+
nparticles(neighbor))
36+
end
37+
38+
function create_neighborhood_search(neighborhood_search, system::TotalLagrangianSPHSystem,
39+
neighbor::TotalLagrangianSPHSystem)
40+
# TLSPH self-interaction is using a specialized neighborhood search
41+
return copy_neighborhood_search(neighborhood_search, zero(eltype(system)),
42+
nparticles(neighbor))
43+
end
44+
1645
@inline function compact_support(system, neighbor)
1746
(; smoothing_kernel) = system
1847
# TODO: Variable search radius for NHS?
1948
return compact_support(smoothing_kernel, initial_smoothing_length(system))
2049
end
2150

22-
# -- Open boundary systems
2351
@inline function compact_support(system::OpenBoundarySystem,
2452
neighbor::OpenBoundarySystem)
2553
# This NHS is never used
@@ -32,7 +60,6 @@ end
3260
return compact_support(system.fluid_system, neighbor.fluid_system)
3361
end
3462

35-
# -- DEM boundaries
3663
@inline function compact_support(system::BoundaryDEMSystem, neighbor::BoundaryDEMSystem)
3764
# This NHS is never used
3865
return zero(eltype(system))
@@ -43,14 +70,12 @@ end
4370
return compact_support(neighbor, system)
4471
end
4572

46-
# -- TLSPH systems
4773
@inline function compact_support(system::TotalLagrangianSPHSystem,
4874
neighbor::TotalLagrangianSPHSystem)
4975
(; smoothing_kernel, smoothing_length) = system
5076
return compact_support(smoothing_kernel, smoothing_length)
5177
end
5278

53-
# -- Boundary models
5479
@inline function compact_support(system::Union{TotalLagrangianSPHSystem,
5580
WallBoundarySystem},
5681
neighbor)
@@ -76,79 +101,43 @@ end
76101
return compact_support(smoothing_kernel, smoothing_length)
77102
end
78103

79-
# === Neighborhood search creation ===
80-
function create_neighborhood_search(::Nothing, system, neighbor)
81-
nhs = TrivialNeighborhoodSearch{ndims(system)}()
82-
83-
return create_neighborhood_search(nhs, system, neighbor)
84-
end
85-
86-
# Avoid method ambiguity
87-
function create_neighborhood_search(::Nothing, system::TotalLagrangianSPHSystem,
88-
neighbor::TotalLagrangianSPHSystem)
89-
nhs = TrivialNeighborhoodSearch{ndims(system)}()
90-
91-
return create_neighborhood_search(nhs, system, neighbor)
92-
end
93-
94-
function create_neighborhood_search(neighborhood_search, system, neighbor)
95-
return copy_neighborhood_search(neighborhood_search, compact_support(system, neighbor),
96-
nparticles(neighbor))
97-
end
98-
99-
function create_neighborhood_search(neighborhood_search, system::TotalLagrangianSPHSystem,
100-
neighbor::TotalLagrangianSPHSystem)
101-
# TLSPH self-interaction is using a specialized neighborhood search
102-
return copy_neighborhood_search(neighborhood_search, zero(eltype(system)),
103-
nparticles(neighbor))
104-
end
105-
106-
# === Neighborhood search lookup ===
107104
@inline function get_neighborhood_search(system, semi)
108-
system_index = system_indices(system, semi)
105+
(; neighborhood_searches) = semi
109106

110-
return get_neighborhood_search(system, semi, system_index)
111-
end
112-
113-
@inline function get_neighborhood_search(system, neighbor_system, semi)
114107
system_index = system_indices(system, semi)
115-
neighbor_index = system_indices(neighbor_system, semi)
116108

117-
return get_neighborhood_search(system, neighbor_system, semi, system_index, neighbor_index)
109+
return neighborhood_searches[system_index][system_index]
118110
end
119111

120-
@inline function get_neighborhood_search(system, semi, system_index::Integer)
121-
return semi.neighborhood_searches[system_index][system_index]
122-
end
123-
124-
@inline function get_neighborhood_search(system::TotalLagrangianSPHSystem, semi,
125-
system_index::Integer)
112+
@inline function get_neighborhood_search(system::TotalLagrangianSPHSystem, semi)
126113
# For TLSPH, use the specialized self-interaction neighborhood search
127114
# for finding neighbors in the initial configuration.
128115
return system.self_interaction_nhs
129116
end
130117

131-
@inline function get_neighborhood_search(system, neighbor_system, semi,
132-
system_index::Integer, neighbor_index::Integer)
133-
return semi.neighborhood_searches[system_index][neighbor_index]
134-
end
135-
136118
@inline function get_neighborhood_search(system::TotalLagrangianSPHSystem,
137-
neighbor_system::TotalLagrangianSPHSystem, semi,
138-
system_index::Integer, neighbor_index::Integer)
119+
neighbor_system::TotalLagrangianSPHSystem, semi)
120+
(; neighborhood_searches) = semi
121+
122+
system_index = system_indices(system, semi)
123+
neighbor_index = system_indices(neighbor_system, semi)
124+
139125
if system_index == neighbor_index
140126
# For TLSPH, use the specialized self-interaction neighborhood search
141127
# for finding neighbors in the initial configuration.
142128
return system.self_interaction_nhs
143129
end
144130

145-
return semi.neighborhood_searches[system_index][neighbor_index]
131+
return neighborhood_searches[system_index][neighbor_index]
146132
end
147-
# === Initialization ===
148-
# For non-TLSPH systems, do nothing
149-
function initialize_self_interaction_nhs(system, neighborhood_search,
150-
parallelization_backend)
151-
return system
133+
134+
@inline function get_neighborhood_search(system, neighbor_system, semi)
135+
(; neighborhood_searches) = semi
136+
137+
system_index = system_indices(system, semi)
138+
neighbor_index = system_indices(neighbor_system, semi)
139+
140+
return neighborhood_searches[system_index][neighbor_index]
152141
end
153142

154143
function initialize_neighborhood_searches!(semi)
@@ -161,13 +150,11 @@ function initialize_neighborhood_searches!(semi)
161150
return semi
162151
end
163152

164-
function initialize_neighborhood_search!(semi, system, neighbor,
165-
system_index::Integer, neighbor_index::Integer)
153+
function initialize_neighborhood_search!(semi, system, neighbor)
166154
# TODO Initialize after adapting to the GPU.
167155
# Currently, this cannot use `semi.parallelization_backend`
168156
# because data is still on the CPU.
169-
PointNeighbors.initialize!(get_neighborhood_search(system, neighbor, semi,
170-
system_index, neighbor_index),
157+
PointNeighbors.initialize!(get_neighborhood_search(system, neighbor, semi),
171158
initial_coordinates(system),
172159
initial_coordinates(neighbor),
173160
eachindex_y=each_active_particle(neighbor),
@@ -177,39 +164,27 @@ function initialize_neighborhood_search!(semi, system, neighbor,
177164
end
178165

179166
function initialize_neighborhood_search!(semi, system::TotalLagrangianSPHSystem,
180-
neighbor::TotalLagrangianSPHSystem,
181-
system_index::Integer, neighbor_index::Integer)
167+
neighbor::TotalLagrangianSPHSystem)
182168
# For TLSPH, the self-interaction NHS is already initialized in the system constructor
183169
return semi
184170
end
185171

186-
function initialize_neighborhood_search!(semi, system, neighbor)
187-
system_index = system_indices(system, semi)
188-
neighbor_index = system_indices(neighbor, semi)
189-
190-
return initialize_neighborhood_search!(semi, system, neighbor,
191-
system_index, neighbor_index)
192-
end
193-
194-
# === Neighborhood search updates (per-system) ===
195172
function update_nhs!(semi, u_ode)
196173
# Update NHS for each pair of systems
197-
foreach_system_indexed(semi) do system_index, system
198-
u_system = wrap_u(u_ode, system, semi, system_index)
174+
foreach_system(semi) do system
175+
u_system = wrap_u(u_ode, system, semi)
199176

200-
foreach_system_indexed(semi) do neighbor_index, neighbor
201-
u_neighbor = wrap_u(u_ode, neighbor, semi, neighbor_index)
202-
neighborhood_search = get_neighborhood_search(system, neighbor, semi,
203-
system_index, neighbor_index)
177+
foreach_system(semi) do neighbor
178+
u_neighbor = wrap_u(u_ode, neighbor, semi)
179+
neighborhood_search = get_neighborhood_search(system, neighbor, semi)
204180

205181
update_nhs!(neighborhood_search, system, neighbor, u_system, u_neighbor, semi)
206182
end
207183
end
208184
end
209185

210-
# === Neighborhood search updates (per-pair dispatch) ===
186+
# NHS updates
211187
# To prevent hard-to-find bugs, there is no default version
212-
# -- Fluid / structure interactions
213188
function update_nhs!(neighborhood_search,
214189
system::AbstractFluidSystem,
215190
neighbor::Union{AbstractFluidSystem, TotalLagrangianSPHSystem},
@@ -221,7 +196,6 @@ function update_nhs!(neighborhood_search,
221196
semi, points_moving=(true, true), eachindex_y=each_active_particle(neighbor))
222197
end
223198

224-
# -- Fluid / wall interactions
225199
function update_nhs!(neighborhood_search,
226200
system::Union{AbstractFluidSystem,
227201
OpenBoundarySystem{<:BoundaryModelDynamicalPressureZhang}},
@@ -234,7 +208,6 @@ function update_nhs!(neighborhood_search,
234208
semi, points_moving=(true, neighbor.ismoving[]))
235209
end
236210

237-
# -- Open boundary interactions
238211
function update_nhs!(neighborhood_search,
239212
system::AbstractFluidSystem, neighbor::OpenBoundarySystem,
240213
u_system, u_neighbor, semi)
@@ -291,7 +264,6 @@ function update_nhs!(neighborhood_search,
291264
semi, points_moving=(true, true), eachindex_y=each_active_particle(neighbor))
292265
end
293266

294-
# -- Open boundary combinations that are never used
295267
function update_nhs!(neighborhood_search,
296268
system::OpenBoundarySystem, neighbor::TotalLagrangianSPHSystem,
297269
u_system, u_neighbor, semi)
@@ -306,7 +278,6 @@ function update_nhs!(neighborhood_search,
306278
return neighborhood_search
307279
end
308280

309-
# -- TLSPH interactions
310281
function update_nhs!(neighborhood_search,
311282
system::TotalLagrangianSPHSystem, neighbor::AbstractFluidSystem,
312283
u_system, u_neighbor, semi)
@@ -317,6 +288,14 @@ function update_nhs!(neighborhood_search,
317288
semi, points_moving=(true, true), eachindex_y=each_active_particle(neighbor))
318289
end
319290

291+
function update_nhs!(neighborhood_search,
292+
system::TotalLagrangianSPHSystem, neighbor::TotalLagrangianSPHSystem,
293+
u_system, u_neighbor, semi)
294+
# Don't update. This NHS is never used.
295+
# TLSPH systems have their own self-interaction NHS.
296+
return neighborhood_search
297+
end
298+
320299
function update_nhs!(neighborhood_search,
321300
system::TotalLagrangianSPHSystem, neighbor::WallBoundarySystem,
322301
u_system, u_neighbor, semi)
@@ -328,15 +307,6 @@ function update_nhs!(neighborhood_search,
328307
semi, points_moving=(true, neighbor.ismoving[]))
329308
end
330309

331-
function update_nhs!(neighborhood_search,
332-
system::TotalLagrangianSPHSystem, neighbor::TotalLagrangianSPHSystem,
333-
u_system, u_neighbor, semi)
334-
# Don't update. This NHS is never used.
335-
# TLSPH systems have their own self-interaction NHS.
336-
return neighborhood_search
337-
end
338-
339-
# -- Wall dummy particle interactions
340310
# This function is the same as the one below to avoid ambiguous dispatch when using `Union`
341311
function update_nhs!(neighborhood_search,
342312
system::WallBoundarySystem{<:BoundaryModelDummyParticles},
@@ -391,7 +361,6 @@ function update_nhs!(neighborhood_search,
391361
semi, points_moving=(system.ismoving[], true))
392362
end
393363

394-
# -- Wall / wall interactions
395364
function update_nhs!(neighborhood_search,
396365
system::WallBoundarySystem{<:BoundaryModelDummyParticles},
397366
neighbor::WallBoundarySystem,
@@ -404,7 +373,6 @@ function update_nhs!(neighborhood_search,
404373
semi, points_moving=(system.ismoving[], neighbor.ismoving[]))
405374
end
406375

407-
# -- DEM interactions
408376
function update_nhs!(neighborhood_search,
409377
system::DEMSystem, neighbor::DEMSystem,
410378
u_system, u_neighbor, semi)
@@ -425,7 +393,6 @@ function update_nhs!(neighborhood_search,
425393
semi, points_moving=(true, false))
426394
end
427395

428-
# -- Combinations that are never used
429396
function update_nhs!(neighborhood_search,
430397
system::WallBoundarySystem,
431398
neighbor::AbstractFluidSystem,
@@ -450,7 +417,7 @@ function update_nhs!(neighborhood_search,
450417
return neighborhood_search
451418
end
452419

453-
# === PointNeighbors forwarding ===
420+
# Forward to PointNeighbors.jl
454421
function update!(neighborhood_search, x, y, semi; points_moving=(true, true),
455422
eachindex_y=axes(y, 2))
456423
PointNeighbors.update!(neighborhood_search, x, y; points_moving, eachindex_y,

0 commit comments

Comments
 (0)