Skip to content
LIBRARY
PartialLineForce.md

PartialLineForce

Base model for line force components that define the force law directly via a scalar force f acting along the line between frame_a and frame_b.

Extends LineForceBase for geometry and adds the scalar force f, the relative position in frame_a (r_rel_a), and the unit direction (e_a).

This component extends from LineForceBase

Usage

MultibodyComponents.PartialLineForce(s_small=1e-10)

Parameters:

NameDescriptionUnitsDefault value
fixed_rotation_at_frame_afalse
fixed_rotation_at_frame_bfalse
s_small1e-10

Connectors

  • frame_a - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

  • frame_b - Frame3D is the fundamental 3D connector used for 6DOF motion. Most components have one or several Frame

connectors that can be connected together (Frame3D)

Variables

NameDescriptionUnits
lengthDistance between the origin of frame_a and the origin of frame_bm
s(Guarded) distance between the origin of frame_a and the origin of frame_b (>= s_small))m
r_rel_0Position vector from frame_a to frame_b resolved in world framem
e_rel_0Unit vector in direction from frame_a to frame_b, resolved in world frame
r_rel_aPosition vector from frame_a to frame_b, resolved in frame_am
e_aUnit vector from frame_a to frame_b, resolved in frame_a
fScalar line force (positive = tension)N

Source

dyad
"""
Base model for line force components that define the force law directly
via a scalar force `f` acting along the line between `frame_a` and `frame_b`.

Extends `LineForceBase` for geometry and adds the scalar force `f`,
the relative position in frame_a (`r_rel_a`), and the unit direction (`e_a`).
"""
partial component PartialLineForce
  extends LineForceBase
  "Position vector from frame_a to frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
  "Unit vector from frame_a to frame_b, resolved in frame_a"
  variable e_a::Real[3]
  "Scalar line force (positive = tension)"
  variable f::Dyad.Force
relations
  r_rel_a = resolve2(frame_a.R, r_rel_0)
  e_a = r_rel_a / s
  frame_a.f = -e_a * f
  frame_b.f = -resolve2(frame_b.R, resolve1(frame_a.R, frame_a.f))
end
Flattened Source
dyad
"""
Base model for line force components that define the force law directly
via a scalar force `f` acting along the line between `frame_a` and `frame_b`.

Extends `LineForceBase` for geometry and adds the scalar force `f`,
the relative position in frame_a (`r_rel_a`), and the unit direction (`e_a`).
"""
partial component PartialLineForce
  frame_a = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": -50, "y1": 450, "x2": 50, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  frame_b = Frame3D() {
    "Dyad": {
      "placement": {
        "diagram": {"iconName": "default", "x1": 950, "y1": 450, "x2": 1050, "y2": 550, "rot": 0}
      },
      "tags": []
    }
  }
  structural parameter fixed_rotation_at_frame_a::Boolean = false
  structural parameter fixed_rotation_at_frame_b::Boolean = false
  parameter s_small::Real = 1e-10
  "Distance between the origin of frame_a and the origin of frame_b"
  variable length::Length
  "(Guarded) distance between the origin of frame_a and the origin of frame_b (>= s_small))"
  variable s::Length
  "Position vector from frame_a to frame_b resolved in world frame"
  variable r_rel_0::Position[3]
  "Unit vector in direction from frame_a to frame_b, resolved in world frame"
  variable e_rel_0::Real[3]
  "Position vector from frame_a to frame_b, resolved in frame_a"
  variable r_rel_a::Position[3]
  "Unit vector from frame_a to frame_b, resolved in frame_a"
  variable e_a::Real[3]
  "Scalar line force (positive = tension)"
  variable f::Dyad.Force
relations
  # Relative position and distance
  r_rel_0 = frame_b.r_0 - frame_a.r_0
  length = norm_(r_rel_0)
  assert(length > s_small, "The distance between the origin of frame_a and the origin of frame_b of a line force component became smaller than parameter s_small.")
  s = max(length, s_small)
  e_rel_0 = r_rel_0 / s
  # frame_a: fix rotation to identity or set tau = 0
  if fixed_rotation_at_frame_a
    frame_a.R = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
  else
    frame_a.tau = [0, 0, 0]
  end
  # frame_b: fix rotation to identity or set tau = 0
  if fixed_rotation_at_frame_b
    frame_b.R = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
  else
    frame_b.tau = [0, 0, 0]
  end
  r_rel_a = resolve2(frame_a.R, r_rel_0)
  e_a = r_rel_a / s
  frame_a.f = -e_a * f
  frame_b.f = -resolve2(frame_b.R, resolve1(frame_a.R, frame_a.f))
metadata {}
end


Test Cases

No test cases defined.

  • Examples

  • Experiments

  • Analyses