Skip to content

Commit 2ceceea

Browse files
committed
Store r_abs, R_abs of visual shapes in result
1 parent 0d37b51 commit 2ceceea

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ HTTP = "0.9"
1212
JSON = "0.21"
1313
Measurements = "2"
1414
MeshIO = "0.4.10"
15-
Modia = "0.12.0, 0.11.0"
15+
Modia = "0.12.0"
1616
MonteCarloMeasurements = "1"
1717
OrderedCollections = "1"
1818
Reexport = "1.0"

src/Composition/dynamics.jl

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,23 @@ function initSegment_Model3D!(partiallyInstantiatedModel::Modia.InstantiatedMode
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
@@ -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

src/Composition/joints/joints.jl

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ mutable struct MultibodyData{F <: Modia3D.VarFloatType, TimeType}
3131
freeMotionCache_h::Vector{SVector{3,F}} # = h_f(q,qd,gravity,contact-forces)
3232
hiddenCache_h::Vector{F} # = h_hidden(q,qd,gravity,contact-forces)
3333

34+
objIndices::Matrix{Int} # objIndices[i,1]: Index of local w_segmented variable r_abs of Object3D i
35+
# [i,2]: Index of local w_segmented variable R_abs of Object3D i
3436
zStartIndex::Int # eventHandler.z[zStartIndex] is first index of crossing function
3537
# (or zero, if enableContactDetection=false)
3638
nz::Int # Number of used zero crossing functions
@@ -43,7 +45,7 @@ mutable struct MultibodyData{F <: Modia3D.VarFloatType, TimeType}
4345

4446
function MultibodyData{F,TimeType}(partiallyInstantiatedModel::Modia.InstantiatedModel{F,TimeType}, modelPath::String, world, scene,
4547
revoluteObjects, prismaticObjects, freeMotionObjects, hiddenJointObjects,
46-
revoluteIndices, prismaticIndices, freeMotionIndices,
48+
revoluteIndices, prismaticIndices, freeMotionIndices, objIndices,
4749
zStartIndex, nz) where {F,TimeType}
4850
# Make joints available
4951
revoluteJoints = Vector{Revolute{F}}( undef, length(revoluteObjects))
@@ -116,7 +118,7 @@ mutable struct MultibodyData{F <: Modia3D.VarFloatType, TimeType}
116118
zeros(F, length(revoluteObjects)), zeros(F, length(prismaticObjects)),
117119
zeros(F, length(revoluteObjects)+length(prismaticObjects)), zeros(SVector{3,F}, 2*length(freeMotionObjects)), zeros(F, nhidden_qdd),
118120
zeros(F, length(revoluteObjects)+length(prismaticObjects)), zeros(SVector{3,F}, 2*length(freeMotionObjects)), zeros(F, nhidden_qdd),
119-
zStartIndex, nz, partiallyInstantiatedModel.time,
121+
objIndices, zStartIndex, nz, partiallyInstantiatedModel.time,
120122
zeros(F, 2*3*length(freeMotionObjects)),
121123
Modia.LinearEquations{F}[])
122124
end

test/Basic/Pendulum.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ Pendulum = Model3D(
1212
pendulum = @instantiateModel(Pendulum, unitless=true, log=false, logDetails=false, logCode=true, logStateSelection=false, logCalculations=false)
1313
requiredFinalStates = [5.970529829666215, -1.1395482781332746]
1414
simulate!(pendulum, stopTime=3.0, log=true, requiredFinalStates = requiredFinalStates)
15+
showInfo(pendulum)
1516

1617
@usingModiaPlot
17-
plot(pendulum, "rev.phi")
18-
18+
plot(pendulum, ["rev.phi", "body.r_abs", "body.R_abs"])
1919

2020
end

test/Segmented/TwoStageRocket3D.jl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,13 @@ rocket = @instantiateModel(TwoStageRocket, unitless=true)
6969
stopTime = 15.0
7070
tolerance = 1.0e-6
7171
requiredFinalStates = [0.0, 1232.2203937213537, 0.0, 0.0, 77.85108394267779, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
72-
simulate!(rocket, stopTime=stopTime, tolerance=tolerance, log=true, logEvents=false, logStates=false, requiredFinalStates=requiredFinalStates)
73-
72+
simulate!(rocket, stopTime=stopTime, tolerance=tolerance, log=true, logEvents=true, logStates=false, requiredFinalStates=requiredFinalStates)
73+
showInfo(rocket)
7474

7575
@usingModiaPlot
7676
plot(rocket, [("stage2.body.translation[2]", "stage1.body.translation[2]" ),
7777
("stage2.body.velocity[2]", "stage1.body.velocity[2]"),
7878
("stage1.thrust.forceVector[2]", "stage2.thrust.forceVector[2]")])
7979

80+
plot(rocket, ["stage1.body.r_abs[2]", "stage2.body.r_abs[2]"], figure=2)
8081
end

0 commit comments

Comments
 (0)