Skip to content

Commit

Permalink
Extend from PartialForce instead of PartialTwoFrames
Browse files Browse the repository at this point in the history
  • Loading branch information
tobolar authored and beutlich committed Nov 18, 2023
1 parent 402662a commit c163513
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 47 deletions.
47 changes: 23 additions & 24 deletions Modelica/Mechanics/MultiBody/Forces/Internal/BasicForce.mo
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
within Modelica.Mechanics.MultiBody.Forces.Internal;
model BasicForce
"Force acting between two frames, defined by 3 input signals"
extends Modelica.Mechanics.MultiBody.Interfaces.PartialTwoFrames;
extends Interfaces.PartialForce;
import Modelica.Mechanics.MultiBody.Types.ResolveInFrameAB;

Interfaces.Frame_resolve frame_resolve
"The input signals are optionally resolved in this frame"
annotation (Placement(transformation(
Expand All @@ -22,36 +23,34 @@ model BasicForce

SI.Position r_0[3]
"Position vector from origin of frame_a to origin of frame_b resolved in world frame";
SI.Force f_b_0[3] "frame_b.f resolved in world frame";
SI.Force f_b_0[3] "Force frame_b.f resolved in world frame";

equation
assert(cardinality(frame_resolve) > 0, "Connector frame_resolve must be connected at least once and frame_resolve.r_0/.R must be set");
frame_resolve.f = zeros(3);
frame_resolve.t = zeros(3);

if resolveInFrame == ResolveInFrameAB.frame_a then
f_b_0 = -Frames.resolve1(frame_a.R, force);
frame_b.f = Frames.resolve2(frame_b.R, f_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_b then
f_b_0 = -Frames.resolve1(frame_b.R, force);
frame_b.f = -force;
elseif resolveInFrame == ResolveInFrameAB.world then
f_b_0 = -force;
frame_b.f = Frames.resolve2(frame_b.R, f_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_resolve then
f_b_0 = -Frames.resolve1(frame_resolve.R, force);
frame_b.f = Frames.resolve2(frame_b.R, f_b_0);
else
assert(false, "Wrong value for parameter resolveInFrame");
f_b_0 = zeros(3);
frame_b.f = zeros(3);
end if;
frame_b.t = zeros(3);
r_0 = frame_b.r_0 - frame_a.r_0;
frame_b.t = zeros(3);

if resolveInFrame == ResolveInFrameAB.frame_a then
f_b_0 = -Frames.resolve1(frame_a.R, force);
frame_b.f = Frames.resolve2(frame_b.R, f_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_b then
f_b_0 = -Frames.resolve1(frame_b.R, force);
frame_b.f = -force;
elseif resolveInFrame == ResolveInFrameAB.world then
f_b_0 = -force;
frame_b.f = Frames.resolve2(frame_b.R, f_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_resolve then
f_b_0 = -Frames.resolve1(frame_resolve.R, force);
frame_b.f = Frames.resolve2(frame_b.R, f_b_0);
else
assert(false, "Wrong value for parameter resolveInFrame");
f_b_0 = zeros(3);
frame_b.f = zeros(3);
end if;

// Force and torque balance
r_0 = frame_b.r_0 - frame_a.r_0;
zeros(3) = frame_a.f + Frames.resolve2(frame_a.R, f_b_0);
zeros(3) = frame_a.t + Frames.resolve2(frame_a.R, cross(r_0, f_b_0));
annotation (
Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{
100,100}}), graphics={
Expand Down
43 changes: 20 additions & 23 deletions Modelica/Mechanics/MultiBody/Forces/Internal/BasicTorque.mo
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
within Modelica.Mechanics.MultiBody.Forces.Internal;
model BasicTorque
"Torque acting between two frames, defined by 3 input signals"
extends Interfaces.PartialForce;
import Modelica.Mechanics.MultiBody.Types.ResolveInFrameAB;
extends Modelica.Mechanics.MultiBody.Interfaces.PartialTwoFrames;

Interfaces.Frame_resolve frame_resolve
"The input signals are optionally resolved in this frame"
annotation (Placement(transformation(
origin={40,100},
extent={{-16,-16},{16,16}},
rotation=90)));

Modelica.Blocks.Interfaces.RealInput torque[3](each final quantity="Torque", each final unit="N.m")
"x-, y-, z-coordinates of torque resolved in frame defined by resolveInFrame"
annotation (Placement(transformation(
Expand All @@ -23,37 +23,34 @@ model BasicTorque

SI.Position r_0[3]
"Position vector from origin of frame_a to origin of frame_b resolved in world frame";
SI.Torque t_b_0[3] "frame_b.t resolved in world frame";
SI.Torque t_b_0[3] "Torque frame_b.t resolved in world frame";

equation
assert(cardinality(frame_resolve) > 0, "Connector frame_resolve must be connected at least once and frame_resolve.r_0/.R must be set");
frame_resolve.f = zeros(3);
frame_resolve.t = zeros(3);

r_0 = frame_b.r_0 - frame_a.r_0;
frame_a.f = zeros(3);
frame_b.f = zeros(3);

if resolveInFrame == ResolveInFrameAB.frame_a then
t_b_0 = -Frames.resolve1(frame_a.R, torque);
frame_b.t = Frames.resolve2(frame_b.R, t_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_b then
t_b_0 = -Frames.resolve1(frame_b.R, torque);
frame_b.t = -torque;
elseif resolveInFrame == ResolveInFrameAB.world then
t_b_0 = -torque;
frame_b.t = Frames.resolve2(frame_b.R, t_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_resolve then
t_b_0 = -Frames.resolve1(frame_resolve.R, torque);
frame_b.t = Frames.resolve2(frame_b.R, t_b_0);
else
assert(false, "Wrong value for parameter resolveInFrame");
t_b_0 = zeros(3);
frame_b.t = zeros(3);
end if;
if resolveInFrame == ResolveInFrameAB.frame_a then
t_b_0 = -Frames.resolve1(frame_a.R, torque);
frame_b.t = Frames.resolve2(frame_b.R, t_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_b then
t_b_0 = -Frames.resolve1(frame_b.R, torque);
frame_b.t = -torque;
elseif resolveInFrame == ResolveInFrameAB.world then
t_b_0 = -torque;
frame_b.t = Frames.resolve2(frame_b.R, t_b_0);
elseif resolveInFrame == ResolveInFrameAB.frame_resolve then
t_b_0 = -Frames.resolve1(frame_resolve.R, torque);
frame_b.t = Frames.resolve2(frame_b.R, t_b_0);
else
assert(false, "Wrong value for parameter resolveInFrame");
t_b_0 = zeros(3);
frame_b.t = zeros(3);
end if;

// torque balance
zeros(3) = frame_a.t + Frames.resolve2(frame_a.R, t_b_0);
annotation (
Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{
100,100}}), graphics={
Expand Down

0 comments on commit c163513

Please sign in to comment.