Skip to content

Commit 16fd37c

Browse files
committed
Fix performance issues + update of release notes
1 parent 98253e6 commit 16fd37c

File tree

7 files changed

+58
-49
lines changed

7 files changed

+58
-49
lines changed

Manifest.toml

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,9 @@ version = "2.20.1"
195195

196196
[[deps.DiffEqJump]]
197197
deps = ["ArrayInterface", "Compat", "DataStructures", "DiffEqBase", "FunctionWrappers", "Graphs", "LinearAlgebra", "PoissonRandom", "Random", "RandomNumbers", "RecursiveArrayTools", "Reexport", "StaticArrays", "TreeViews", "UnPack"]
198-
git-tree-sha1 = "ec1f3a5b4eac6502e45dcf79d213b200afd61990"
198+
git-tree-sha1 = "e30f058eb600407e3fd4ea082e2527e3a3671238"
199199
uuid = "c894b116-72e5-5b58-be3c-e6d8d4ac2b12"
200-
version = "8.2.0"
200+
version = "8.2.1"
201201

202202
[[deps.DiffEqNoiseProcess]]
203203
deps = ["DiffEqBase", "Distributions", "LinearAlgebra", "Optim", "PoissonRandom", "QuadGK", "Random", "Random123", "RandomNumbers", "RecipesBase", "RecursiveArrayTools", "Requires", "ResettableStacks", "SciMLBase", "StaticArrays", "Statistics"]
@@ -578,15 +578,15 @@ version = "0.7.3"
578578

579579
[[deps.ModiaBase]]
580580
deps = ["DataFrames", "DiffRules", "LinearAlgebra", "Measurements", "MonteCarloMeasurements", "OrderedCollections", "RecursiveFactorization", "StaticArrays", "TimerOutputs", "Unitful"]
581-
git-tree-sha1 = "9e678c9f7ce692bb30855083b83fa35db09c0d32"
581+
git-tree-sha1 = "e32f09c491f569f254d3c7776326539f4b3c5f24"
582582
uuid = "ec7bf1ca-419d-4510-bbab-199861c55244"
583-
version = "0.9.1"
583+
version = "0.9.2"
584584

585585
[[deps.ModiaLang]]
586586
deps = ["DataFrames", "DifferentialEquations", "FiniteDiff", "ForwardDiff", "InteractiveUtils", "JSON", "Measurements", "ModiaBase", "ModiaResult", "MonteCarloMeasurements", "OrderedCollections", "Printf", "Reexport", "StaticArrays", "Sundials", "Test", "TimerOutputs", "Unitful"]
587-
git-tree-sha1 = "30a6da396a763673608bb94bf90683daec9adc6e"
587+
git-tree-sha1 = "c3167743de35eb2aaf4b86985c086d86dfebfdba"
588588
uuid = "34b37210-eaa3-4b48-8781-0b87bf559981"
589-
version = "0.11.1"
589+
version = "0.11.2"
590590

591591
[[deps.ModiaResult]]
592592
deps = ["DataFrames", "Measurements", "MonteCarloMeasurements", "OrderedCollections", "Pkg", "Tables", "Unitful"]
@@ -707,9 +707,9 @@ version = "0.4.0"
707707

