@@ -2,6 +2,24 @@ using PointNeighbors
22using TrixiParticles
33using BenchmarkTools
44
5+ # Create a dummy semidiscretization type to be able to use a specific neighborhood search
6+ struct DummySemidiscretization{N, P}
7+ neighborhood_search :: N
8+ parallelization_backend :: P
9+ end
10+
11+ @inline function PointNeighbors. parallel_foreach (f, iterator, semi:: DummySemidiscretization )
12+ PointNeighbors. parallel_foreach (f, iterator, semi. parallelization_backend)
13+ end
14+
15+ @inline function TrixiParticles. get_neighborhood_search (_, _, semi:: DummySemidiscretization )
16+ return semi. neighborhood_search
17+ end
18+
19+ @inline function TrixiParticles. get_neighborhood_search (_, semi:: DummySemidiscretization )
20+ return semi. neighborhood_search
21+ end
22+
523"""
624 benchmark_wcsph(neighborhood_search, coordinates; parallel = true)
725
@@ -14,8 +32,8 @@ function benchmark_wcsph(neighborhood_search, coordinates;
1432 density = 1000.0
1533 fluid = InitialCondition (; coordinates, density, mass = 0.1 )
1634
17- # Compact support == smoothing length for the Wendland kernel
18- smoothing_length = PointNeighbors. search_radius (neighborhood_search)
35+ # Compact support == 2 * smoothing length for these kernels
36+ smoothing_length = PointNeighbors. search_radius (neighborhood_search) / 2
1937 if ndims (neighborhood_search) == 1
2038 smoothing_kernel = SchoenbergCubicSplineKernel {1} ()
2139 else
@@ -37,17 +55,18 @@ function benchmark_wcsph(neighborhood_search, coordinates;
3755
3856 system = PointNeighbors. Adapt. adapt (parallelization_backend, fluid_system)
3957 nhs = PointNeighbors. Adapt. adapt (parallelization_backend, neighborhood_search)
58+ semi = DummySemidiscretization (nhs, parallelization_backend)
4059
4160 v = PointNeighbors. Adapt. adapt (parallelization_backend,
4261 vcat (fluid. velocity, fluid. density' ))
4362 u = PointNeighbors. Adapt. adapt (parallelization_backend, coordinates)
4463 dv = zero (v)
4564
4665 # Initialize the system
47- TrixiParticles. initialize! (system, nhs )
48- TrixiParticles. compute_pressure! (system, v)
66+ TrixiParticles. initialize! (system, semi )
67+ TrixiParticles. compute_pressure! (system, v, semi )
4968
50- return @belapsed TrixiParticles. interact! ($ dv, $ v, $ u, $ v, $ u, $ nhs , $ system, $ system )
69+ return @belapsed TrixiParticles. interact! ($ dv, $ v, $ u, $ v, $ u, $ system , $ system, $ semi )
5170end
5271
5372"""
@@ -61,8 +80,9 @@ function benchmark_wcsph_fp32(neighborhood_search, coordinates_;
6180 density = 1000.0f0
6281 fluid = InitialCondition (; coordinates, density, mass = 0.1f0 )
6382
64- # Compact support == smoothing length for the Wendland kernel
65- smoothing_length = convert (Float32, PointNeighbors. search_radius (neighborhood_search))
83+ # Compact support == 2 * smoothing length for these kernels
84+ smoothing_length = convert (Float32,
85+ PointNeighbors. search_radius (neighborhood_search) / 2 )
6686 if ndims (neighborhood_search) == 1
6787 smoothing_kernel = SchoenbergCubicSplineKernel {1} ()
6888 else
@@ -80,22 +100,24 @@ function benchmark_wcsph_fp32(neighborhood_search, coordinates_;
80100 fluid_system = WeaklyCompressibleSPHSystem (fluid, fluid_density_calculator,
81101 state_equation, smoothing_kernel,
82102 smoothing_length, viscosity = viscosity,
83- acceleration = (0.0f0 , 0.0f0 , 0.0f0 ),
103+ acceleration = ntuple (_ -> 0.0f0 ,
104+ Val (ndims (neighborhood_search))),
84105 density_diffusion = density_diffusion)
85106
86107 system = PointNeighbors. Adapt. adapt (parallelization_backend, fluid_system)
87108 nhs = PointNeighbors. Adapt. adapt (parallelization_backend, neighborhood_search)
109+ semi = DummySemidiscretization (nhs, parallelization_backend)
88110
89111 v = PointNeighbors. Adapt. adapt (parallelization_backend,
90112 vcat (fluid. velocity, fluid. density' ))
91113 u = PointNeighbors. Adapt. adapt (parallelization_backend, coordinates)
92114 dv = zero (v)
93115
94116 # Initialize the system
95- TrixiParticles. initialize! (system, nhs )
96- TrixiParticles. compute_pressure! (system, v)
117+ TrixiParticles. initialize! (system, semi )
118+ TrixiParticles. compute_pressure! (system, v, semi )
97119
98- return @belapsed TrixiParticles. interact! ($ dv, $ v, $ u, $ v, $ u, $ nhs , $ system, $ system )
120+ return @belapsed TrixiParticles. interact! ($ dv, $ v, $ u, $ v, $ u, $ system , $ system, $ semi )
99121end
100122
101123"""
@@ -110,8 +132,8 @@ function benchmark_tlsph(neighborhood_search, coordinates;
110132 material = (density = 1000.0 , E = 1.4e6 , nu = 0.4 )
111133 solid = InitialCondition (; coordinates, density = material. density, mass = 0.1 )
112134
113- # Compact support == smoothing length for the Wendland kernel
114- smoothing_length = PointNeighbors. search_radius (neighborhood_search)
135+ # Compact support == 2 * smoothing length for these kernels
136+ smoothing_length = PointNeighbors. search_radius (neighborhood_search) / 2
115137 if ndims (neighborhood_search) == 1
116138 smoothing_kernel = SchoenbergCubicSplineKernel {1} ()
117139 else
@@ -120,14 +142,15 @@ function benchmark_tlsph(neighborhood_search, coordinates;
120142
121143 solid_system = TotalLagrangianSPHSystem (solid, smoothing_kernel, smoothing_length,
122144 material. E, material. nu)
145+ semi = DummySemidiscretization (neighborhood_search, parallelization_backend)
123146
124147 v = copy (solid. velocity)
125148 u = copy (solid. coordinates)
126149 dv = zero (v)
127150
128151 # Initialize the system
129- TrixiParticles. initialize! (solid_system, neighborhood_search )
152+ TrixiParticles. initialize! (solid_system, semi )
130153
131- return @belapsed TrixiParticles. interact! ($ dv, $ v, $ u, $ v, $ u, $ neighborhood_search,
132- $ solid_system, $ solid_system)
154+ return @belapsed TrixiParticles. interact! ($ dv, $ v, $ u, $ v, $ u,
155+ $ solid_system, $ solid_system, $ semi )
133156end
0 commit comments