66# Unpack the neighboring systems viscosity to dispatch on the viscosity type.
77# This function is only necessary to allow `nothing` as viscosity.
88# Otherwise, we could just apply the viscosity as a function directly.
9- @propagate_inbounds function dv_viscosity (particle_system, neighbor_system,
9+ @propagate_inbounds function dv_viscosity (dv_particle, particle_system, neighbor_system,
1010 v_particle_system, v_neighbor_system,
1111 particle, neighbor, pos_diff, distance,
1212 sound_speed, m_a, m_b, rho_a, rho_b,
1313 v_a, v_b, grad_kernel)
1414 viscosity = viscosity_model (particle_system, neighbor_system)
1515
16- return dv_viscosity (viscosity, particle_system, neighbor_system,
16+ return dv_viscosity (dv_particle, viscosity, particle_system, neighbor_system,
1717 v_particle_system, v_neighbor_system,
1818 particle, neighbor, pos_diff, distance,
1919 sound_speed, m_a, m_b, rho_a, rho_b, v_a, v_b, grad_kernel)
2020end
2121
22- @propagate_inbounds function dv_viscosity (viscosity, particle_system, neighbor_system,
22+ @propagate_inbounds function dv_viscosity (dv_particle, viscosity, particle_system,
23+ neighbor_system,
2324 v_particle_system, v_neighbor_system,
2425 particle, neighbor, pos_diff, distance,
2526 sound_speed, m_a, m_b, rho_a, rho_b,
2627 v_a, v_b, grad_kernel)
27- return viscosity (particle_system, neighbor_system,
28+ return viscosity (dv_particle, particle_system, neighbor_system,
2829 v_particle_system, v_neighbor_system,
2930 particle, neighbor, pos_diff, distance,
3031 sound_speed, m_a, m_b, rho_a, rho_b, v_a, v_b, grad_kernel)
3132end
3233
33- @inline function dv_viscosity (viscosity:: Nothing , particle_system, neighbor_system,
34+ @inline function dv_viscosity (dv_particle, viscosity:: Nothing , particle_system,
35+ neighbor_system,
3436 v_particle_system, v_neighbor_system,
3537 particle, neighbor, pos_diff, distance,
3638 sound_speed, m_a, m_b, rho_a, rho_b, v_a, v_b, grad_kernel)
8991end
9092
9193@propagate_inbounds function (viscosity:: Union {ArtificialViscosityMonaghan,
92- ViscosityMorris})(particle_system,
94+ ViscosityMorris})(dv_particle,
95+ particle_system,
9396 neighbor_system,
9497 v_particle_system,
9598 v_neighbor_system,
@@ -115,15 +118,14 @@ end
115118 viscosity_model (particle_system, neighbor_system),
116119 smoothing_length_neighbor, sound_speed)
117120
118- pi_ab = viscosity (sound_speed, v_diff, pos_diff, distance, rho_mean, rho_a, rho_b,
119- smoothing_length_average, grad_kernel, nu_a, nu_b)
120-
121- return m_b * pi_ab
121+ viscosity (dv_particle, sound_speed, v_diff, pos_diff, distance, rho_mean, rho_a, rho_b,
122+ smoothing_length_average, grad_kernel, nu_a, nu_b, m_b)
122123end
123124
124- @inline function (viscosity:: ArtificialViscosityMonaghan )(c, v_diff, pos_diff, distance,
125+ @inline function (viscosity:: ArtificialViscosityMonaghan )(dv_particle, c, v_diff, pos_diff,
126+ distance,
125127 rho_mean, rho_a, rho_b, h,
126- grad_kernel, nu_a, nu_b)
128+ grad_kernel, nu_a, nu_b, m_b )
127129 (; alpha, beta, epsilon) = viscosity
128130
129131 # v_ab ⋅ r_ab
@@ -137,10 +139,11 @@ end
137139 # Since this is one of the most performance critical functions, using fast divisions
138140 # here gives a significant speedup on GPUs.
139141 mu = div_fast (h * vr, distance^ 2 + epsilon * h^ 2 )
140- return div_fast (alpha * c * mu + beta * mu^ 2 , rho_mean) * grad_kernel
142+ dv_particle[] += m_b * div_fast (alpha * c * mu + beta * mu^ 2 , rho_mean) *
143+ grad_kernel
141144 end
142145
143- return zero (v_diff)
146+ return dv_particle
144147end
145148
146149@inline function (viscosity:: ViscosityMorris )(c, v_diff, pos_diff, distance, rho_mean,
0 commit comments