@@ -68,7 +68,7 @@ struct TotalLagrangianSPHSystem{BM, NDIMS, ELTYPE <: Real, IC, ARRAY1D, ARRAY2D,
6868 current_coordinates :: ARRAY2D # Array{ELTYPE, 2}: [dimension, particle]
6969 mass :: ARRAY1D # Array{ELTYPE, 1}: [particle]
7070 correction_matrix :: ARRAY3D # Array{ELTYPE, 3}: [i, j, particle]
71- pk1_corrected :: ARRAY3D # Array{ELTYPE, 3} : [i, j, particle]
71+ pk1_rho2 :: ARRAY3D # PK1 corrected divided by rho^2 : [i, j, particle]
7272 deformation_grad :: ARRAY3D # Array{ELTYPE, 3}: [i, j, particle]
7373 material_density :: ARRAY1D # Array{ELTYPE, 1}: [particle]
7474 n_integrated_particles :: Int64
@@ -115,7 +115,7 @@ function TotalLagrangianSPHSystem(initial_condition, smoothing_kernel, smoothing
115115 mass = copy (initial_condition. mass)
116116 material_density = copy (initial_condition. density)
117117 correction_matrix = Array {ELTYPE, 3} (undef, NDIMS, NDIMS, n_particles)
118- pk1_corrected = Array {ELTYPE, 3} (undef, NDIMS, NDIMS, n_particles)
118+ pk1_rho2 = Array {ELTYPE, 3} (undef, NDIMS, NDIMS, n_particles)
119119 deformation_grad = Array {ELTYPE, 3} (undef, NDIMS, NDIMS, n_particles)
120120
121121 n_integrated_particles = n_particles - n_clamped_particles
@@ -132,7 +132,7 @@ function TotalLagrangianSPHSystem(initial_condition, smoothing_kernel, smoothing
132132
133133 return TotalLagrangianSPHSystem (initial_condition, initial_coordinates,
134134 current_coordinates, mass, correction_matrix,
135- pk1_corrected , deformation_grad, material_density,
135+ pk1_rho2 , deformation_grad, material_density,
136136 n_integrated_particles, young_modulus, poisson_ratio,
137137 lame_lambda, lame_mu, smoothing_kernel,
138138 smoothing_length, acceleration_, boundary_model,
@@ -171,14 +171,14 @@ end
171171 return system. current_coordinates
172172end
173173
174- @inline function current_coords (system:: TotalLagrangianSPHSystem , particle)
174+ @propagate_inbounds function current_coords (system:: TotalLagrangianSPHSystem , particle)
175175 # For this system, the current coordinates are stored in the system directly,
176176 # so we don't need a `u` array. This function is only to be used in this file
177177 # when no `u` is available.
178178 current_coords (nothing , system, particle)
179179end
180180
181- @inline function current_velocity (v, system:: TotalLagrangianSPHSystem , particle)
181+ @propagate_inbounds function current_velocity (v, system:: TotalLagrangianSPHSystem , particle)
182182 if particle <= system. n_integrated_particles
183183 return extract_svector (v, system, particle)
184184 end
@@ -204,58 +204,58 @@ end
204204 error (" `current_velocity(v, system)` is not implemented for `TotalLagrangianSPHSystem`" )
205205end
206206
207- @inline function viscous_velocity (v, system:: TotalLagrangianSPHSystem , particle)
207+ @propagate_inbounds function viscous_velocity (v, system:: TotalLagrangianSPHSystem , particle)
208208 return extract_svector (system. boundary_model. cache. wall_velocity, system, particle)
209209end
210210
211- @inline function current_density (v, system:: TotalLagrangianSPHSystem )
211+ @propagate_inbounds function current_density (v, system:: TotalLagrangianSPHSystem )
212212 return current_density (v, system. boundary_model, system)
213213end
214214
215215# In fluid-structure interaction, use the "hydrodynamic pressure" of the structure particles
216216# corresponding to the chosen boundary model.
217- @inline function current_pressure (v, system:: TotalLagrangianSPHSystem )
217+ @propagate_inbounds function current_pressure (v, system:: TotalLagrangianSPHSystem )
218218 return current_pressure (v, system. boundary_model, system)
219219end
220220
221- @inline function hydrodynamic_mass (system:: TotalLagrangianSPHSystem , particle)
221+ @propagate_inbounds function hydrodynamic_mass (system:: TotalLagrangianSPHSystem , particle)
222222 return system. boundary_model. hydrodynamic_mass[particle]
223223end
224224
225- @inline function correction_matrix (system, particle)
225+ @propagate_inbounds function correction_matrix (system, particle)
226226 extract_smatrix (system. correction_matrix, system, particle)
227227end
228228
229- @inline function deformation_gradient (system, particle)
229+ @propagate_inbounds function deformation_gradient (system, particle)
230230 extract_smatrix (system. deformation_grad, system, particle)
231231end
232- @inline function pk1_corrected (system, particle)
233- extract_smatrix (system. pk1_corrected , system, particle)
232+ @propagate_inbounds function pk1_rho2 (system, particle)
233+ extract_smatrix (system. pk1_rho2 , system, particle)
234234end
235235
236- function young_modulus (system:: TotalLagrangianSPHSystem , particle)
236+ @propagate_inbounds function young_modulus (system:: TotalLagrangianSPHSystem , particle)
237237 return young_modulus (system, system. young_modulus, particle)
238238end
239239
240- function young_modulus (:: TotalLagrangianSPHSystem , young_modulus, particle)
240+ @inline function young_modulus (:: TotalLagrangianSPHSystem , young_modulus, particle)
241241 return young_modulus
242242end
243243
244- function young_modulus (:: TotalLagrangianSPHSystem ,
245- young_modulus:: AbstractVector , particle)
244+ @propagate_inbounds function young_modulus (:: TotalLagrangianSPHSystem ,
245+ young_modulus:: AbstractVector , particle)
246246 return young_modulus[particle]
247247end
248248
249- function poisson_ratio (system:: TotalLagrangianSPHSystem , particle)
249+ @propagate_inbounds function poisson_ratio (system:: TotalLagrangianSPHSystem , particle)
250250 return poisson_ratio (system, system. poisson_ratio, particle)
251251end
252252
253- function poisson_ratio (:: TotalLagrangianSPHSystem , poisson_ratio, particle)
253+ @inline function poisson_ratio (:: TotalLagrangianSPHSystem , poisson_ratio, particle)
254254 return poisson_ratio
255255end
256256
257- function poisson_ratio (:: TotalLagrangianSPHSystem ,
258- poisson_ratio:: AbstractVector , particle)
257+ @inline function poisson_ratio (:: TotalLagrangianSPHSystem ,
258+ poisson_ratio:: AbstractVector , particle)
259259 return poisson_ratio[particle]
260260end
261261
@@ -316,16 +316,18 @@ function update_boundary_interpolation!(system::TotalLagrangianSPHSystem, v, u,
316316end
317317
318318@inline function compute_pk1_corrected! (system, semi)
319- (; deformation_grad) = system
319+ (; deformation_grad, pk1_rho2, material_density ) = system
320320
321321 calc_deformation_grad! (deformation_grad, system, semi)
322322
323323 @threaded semi for particle in eachparticle (system)
324324 pk1_particle = pk1_stress_tensor (system, particle)
325325 pk1_particle_corrected = pk1_particle * correction_matrix (system, particle)
326+ rho2_inv = 1 / material_density[particle]^ 2
326327
327- @inbounds for j in 1 : ndims (system), i in 1 : ndims (system)
328- system. pk1_corrected[i, j, particle] = pk1_particle_corrected[i, j]
328+ for j in 1 : ndims (system), i in 1 : ndims (system)
329+ # Precompute PK1 / rho^2 to avoid repeated divisions in the interaction loop
330+ @inbounds pk1_rho2[i, j, particle] = pk1_particle_corrected[i, j] * rho2_inv
329331 end
330332 end
331333end
446448# The von-Mises stress is one form of equivalent stress, where sigma is the deviatoric stress.
447449# See pages 32 and 123.
448450function von_mises_stress (system)
449- von_mises_stress_vector = zeros (eltype (system. pk1_corrected ), nparticles (system))
451+ von_mises_stress_vector = zeros (eltype (system. pk1_rho2 ), nparticles (system))
450452
451453 @threaded default_backend (von_mises_stress_vector) for particle in
452454 each_integrated_particle (system)
463465@inline function von_mises_stress (system, particle:: Integer )
464466 F = deformation_gradient (system, particle)
465467 J = det (F)
466- P = pk1_corrected (system, particle)
468+ P = pk1_rho2 (system, particle) * system . material_density[particle] ^ 2
467469 sigma = (1.0 / J) * P * F'
468470
469471 # Calculate deviatoric stress tensor
@@ -479,14 +481,14 @@ end
479481function cauchy_stress (system:: TotalLagrangianSPHSystem )
480482 NDIMS = ndims (system)
481483
482- cauchy_stress_tensors = zeros (eltype (system. pk1_corrected ), NDIMS, NDIMS,
484+ cauchy_stress_tensors = zeros (eltype (system. pk1_rho2 ), NDIMS, NDIMS,
483485 nparticles (system))
484486
485487 @threaded default_backend (cauchy_stress_tensors) for particle in
486488 each_integrated_particle (system)
487489 F = deformation_gradient (system, particle)
488490 J = det (F)
489- P = pk1_corrected (system, particle)
491+ P = pk1_rho2 (system, particle) * system . material_density[particle] ^ 2
490492 sigma = (1.0 / J) * P * F'
491493 cauchy_stress_tensors[:, :, particle] = sigma
492494 end
507509end
508510
509511function system_data (system:: TotalLagrangianSPHSystem , dv_ode, du_ode, v_ode, u_ode, semi)
510- (; mass, material_density, deformation_grad, pk1_corrected, young_modulus,
512+ (; mass, material_density, deformation_grad, young_modulus,
511513 poisson_ratio, lame_lambda, lame_mu) = system
512514
513515 dv = wrap_v (dv_ode, system, semi)
@@ -518,6 +520,8 @@ function system_data(system::TotalLagrangianSPHSystem, dv_ode, du_ode, v_ode, u_
518520 initial_coordinates_ = initial_coordinates (system)
519521 velocity = [current_velocity (v, system, particle) for particle in eachparticle (system)]
520522 acceleration = system_data_acceleration (dv, system, system. clamped_particles_motion)
523+ pk1_corrected = [pk1_rho2 (system, particle) * system. material_density[particle]^ 2
524+ for particle in eachparticle (system)]
521525
522526 return (; coordinates, initial_coordinates= initial_coordinates_, velocity, mass,
523527 material_density, deformation_grad, pk1_corrected, young_modulus, poisson_ratio,
0 commit comments