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)
1211end
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))
2049end
2150
22- # -- Open boundary systems
2351@inline function compact_support (system:: OpenBoundarySystem ,
2452 neighbor:: OpenBoundarySystem )
2553 # This NHS is never used
3260 return compact_support (system. fluid_system, neighbor. fluid_system)
3361end
3462
35- # -- DEM boundaries
3663@inline function compact_support (system:: BoundaryDEMSystem , neighbor:: BoundaryDEMSystem )
3764 # This NHS is never used
3865 return zero (eltype (system))
4370 return compact_support (neighbor, system)
4471end
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)
5177end
5278
53- # -- Boundary models
5479@inline function compact_support (system:: Union {TotalLagrangianSPHSystem,
5580 WallBoundarySystem},
5681 neighbor)
76101 return compact_support (smoothing_kernel, smoothing_length)
77102end
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]
118110end
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
129116end
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]
146132end
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]
152141end
153142
154143function initialize_neighborhood_searches! (semi)
@@ -161,13 +150,11 @@ function initialize_neighborhood_searches!(semi)
161150 return semi
162151end
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,
177164end
178165
179166function 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
184170end
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) ===
195172function 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
208184end
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
213188function 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))
222197end
223198
224- # -- Fluid / wall interactions
225199function 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[]))
235209end
236210
237- # -- Open boundary interactions
238211function 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))
292265end
293266
294- # -- Open boundary combinations that are never used
295267function 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
307279end
308280
309- # -- TLSPH interactions
310281function 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))
318289end
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+
320299function 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[]))
329308end
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`
341311function update_nhs! (neighborhood_search,
342312 system:: WallBoundarySystem{<:BoundaryModelDummyParticles} ,
@@ -391,7 +361,6 @@ function update_nhs!(neighborhood_search,
391361 semi, points_moving= (system. ismoving[], true ))
392362end
393363
394- # -- Wall / wall interactions
395364function 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[]))
405374end
406375
407- # -- DEM interactions
408376function 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 ))
426394end
427395
428- # -- Combinations that are never used
429396function update_nhs! (neighborhood_search,
430397 system:: WallBoundarySystem ,
431398 neighbor:: AbstractFluidSystem ,
@@ -450,7 +417,7 @@ function update_nhs!(neighborhood_search,
450417 return neighborhood_search
451418end
452419
453- # === PointNeighbors forwarding ===
420+ # Forward to PointNeighbors.jl
454421function 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