Skip to content

Commit cd95187

Browse files
authored
Merge pull request #122 from ModiaSim/Release0.12.1
Release0.12.1
2 parents f083686 + c2b2df8 commit cd95187

File tree

18 files changed

+110
-1328
lines changed

18 files changed

+110
-1328
lines changed

Manifest.toml

Lines changed: 0 additions & 1259 deletions
This file was deleted.

Project.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
authors = ["Andrea Neumayr <andrea.neumayr@dlr.de>", "Martin Otter <Martin.Otter@dlr.de>", "Gerhard Hippmann <gerhard.hippmann@dlr.de>"]
22
name = "Modia3D"
33
uuid = "07f2c1e0-90b0-56cf-bda7-b44b56e34eed"
4-
version = "0.12.0"
4+
version = "0.12.1"
55

66
[compat]
77
Colors = "0.12, 0.11, 0.10"
@@ -12,7 +12,7 @@ HTTP = "0.9"
1212
JSON = "0.21"
1313
Measurements = "2"
1414
MeshIO = "0.4.10"
15-
Modia = "0.10.0"
15+
Modia = "0.12.0"
1616
MonteCarloMeasurements = "1"
1717
OrderedCollections = "1"
1818
Reexport = "1.0"

docs/src/index.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,16 @@ julia -JModia3D_sysimage.so (otherwise)
9292
| [8] |*[Modelling and Simulation of Physical Systems with Dynamically Changing Degrees of Freedom](https://doi.org/10.3390/electronics12030500)*| Electronics 2023, 12(3), 500 | [10.3390/electronics12030500](https://doi.org/10.3390/electronics12030500) |
9393

9494
## Release Notes
95+
96+
### Version 0.12.1
97+
98+
- Adapted to Modia 0.12.0 (arguments of buildFunction in ModiaInterface had been changed,
99+
as well as function names to define/access variables of built-in components)
100+
- Absolute position (`r_abs`) and orientation (`R_abs`) of visible shapes are stored in the result
101+
data structure and can be plotted (see Modia3D/test/Basid/Pendulum.jl, Modia3D/test/Segmented/TwoStageRocket3D.jl)
102+
- Manifest.toml file removed
103+
104+
95105
### Version 0.12.0
96106
- Support for variable-structure systems where variables (states) can appear and disappear during simulation
97107
- A simulation run is partitioned into phases that are called segments or modes (multi-mode modeling)

src/Composition/ForceElements/Bushing.jl

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ function torqueFromMoments(largeAngles::Bool, moments::SVector{3,F}, sico::SMatr
201201
end
202202

203203

204-
function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force::Bushing{F})::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
204+
function initializeForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::Bushing{F})::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
205205
force.obj1.hasForceElement = true
206206
force.obj2.hasForceElement = true
207207

@@ -220,7 +220,7 @@ function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force:
220220
return nothing
221221
end
222222