708708
[[deps.Polyester]]
709709
deps = ["ArrayInterface", "BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "ManualMemory", "PolyesterWeave", "Requires", "Static", "StrideArraysCore", "ThreadingUtilities"]
710-
git-tree-sha1 = "93b829eedfc466c844c233f285fae94dcaa1870a"
710+
git-tree-sha1 = "2232d3865bc9a098e664f69cbe340b960d48217f"
711711
uuid = "f517fe37-dbe3-4b94-8317-1923a5111588"
712-
version = "0.6.5"
712+
version = "0.6.6"
713713

714714
[[deps.PolyesterWeave]]
715715
deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"]
@@ -851,9 +851,9 @@ version = "0.1.0"
851851

852852
[[deps.SLEEFPirates]]
853853
deps = ["IfElse", "Static", "VectorizationBase"]
854-
git-tree-sha1 = "3a5ae1db486e4ce3ccd2b392389943481e20401f"
854+
git-tree-sha1 = "61a96d8b89083a53fb2b745f3b59a05359651bbe"
855855
uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa"
856-
version = "0.6.29"
856+
version = "0.6.30"
857857

858858
[[deps.SciMLBase]]
859859
deps = ["ArrayInterface", "CommonSolve", "ConstructionBase", "Distributed", "DocStringExtensions", "IteratorInterfaceExtensions", "LinearAlgebra", "Logging", "RecipesBase", "RecursiveArrayTools", "StaticArrays", "Statistics", "Tables", "TreeViews"]
@@ -913,9 +913,9 @@ version = "0.4.1"
913913

914914
[[deps.StaticArrays]]
915915
deps = ["LinearAlgebra", "Random", "Statistics"]
916-
git-tree-sha1 = "95c6a5d0e8c69555842fc4a927fc485040ccc31c"
916+
git-tree-sha1 = "6354dfaf95d398a1a70e0b28238321d5d17b2530"
917917
uuid = "90137ffa-7385-5640-81b9-e52037218182"
918-
version = "1.3.5"
918+
version = "1.4.0"
919919

920920
[[deps.Statistics]]
921921
deps = ["LinearAlgebra", "SparseArrays"]
@@ -953,9 +953,9 @@ version = "6.44.0"
953953

954954
[[deps.StrideArraysCore]]
955955
deps = ["ArrayInterface", "CloseOpenIntervals", "IfElse", "LayoutPointers", "ManualMemory", "Requires", "SIMDTypes", "Static", "ThreadingUtilities"]
956-
git-tree-sha1 = "2025a5d6564a93fa5b499dd216c0bc44537fb0d4"
956+
git-tree-sha1 = "e0a02838565c4600ecd1d8874db8cfe263aaa6c7"
957957
uuid = "7792a7ef-975c-4747-a70f-980b88e8d1da"
958-
version = "0.2.11"
958+
version = "0.2.12"
959959

960960
[[deps.StructArrays]]
961961
deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"]

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ FileIO = "1"
3232
JSON = "0.21"
3333
Measurements = "2"
3434
MeshIO = "0.4.10"
35-
ModiaLang = "0.11.1"
35+
ModiaLang = "0.11.2"
3636
MonteCarloMeasurements = "1"
3737
OrderedCollections = "1"
3838
Reexport = "1.0"

docs/src/index.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,19 +55,15 @@ Non-backwards compatible changes
5555
- Operator `buildModia3D(..)` is removed. Instead, the new constructor `Model3D(..)` must be used at the top level of a
5656
Modia3D definition. It is now possible to define several, independent multibody systems
5757
(currently, only one of them can have animation and animation export).
58-
5958
- If init/start vectors are defined (e.g. initial state of a FreeMotion joint), they must be defined as SVector{3,Float64}(..).
60-
Otherwise, errors occur during compilation.
61-
62-
- Requires ModiaLang Version 0.11
63-
59+
Otherwise, errors occur during compilation.
6460

6561
Other changes
6662

63+
- All test models changed, due to the non-backwards compatible change.
6764
- Code generation changed significantly, in order that the interface to Modia3D functions is type stable.
6865
As a result, simulation is more efficient and much less memory is allocated during simulation.
69-
70-
- All test models changed, due to the non-backwards compatible change
66+
- Efficiency improvements for collisions (less memory is allocated during simulation + faster simulation).
7167

7268

7369
### Version 0.8.2

src/Composition/dynamics.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ while LinearEquationsIteration(_leq, <...>)
352352
end
353353
```
354354
"""
355-
function computeGeneralizedForces!(mbs::MultibodyData{F}, _leq)::MultibodyData{F} where {F}
355+
function computeGeneralizedForces!(mbs::MultibodyData{F,TimeType}, _leq)::MultibodyData{F,TimeType} where {F,TimeType}
356356
instantiatedModel = mbs.instantiatedModel
357357
TimerOutputs.@timeit instantiatedModel.timer "Modia3D computeGeneralizedForces!" begin
358358
storeResult = instantiatedModel.storeResult

src/Composition/joints/joints.jl

Lines changed: 37 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ mutable struct MultibodyData{F <: Modia3D.VarFloatType, TimeType}
2929
nz::Int # Number of used zero crossing functions
3030
time::TimeType # Current time
3131

32+
freeMotionResiduals::Vector{F}
33+
3234
# for multibodyAccelerations
3335
leq::Vector{ModiaBase.LinearEquations{F}}
3436

@@ -39,7 +41,9 @@ mutable struct MultibodyData{F <: Modia3D.VarFloatType, TimeType}
3941
revoluteObjects, prismaticObjects, freeMotionObjects,
4042
zeros(F, length(revoluteObjects)), zeros(F, length(prismaticObjects)), zeros(SVector{3,F}, 2*length(freeMotionObjects)),
4143
zeros(F, length(revoluteObjects)), zeros(F, length(prismaticObjects)), zeros(SVector{3,F}, 2*length(freeMotionObjects)),
42-
zStartIndex, nz, Modia3D.convertAndStripUnit(TimeType, u"s", time), ModiaBase.LinearEquations{F}[])
44+
zStartIndex, nz, Modia3D.convertAndStripUnit(TimeType, u"s", time),
45+
zeros(F, 2*3*length(freeMotionObjects)),
46+
ModiaBase.LinearEquations{F}[])
4347
end
4448

4549
mutable struct MultibodyBuild{F <: Modia3D.VarFloatType, TimeType}
@@ -466,8 +470,8 @@ end
466470
467471
Copy states of the revolute joints into the corresponding Object3Ds.
468472
"""
469-
@inline function setStatesRevolute!(mbs::MultibodyData{F}, args::Vararg{F,NJOINTS_TIMES_2})::MultibodyData{F} where {F,NJOINTS_TIMES_2}
470-
@assert(NJOINTS_TIMES_2 == 2*length(mbs.revoluteObjects))
473+
function setStatesRevolute!(mbs::MultibodyData{F,TimeType}, args::Vararg{F})::MultibodyData{F,TimeType} where {F,TimeType}
474+
@assert(length(args) == 2*length(mbs.revoluteObjects))
471475
scene = mbs.scene
472476
j = 1
473477
@inbounds for obj in mbs.revoluteObjects
@@ -485,8 +489,8 @@ end
485489
486490
Copy states of the prismatic joints into the corresponding Object3Ds.
487491
"""
488-
@inline function setStatesPrismatic!(mbs::MultibodyData{F}, args::Vararg{F,NJOINTS_TIMES_2})::MultibodyData{F} where {F,NJOINTS_TIMES_2}
489-
@assert(NJOINTS_TIMES_2 == 2*length(mbs.prismaticObjects))
492+
function setStatesPrismatic!(mbs::MultibodyData{F,TimeType}, args::Vararg{F})::MultibodyData{F,TimeType} where {F,TimeType}
493+
@assert(length(args) == 2*length(mbs.prismaticObjects))
490494
scene = mbs.scene
491495
j = 1
492496
@inbounds for obj in mbs.prismaticObjects
@@ -504,8 +508,8 @@ end
504508
505509
Copy states of the free motion joints into the corresponding Object3Ds.
506510
"""
507-
@inline function setStatesFreeMotion!(mbs::MultibodyData{F}, args::Vararg{SVector{3,F},NJOINTS_TIMES_4})::MultibodyData{F} where {F,NJOINTS_TIMES_4}
508-
@assert(NJOINTS_TIMES_4 == 4*length(mbs.freeMotionObjects))
511+
function setStatesFreeMotion!(mbs::MultibodyData{F,TimeType}, args::Vararg{SVector{3,F}})::MultibodyData{F,TimeType} where {F,TimeType}
512+
@assert(length(args) == 4*length(mbs.freeMotionObjects))
509513
scene = mbs.scene
510514
j = 1
511515
@inbounds for obj in mbs.freeMotionObjects
@@ -525,8 +529,8 @@ end
525529
526530
Copy isrot123 of the free motion joints into the corresponding Object3Ds.
527531
"""
528-
@inline function setStatesFreeMotion_isrot123!(mbs::MultibodyData{F}, args::Vararg{Bool,NJOINTS})::MultibodyData{F} where {F,NJOINTS}
529-
@assert(NJOINTS == length(mbs.freeMotionObjects))
532+
function setStatesFreeMotion_isrot123!(mbs::MultibodyData{F,TimeType}, args::Vararg{Bool})::MultibodyData{F,TimeType} where {F,TimeType}
533+
@assert(length(args) == length(mbs.freeMotionObjects))
530534
scene = mbs.scene
531535
@inbounds for (i,obj) in enumerate(mbs.freeMotionObjects)
532536
scene.freeMotion[obj.jointIndex].isrot123 = args[i]
@@ -540,8 +544,8 @@ end
540544
541545
Copy accelerations of revolute joints into mbs.
542546
"""
543-
@inline function setAccelerationsRevolute!(mbs::MultibodyData{F}, args::Vararg{F,NJOINTS}) where {F,NJOINTS}
544-
@assert(NJOINTS == length(mbs.revoluteObjects))
547+
function setAccelerationsRevolute!(mbs::MultibodyData{F,TimeType}, args::Vararg{F}) where {F,TimeType}
548+
@assert(length(args) == length(mbs.revoluteObjects))
545549
scene = mbs.scene
546550
@inbounds for (i,obj) in enumerate(mbs.revoluteObjects)
547551
scene.revolute[obj.jointIndex].a = args[i]
@@ -555,8 +559,8 @@ end
555559
556560
Copy accelerations of prismatic joints into mbs.
557561
"""
558-
@inline function setAccelerationsPrismatic!(mbs::MultibodyData{F}, args::Vararg{F,NJOINTS}) where {F,NJOINTS}
559-
@assert(NJOINTS == length(mbs.prismaticObjects))
562+
function setAccelerationsPrismatic!(mbs::MultibodyData{F,TimeType}, args::Vararg{F}) where {F,TimeType}
563+
@assert(length(args) == length(mbs.prismaticObjects))
560564
scene = mbs.scene
561565
@inbounds for (i,obj) in enumerate(mbs.prismaticObjects)
562566
scene.prismatic[obj.jointIndex].a = args[i]
@@ -570,8 +574,8 @@ end
570574
571575
Copy accelerations of free motion joints into mbs
572576
"""
573-
@inline function setAccelerationsFreeMotion!(mbs::MultibodyData{F}, args::Vararg{SVector{3,F},NJOINTS_TIMES_2}) where {F,NJOINTS_TIMES_2}
574-
@assert(NJOINTS_TIMES_2 == 2*length(mbs.freeMotionObjects))
577+
function setAccelerationsFreeMotion!(mbs::MultibodyData{F,TimeType}, args::Vararg{SVector{3,F}}) where {F,TimeType}
578+
@assert(length(args) == 2*length(mbs.freeMotionObjects))
575579
scene = mbs.scene
576580
j = 1
577581
@inbounds for obj in mbs.freeMotionObjects
@@ -583,32 +587,41 @@ Copy accelerations of free motion joints into mbs
583587
return mbs
584588
end
585589

586-
587590
"""
588591
(tau1,tau2,<...>) = getGenForcesRevolute(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N}
589592
590593
Return generalized forces of revolute joints as NTuple.
591594
"""
592-
@inline getGenForcesRevolute(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N} = ntuple(i->mbs.revoluteGenForces[i], Val(N))
595+
#getGenForcesRevolute(mbs::MultibodyData{F,TimeType}) where {F,TimeType} = mbs.revoluteGenForces
596+
getGenForcesRevolute(mbs::MultibodyData{F,TimeType}, ::Val{N}) where {F,TimeType,N} = ntuple(i->mbs.revoluteGenForces[i], Val(N))
593597

594598

595599
"""
596600
(f1,f2,<...>) = getGenForcesPrismatic(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N}
597601
598602
Return generalized forces of prismatic joints as NTuple.
599603
"""
600-
@inline getGenForcesPrismatic(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N} = ntuple(i->mbs.prismaticGenForces[i], Val(N))
604+
#getGenForcesPrismatic(mbs::MultibodyData{F,TimeType}) where {F,TimeType} = mbs.prismaticGenForces
605+
getGenForcesPrismatic(mbs::MultibodyData{F,TimeType}, ::Val{N}) where {F,TimeType,N} = ntuple(i->mbs.prismaticGenForces[i], Val(N))
601606

602607

603608
"""
604-
(genf1,gent1,genf2,gent2,<...>) = getGenForcesFreeMotion(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N}
609+
residuals = getGenForcesFreeMotion(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N}
605610
606-
Return generalized forces of free motion joints as NTuple.
611+
Return generalized forces of free motion joints as Vector to be used for residuals vector.
607612
"""
608-
@inline getGenForcesFreeMotion(mbs::MultibodyData{F}, ::Val{N}) where {F <: Modia3D.VarFloatType,N} = ntuple(i->mbs.freeMotionGenForces[i], Val(N))
609-
610-
611-
613+
function getGenForcesFreeMotion(mbs::MultibodyData{F,TimeType})::Vector{F} where {F,TimeType}
614+
res = mbs.freeMotionResiduals
615+
j = 1
616+
@assert(length(res) == 3*length(mbs.freeMotionGenForces))
617+
@inbounds for vec in mbs.freeMotionGenForces
618+
res[j] = vec[1]
619+
res[j+1] = vec[2]
620+
res[j+2] = vec[3]
621+
j += 3
622+
end
623+
return res
624+
end
612625

613626

614627
# For backwards compatibility (do not use for new models)

src/Modia3D.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ module Modia3D
55

66
const path = dirname(dirname(@__FILE__)) # Absolute path of package directory
77
const Version = "0.9.0"
8-
const Date = "2022-02-21"
8+
const Date = "2022-02-23"
99

1010
println("\nImporting Modia3D Version $Version ($Date)")
1111

src/ModiaInterface/buildModia3D.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ function buildModia3D!(model::AbstractDict, FloatType::Type, TimeType::Type,
225225
end
226226
if length(jointAccelerationsFreeMotion2) > 0
227227
NFreeMotion2 = 2*NFreeMotion
228-
push!(mbs_equations, :( ($(jointForcesFreeMotion2...), ) = implicitDependency(Modia3D.getGenForcesFreeMotion($mbsi, Val($NFreeMotion2)), $(jointAccelerationsFreeMotion2...)) ))
228+
push!(mbs_equations, :( ($(jointForcesFreeMotion2...), ) = implicitDependency(Modia3D.getGenForcesFreeMotion($mbsi), $(jointAccelerationsFreeMotion2...)) ))
229229
mbs_variables[mbsi] = Var(hideResult=true)
230230
end
231231

0 commit comments

Comments
 (0)