From ca0d63631d4103437e702b59b141ce5a0e528ea8 Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Mon, 6 Jul 2026 00:45:24 +0200 Subject: [PATCH 1/4] Specialize time stepping mode --- src/SPHCellList.jl | 14 +++++++------- src/SimulationMetaDataConfiguration.jl | 24 ++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 9 deletions(-) diff --git a/src/SPHCellList.jl b/src/SPHCellList.jl index 1fb92b2a..28e4957f 100644 --- a/src/SPHCellList.jl +++ b/src/SPHCellList.jl @@ -703,9 +703,11 @@ using LinearAlgebra MotionDetails{Dimensions, FloatType}, }, }, - }) where { + }, + ::Type{TMode}) where { Dimensions, FloatType, SMode, KMode, BMode, LMode, + TMode<:TimeSteppingMode, SDD<:SPHDensityDiffusion, SV<:SPHViscosity} ParticleType = SimParticles.Type @@ -717,8 +719,6 @@ using LinearAlgebra UniqueCellsView = view(UniqueCells, 1:SimMetaData.IndexCounter) # This code here is to initialize the first time step for each simulation loop dt = SimConstants.CFL * (SimKernel.h / SimConstants.c₀) - TimeSteppingMode = SimMetaData.TimeSteppingMode - @no_escape begin AccelerationMax = @alloc(FloatType, length(SimParticles.Position)) dt₂ = dt * 0.5 @@ -727,7 +727,7 @@ using LinearAlgebra UniqueCellsView = view(UniqueCells, 1:SimMetaData.IndexCounter) BuildNeighborCellLists!(NeighborCellLists, FullStencil, UniqueCellsView, ParticleRanges) - if TimeSteppingMode isa SingleNeighborTimeStepping + if TMode <: SingleNeighborTimeStepping @timeit SimMetaData.HourGlass "00 Init Pressure" Pressure!(SimParticles.Pressure, SimParticles.Density, SimConstants) @timeit SimMetaData.HourGlass "00a Init MDBC" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) @timeit SimMetaData.HourGlass "00b Init NeighborLoop" NeighborLoopPerParticle!( @@ -762,7 +762,7 @@ using LinearAlgebra @timeit SimMetaData.HourGlass "Motion" ProgressMotion(SimParticles, dt₂, MotionDefinition, SimMetaData) - if TimeSteppingMode isa SymplecticTimeStepping + if TMode <: SymplecticTimeStepping @timeit SimMetaData.HourGlass "02 Pressure" Pressure!(SimParticles.Pressure, SimParticles.Density, SimConstants) @timeit SimMetaData.HourGlass "03 Apply MDBC before Half TimeStep" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) @@ -837,7 +837,7 @@ using LinearAlgebra NumberOfPoints = length(SimParticles) - SimMetaData.TimeSteppingMode = SimTimeStepping + TimeSteppingType = typeof(SimTimeStepping) dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, ∇Cᵢ, ∇◌rᵢ = AllocateSupportDataStructures(SimMetaData, SimParticles.Position) @@ -893,7 +893,7 @@ using LinearAlgebra SimConstants, SimParticles, FullStencil, ParticleRanges, UniqueCells, CellListIndices, SortingScratchSpace, NeighborCellLists, dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, - ∇Cᵢ, ∇◌rᵢ, MotionDefinition, + ∇Cᵢ, ∇◌rᵢ, MotionDefinition, TimeSteppingType, ) push!(SimMetaData.TimeSteps, SimMetaData.CurrentTimeStep) diff --git a/src/SimulationMetaDataConfiguration.jl b/src/SimulationMetaDataConfiguration.jl index b92381bf..0621d412 100644 --- a/src/SimulationMetaDataConfiguration.jl +++ b/src/SimulationMetaDataConfiguration.jl @@ -35,7 +35,8 @@ struct SingleNeighborTimeStepping <: TimeSteppingMode end SMode <: ShiftingMode, KMode <: KernelOutputMode, BMode <: MDBCMode, - LMode <: LogMode} + LMode <: LogMode, + TMode <: TimeSteppingMode} SimulationName::String SaveLocation::String HourGlass::TimerOutput = TimerOutput() @@ -55,7 +56,26 @@ struct SingleNeighborTimeStepping <: TimeSteppingMode end ExportGridCellParticleCounts::Bool = false OpenLogFile::Bool = true Δx::FloatType = zero(FloatType) - TimeSteppingMode::TimeSteppingMode = SingleNeighborTimeStepping() + TimeSteppingMode::Type{TMode} = TMode +end + +_time_stepping_type(::Type{TMode}) where {TMode<:TimeSteppingMode} = TMode +_time_stepping_type(::_TMode) where {_TMode<:TimeSteppingMode} = _TMode + +function _metadata_kwargs_without_time_stepping_mode(kwargs) + Kw = NamedTuple(kwargs) + Names = Tuple(Name for Name in keys(Kw) if Name !== :TimeSteppingMode) + Values = Tuple(Kw[Name] for Name in Names) + + return NamedTuple{Names}(Values) +end + +function SimulationMetaData{D,T,S,K,B,L}(; kwargs...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} + Kw = NamedTuple(kwargs) + TMode = _time_stepping_type(get(Kw, :TimeSteppingMode, SingleNeighborTimeStepping)) + CleanKw = _metadata_kwargs_without_time_stepping_mode(Kw) + + return SimulationMetaData{D,T,S,K,B,L,TMode}(; CleanKw...) end SimulationMetaData{D,T,S,K,B}(; kwargs...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode} = SimulationMetaData{D,T,S,K,B,NoLog}(; kwargs...) From 067c90aad5851b5bcacf71d86c97d9e15d2121ce Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Mon, 6 Jul 2026 01:04:53 +0200 Subject: [PATCH 2/4] Use metadata time stepping type --- src/SPHCellList.jl | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/SPHCellList.jl b/src/SPHCellList.jl index 28e4957f..543b95a0 100644 --- a/src/SPHCellList.jl +++ b/src/SPHCellList.jl @@ -689,7 +689,7 @@ using LinearAlgebra # Per-particle local Δx removed: use single scalar `SimMetaData.Δx`. @inbounds function SimulationLoop(SimDensityDiffusion::SDD, SimViscosity::SV, SimKernel, - SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode}, + SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode, TMode}, SimConstants, SimParticles, FullStencil, ParticleRanges, UniqueCells, CellListIndices, SortingScratchSpace, @@ -703,8 +703,7 @@ using LinearAlgebra MotionDetails{Dimensions, FloatType}, }, }, - }, - ::Type{TMode}) where { + }) where { Dimensions, FloatType, SMode, KMode, BMode, LMode, TMode<:TimeSteppingMode, @@ -824,7 +823,7 @@ using LinearAlgebra ###=== function RunSimulation(;SimGeometry::Vector{Geometry{Dimensions, FloatType}}, #Don't further specify type for now - SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode}, + SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode, TMode}, SimConstants::SimulationConstants, SimKernel::SPHKernelInstance, SimLogger::SimulationLogger, @@ -833,11 +832,11 @@ using LinearAlgebra SimDensityDiffusion::SDD, SimTimeStepping::TimeSteppingMode, ParticleNormalsPath::Union{Nothing,String} = nothing - ) where {Dimensions,FloatType,SMode,KMode,BMode,LMode,SV<:SPHViscosity,SDD<:SPHDensityDiffusion} + ) where {Dimensions,FloatType,SMode,KMode,BMode,LMode,TMode<:TimeSteppingMode,SV<:SPHViscosity,SDD<:SPHDensityDiffusion} - NumberOfPoints = length(SimParticles) + @assert SimTimeStepping isa TMode "SimTimeStepping must match the time-stepping mode encoded in SimMetaData." - TimeSteppingType = typeof(SimTimeStepping) + NumberOfPoints = length(SimParticles) dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, ∇Cᵢ, ∇◌rᵢ = AllocateSupportDataStructures(SimMetaData, SimParticles.Position) @@ -893,7 +892,7 @@ using LinearAlgebra SimConstants, SimParticles, FullStencil, ParticleRanges, UniqueCells, CellListIndices, SortingScratchSpace, NeighborCellLists, dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, - ∇Cᵢ, ∇◌rᵢ, MotionDefinition, TimeSteppingType, + ∇Cᵢ, ∇◌rᵢ, MotionDefinition, ) push!(SimMetaData.TimeSteps, SimMetaData.CurrentTimeStep) From 59a1ea6d3005072657e05d1127b7c1e686211557 Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Mon, 6 Jul 2026 01:05:45 +0200 Subject: [PATCH 3/4] Simplify metadata time mode --- README.md | 5 +++-- src/SPHCellList.jl | 8 +++++++- src/SimulationMetaDataConfiguration.jl | 21 ++------------------- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 4d4dc776..09984c5b 100644 --- a/README.md +++ b/README.md @@ -26,8 +26,9 @@ The project demonstrates how to assemble a small SPH solver with Julia. It focus - **Wendland quintic kernel** – simple and stable without tensile corrections. - **Symplectic time stepping** – choose between symplectic two-loop and single-loop midpoint updates. -Time-stepping behavior is selected via `RunSimulation(..., SimTimeStepping=...)` with either -`SymplecticTimeStepping()` or `SingleNeighborTimeStepping()` depending on the desired update path. +Time-stepping behavior is encoded in the `SimulationMetaData` type. The shorter metadata constructors default to +`SingleNeighborTimeStepping`; use the seven-parameter form with `SymplecticTimeStepping` when the symplectic +two-loop update path is desired. ## Folder Structure diff --git a/src/SPHCellList.jl b/src/SPHCellList.jl index 543b95a0..e21ebe04 100644 --- a/src/SPHCellList.jl +++ b/src/SPHCellList.jl @@ -821,6 +821,12 @@ using LinearAlgebra return nothing end + + ValidateTimeSteppingMode(::SimulationMetaData{D,T,S,K,B,L,TMode}, ::TMode) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode,TMode<:TimeSteppingMode} = nothing + function ValidateTimeSteppingMode(::SimulationMetaData{D,T,S,K,B,L,TMode}, SimTimeStepping::TimeSteppingMode) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode,TMode<:TimeSteppingMode} + throw(ArgumentError("SimTimeStepping $(typeof(SimTimeStepping)) does not match SimulationMetaData time-stepping mode $TMode.")) + end + ###=== function RunSimulation(;SimGeometry::Vector{Geometry{Dimensions, FloatType}}, #Don't further specify type for now SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode, TMode}, @@ -834,7 +840,7 @@ using LinearAlgebra ParticleNormalsPath::Union{Nothing,String} = nothing ) where {Dimensions,FloatType,SMode,KMode,BMode,LMode,TMode<:TimeSteppingMode,SV<:SPHViscosity,SDD<:SPHDensityDiffusion} - @assert SimTimeStepping isa TMode "SimTimeStepping must match the time-stepping mode encoded in SimMetaData." + ValidateTimeSteppingMode(SimMetaData, SimTimeStepping) NumberOfPoints = length(SimParticles) diff --git a/src/SimulationMetaDataConfiguration.jl b/src/SimulationMetaDataConfiguration.jl index 0621d412..bf78fe39 100644 --- a/src/SimulationMetaDataConfiguration.jl +++ b/src/SimulationMetaDataConfiguration.jl @@ -56,27 +56,10 @@ struct SingleNeighborTimeStepping <: TimeSteppingMode end ExportGridCellParticleCounts::Bool = false OpenLogFile::Bool = true Δx::FloatType = zero(FloatType) - TimeSteppingMode::Type{TMode} = TMode end -_time_stepping_type(::Type{TMode}) where {TMode<:TimeSteppingMode} = TMode -_time_stepping_type(::_TMode) where {_TMode<:TimeSteppingMode} = _TMode - -function _metadata_kwargs_without_time_stepping_mode(kwargs) - Kw = NamedTuple(kwargs) - Names = Tuple(Name for Name in keys(Kw) if Name !== :TimeSteppingMode) - Values = Tuple(Kw[Name] for Name in Names) - - return NamedTuple{Names}(Values) -end - -function SimulationMetaData{D,T,S,K,B,L}(; kwargs...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} - Kw = NamedTuple(kwargs) - TMode = _time_stepping_type(get(Kw, :TimeSteppingMode, SingleNeighborTimeStepping)) - CleanKw = _metadata_kwargs_without_time_stepping_mode(Kw) - - return SimulationMetaData{D,T,S,K,B,L,TMode}(; CleanKw...) -end +SimulationMetaData{D,T,S,K,B,L}(; kwargs...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} = + SimulationMetaData{D,T,S,K,B,L,SingleNeighborTimeStepping}(; kwargs...) SimulationMetaData{D,T,S,K,B}(; kwargs...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode} = SimulationMetaData{D,T,S,K,B,NoLog}(; kwargs...) SimulationMetaData{D,T,S,K}(; kwargs...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode} = From 6eb18e5980e11e64c57d38589a5a107a33c2a553 Mon Sep 17 00:00:00 2001 From: AhmedSalih3d <36305327+AhmedSalih3d@users.noreply.github.com> Date: Mon, 6 Jul 2026 01:06:04 +0200 Subject: [PATCH 4/4] Dispatch time stepping loops --- example/Dambreak2dMDBC.jl | 1 - example/Dambreak3d.jl | 1 - example/DucklingMDBC.jl | 1 - example/MovingSquare2d.jl | 1 - example/StillWedgeMDBC.jl | 1 - example/StillWedgeMiddleSquareMDBC.jl | 1 - src/SPHCellList.jl | 150 +++++++++++++++----------- 7 files changed, 87 insertions(+), 69 deletions(-) diff --git a/example/Dambreak2dMDBC.jl b/example/Dambreak2dMDBC.jl index 94a5d4b8..2441dc2d 100644 --- a/example/Dambreak2dMDBC.jl +++ b/example/Dambreak2dMDBC.jl @@ -79,7 +79,6 @@ let SimParticles = SimParticles, SimViscosity = ArtificialViscosity(), SimDensityDiffusion = LinearDensityDiffusion(), - SimTimeStepping = SingleNeighborTimeStepping(), ParticleNormalsPath = "./input/dam_break_2d/DamBreak2d_Dp0.02_MDBC_GhostNodes_ThreeLayers.csv" ) end diff --git a/example/Dambreak3d.jl b/example/Dambreak3d.jl index b6ca0ee5..157af341 100644 --- a/example/Dambreak3d.jl +++ b/example/Dambreak3d.jl @@ -73,6 +73,5 @@ let SimParticles = SimParticles, SimViscosity = SimViscosity, SimDensityDiffusion= SimDensityDiffusion, - SimTimeStepping = SingleNeighborTimeStepping() ) end diff --git a/example/DucklingMDBC.jl b/example/DucklingMDBC.jl index d7ddf44c..7d6f7444 100644 --- a/example/DucklingMDBC.jl +++ b/example/DucklingMDBC.jl @@ -60,7 +60,6 @@ let SimKernel = SimKernel, SimViscosity = SimViscosity, SimDensityDiffusion = SimDensityDiffusion, - SimTimeStepping = SingleNeighborTimeStepping(), ParticleNormalsPath = "./input/case_duckling_mdbc/CaseDuckling_Dp$(SimConstantsWedge.dx)_GhostNodes.csv" ) diff --git a/example/MovingSquare2d.jl b/example/MovingSquare2d.jl index 71904f32..64a4101a 100644 --- a/example/MovingSquare2d.jl +++ b/example/MovingSquare2d.jl @@ -82,6 +82,5 @@ let SimKernel = SimKernel, SimViscosity = LaminarSPS(), SimDensityDiffusion = LinearDensityDiffusion(), - SimTimeStepping = SingleNeighborTimeStepping() ) end diff --git a/example/StillWedgeMDBC.jl b/example/StillWedgeMDBC.jl index 2a81d6f1..14a3abc0 100644 --- a/example/StillWedgeMDBC.jl +++ b/example/StillWedgeMDBC.jl @@ -58,7 +58,6 @@ let SimParticles = SimParticles, SimViscosity = ArtificialViscosity(), SimDensityDiffusion = LinearDensityDiffusion(), - SimTimeStepping = SingleNeighborTimeStepping(), ParticleNormalsPath = "./input/still_wedge_mdbc/StillWedge_Dp$(SimConstantsWedge.dx)_GhostNodes_Correct.csv" ) diff --git a/example/StillWedgeMiddleSquareMDBC.jl b/example/StillWedgeMiddleSquareMDBC.jl index e8fa6c1a..69437f63 100644 --- a/example/StillWedgeMiddleSquareMDBC.jl +++ b/example/StillWedgeMiddleSquareMDBC.jl @@ -63,7 +63,6 @@ let SimParticles = SimParticles, SimViscosity = ArtificialViscosity(), SimDensityDiffusion = LinearDensityDiffusion(), - SimTimeStepping = SingleNeighborTimeStepping(), ParticleNormalsPath = "./input/still_wedge_middle_square_mdbc/StillWedge_MiddleSquare_Dp$(SimConstantsWedge.dx)_GhostNodes.csv" ) diff --git a/src/SPHCellList.jl b/src/SPHCellList.jl index e21ebe04..d38cc986 100644 --- a/src/SPHCellList.jl +++ b/src/SPHCellList.jl @@ -688,6 +688,86 @@ using LinearAlgebra # Per-particle local Δx removed: use single scalar `SimMetaData.Δx`. + function InitialNeighborLoop!(::SimulationMetaData{D,T,S,K,B,L,SymplecticTimeStepping}, _args...) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} + return nothing + end + + function InitialNeighborLoop!(SimMetaData::SimulationMetaData{D,T,S,K,B,L,SingleNeighborTimeStepping}, + SimDensityDiffusion, SimViscosity, SimKernel, SimConstants, + SimParticles, ParticleRanges, CellListIndices, NeighborCellLists, + dρdtI, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, UniqueCells) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} + @timeit SimMetaData.HourGlass "00 Init Pressure" Pressure!(SimParticles.Pressure, SimParticles.Density, SimConstants) + @timeit SimMetaData.HourGlass "00a Init MDBC" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) + @timeit SimMetaData.HourGlass "00b Init NeighborLoop" NeighborLoopPerParticle!( + SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, + SimConstants, SimParticles, ParticleRanges, CellListIndices, + NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, + ) + + return nothing + end + + function HalfStepNeighborLoops!(SimMetaData::SimulationMetaData{D,T,S,K,B,L,SymplecticTimeStepping}, + SimDensityDiffusion, SimViscosity, SimKernel, SimConstants, + SimParticles, ParticleRanges, UniqueCells, CellListIndices, + NeighborCellLists, dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, + ∇Cᵢ, ∇◌rᵢ, AccelerationMax, dt₂, ParticleType, + MotionDefinition) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} + @timeit SimMetaData.HourGlass "02 Pressure" Pressure!(SimParticles.Pressure, SimParticles.Density, SimConstants) + @timeit SimMetaData.HourGlass "03 Apply MDBC before Half TimeStep" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) + + @timeit SimMetaData.HourGlass "04 First NeighborLoop" NeighborLoopPerParticle!( + SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, + SimConstants, SimParticles, ParticleRanges, CellListIndices, + NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, + ) + + @timeit SimMetaData.HourGlass "05 Update To Half TimeStep" HalfTimeStep(SimMetaData, SimConstants, SimParticles, Positionₙ⁺, Velocityₙ⁺, ρₙ⁺, dρdtI, dt₂) + + @timeit SimMetaData.HourGlass "06 Half LimitDensityAtBoundary" LimitDensityAtBoundary!(ρₙ⁺, SimConstants.ρ₀, ParticleType) + + @timeit SimMetaData.HourGlass "Motion" ProgressMotion(SimParticles, dt₂, MotionDefinition, SimMetaData) + + @timeit SimMetaData.HourGlass "07 Pressure" Pressure!(SimParticles.Pressure, ρₙ⁺, SimConstants) + @timeit SimMetaData.HourGlass "08 Second NeighborLoop" NeighborLoopPerParticle!( + SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, + SimConstants, SimParticles, ParticleRanges, CellListIndices, + NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, + Position = Positionₙ⁺, + Density = ρₙ⁺, + Velocity = Velocityₙ⁺, + ) + + return nothing + end + + function HalfStepNeighborLoops!(SimMetaData::SimulationMetaData{D,T,S,K,B,L,SingleNeighborTimeStepping}, + SimDensityDiffusion, SimViscosity, SimKernel, SimConstants, + SimParticles, ParticleRanges, UniqueCells, CellListIndices, + NeighborCellLists, dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, + ∇Cᵢ, ∇◌rᵢ, AccelerationMax, dt₂, ParticleType, + MotionDefinition) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode} + @timeit SimMetaData.HourGlass "02 Apply MDBC before Half TimeStep" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) + + @timeit SimMetaData.HourGlass "03 Update To Half TimeStep" HalfTimeStep(SimMetaData, SimConstants, SimParticles, Positionₙ⁺, Velocityₙ⁺, ρₙ⁺, dρdtI, dt₂) + + @timeit SimMetaData.HourGlass "04 Half LimitDensityAtBoundary" LimitDensityAtBoundary!(ρₙ⁺, SimConstants.ρ₀, ParticleType) + + @timeit SimMetaData.HourGlass "Motion" ProgressMotion(SimParticles, dt₂, MotionDefinition, SimMetaData) + + @timeit SimMetaData.HourGlass "05 Pressure" Pressure!(SimParticles.Pressure, ρₙ⁺, SimConstants) + @timeit SimMetaData.HourGlass "06 NeighborLoop" NeighborLoopPerParticle!( + SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, + SimConstants, SimParticles, ParticleRanges, CellListIndices, + NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, + Position = Positionₙ⁺, + Density = ρₙ⁺, + Velocity = Velocityₙ⁺, + ) + + return nothing + end + @inbounds function SimulationLoop(SimDensityDiffusion::SDD, SimViscosity::SV, SimKernel, SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode, TMode}, SimConstants, SimParticles, FullStencil, @@ -726,15 +806,9 @@ using LinearAlgebra UniqueCellsView = view(UniqueCells, 1:SimMetaData.IndexCounter) BuildNeighborCellLists!(NeighborCellLists, FullStencil, UniqueCellsView, ParticleRanges) - if TMode <: SingleNeighborTimeStepping - @timeit SimMetaData.HourGlass "00 Init Pressure" Pressure!(SimParticles.Pressure, SimParticles.Density, SimConstants) - @timeit SimMetaData.HourGlass "00a Init MDBC" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) - @timeit SimMetaData.HourGlass "00b Init NeighborLoop" NeighborLoopPerParticle!( - SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, - SimConstants, SimParticles, ParticleRanges, CellListIndices, - NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, - ) - end + InitialNeighborLoop!(SimMetaData, SimDensityDiffusion, SimViscosity, SimKernel, SimConstants, + SimParticles, ParticleRanges, CellListIndices, NeighborCellLists, + dρdtI, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, UniqueCells) NextOutputTime = next_output_time(SimMetaData) while SimMetaData.TotalTime <= NextOutputTime @@ -761,50 +835,10 @@ using LinearAlgebra @timeit SimMetaData.HourGlass "Motion" ProgressMotion(SimParticles, dt₂, MotionDefinition, SimMetaData) - if TMode <: SymplecticTimeStepping - @timeit SimMetaData.HourGlass "02 Pressure" Pressure!(SimParticles.Pressure, SimParticles.Density, SimConstants) - @timeit SimMetaData.HourGlass "03 Apply MDBC before Half TimeStep" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) - - @timeit SimMetaData.HourGlass "04 First NeighborLoop" NeighborLoopPerParticle!( - SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, - SimConstants, SimParticles, ParticleRanges, CellListIndices, - NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, - ) - - @timeit SimMetaData.HourGlass "05 Update To Half TimeStep" HalfTimeStep(SimMetaData, SimConstants, SimParticles, Positionₙ⁺, Velocityₙ⁺, ρₙ⁺, dρdtI, dt₂) - - @timeit SimMetaData.HourGlass "06 Half LimitDensityAtBoundary" LimitDensityAtBoundary!(ρₙ⁺, SimConstants.ρ₀, ParticleType) - - @timeit SimMetaData.HourGlass "Motion" ProgressMotion(SimParticles, dt₂, MotionDefinition, SimMetaData) - - @timeit SimMetaData.HourGlass "07 Pressure" Pressure!(SimParticles.Pressure, ρₙ⁺, SimConstants) - @timeit SimMetaData.HourGlass "08 Second NeighborLoop" NeighborLoopPerParticle!( - SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, - SimConstants, SimParticles, ParticleRanges, CellListIndices, - NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, - Position = Positionₙ⁺, - Density = ρₙ⁺, - Velocity = Velocityₙ⁺, - ) - else - @timeit SimMetaData.HourGlass "02 Apply MDBC before Half TimeStep" ApplyMDBCBeforeHalf!(SimMetaData, SimKernel, SimConstants, SimParticles, ParticleRanges, UniqueCells) - - @timeit SimMetaData.HourGlass "03 Update To Half TimeStep" HalfTimeStep(SimMetaData, SimConstants, SimParticles, Positionₙ⁺, Velocityₙ⁺, ρₙ⁺, dρdtI, dt₂) - - @timeit SimMetaData.HourGlass "04 Half LimitDensityAtBoundary" LimitDensityAtBoundary!(ρₙ⁺, SimConstants.ρ₀, ParticleType) - - @timeit SimMetaData.HourGlass "Motion" ProgressMotion(SimParticles, dt₂, MotionDefinition, SimMetaData) - - @timeit SimMetaData.HourGlass "05 Pressure" Pressure!(SimParticles.Pressure, ρₙ⁺, SimConstants) - @timeit SimMetaData.HourGlass "06 NeighborLoop" NeighborLoopPerParticle!( - SimDensityDiffusion, SimViscosity, SimKernel, SimMetaData, - SimConstants, SimParticles, ParticleRanges, CellListIndices, - NeighborCellLists, dρdtI, SimParticles.Acceleration, ∇Cᵢ, ∇◌rᵢ, AccelerationMax, - Position = Positionₙ⁺, - Density = ρₙ⁺, - Velocity = Velocityₙ⁺, - ) - end + HalfStepNeighborLoops!(SimMetaData, SimDensityDiffusion, SimViscosity, SimKernel, SimConstants, + SimParticles, ParticleRanges, UniqueCells, CellListIndices, + NeighborCellLists, dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, + ∇Cᵢ, ∇◌rᵢ, AccelerationMax, dt₂, ParticleType, MotionDefinition) @timeit SimMetaData.HourGlass "07 Final Density" DensityEpsi!(SimParticles.Density, dρdtI, ρₙ⁺, dt) @@ -820,13 +854,6 @@ using LinearAlgebra return nothing end - - - ValidateTimeSteppingMode(::SimulationMetaData{D,T,S,K,B,L,TMode}, ::TMode) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode,TMode<:TimeSteppingMode} = nothing - function ValidateTimeSteppingMode(::SimulationMetaData{D,T,S,K,B,L,TMode}, SimTimeStepping::TimeSteppingMode) where {D,T,S<:ShiftingMode,K<:KernelOutputMode,B<:MDBCMode,L<:LogMode,TMode<:TimeSteppingMode} - throw(ArgumentError("SimTimeStepping $(typeof(SimTimeStepping)) does not match SimulationMetaData time-stepping mode $TMode.")) - end - ###=== function RunSimulation(;SimGeometry::Vector{Geometry{Dimensions, FloatType}}, #Don't further specify type for now SimMetaData::SimulationMetaData{Dimensions, FloatType, SMode, KMode, BMode, LMode, TMode}, @@ -836,12 +863,9 @@ using LinearAlgebra SimParticles::StructArray, SimViscosity::SV, SimDensityDiffusion::SDD, - SimTimeStepping::TimeSteppingMode, ParticleNormalsPath::Union{Nothing,String} = nothing ) where {Dimensions,FloatType,SMode,KMode,BMode,LMode,TMode<:TimeSteppingMode,SV<:SPHViscosity,SDD<:SPHDensityDiffusion} - ValidateTimeSteppingMode(SimMetaData, SimTimeStepping) - NumberOfPoints = length(SimParticles) dρdtI, Velocityₙ⁺, Positionₙ⁺, ρₙ⁺, ∇Cᵢ, ∇◌rᵢ = AllocateSupportDataStructures(SimMetaData, SimParticles.Position)