223-
function evaluateForceElement(model::Modia.SimulationModel{F,TimeType}, force::Bushing{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
223+
function evaluateForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::Bushing{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
224224
R12 = measFrameRotation(force.obj2; frameOrig=force.obj1)
225225
r12 = measFramePosition(force.obj2; frameOrig=force.obj1, frameCoord=force.obj1)
226226
w12 = measFrameRotVelocity(force.obj2; frameOrig=force.obj1, frameCoord=force.obj1)
@@ -245,17 +245,17 @@ function evaluateForceElement(model::Modia.SimulationModel{F,TimeType}, force::B
245245
applyFrameTorquePair!(force.obj2, force.obj1, t12; frameCoord=force.obj1)
246246

247247
if Modia.storeResults(model)
248-
Modia.add_w_segmented_value!(model, force.translationResultIndex, r12)
249-
Modia.add_w_segmented_value!(model, force.rotationResultIndex, ang)
250-
Modia.add_w_segmented_value!(model, force.velocityResultIndex, v12)
251-
Modia.add_w_segmented_value!(model, force.rotationVelocityResultIndex, angd)
252-
Modia.add_w_segmented_value!(model, force.springForceResultIndex, fc)
253-
Modia.add_w_segmented_value!(model, force.springTorqueResultIndex, mc)
254-
Modia.add_w_segmented_value!(model, force.damperForceResultIndex, fd)
255-
Modia.add_w_segmented_value!(model, force.damperTorqueResultIndex, md)
256-
Modia.add_w_segmented_value!(model, force.torqueResultIndex, mom)
257-
Modia.add_w_segmented_value!(model, force.forceVectorResultIndex, -f12)
258-
Modia.add_w_segmented_value!(model, force.torqueVectorResultIndex, -t12)
248+
Modia.copy_w_segmented_value_to_result(model, force.translationResultIndex, r12)
249+
Modia.copy_w_segmented_value_to_result(model, force.rotationResultIndex, ang)
250+
Modia.copy_w_segmented_value_to_result(model, force.velocityResultIndex, v12)
251+
Modia.copy_w_segmented_value_to_result(model, force.rotationVelocityResultIndex, angd)
252+
Modia.copy_w_segmented_value_to_result(model, force.springForceResultIndex, fc)
253+
Modia.copy_w_segmented_value_to_result(model, force.springTorqueResultIndex, mc)
254+
Modia.copy_w_segmented_value_to_result(model, force.damperForceResultIndex, fd)
255+
Modia.copy_w_segmented_value_to_result(model, force.damperTorqueResultIndex, md)
256+
Modia.copy_w_segmented_value_to_result(model, force.torqueResultIndex, mom)
257+
Modia.copy_w_segmented_value_to_result(model, force.forceVectorResultIndex, -f12)
258+
Modia.copy_w_segmented_value_to_result(model, force.torqueVectorResultIndex, -t12)
259259
end
260260

261261
return nothing

src/Composition/ForceElements/SpringDamperPtP.jl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ end
8383
SpringDamperPtP(; kwargs...) = SpringDamperPtP{Float64}(; kwargs...)
8484

8585

86-
function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force::SpringDamperPtP{F}) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
86+
function initializeForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::SpringDamperPtP{F}) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
8787
force.obj1.hasForceElement = true
8888
force.obj2.hasForceElement = true
8989

@@ -98,7 +98,7 @@ function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force:
9898
return nothing
9999
end
100100

101-
function evaluateForceElement(model::Modia.SimulationModel{F,TimeType}, force::SpringDamperPtP{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
101+
function evaluateForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::SpringDamperPtP{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
102102
(pos, norm) = measFrameDistance(force.obj2; frameOrig=force.obj1)
103103
vel = measFrameDistVelocity(force.obj2; frameOrig=force.obj1)
104104

@@ -111,13 +111,13 @@ function evaluateForceElement(model::Modia.SimulationModel{F,TimeType}, force::S
111111
applyFrameForcePair!(force.obj2, force.obj1, f12; frameCoord=force.obj1)
112112

113113
if Modia.storeResults(model)
114-
Modia.add_w_segmented_value!(model, force.distanceResultIndex, pos)
115-
Modia.add_w_segmented_value!(model, force.deflectionResultIndex, defl)
116-
Modia.add_w_segmented_value!(model, force.velocityResultIndex, vel)
117-
Modia.add_w_segmented_value!(model, force.springForceResultIndex, fc)
118-
Modia.add_w_segmented_value!(model, force.damperForceResultIndex, fd)
119-
Modia.add_w_segmented_value!(model, force.forceResultIndex, frc)
120-
Modia.add_w_segmented_value!(model, force.forceVectorResultIndex, -f12)
114+
Modia.copy_w_segmented_value_to_result(model, force.distanceResultIndex, pos)
115+
Modia.copy_w_segmented_value_to_result(model, force.deflectionResultIndex, defl)
116+
Modia.copy_w_segmented_value_to_result(model, force.velocityResultIndex, vel)
117+
Modia.copy_w_segmented_value_to_result(model, force.springForceResultIndex, fc)
118+
Modia.copy_w_segmented_value_to_result(model, force.damperForceResultIndex, fd)
119+
Modia.copy_w_segmented_value_to_result(model, force.forceResultIndex, frc)
120+
Modia.copy_w_segmented_value_to_result(model, force.forceVectorResultIndex, -f12)
121121
end
122122

123123
return nothing

src/Composition/ForceElements/WorldForce.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ end
4444
WorldForce(; kwargs...) = WorldForce{Float64}(; kwargs...)
4545

4646

47-
function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force::WorldForce{F})::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
47+
function initializeForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::WorldForce{F})::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
4848

4949
force.objectApply.hasForceElement = true
5050
if !isnothing(force.objectCoord)
@@ -56,14 +56,14 @@ function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force:
5656
return nothing
5757
end
5858

59-
function evaluateForceElement(model::Modia.SimulationModel{F,TimeType}, force::WorldForce{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
59+
function evaluateForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::WorldForce{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
6060

6161
forceVector = force.forceFunction(; time=time, objectApply=force.objectApply, objectCoord=force.objectCoord)
6262

6363
applyFrameForce!(force.objectApply, forceVector; frameCoord=force.objectCoord)
6464

6565
if Modia.storeResults(model)
66-
Modia.add_w_segmented_value!(model, force.forceVectorResultIndex, forceVector)
66+
Modia.copy_w_segmented_value_to_result(model, force.forceVectorResultIndex, forceVector)
6767
end
6868

6969
return nothing

src/Composition/ForceElements/WorldTorque.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ end
4444
WorldTorque(; kwargs...) = WorldTorque{Float64}(; kwargs...)
4545

4646

47-
function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force::WorldTorque{F})::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
47+
function initializeForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::WorldTorque{F})::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
4848

4949
force.objectApply.hasForceElement = true
5050
if !isnothing(force.objectCoord)
@@ -56,14 +56,14 @@ function initializeForceElement(model::Modia.SimulationModel{F,TimeType}, force:
5656
return nothing
5757
end
5858

59-
function evaluateForceElement(model::Modia.SimulationModel{F,TimeType}, force::WorldTorque{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
59+
function evaluateForceElement(model::Modia.InstantiatedModel{F,TimeType}, force::WorldTorque{F}, time::TimeType) where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
6060

6161
torqueVector = force.torqueFunction(; time=time, objectApply=force.objectApply, objectCoord=force.objectCoord)
6262

6363
applyFrameTorque!(force.objectApply, torqueVector; frameCoord=force.objectCoord)
6464

6565
if Modia.storeResults(model)
66-
Modia.add_w_segmented_value!(model, force.torqueVectorResultIndex, torqueVector)
66+
Modia.copy_w_segmented_value_to_result(model, force.torqueVectorResultIndex, torqueVector)
6767
end
6868

6969
return nothing

src/Composition/_module.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export isFree, isNotFree, changeJointFromFreeMotionToFix!, changeJointFromFixToF
6969

7070
export fullName, instanceName
7171

72-
# export updateSimulationModel!
72+
# export updateInstantiatedModel!
7373

7474
export rot123fromR, rot132fromR, Rfromrot123, Rfromrot132
7575

src/Composition/dynamicCollision.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# between objs with mpr algorithm, and use them as zero-crossing functions
55
# (see file ...\ContactDetectionMPR\handler.jl)
66
# after computing all distances between colliding shapes response calculations are done
7-
function computeContactForcesAndTorques(sim::Modia.SimulationModel, scene, world, time, file)
7+
function computeContactForcesAndTorques(sim::Modia.InstantiatedModel, scene, world, time, file)
88
if typeof(scene.options.contactDetection) <: Modia3D.ContactDetectionMPR_handler
99
ch::Modia3D.ContactDetectionMPR_handler = scene.options.contactDetection
1010
# Compute signed distances of all contact shapes during zero-crossing computation
@@ -39,7 +39,7 @@ end
3939
# (see file ...\Composition\responseCalculation\elasticCollisionResponse.jl)
4040
# further, at an event simulation status is updated, contact material is replaced
4141
# and the actual contactDict is stored
42-
function dealWithContacts!(sim::Modia.SimulationModel{F, T}, scene::Scene{F}, ch::Composition.ContactDetectionMPR_handler{M,F}, world::Composition.Object3D{F}, time::Float64, file::Nothing)::Nothing where {F <: Modia3D.VarFloatType, T, M}
42+
function dealWithContacts!(sim::Modia.InstantiatedModel{F, T}, scene::Scene{F}, ch::Composition.ContactDetectionMPR_handler{M,F}, world::Composition.Object3D{F}, time::Float64, file::Nothing)::Nothing where {F <: Modia3D.VarFloatType, T, M}
4343

4444
simh::Modia.EventHandler{F,T} = sim.eventHandler
4545
f1::SVector{3,F}=Modia3D.ZeroVector3D(F)

src/Composition/dynamics.jl

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ end
105105

106106

107107
"""
108-
initSegment_Model3D!(partiallyInstantiatedModel::Modia.SimulationModel,
108+
initSegment_Model3D!(partiallyInstantiatedModel::Modia.InstantiatedModel,
109109
modelPath::String, ID, parameters::AbstractDict; log=false)
110110
111111
Called once before initialization of a new simulation segment to instantiate/re-initialize a Model3D model
112112
"""
113-
function initSegment_Model3D!(partiallyInstantiatedModel::Modia.SimulationModel{F,TimeType},
113+
function initSegment_Model3D!(partiallyInstantiatedModel::Modia.InstantiatedModel{F,TimeType},
114114
modelPath::String, ID, parameters::AbstractDict; log=false)::Nothing where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
115115
TimerOutputs.@timeit partiallyInstantiatedModel.timer "Modia3D_0 initSegment_Model3D!" begin
116116
if log
@@ -174,10 +174,23 @@ function initSegment_Model3D!(partiallyInstantiatedModel::Modia.SimulationModel{
174174
zStartIndex = 0
175175
end
176176

177+
# objIndices[i,1]: Index of r_abs of Object3D i
178+
# [i,2]: Index of R_abs of Object3D i
179+
objIndices = Matrix{Int}(undef, length(scene.updateVisuElements), 2)
180+
for (i,obj) in enumerate(scene.updateVisuElements)
181+
if typeof(obj.feature) == Modia3D.Composition.EmptyObject3DFeature
182+
objIndices[i,1] = 0
183+
objIndices[i,2] = 0
184+
else
185+
objIndices[i,1] = Modia.new_w_segmented_variable!(partiallyInstantiatedModel, obj.path*".r_abs", Modia3D.ZeroVector3D(F), "m")
186+
objIndices[i,2] = Modia.new_w_segmented_variable!(partiallyInstantiatedModel, obj.path*".R_abs", Modia3D.NullRotation(F), "")
187+
end
188+
end
189+
177190
mbsBuild.mbs = MultibodyData{F,TimeType}(partiallyInstantiatedModel, modelPath, world, scene,
178-
revoluteObjects, prismaticObjects, freeMotionObjects, hiddenJointObjects,
179-
mbsBuild.revoluteIndices, mbsBuild.prismaticIndices, mbsBuild.freeMotionIndices,
180-
zStartIndex, nz)
191+
revoluteObjects, prismaticObjects, freeMotionObjects, hiddenJointObjects,
192+
mbsBuild.revoluteIndices, mbsBuild.prismaticIndices, mbsBuild.freeMotionIndices,
193+
objIndices, zStartIndex, nz)
181194
parameters[:qdd_hidden] = zeros(F, length(mbsBuild.mbs.hiddenGenForces))
182195

183196
if log
@@ -215,7 +228,7 @@ Open Model3D:
215228
- Copy der(r):=v and der(rot):= f(w) into hidden derivatives.
216229
- Return mbs.
217230
"""
218-
function openModel3D!(instantiatedModel::Modia.SimulationModel{F,TimeType}, modelPath::String, x::AbstractVector, time::TimeType)::MultibodyData{F,TimeType} where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
231+
function openModel3D!(instantiatedModel::Modia.InstantiatedModel{F,TimeType}, modelPath::String, x::AbstractVector, time::TimeType)::MultibodyData{F,TimeType} where {F <: Modia3D.VarFloatType, TimeType <: AbstractFloat}
219232
# println("bin in openModel3D ", instantiatedModel.eventHandler.restart)
220233
mbsBuild::MultibodyBuild{F,TimeType} = instantiatedModel.buildDict[modelPath]
221234

@@ -514,11 +527,17 @@ function computeGeneralizedForces!(mbs::MultibodyData{F,TimeType}, qdd_hidden::V
514527
TimerOutputs.@timeit instantiatedModel.timer "Modia3D_3" begin
515528
# objects can have interactionManner (need to rename updateVisuElements)
516529
if scene.options.useOptimizedStructure
517-
for obj in scene.updateVisuElements
530+
objIndices = mbs.objIndices
531+
for (i,obj) in enumerate(scene.updateVisuElements)
518532
parent = obj.parent
519533
obj.r_abs = obj.r_rel Modia3D.ZeroVector3D(F) ? parent.r_abs : parent.r_abs + parent.R_abs'*obj.r_rel
520534
obj.R_abs = obj.R_rel Modia3D.NullRotation(F) ? parent.R_abs : obj.R_rel*parent.R_abs
521535

536+
if objIndices[i,1] > 0
537+
Modia.copy_w_segmented_value_to_result(instantiatedModel, objIndices[i,1], obj.r_abs)
538+
Modia.copy_w_segmented_value_to_result(instantiatedModel, objIndices[i,2], obj.R_abs)
539+
end
540+
522541
# is executed only if an internal Object3D called
523542
if length( obj.visualizationFrame ) == 1
524543
obj.visualizationFrame[1].r_abs = obj.r_abs

0 commit comments

Comments
 (0)