Skip to content

Commit 71af8d3

Browse files
committed
avoid allocations in elasticResponseCalculation (avoid multiple dispatch)
1 parent 2b062a5 commit 71af8d3

File tree

5 files changed

+44
-13
lines changed

5 files changed

+44
-13
lines changed

src/Composition/dynamicCollision.jl

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,53 @@ end
3333
# (see file ...\Composition\responseCalculation\elasticCollisionResponse.jl)
3434
# further, at an event simulation status is updated, contact material is replaced
3535
# and the actual contactDict is stored
36-
function dealWithContacts!(sim, scene::Scene{F}, ch, world, time, file) where F <: Modia3D.VarFloatType
37-
simh = sim.eventHandler
36+
function dealWithContacts!(sim::Modia.SimulationModel, scene::Scene{F}, ch::Composition.ContactDetectionMPR_handler, world::Composition.Object3D{F}, time::Float64, file::Nothing)::Nothing where F <: Modia3D.VarFloatType
37+
38+
simh::Modia.EventHandler = sim.eventHandler
3839
f1::SVector{3,F}=Modia3D.ZeroVector3D(F)
3940
f2::SVector{3,F}=Modia3D.ZeroVector3D(F)
4041
t1::SVector{3,F}=Modia3D.ZeroVector3D(F)
4142
t2::SVector{3,F}=Modia3D.ZeroVector3D(F)
4243

