@@ -23,40 +23,47 @@ function interact!(dv, v_particle_system, u_particle_system,
2323 foreach_point_neighbor (particle_system, neighbor_system,
2424 system_coords, neighbor_system_coords,
2525 neighborhood_search) do particle, neighbor, pos_diff, distance
26- rho_a = particle_density (v_particle_system, particle_system, particle)
27- rho_b = particle_density (v_neighbor_system, neighbor_system, neighbor)
26+ # `foreach_point_neighbor` makes sure that `particle` and `neighbor` are
27+ # in bounds of the respective system. For performance reasons, we use `@inbounds`
28+ # in this hot loop to avoid bounds checking when extracting particle quantities.
29+ rho_a = @inbounds particle_density (v_particle_system, particle_system, particle)
30+ rho_b = @inbounds particle_density (v_neighbor_system, neighbor_system, neighbor)
2831 rho_mean = 0.5 * (rho_a + rho_b)
2932
30- # Determine correction values
31- viscosity_correction, pressure_correction, surface_tension_correction = free_surface_correction (correction,
32- particle_system,
33- rho_mean)
33+ # Determine correction factors.
34+ # This can be ignored, as these are all 1 when no correction is used.
35+ (viscosity_correction, pressure_correction,
36+ surface_tension_correction) = free_surface_correction (correction, particle_system,
37+ rho_mean)
3438
3539 grad_kernel = smoothing_kernel_grad (particle_system, pos_diff, distance, particle)
3640
37- m_a = hydrodynamic_mass (particle_system, particle)
38- m_b = hydrodynamic_mass (neighbor_system, neighbor)
41+ m_a = @inbounds hydrodynamic_mass (particle_system, particle)
42+ m_b = @inbounds hydrodynamic_mass (neighbor_system, neighbor)
3943
4044 # The following call is equivalent to
4145 # `p_a = particle_pressure(v_particle_system, particle_system, particle)`
4246 # `p_b = particle_pressure(v_neighbor_system, neighbor_system, neighbor)`
4347 # Only when the neighbor system is a `BoundarySPHSystem` or a `TotalLagrangianSPHSystem`
4448 # with the boundary model `PressureMirroring`, this will return `p_b = p_a`, which is
4549 # the pressure of the fluid particle.
46- p_a, p_b = particle_neighbor_pressure (v_particle_system, v_neighbor_system,
47- particle_system, neighbor_system,
48- particle, neighbor)
50+ p_a, p_b = @inbounds particle_neighbor_pressure (v_particle_system,
51+ v_neighbor_system,
52+ particle_system, neighbor_system,
53+ particle, neighbor)
4954
5055 dv_pressure = pressure_correction *
5156 pressure_acceleration (particle_system, neighbor_system, neighbor,
5257 m_a, m_b, p_a, p_b, rho_a, rho_b, pos_diff,
5358 distance, grad_kernel, correction)
5459
60+ # Propagate `@inbounds` to the viscosity function, which accesses particle data
5561 dv_viscosity_ = viscosity_correction *
56- dv_viscosity (particle_system, neighbor_system,
57- v_particle_system, v_neighbor_system,
58- particle, neighbor, pos_diff, distance,
59- sound_speed, m_a, m_b, rho_a, rho_b, grad_kernel)
62+ @inbounds dv_viscosity (particle_system, neighbor_system,
63+ v_particle_system, v_neighbor_system,
64+ particle, neighbor, pos_diff, distance,
65+ sound_speed, m_a, m_b, rho_a, rho_b,
66+ grad_kernel)
6067
6168 dv_surface_tension = surface_tension_correction *
6269 surface_tension_force (surface_tension_a, surface_tension_b,
@@ -66,17 +73,19 @@ function interact!(dv, v_particle_system, u_particle_system,
6673 dv_adhesion = adhesion_force (surface_tension, particle_system, neighbor_system,
6774 particle, neighbor, pos_diff, distance)
6875
69- @inbounds for i in 1 : ndims (particle_system)
70- dv[i, particle] += dv_pressure[i] + dv_viscosity_[i] + dv_surface_tension [i] +
71- dv_adhesion[i]
76+ for i in 1 : ndims (particle_system)
77+ @inbounds dv[i, particle] += dv_pressure[i] + dv_viscosity_[i] +
78+ dv_surface_tension[i] + dv_adhesion[i]
7279 # Debug example
7380 # debug_array[i, particle] += dv_pressure[i]
7481 end
7582
7683 # TODO If variable smoothing_length is used, this should use the neighbor smoothing length
77- continuity_equation! (dv, density_calculator, v_particle_system, v_neighbor_system,
78- particle, neighbor, pos_diff, distance, m_b, rho_a, rho_b,
79- particle_system, neighbor_system, grad_kernel)
84+ # Propagate `@inbounds` to the continuity equation, which accesses particle data
85+ @inbounds continuity_equation! (dv, density_calculator, v_particle_system,
86+ v_neighbor_system, particle, neighbor,
87+ pos_diff, distance, m_b, rho_a, rho_b,
88+ particle_system, neighbor_system, grad_kernel)
8089 end
8190 # Debug example
8291 # periodic_box = neighborhood_search.periodic_box
98107end
99108
100109# This formulation was chosen to be consistent with the used pressure_acceleration formulations.
101- @inline function continuity_equation! (dv, density_calculator:: ContinuityDensity ,
102- v_particle_system, v_neighbor_system,
103- particle, neighbor, pos_diff, distance,
104- m_b, rho_a, rho_b,
105- particle_system:: WeaklyCompressibleSPHSystem ,
106- neighbor_system, grad_kernel)
110+ @propagate_inbounds function continuity_equation! (dv, density_calculator:: ContinuityDensity ,
111+ v_particle_system, v_neighbor_system,
112+ particle, neighbor, pos_diff, distance,
113+ m_b, rho_a, rho_b,
114+ particle_system:: WeaklyCompressibleSPHSystem ,
115+ neighbor_system, grad_kernel)
107116 (; density_diffusion) = particle_system
108117
109118 vdiff = current_velocity (v_particle_system, particle_system, particle) -
121130 end
122131end
123132
124- @inline function particle_neighbor_pressure (v_particle_system, v_neighbor_system,
125- particle_system, neighbor_system,
126- particle, neighbor)
133+ @propagate_inbounds function particle_neighbor_pressure (v_particle_system,
134+ v_neighbor_system,
135+ particle_system, neighbor_system,
136+ particle, neighbor)
127137 p_a = particle_pressure (v_particle_system, particle_system, particle)
128138 p_b = particle_pressure (v_neighbor_system, neighbor_system, neighbor)
129139
0 commit comments