From 61fb7f2521226432527f29fc8ddee3259774d016 Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Tue, 13 Jan 2026 19:53:57 +0100 Subject: [PATCH 1/3] Add precompile workload --- Project.toml | 2 ++ README.md | 5 +++++ src/SPHExample.jl | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/Project.toml b/Project.toml index 3eae26b8..165a8a83 100644 --- a/Project.toml +++ b/Project.toml @@ -15,6 +15,7 @@ LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" Logging = "56ddb016-857b-54e1-b83d-db4d58db5568" LoggingExtras = "e6f89c97-d47a-5376-807f-9c37f3926c36" Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" +PrecompileTools = "aea7be01-6a6a-4083-8856-8a6e6704d82a" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" @@ -31,6 +32,7 @@ InteractiveUtils = "1.11.0" LibGit2 = "1.11.0" LoggingExtras = "^1.2.0" Parameters = "^0.12.3" +PrecompileTools = "1.3.3" StaticArrays = "^1.9.15" StructArrays = "^0.7.2" TimerOutputs = "^0.5.29" diff --git a/README.md b/README.md index e1bf6bb4..aa538293 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,11 @@ using Pkg Pkg.add(url="https://github.com/AhmedSalih3d/SPHExample") ``` +The package uses `PrecompileTools` to precompile representative workloads on +first load, improving time-to-first-simulation across platforms. The initial +`using SPHExample` may take a little longer while the precompile cache is +generated, but subsequent loads will be noticeably faster. + ### Running an Example Open one of the files in `example/`, for instance `example/StillWedgeMDBC.jl`, diff --git a/src/SPHExample.jl b/src/SPHExample.jl index 28ef3ae7..02624afb 100644 --- a/src/SPHExample.jl +++ b/src/SPHExample.jl @@ -65,4 +65,27 @@ module SPHExample using .OpenExternalPrograms export AutoOpenLogFile, AutoOpenParaview + using PrecompileTools + using StaticArrays + + @setup_workload begin + KernelInstance = SPHKernelInstance{2, Float64}(WendlandC2(); dx=0.02) + Constants = SimulationConstants() + Position = SVector(0.0, 0.0) + Density = [Constants.ρ₀, Constants.ρ₀] + Pressure = similar(Density) + MotionLimiter = [1.0, 0.0] + q = 0.5 + + @compile_workload begin + Wᵢⱼ(KernelInstance, q) + ∇Wᵢⱼ(KernelInstance, q, Position) + tensile_correction(KernelInstance, 0.0, 1.0, 0.0, 1.0, q, 0.02) + EquationOfStateGamma7(Constants.ρ₀, Constants.c₀, Constants.ρ₀) + ConstructGravitySVector(Position, Constants.g) + Pressure!(Pressure, Density, Constants) + LimitDensityAtBoundary!(Density, Constants.ρ₀, MotionLimiter) + end + end + end From 6c8a77a65a1aa25f8bf685409dff4dbb7f828fc2 Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:15:33 +0100 Subject: [PATCH 2/3] Refine precompile workload --- src/SPHExample.jl | 50 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/src/SPHExample.jl b/src/SPHExample.jl index 02624afb..0118a96b 100644 --- a/src/SPHExample.jl +++ b/src/SPHExample.jl @@ -67,24 +67,58 @@ module SPHExample using PrecompileTools using StaticArrays + using StructArrays @setup_workload begin KernelInstance = SPHKernelInstance{2, Float64}(WendlandC2(); dx=0.02) Constants = SimulationConstants() - Position = SVector(0.0, 0.0) - Density = [Constants.ρ₀, Constants.ρ₀] - Pressure = similar(Density) + Position = [SVector(0.0, 0.0), SVector(0.02, 0.0)] + Velocity = [SVector(0.0, 0.0), SVector(0.1, 0.0)] + Acceleration = [SVector(0.0, 0.0), SVector(0.0, -9.81)] + Density = fill(Constants.ρ₀, 2) + Pressure = zeros(Float64, 2) + GravityFactor = [-1.0, 1.0] MotionLimiter = [1.0, 0.0] - q = 0.5 + Types = [Fluid, Moving] + GroupMarker = [UInt(1), UInt(1)] + Cells = fill(CartesianIndex{2}(0, 0), 2) + SimParticles = StructArray((; + Cells = Cells, + Position = Position, + Acceleration = Acceleration, + Velocity = Velocity, + Density = Density, + Pressure = Pressure, + GravityFactor = GravityFactor, + MotionLimiter = MotionLimiter, + Type = Types, + GroupMarker = GroupMarker, + )) + Xij = Position[1] - Position[2] + Vij = Velocity[1] - Velocity[2] + DistanceSquared = dot(Xij, Xij) + Q = sqrt(DistanceSquared) * KernelInstance.h⁻¹ + GradientWij = ∇Wᵢⱼ(KernelInstance, Q, Xij) + SimMetaData = SimulationMetaData{2, Float64}(SimulationName = "Precompile", SaveLocation = ".") + PositionNext = similar(Position) + VelocityNext = similar(Velocity) + DensityNext = similar(Density) + DensityRate = zeros(Float64, 2) + HalfStep = 0.5 @compile_workload begin - Wᵢⱼ(KernelInstance, q) - ∇Wᵢⱼ(KernelInstance, q, Position) - tensile_correction(KernelInstance, 0.0, 1.0, 0.0, 1.0, q, 0.02) + Wᵢⱼ(KernelInstance, Q) + ∇Wᵢⱼ(KernelInstance, Q, Xij) + tensile_correction(KernelInstance, 0.0, 1.0, 0.0, 1.0, Q, 0.02) EquationOfStateGamma7(Constants.ρ₀, Constants.c₀, Constants.ρ₀) - ConstructGravitySVector(Position, Constants.g) + ConstructGravitySVector(Xij, Constants.g) Pressure!(Pressure, Density, Constants) LimitDensityAtBoundary!(Density, Constants.ρ₀, MotionLimiter) + compute_viscosity(ArtificialViscosity(), KernelInstance, Constants, SimParticles, Xij, Vij, GradientWij, DistanceSquared, 1, 2) + compute_viscosity(Laminar(), KernelInstance, Constants, SimParticles, Xij, Vij, GradientWij, DistanceSquared, 1, 2) + compute_density_diffusion(LinearDensityDiffusion(), KernelInstance, Constants, SimParticles, Xij, GradientWij, DistanceSquared, 1, 2, MotionLimiter) + compute_density_diffusion(ComplexDensityDiffusion(), KernelInstance, Constants, SimParticles, Xij, GradientWij, DistanceSquared, 1, 2, MotionLimiter) + HalfTimeStep(SimMetaData, Constants, SimParticles, PositionNext, VelocityNext, DensityNext, DensityRate, HalfStep) end end From 058744fe6636ec942544329af5035c98fea3fde2 Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Tue, 13 Jan 2026 20:23:43 +0100 Subject: [PATCH 3/3] Fix precompile workload --- src/SPHExample.jl | 57 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/SPHExample.jl b/src/SPHExample.jl index 0118a96b..96a30973 100644 --- a/src/SPHExample.jl +++ b/src/SPHExample.jl @@ -38,7 +38,7 @@ module SPHExample using .ProduceHDFVTK export SaveVTKHDF, GenerateGeometryStructure, GenerateStepStructure, AppendVTKHDFData, SaveCellGridVTKHDF, AppendVTKHDFGridData, SetupVTKOutput - using .TimeStepping: Δt + using .TimeStepping: Δt, FinalizeTimeStep, UpdateTimeStepBuffers!, HalfTimeStep, FullTimeStep export Δt using .SimulationEquations @@ -66,22 +66,28 @@ module SPHExample export AutoOpenLogFile, AutoOpenParaview using PrecompileTools + using LinearAlgebra using StaticArrays using StructArrays @setup_workload begin KernelInstance = SPHKernelInstance{2, Float64}(WendlandC2(); dx=0.02) - Constants = SimulationConstants() - Position = [SVector(0.0, 0.0), SVector(0.02, 0.0)] - Velocity = [SVector(0.0, 0.0), SVector(0.1, 0.0)] - Acceleration = [SVector(0.0, 0.0), SVector(0.0, -9.81)] - Density = fill(Constants.ρ₀, 2) - Pressure = zeros(Float64, 2) - GravityFactor = [-1.0, 1.0] - MotionLimiter = [1.0, 0.0] - Types = [Fluid, Moving] - GroupMarker = [UInt(1), UInt(1)] - Cells = fill(CartesianIndex{2}(0, 0), 2) + CubicKernelInstance = SPHKernelInstance{2, Float64}(CubicSpline{Float64}(); dx=0.02) + Constants = SimulationConstants(ρ₀ = 1000.0, dx = 0.02, γ = 7.0) + Position = [SVector(0.0, 0.0), SVector(0.02, 0.0), SVector(0.04, 0.0)] + Velocity = [SVector(0.0, 0.0), SVector(0.1, 0.0), SVector(-0.05, 0.0)] + Acceleration = [SVector(0.0, 0.0), SVector(0.0, -9.81), SVector(0.0, -9.81)] + Density = fill(Constants.ρ₀, 3) + Pressure = zeros(Float64, 3) + GravityFactor = [-1.0, 1.0, -1.0] + MotionLimiter = [1.0, 0.0, 1.0] + Types = [Fluid, Moving, Fluid] + GroupMarker = [UInt(1), UInt(1), UInt(2)] + Cells = fill(CartesianIndex{2}(0, 0), 3) + Kernel = zeros(Float64, 3) + KernelGradient = zeros(eltype(Position), 3) + GhostPoints = zeros(eltype(Position), 3) + GhostNormals = zeros(eltype(Position), 3) SimParticles = StructArray((; Cells = Cells, Position = Position, @@ -93,32 +99,49 @@ module SPHExample MotionLimiter = MotionLimiter, Type = Types, GroupMarker = GroupMarker, + Kernel = Kernel, + KernelGradient = KernelGradient, + GhostPoints = GhostPoints, + GhostNormals = GhostNormals, )) Xij = Position[1] - Position[2] Vij = Velocity[1] - Velocity[2] DistanceSquared = dot(Xij, Xij) Q = sqrt(DistanceSquared) * KernelInstance.h⁻¹ GradientWij = ∇Wᵢⱼ(KernelInstance, Q, Xij) - SimMetaData = SimulationMetaData{2, Float64}(SimulationName = "Precompile", SaveLocation = ".") - PositionNext = similar(Position) - VelocityNext = similar(Velocity) - DensityNext = similar(Density) - DensityRate = zeros(Float64, 2) + CubicGradientWij = ∇Wᵢⱼ(CubicKernelInstance, Q, Xij) + SimMetaData = SimulationMetaData{2, Float64, NoShifting, StoreKernelOutput, SimpleMDBC, NoLog}(SimulationName = "Precompile", SaveLocation = ".") + DensityRate, VelocityNext, PositionNext, DensityNext, ShiftGradient, ShiftDivergence = AllocateSupportDataStructures(SimMetaData, Position) HalfStep = 0.5 + FullStep = 0.01 + MaxVisc = zeros(Float64, 3) + MinDtForce = fill(Inf, 3) @compile_workload begin Wᵢⱼ(KernelInstance, Q) ∇Wᵢⱼ(KernelInstance, Q, Xij) tensile_correction(KernelInstance, 0.0, 1.0, 0.0, 1.0, Q, 0.02) + Wᵢⱼ(CubicKernelInstance, Q) + ∇Wᵢⱼ(CubicKernelInstance, Q, Xij) + tensile_correction(CubicKernelInstance, 0.0, 1.0, 0.0, 1.0, Q, 0.02) EquationOfStateGamma7(Constants.ρ₀, Constants.c₀, Constants.ρ₀) ConstructGravitySVector(Xij, Constants.g) Pressure!(Pressure, Density, Constants) LimitDensityAtBoundary!(Density, Constants.ρ₀, MotionLimiter) + compute_viscosity(ZeroViscosity(), KernelInstance, Constants, SimParticles, Xij, Vij, GradientWij, DistanceSquared, 1, 2) compute_viscosity(ArtificialViscosity(), KernelInstance, Constants, SimParticles, Xij, Vij, GradientWij, DistanceSquared, 1, 2) compute_viscosity(Laminar(), KernelInstance, Constants, SimParticles, Xij, Vij, GradientWij, DistanceSquared, 1, 2) + compute_viscosity(LaminarSPS(), KernelInstance, Constants, SimParticles, Xij, Vij, GradientWij, DistanceSquared, 1, 2) + compute_density_diffusion(ZeroDensityDiffusion(), KernelInstance, Constants, SimParticles, Xij, GradientWij, DistanceSquared, 1, 2, MotionLimiter) compute_density_diffusion(LinearDensityDiffusion(), KernelInstance, Constants, SimParticles, Xij, GradientWij, DistanceSquared, 1, 2, MotionLimiter) compute_density_diffusion(ComplexDensityDiffusion(), KernelInstance, Constants, SimParticles, Xij, GradientWij, DistanceSquared, 1, 2, MotionLimiter) + compute_density_diffusion(LinearDensityDiffusion(), CubicKernelInstance, Constants, SimParticles, Xij, CubicGradientWij, DistanceSquared, 1, 2, MotionLimiter) HalfTimeStep(SimMetaData, Constants, SimParticles, PositionNext, VelocityNext, DensityNext, DensityRate, HalfStep) + FullTimeStep(SimMetaData, KernelInstance, Constants, SimParticles, ShiftGradient, ShiftDivergence, FullStep) + UpdateTimeStepBuffers!(MaxVisc, MinDtForce, 1, Position[1], Velocity[1], Acceleration[1], KernelInstance) + UpdateTimeStepBuffers!(MaxVisc, MinDtForce, 2, Position[2], Velocity[2], Acceleration[2], KernelInstance) + FinalizeTimeStep(MaxVisc, MinDtForce, Constants, KernelInstance) + Δt(Position, Velocity, Acceleration, Constants, KernelInstance) end end