@@ -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