Skip to content

Commit dd225c9

Browse files
committed
Adapt to Modia (branch mo_states_in_model_functions)
1 parent 7eeef35 commit dd225c9

File tree

8 files changed

+278
-250
lines changed

8 files changed

+278
-250
lines changed

Manifest.toml

Lines changed: 223 additions & 194 deletions
Large diffs are not rendered by default.

src/Composition/dynamics.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ function instantiateModel3D!(partiallyInstantiatedModel::Modia.SimulationModel{F
128128
scene.forceElements = forceElements
129129
if scene.options.enableContactDetection && scene.collide
130130
nz = 2
131-
zStartIndex = Modia.newZeroCrossings(partiallyInstantiatedModel, nz)
131+
zStartIndex = Modia.new_z_segmented_variable!(partiallyInstantiatedModel, nz)
132132
scene.zStartIndex = zStartIndex
133133
else
134134
nz = 0

src/Composition/joints/joints.jl

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -90,15 +90,15 @@ mutable struct MultibodyData{F <: Modia3D.VarFloatType, TimeType}
9090
# Define hidden model states and copy initial values into eqInfo
9191
path = obj.path * "."
9292
w_init = freeMotion.wResolvedInParent ? Modia3D.resolve1(freeMotion.rot, freeMotion.w, rotation123=freeMotion.isrot123) : freeMotion.w
93-
freeMotion.ix_hidden_r = Modia.newHiddenState!(partiallyInstantiatedModel, path*"translation" , path*"der(translation)" , freeMotion.r)
94-
freeMotion.ix_hidden_v = Modia.newHiddenState!(partiallyInstantiatedModel, path*"velocity" , path*"der(velocity)" , freeMotion.v)
95-
freeMotion.ix_hidden_rot = Modia.newHiddenState!(partiallyInstantiatedModel, path*"rotation" , path*"der(rotation)" , freeMotion.rot)
96-
freeMotion.ix_hidden_w = Modia.newHiddenState!(partiallyInstantiatedModel, path*"angularVelocity", path*"der(angularVelocity)", w_init)
97-
freeMotion.iextra_isrot123 = Modia.newExtraResult!(partiallyInstantiatedModel, path*"rotation123", freeMotion.isrot123)
98-
freeMotion.ix_rot = Modia.getStateStartIndexFromHiddenStateStartIndex(partiallyInstantiatedModel,freeMotion.ix_hidden_rot)
93+
freeMotion.ix_segmented_r = Modia.new_x_segmented_variable!(partiallyInstantiatedModel, path*"translation" , path*"der(translation)" , freeMotion.r)
94+
freeMotion.ix_segmented_v = Modia.new_x_segmented_variable!(partiallyInstantiatedModel, path*"velocity" , path*"der(velocity)" , freeMotion.v)
95+
freeMotion.ix_segmented_rot = Modia.new_x_segmented_variable!(partiallyInstantiatedModel, path*"rotation" , path*"der(rotation)" , freeMotion.rot)
96+
freeMotion.ix_segmented_w = Modia.new_x_segmented_variable!(partiallyInstantiatedModel, path*"angularVelocity", path*"der(angularVelocity)", w_init)
97+
freeMotion.iextra_isrot123 = Modia.new_w_segmented_variable!(partiallyInstantiatedModel, path*"rotation123", freeMotion.isrot123)
98+
freeMotion.ix_rot = Modia.get_x_startIndex_from_x_segmented_startIndex(partiallyInstantiatedModel,freeMotion.ix_segmented_rot)
9999

100100
# Define event indicator to monitor changing sequence of rotation angles
101-
freeMotion.iz_rot2 = Modia.newZeroCrossings(partiallyInstantiatedModel, 1)
101+
freeMotion.iz_rot2 = Modia.new_z_segmented_variable!(partiallyInstantiatedModel, 1)
102102
end
103103

104104
for obj in scene.treeForComputation
@@ -631,15 +631,15 @@ singularitySafetyMargin(ang) = abs(rem2pi(ang, RoundNearest)) - 1.5 # is negati
631631

632632

633633
"""
634-
change_rotSequence!(instantiatedModel, freeMotion::FreeMotion, x::AbstractVector, x_hidden::AbstractVector)
634+
change_rotSequence!(instantiatedModel, freeMotion::FreeMotion, x::AbstractVector, x_segmented::AbstractVector)
635635
636636
Change rotation sequence of `freeMotion.rot` from `x-axis, y-axis, z-axis` to `x-axis, z-axis, y-axis` or visa versa:
637637
638-
- If `freeMotion.isrot123 = true` , set `freeMotion.isrot123 = false` and `x[..] = x_hidden[..] = rot132fromR(Rfromrot123(freeMotion.rot))`
638+
- If `freeMotion.isrot123 = true` , set `freeMotion.isrot123 = false` and `x[..] = x_segmented[..] = rot132fromR(Rfromrot123(freeMotion.rot))`
639639
640-
- If `freeMotion.isrot123 = false`, set `freeMotion.isrot123 = true` and `x[..] = x_hidden[..] = rot123fromR(Rfromrot132(freeMotion.rot))`
640+
- If `freeMotion.isrot123 = false`, set `freeMotion.isrot123 = true` and `x[..] = x_segmented[..] = rot123fromR(Rfromrot132(freeMotion.rot))`
641641
"""
642-
function change_rotSequence!(m::Modia.SimulationModel, freeMotion::FreeMotion, x::AbstractVector, x_hidden::AbstractVector)::Nothing
642+
function change_rotSequence!(m::Modia.SimulationModel, freeMotion::FreeMotion, x::AbstractVector, x_segmented::AbstractVector)::Nothing
643643
if freeMotion.isrot123
644644
freeMotion.rot = rot132fromR(Rfromrot123(freeMotion.rot))
645645
freeMotion.isrot123 = false
@@ -650,10 +650,10 @@ function change_rotSequence!(m::Modia.SimulationModel, freeMotion::FreeMotion, x
650650
Modia.addExtraResult!(m, freeMotion.iextra_isrot123, freeMotion.isrot123)
651651

652652
# Change x-vector
653-
startIndex = freeMotion.ix_hidden_rot
654-
x_hidden[startIndex ] = freeMotion.rot[1]
655-
x_hidden[startIndex+1] = freeMotion.rot[2]
656-
x_hidden[startIndex+2] = freeMotion.rot[3]
653+
startIndex = freeMotion.ix_segmented_rot
654+
x_segmented[startIndex ] = freeMotion.rot[1]
655+
x_segmented[startIndex+1] = freeMotion.rot[2]
656+
x_segmented[startIndex+2] = freeMotion.rot[3]
657657

658658
startIndex = freeMotion.ix_rot
659659
x[startIndex] = freeMotion.rot[1]
@@ -679,42 +679,42 @@ end
679679
"""
680680
setStatesHiddenJoints!(instantiatedModel::Modia.SimulationModel, mbs::MultibodyData, x)
681681
682-
Copy states from the hidden state vector instantiatedModel.x_hidden to the hidden joints into the corresponding Object3Ds
683-
and copy some state derivatives into instantiatedModel.der_x_hidden.
682+
Copy states from the hidden state vector instantiatedModel.x_segmented to the hidden joints into the corresponding Object3Ds
683+
and copy some state derivatives into instantiatedModel.der_x_segmented.
684684
"""
685685
function setStatesHiddenJoints!(m::Modia.SimulationModel{F,TimeType}, mbs::MultibodyData{F,TimeType}, _x)::Nothing where {F,TimeType}
686-
x_hidden = m.x_hidden
687-
der_x_hidden = m.der_x_hidden
686+
x_segmented = m.x_segmented
687+
der_x_segmented = m.der_x_segmented
688688
j1::Int = 0
689689
j2::Int = 0
690690
j3::Int = 0
691691
j4::Int = 0
692692
for obj in mbs.hiddenJointObjects
693-
# Copy x_hidden states into freeMotion states
693+
# Copy x_segmented states into freeMotion states
694694
freeMotion = mbs.freeMotion[obj.jointIndex]
695-
j1 = freeMotion.ix_hidden_r ; freeMotion.r = SVector{3,F}(x_hidden[j1], x_hidden[j1+1], x_hidden[j1+2])
696-
j2 = freeMotion.ix_hidden_rot; freeMotion.rot = SVector{3,F}(x_hidden[j2], x_hidden[j2+1], x_hidden[j2+2])
697-
j3 = freeMotion.ix_hidden_v ; freeMotion.v = SVector{3,F}(x_hidden[j3], x_hidden[j3+1], x_hidden[j3+2])
698-
j4 = freeMotion.ix_hidden_w ; freeMotion.w = SVector{3,F}(x_hidden[j4], x_hidden[j4+1], x_hidden[j4+2])
695+
j1 = freeMotion.ix_segmented_r ; freeMotion.r = SVector{3,F}(x_segmented[j1], x_segmented[j1+1], x_segmented[j1+2])
696+
j2 = freeMotion.ix_segmented_rot; freeMotion.rot = SVector{3,F}(x_segmented[j2], x_segmented[j2+1], x_segmented[j2+2])
697+
j3 = freeMotion.ix_segmented_v ; freeMotion.v = SVector{3,F}(x_segmented[j3], x_segmented[j3+1], x_segmented[j3+2])
698+
j4 = freeMotion.ix_segmented_w ; freeMotion.w = SVector{3,F}(x_segmented[j4], x_segmented[j4+1], x_segmented[j4+2])
699699
if freeMotion.wResolvedInParent
700700
freeMotion.w = Modia3D.resolve2(freeMotion.rot, freeMotion.w, rotation123 = freeMotion.isrot123)
701701
end
702702

703703
# der(r) = v
704-
der_x_hidden[j1] = freeMotion.v[1]
705-
der_x_hidden[j1+1] = freeMotion.v[2]
706-
der_x_hidden[j1+2] = freeMotion.v[3]
704+
der_x_segmented[j1] = freeMotion.v[1]
705+
der_x_segmented[j1+1] = freeMotion.v[2]
706+
der_x_segmented[j1+2] = freeMotion.v[3]
707707

708708
if Modia.positive(m, freeMotion.iz_rot2, singularitySafetyMargin(freeMotion.rot[2]), freeMotion.str_rot2, nothing)
709709
# freeMotion.rot[2] mapped to range -pi .. pi is either >= 1.5 or <= -1.5 (so comes close to singular position pi/2 = 1.57...)
710-
change_rotSequence!(m, freeMotion, _x, x_hidden)
710+
change_rotSequence!(m, freeMotion, _x, x_segmented)
711711
end
712712

713713
# der(rot) = J123or132(rot,isrot123) * w
714714
der_rot = J123or132(freeMotion.rot, freeMotion.isrot123)*freeMotion.w
715-
der_x_hidden[j2] = der_rot[1]
716-
der_x_hidden[j2+1] = der_rot[2]
717-
der_x_hidden[j2+2] = der_rot[3]
715+
der_x_segmented[j2] = der_rot[1]
716+
der_x_segmented[j2+1] = der_rot[2]
717+
der_x_segmented[j2+2] = der_rot[3]
718718
end
719719
return nothing
720720
end
@@ -785,24 +785,24 @@ end
785785
"""
786786
setHiddenStatesDerivatives!(instantiatedModel, mbs)
787787
788-
Copy derivatives of hidden states to instantiatedModel.der_x_hidden
788+
Copy derivatives of hidden states to instantiatedModel.der_x_segmented
789789
"""
790790
function setHiddenStatesDerivatives!(m::Modia.SimulationModel{F,TimeType}, mbs::MultibodyData{F,TimeType})::Nothing where {F,TimeType}
791791
for obj in mbs.hiddenJointObjects
792792
freeMotion = mbs.freeMotion[obj.jointIndex]
793793

794-
j1 = freeMotion.ix_hidden_v
795-
m.der_x_hidden[j1 ] = freeMotion.a[1]
796-
m.der_x_hidden[j1+1] = freeMotion.a[2]
797-
m.der_x_hidden[j1+2] = freeMotion.a[3]
794+
j1 = freeMotion.ix_segmented_v
795+
m.der_x_segmented[j1 ] = freeMotion.a[1]
796+
m.der_x_segmented[j1+1] = freeMotion.a[2]
797+
m.der_x_segmented[j1+2] = freeMotion.a[3]
798798

799-
j2 = freeMotion.ix_hidden_w
799+
j2 = freeMotion.ix_segmented_w
800800
z = freeMotion.wResolvedInParent ? Modia3D.resolve1(obj.R_rel, freeMotion.z) : freeMotion.z
801-
m.der_x_hidden[j2 ] = z[1]
802-
m.der_x_hidden[j2+1] = z[2]
803-
m.der_x_hidden[j2+2] = z[3]
801+
m.der_x_segmented[j2 ] = z[1]
802+
m.der_x_segmented[j2+1] = z[2]
803+
m.der_x_segmented[j2+2] = z[3]
804804

805-
#println(" j1=$j1, j2=$j2, freeMotion.a[2] = ", freeMotion.a[2], ", m.der_x_hidden = ", m.der_x_hidden)
805+
#println(" j1=$j1, j2=$j2, freeMotion.a[2] = ", freeMotion.a[2], ", m.der_x_segmented = ", m.der_x_segmented)
806806
end
807807
return nothing
808808
end

src/Composition/joints/object3DMotion.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,10 @@ mutable struct FreeMotion{F <: Modia3D.VarFloatType} <: Modia3D.AbstractJoint
5353
path::String
5454

5555
# Hidden states are stored in the following way:
56-
# x_hidden[ix_r:...] = [r, rot, v, w]
56+
# x_segmented[ix_r:...] = [r, rot, v, w]
5757
#
5858
# Derivatives of hidden states are stored in the following way
59-
# der_x_hidden[ix_r:...] = [der(r), der(rot), der(v), der(w)]
59+
# der_x_segmented[ix_r:...] = [der(r), der(rot), der(v), der(w)]
6060
#
6161
# with
6262
# der(r) = v
@@ -65,10 +65,10 @@ mutable struct FreeMotion{F <: Modia3D.VarFloatType} <: Modia3D.AbstractJoint
6565
# der(w) = ...
6666

6767
hiddenStates::Bool # = true, if state is not visible in generated code
68-
ix_hidden_r::Int # instantiatedModel.x_hidden[ix_r_hidden :ix_hidden_r+2] are the elements of x_hidden that are stored in r if hiddenStates
69-
ix_hidden_rot::Int # instantiatedModel.x_hidden[ix_rot_hidden:ix_hidden_rot+2] are the elements of x_hidden that are stored in rot if hiddenStates
70-
ix_hidden_v::Int # instantiatedModel.x_hidden[ix_v_hidden :ix_hidden_v+2] are the elements of x_hidden that are stored in v if hiddenStates
71-
ix_hidden_w::Int # instantiatedModel.x_hidden[ix_w_hidden :ix_hidden_w+2] are the elements of x_hidden that are stored in w if hiddenStates
68+
ix_segmented_r::Int # instantiatedModel.x_segmented[ix_r_hidden :ix_segmented_r+2] are the elements of x_segmented that are stored in r if hiddenStates
69+
ix_segmented_rot::Int # instantiatedModel.x_segmented[ix_rot_hidden:ix_segmented_rot+2] are the elements of x_segmented that are stored in rot if hiddenStates
70+
ix_segmented_v::Int # instantiatedModel.x_segmented[ix_v_hidden :ix_segmented_v+2] are the elements of x_segmented that are stored in v if hiddenStates
71+
ix_segmented_w::Int # instantiatedModel.x_segmented[ix_w_hidden :ix_segmented_w+2] are the elements of x_segmented that are stored in w if hiddenStates
7272
iextra_isrot123::Int # Startindex of extra result isrot123
7373
iz_rot2::Int # instantiatedModel.eventHandler.z[iz_rot2] is the element of z in which singularRem(rot[2]) is stored if hiddenStates,
7474
# to monitor when to switch to a different rotation sequence of rot

src/Frames/quaternion.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@ end
4242

4343

4444
"""
45-
R = Modia3D.from_q(q::SVector{4,F})
45+
R = Modia3D.from_q(q)
4646
47-
Return SMatrix{4,4,F,16} `R` from quaternion `q`.
47+
Return rotation matrix `R::SMatrix{3,3,F,9}` from quaternions `q::SVector{4,F}`.
4848
"""
4949
from_q(q::SVector{4,F}) where F <: Modia3D.VarFloatType = SMatrix{3,3,F,9}( F(2.0) * (q[1] * q[1] + q[4] * q[4]) - F(1.0),
5050
F(2.0) * (q[2] * q[1] - q[3] * q[4]),
@@ -58,10 +58,9 @@ from_q(q::SVector{4,F}) where F <: Modia3D.VarFloatType = SMatrix{3,3,F,9}( F(2.
5858

5959

6060
"""
61-
q = Modia3D.from_R(R::SMatrix{3,3,F,9};
62-
q_guess = NullQuaternion(F))
61+
q = Modia3D.from_R(R; q_guess = NullQuaternion(F))
6362
64-
Return quaternion `SVector{4,F} q` from rotation matrix `SMatrix{3,3,F,9} R`.
63+
Return quaternion `q::SVector{4,F}` from rotation matrix `R::SMatrix{3,3,F,9}`.
6564
6665
From the two possible solutions `q` the one is returned that is closer
6766
to `q_guess` (note, `q` and `-q` define the same rotation).

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.11.0-dev"
8-
const Date = "2022-05-29"
8+
const Date = "2022-07-02"
99

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

test/Basic/BouncingSphere3D.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ bouncingSphere = @instantiateModel(BouncingSphere, unitless=true, logCode=true)
2121

2222
requiredFinalStates = [-1.1158498420134682e-7, 0.09999999283736953, 1.9605796328352922e-10, -1.3226335283305713e-12, 3.726293803759173e-13, 6.442335795625085e-16, -4.97188563948566e-9, 6.3453729183502065e-15, -2.8482188606342696e-6, 6.351235882032115e-15, -4.677163261435682e-20, 1.3039308706792498e-11]
2323
simulate!(bouncingSphere, stopTime=2.2, dtmax=0.1, log=true, logStates=true, requiredFinalStates=requiredFinalStates)
24-
printResultInfo(bouncingSphere)
24+
showInfo(bouncingSphere)
2525

2626
@usingModiaPlot
2727
plot(bouncingSphere, ["sphere.translation", "sphere.velocity", "sphere.rotation123"], figure=1)

test/Basic/FreeShaftAdaptiveRotSequence.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ dtmax = 0.1
2929
requiredFinalStates = [0.0, 0.7, -7.350074420637136, 0.0, 0.1, -2.1, 0.6981317007977381, 1.4336293856408397, 1.5707963267949017, -2.0, 0.0, 0.0]
3030
Modia3D.angularVelocityResolvedInParentStates!(requiredFinalStates, 7, false)
3131
simulate!(shaft, stopTime=stopTime, dtmax=dtmax, log=true, logEvents=true, logStates=false, requiredFinalStates=requiredFinalStates)
32-
#printResultInfo(shaft)
32+
showInfo(shaft)
3333

3434
@usingModiaPlot
3535
plot(shaft, ["shaft.rotation", "shaft.rotation123", "shaft.angularVelocity", "shaft.translation", "shaft.velocity"], figure=2)

0 commit comments

Comments
 (0)