4344
for (pairID, pair) in ch.contactDict
44-
obj1 = pair.obj1
45-
obj2 = pair.obj2
46-
rContact = (pair.contactPoint1 + pair.contactPoint2)/F(2.0)
47-
contactNormal = pair.contactNormal
45+
obj1::Composition.Object3D{F} = pair.obj1
46+
obj2::Composition.Object3D{F} = pair.obj2
47+
rContact::SVector{3,F} = (pair.contactPoint1 + pair.contactPoint2)/F(2.0)
48+
contactNormal::SVector{3,F} = pair.contactNormal
4849
if Modia.isEvent(sim)
4950
# println("$(sim.time): ", obj1.path, " ", obj2.path)
5051
getMaterialContactStart(scene, ch, simh, pair, pairID, obj1, obj2, rContact, contactNormal)
5152
visualizeContactAndSupportPoints(ch, world)
5253
end
5354
if scene.options.enableContactDetection
54-
(f1,f2,t1,t2) = responseCalculation(pair.contactPairMaterial, obj1, obj2,
55+
if pair.pairKind == Modia3D.NoContactPairKind
56+
noContactPairMaterial::Shapes.NoContactPairMaterial = pair.contactPairMaterial
57+
(f1,f2,t1,t2) = responseCalculation(noContactPairMaterial, obj1, obj2,
5558
rContact, contactNormal,
5659
pair.distanceWithHysteresis, time, file, sim)
60+
elseif pair.pairKind == Modia3D.ElasticContactPairKind
61+
elasticContactPairMaterial::Composition.ElasticContactPairResponseMaterial = pair.contactPairMaterial
62+
(f1,f2,t1,t2) = responseCalculation(elasticContactPairMaterial, obj1, obj2,
63+
rContact, contactNormal,
64+
pair.distanceWithHysteresis, time, file, sim)
65+
elseif pair.pairKind == Modia3D.ObserverContactPairKind
66+
observerContactPairMaterial::Shapes.ObserverContactPairMaterial = pair.contactPairMaterial
67+
(f1,f2,t1,t2) = responseCalculation(observerContactPairMaterial, obj1, obj2,
68+
rContact, contactNormal,
69+
pair.distanceWithHysteresis, time, file, sim)
70+
elseif pair.pairKind == Modia3D.ImpulseContactPairKind
71+
impulseContactPairMaterial::Shapes.ImpulseContactPairMaterial = pair.contactPairMaterial
72+
(f1,f2,t1,t2) = responseCalculation(impulseContactPairMaterial, obj1, obj2,
73+
rContact, contactNormal,
74+
pair.distanceWithHysteresis, time, file, sim)
75+
elseif pair.pairKind == Modia3D.WheelRailContactPairKind
76+
wheelRailContactPairMaterial::Shapes.WheelRailContactPairMaterial = pair.contactPairMaterial
77+
(f1,f2,t1,t2) = responseCalculation(wheelRailContactPairMaterial, obj1, obj2,
78+
rContact, contactNormal,
79+
pair.distanceWithHysteresis, time, file, sim)
80+
else
81+
error("not supported contact pair material")
82+
end
5783

5884
# Transform forces/torques in local part frames
5985
obj1.f += obj1.R_abs*f1
@@ -70,7 +96,6 @@ function dealWithContacts!(sim, scene::Scene{F}, ch, world, time, file) where F
7096
end
7197

7298

73-
7499
# mainly its for assigning contact materials.
75100
# therefore, lastContactDict stores information of shape pairs in contact at last step
76101
# if the actual shape pair was in contact at the last step as well, the already assigned contact material is taken
@@ -79,12 +104,13 @@ function getMaterialContactStart(scene, ch, simh, pair, pairID, obj1, obj2, rCon
79104
if haskey(ch.lastContactDict, pairID)
80105
# use material (reference) from previous event
81106
if scene.options.enableContactDetection
82-
pair.contactPairMaterial = ch.lastContactDict[pairID].contactPairMaterial # improve later (should avoid to inquire pairID twice)
107+
pair.contactPairMaterial = ch.lastContactDict[pairID].contactPairMaterial # improve later (should avoid to inquire pairID twice)
108+
pair.pairKind = ch.lastContactDict[pairID].pairKind
83109
end
84110
else
85111
# determine contact pair material
86112
if scene.options.enableContactDetection
87-
pair.contactPairMaterial = contactStart(obj1, obj2, rContact, contactNormal,
113+
(pair.contactPairMaterial, pair.pairKind) = contactStart(obj1, obj2, rContact, contactNormal,
88114
scene.options.elasticContactReductionFactor,
89115
scene.options.maximumContactDamping)
90116
end

src/Composition/responseCalculation/elasticCollisionResponse.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function contactStart(matPair::Shapes.ElasticContactPairMaterial,
105105
matPair.rotationalResistanceCoefficient, mu_r_geo,
106106
matPair.vsmall, matPair.wsmall)
107107
end
108-
return responseMaterial
108+
return (responseMaterial, Shapes.ElasticContactPairKind)
109109
end
110110

111111

src/Composition/responseCalculation/othersCollisionResponse.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
contactStart(matPair::Shapes.NoContactPairMaterial, obj1::Object3D{F}, obj2::Object3D{F}, rContact::SVector{3,F}, contactNormal::SVector{3,F}, elasticContactReductionFactor::F, maximumContactDamping::F) where F <: Modia3D.VarFloatType =
2-
matPair
2+
(matPair, Shapes.NoContactPairKind)
33

4-
contactStart(matPair::Shapes.ObserverContactPairMaterial, obj1::Object3D{F}, obj2::Object3D{F}, rContact::SVector{3,F}, contactNormal::SVector{3,F}, elasticContactReductionFactor::F, maximumContactDamping::F) where F <: Modia3D.VarFloatType = matPair
4+
contactStart(matPair::Shapes.ObserverContactPairMaterial, obj1::Object3D{F}, obj2::Object3D{F}, rContact::SVector{3,F}, contactNormal::SVector{3,F}, elasticContactReductionFactor::F, maximumContactDamping::F) where F <: Modia3D.VarFloatType = (matPair, Shapes.ObserverContactPairKind)
55

66

77
contactStart(matPair::Shapes.ImpulseContactPairMaterial, obj1::Object3D{F}, obj2::Object3D{F}, rContact::SVector{3,F}, contactNormal::SVector{3,F}, elasticContactReductionFactor::F, maximumContactDamping::F) where F <: Modia3D.VarFloatType =

src/Shapes/_module.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ export ShapeKind, UndefinedShapeKind, SphereKind, EllipsoidKind, BoxKind, Cylind
6666

6767
@enum ShapeKind UndefinedShapeKind SphereKind EllipsoidKind BoxKind CylinderKind ConeKind CapsuleKind BeamKind FileMeshKind CoordinateSystemKind GridKind SpringKind GearWheelKind ModelicaKind TextKind
6868

69+
export PairMaterialKind, ElasticContactPairKind, NoContactPairKind, ObserverContactPairKind, ImpulseContactPairKind, WheelRailContactPairKind
70+
71+
@enum PairMaterialKind ElasticContactPairKind NoContactPairKind ObserverContactPairKind ImpulseContactPairKind WheelRailContactPairKind
72+
6973
include("color.jl")
7074
include("visualMaterial.jl")
7175
include("text.jl")

src/contactDetection/ContactDetectionMPR/ContactDetectionMPR_handler.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ mutable struct ContactPair{F <: Modia3D.VarFloatType}
3636
support2B::SVector{3,F}
3737
support3B::SVector{3,F}
3838

39+
pairKind::Shapes.PairMaterialKind
3940
contactPairMaterial::Union{Modia3D.AbstractContactPairMaterial,Nothing} # only if contact = true, otherwise not defined
4041

4142
ContactPair{F}(contactPoint1::SVector{3,F}, contactPoint2::SVector{3,F},

0 commit comments

Comments
 (0)