HOTINT Intensivkurs

Werbung
HOTINT Intensivkurs
Chief Developer:
Johannes Gerstmayr
Program Manager:
Daniel Reischl
Core Developers:
GUI, Interfaces, IO:
FE, Solver:
MBS, Modal Reduction, FE:
Mechatronic Systems:
TCP/IP, FSI:
Testing, Software Architecture:
Alexander Dorninger
Peter Gruber
Alexander Humer
Daniel Reischl
Markus Schörgenhumer
Simon Weitzhofer
AD, JG, PG, AH, SW
HOTINT Kurs
1/2
HOTINT Intensivkurs
Agenda und geplanter Ablauf
09:00 – 10:00: Installation von HOTINT auf den Rechnern der
Teilnehmer
10:00 – 10:45: Begrüßung und Einführung in HOTINT; Übersicht
und Vorstellung der wichtigsten Features
10:45 – 11:30: HOTINT Skript-Sprache
11:30 – 12:00: Bedienung und GUI von HOTINT
12:00 – 13:00: Mittagspause
13:00 – 13:30: HOTINT Solver & Einstellungen
13:30 – 14:15: Beispiel 1: 2-Massenschwinger & Parametervariation
14:15 – 15:00: Beispiel 2: Rotordynamik
15:00 – 15:30: Kaffeepause
15:30 – 16:30: HOTINT C++: Struktur von Elementen & Beispiele
(Platten, Fluid-Struktur Interaktion)
AD, JG, PG, AH, SW
HOTINT Kurs
2/2
HOTINT Intensivkurs: Skriptsprache
Chief Developer:
Johannes Gerstmayr
Program Manager:
Daniel Reischl
Core Developers:
GUI, Interfaces, IO:
FE, Solver:
MBS, Modal Reduction, FE:
Mechatronic Systems:
TCP/IP, FSI:
Testing, Software Architecture:
Alexander Dorninger
Peter Gruber
Alexander Humer
Daniel Reischl
Markus Schörgenhumer
Simon Weitzhofer
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
1 / 38
HOTINT Skriptsprache
Überblick
1 HOTINT Skriptsprache: Einführung
2 Daten, Datenstrukturen, Operationen, Funktionen, ...
3 Erstellen von Elementen und Knoten
4 Hinzufügen eines Verbindungselements
5 Aufbringen von Lasten
6 Hinzufügen von Sensoren
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
2 / 38
HOTINT Skriptsprache: Einführung
HOTINT verfügt über Skript-Parser zur parametrischen Erstellung
von Simulationsmodellen (Dateierweiterung *.hid)
Features der Skript Sprache
• Möglichst simple und intuitive Modellierungssprache
• Definition von Variablen und Datenstrukturen
• Mathematische Operatoren und Funktionen
• Bedingungen und Schleifen (if, for)
• Funktionen zum Hinzufügen von Elementen, Lasten, Sensoren, ...
• Ausblick: Skript-gesteuerte Simulation
Notepad++ Plugin für Syntax-Highlighting und Auto-Completion ist
Bestandteil der Freeware-Version
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
3 / 38
Variablen und Datenstrukturen
Struktur, Kommentare und einfache Variablen
• Textfiles werden zeilenweise geparst; Semikolon (;) nicht nötig
• Zuweisungen mittels linke Seite = rechte Seite
• Zulässige Bezeichner: alphanumerische Zeichen & underscore ( )
• Implizite Variablen-Deklaration
• Kommentare beginnen mit Prozentzeichen (%)
% Beispiel einer einfachen Variablen-Definition
a = 3.0
% Zuweisung eines double Wertes
b = a
% b hat jetzt den Wert 3.0
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
4 / 38
Variablen und Datenstrukturen
Daten-Container
• Daten-Anordnung in Baum-Strukturen
• Beginn und Ende mit geschwungenen
Klammern ({,})
• Zugriff mittels “.”-Operator
• Schachtelung möglich
• Zuweisung ganzer Container erlaubt
Elemente werden mittels Daten-Container
initialisiert
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
mat
{
steel
{
E = 2.1e11
nu = 0.3
}
alu
{
E = 7e10
nu = 0.34
}
}
my_mat = mat.steel
my_E = mat.steel.E
5 / 38
Variablen und Datenstrukturen
Mögliche Datentypen:
bool = yes
integer = 1
float = 0.628e1
string = "text"
vector = [1.,2.,3.,4.]
matrix = [1.1,1.2;2.1,2.2]
%
%
%
%
%
%
%
boolean can be ’yes’ or ’no’
integer
floating point (double)
string
vector, with ’,’ as separator
matrix, with ’,’ and ’;’ as
separators
Initialisieren leerer Matrizen und Vektoren:
matrix = zeros(4,2)
vector = zeros(3,1)
% number of colums is required!
Zugriff auf Vektor- und Matrix-Komponenten:
a = vector[2]
matrix[3,1] = 3.1412
% als lvalue erlaubt!
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
6 / 38
Operatoren und Funktionen
Skalare Operatoren und Funktionen
• Binäre Operatoren: +,-,*,/,^,>,<,>=,<=,==,!=
• Potenzen und Wurzeln: sqr(), sqrt()
• Trigonometrische und Hyperbel-Funktionen: sin(), cos(),
tan(), asin(), acos(), atan(), sinh(), cosh(), tanh()
• Exponentialfunktion und Logarithmen: exp(), ln(), log(),
log10()
• weitere Funktionen: fact(), abs(), fabs(), round(),
floor(), ceil(), heaviside(), sgn()
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
7 / 38
Operatoren und Funktionen
Vektor-Operatoren und Funktionen
• Addition und Subtraktion: +,- oder Sum(vec1,vec2)
• Multiplikation mit Skalar: Product(vector,scalar) oder
Product(scalar,vector)
• Skalarprodukt:
Product(vec1,vec2)
• Kreuzprodukt:
CrossProduct(vec1,vec2)
• Norm eines Vektors: vabs(vector)
Matrix-Operatoren und Funktionen
• Addition und Subtraktion: +,- oder Sum(mat1,mat2)
• Multiplikation mit Skalar: Product(matrix,scalar) oder
Product(scalar,matrix)
• Matrizenprodukt:
Product(mat1,mat2)
auf Vektoren und Matrizen anwendbar:
Transpose(matrix), rows(vector), cols(matrix)
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
8 / 38
Bedingungen und Schleifen
Skriptsprache verfügt über folgenden Kontrollstrukturen:
if – Bedingung
• kein Leerzeichen zwischen if und (bedingung) erlaubt
• kein else if oder else möglich
if(bedingung)
{
% Anweisungen
}
for – Schleife
• Inkrement- und Dekrement-Operatoren (++,--) existieren nicht!
for(start,bedingung,weiter)
{
% Anweisungen
}
AD, JG, PG, AH, SW
% kein Leerzeichen nach for!
HOTINT Intensivkurs: Skriptsprache
9 / 38
weitere Funktionen (Auswahl)
• Include(filename): Inkludiert ein Skript-file; Parameter ist
absoluter oder relativer Pfad zur einzubindenden Datei
• Print(string), Print(variable), Print(tree): Schreibt
String, Variable oder ganzen Baum ins Ausgabefenster
• LoadVectorFromFile(filename, column): Liest einen Vektor
aus einem Textfile (absoluter oder relativer Pfad); column
bezeichnet die zu lesende Spalte der Textdatei; z.B.:
sol = LoadVectorFromFile("solution.txt",2)
• ReadSTLFile(filename): Liest ein STL-Netz aus Datei und gibt
einen Container mit Punkten und Dreiecken zurück; z.B.:
STL = ReadSTLFile("mesh.stl")
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
10 / 38
Hinzufügen von Elementen
Elemente werden mittels des Befehls AddElement(elemData) zum
System hinzugefügt.
Parameter: Als Parameter wird ein Element Daten Container
übergeben, der das Element beschreibt. Abgesehen vom Eintrag
element type, der existieren muss, werden Defaultwerte verwendet,
falls Einträge nicht überschrieben werden.
Rückgabewert: Nummer des Elementes im MBS.
myMass3D
{
element_type = "Mass3D"
% muss gesetzt werden!
Physics.mass = 1
Initialization.initial_position = [1.,0,0] % Anfangsposition
}
nElement = AddElement(myMass3D)
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
11 / 38
Hinzufügen von Elementen
Auswahl verfügbarer Elemente:
• Mass1D, Mass2D, Mass3D: Massenpunkt mit 1–3 Freiheitsgraden
• Rigid2D, Rigid3D, Rigid3DKardan: Starrkörper in 2D und 3D
• LinearBeam3D, ANCFBeam3DTorsion: 3D Bernoulli-Euler Balken
(kein Schub) für kleine bzw. große Deformationen
• ANCFBeamShear3DLinear, ANCFBeamShear3DQuadratic: 3D
Timoshenko-Balken für große Deformationen (lineare bzw.
quadratische Ansatzfunktionen)
• RotorBeamXAxis: Balken-Element für große Rotationen um
(lokale) x-Achse; speziell für Rotordynamik-Anwendungen
• NodalDiskMass3D: Scheibenelement für RotordynamikAnwendungen in Verbindung mit RotorBeamXAxis
in zukünftigem Release: ANCFCable2D, ANCFThinPlate3D,
ANCFBeamShearFE2DLinear/Quadratic
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
12 / 38
Hinzufügen von Elementen
Typischer Element-Daten Aufbau
element_root
{
... % grundlegende Eigenschaften wie element_type, name, ...
Graphics
{
% Darstellungsoptionen (Farbe, Größe, ...)
}
Initialization
{
% Anfangswerte der Element-Freiheitsgrade
}
Physics
{
% physikalische Eigenschaften (Masse, Material, ...)
}
Geometry
{
% Elementgröße, Knotennummern, ...
}
}
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
13 / 38
Hinzufügen von Elementen
Standard Einträge der Elemente:
element root
• element type: legt das zu erstellende Element fest
• name: frei wählbarer Name; erleichtert Editieren im GUI
• loads: Vektor mit Nummern der aufzubringenden Lasten
element root.Graphics
• RGB color: Farbe des Elements (RGB-Werte 0..1)
• use alternative shape: alternative Darstellung des Elements
• geom elements: Vektor mit GeomElements zur alt. Darstellung
• show element: soll Element gezeichnet werden?
Element-spezifische Einstellungen → siehe Dokumentation!
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
14 / 38
Hinzufügen von Elementen
Beispiel Rigid3DKardan: beschreibt räumliche Bewegung eines
Starrkörpers; Rotationsparametrisierung mit 3 Winkeln (Singularität!)
%%% Beispiel Rigid3DKardan
% Abmessungen und Dichte des Körpers
lx = 0.4
ly = 0.1
lz = 0.2
rho = 7850
myRigid3D
{
element_type = "Rigid3DKardan"
name = "myRigid3D"
Graphics
{
body_dimensions = [lx, ly, lz]
}
...
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
15 / 38
Hinzufügen von Elementen
...
Physics
{
volume = lx*ly*lz
mass = rho*volume
moment_of_inertia = [ mass*(ly*ly+lz*lz)/12, 0., 0.
0., mass(lx*lx+lz*lz)/12, 0.
0., 0., mass(ly*ly+lz*lz)/12 ]
}
Initialization
{
initial_position = [0., 0., 1.]
% pos_X, pos_Y, pos_Z
initial_velocity = [0., 0., 0.]
% vel_X, vel_Y, vel_Z
initial_rotation = [0., pi/4, pi/4]
% rot3_X, rot2_Y, rot1_Z
initial_angular_velocity = [2*pi, 0., 0.] % in global coords
}
}
nRigidElem = AddElement(myRigid3D)
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
16 / 38
Hinzufügen von Elementen
Finite Elemente sind im Gegensatz zu Starrkörpern Knoten-basiert
1 Knoten erstellen und initialisieren
2 Geometrie und Materialeigenschaften definieren
3 Finite Elemente mit jeweiligen Knoten und Material erstellen
Unterschiedliche DOFs → unterschiedliche Knotentypen!
• Node3DRxyz: 3 Verschiebungen + 3 Winkel bzgl. globalem
Koordinatensystem; für LinearBeam3D
• Node3DR123: 3 Verschiebungen + 3 Winkel bzgl. lokalem
Koordinatensystem; für RotorBeamXAxis
• Node3DS2S3: 3 Verschiebungen + 2 Vektoren im Querschnitt; für
ANCFBeamShear3DLinear / ANCFBeamShear3DQuadratic
• Node3DS1rot1: 3 Verschiebungen + 1 Tangentialvektor +
1 Winkel; für ANCFBeam3DTorsion
Mesh-Generator zur einfachen Erstellung & Geometrie-Import möglich!
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
17 / 38
Hinzufügen von Elementen
Beispiel LinearBeam3D: Auszug aus Dokumentation
3.2.9
LinearBeam3D
Short description
The Beam3D element is a three dimensional elastic beam element which is aligned along the local x axis. It provides a decoupled calculation of bending in y and z direction, axial deformation
in x direction and torsion about the x axis. Shear deformation is not considered. The decoupled
calculation is a simplification of the real, nonlinear problem, but for small deformations the
results coincidence highly with the exact solution.
Degrees of freedom
Bending is described by 4 DOF, the number of DOF for axial deformation as well as torsion is
2. These 12 DOF are stored in two nodes i and j. The DOF vector of the LinearBeam3D read
as follows
(i)
(i)
(j) (j) (j)
(j)
(j)
(j) T
q(i) = [q(i) , q(j) ] = [x(i) , y (i) , z (i) , φ(i)
x , φy , φz , x , y , z , φ x , φ y , φ z ] .
(3.7)
Nodes
To create a new beam element the user has to define two ’Node3DRxyz’ nodes i and j. Every
node of this type has 6 DOF. The first 3 DOF describe the node displacement (x, y, z) w.r.t
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
18 / 38
Hinzufügen von Elementen
1 Knoten erstellen und initialisieren: 2 Knoten vom Typ Node3DRxyz
Data objects of Node3DRxyz:
Data name
node type
type
string
name
node number
Geometry
Geometry.
reference position
Geometry.
reference rot angles
Initialization
Initialization.
node initial values
Graphics
Graphics.RGB color
Graphics.visible
string
integer
”Node3DRxyz”
1
description
specification of node type. Once the node is
added to the mbs, you MUST NOT change this
type anymore!
Node identifier.
Node Number.
vector
[0, 0, 0]
Position (2D/3D) in reference configuration.
vector
[0, 0, 0]
Kardan rotation angles (X,Y,Z) in rad in global
frame of node in reference configuration.
vector
[0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0]
initial values for all degrees of freedom of node
[0.4, 0.4, 0.1]
1
[red, green, blue] color of element, range = 0..1,
Visibility of node.
vector
integer
R
default
”Node3DRxyz”
Knoten werden mit dem Befehl AddNode(nodeData) zum System
hinzugefügt.
Rückgabewert: Nummer des Knoten im MBS
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
19 / 38
Hinzufügen von Elementen
Anlegen der Knoten:
lx = 1
% Länge des Balkenelements
node1
{
node_type = "Node3DRxyz"
name = "Node1"
node2
{
node_type = "Node3DRxyz"
name = "Node2"
Geometry
{
reference_position = [0.,0.,0.]
reference_rot_angles= [0.,-pi/2,0.]
}
}
nNode1 = AddNode(node1)
AD, JG, PG, AH, SW
Geometry
{
reference_position = [0.,0.,lx]
reference_rot_angles= [0.,-pi/2,0.]
}
}
nNode2 = AddNode(node2)
HOTINT Intensivkurs: Skriptsprache
20 / 38
Hinzufügen von Elementen
2 Geometrie und Materialeigenschaften definieren: werden mittels
Beam3DProperties bzw. Beam2DProperties festgelegt und durch
AddMaterial(materialData) dem System hinzugefügt.
ly = 0.01
lz = 0.05
Em = 2.1e11
rho = 7850
% E-Modul
% Dichte
myBeamProperties
{
material_type = "Beam3DProperties"
cross_section_type = 1
% 1... rectangular, 2... circular
cross_section_size = [ly, lz] % Querschnittsabmessungen
EA = Em * ly*lz
EIy = Em * ly*lz*lz*lz / 12
EIz = Em * lz*ly*ly*ly / 12
GJkx = Em/2 * lz*ly*ly*ly / 3
density = rho
% Biegesteifigkeit um y-Achse
% Biegesteifigkeit um z-Achse
% Drillwiderstand für schmale Rechtecke
}
nBeamProperties = AddBeamProperties(myBeamProperties)
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
21 / 38
Hinzufügen von Elementen
3 LinearBeam3D erstellen: Auszug aus Dokumentation
Data objects of LinearBeam3D:
Data name
element type
type
string
name
element number
loads
string
integer
vector
Graphics
Graphics.RGB color
vector
[0.1, 0.1, 0.8]
Graphics.geom elements
vector
[]
Graphics.
use alternative shape
Graphics.show element
Geometry
Geometry.node 1
Geometry.node 2
Physics
Physics.axial deformation
Physics.material number
bool
0
bool
1
[red, green, blue] color of element, range = 0..1,
use default color:[-1,-1,-1]
Set Geometric elements to represent body ’geomelem1, geomelem2, ...’ or empty
Graphical representation of element with geomobjects that are attached to the element
Flag to draw element
integer
integer
1
2
number of Node 1
number of Node 2
bool
integer
1
1
include effect of axial deformation
material number which contains the main material properties of the beam
AD, JG, PG, AH, SW
R
R
default
description
”LinearBeam3D” specification of element type. Once the element
is added to the mbs, you MUST NOT change this
type anymore!
”LinearBeam3D” name of the element
1
number of the element in the mbs
[]
Set loads attached to this element: ’nr load1,
nr load2, ...’ or empty
HOTINT Intensivkurs: Skriptsprache
22 / 38
Hinzufügen von Elementen
myBeam
{
element_type = "LinearBeam3D"
name = "myBeam"
Geometry
{
node_1 = nNode1
% Nummer des 1. Knoten
node_2 = nNode2
% Nummer des 2. Knoten
}
Physics.material_number = nBeamProperties
}
nBeamElement = AddElement(myBeam)
Knoten und Elemente in for-Schleifen erstellen:
for(i=1,i<=nelems,i=i+1)
{
myBeam.Geometry.node_1 = i
myBeam.Geometry.node_2 = i+1
AddElement(myBeam)
}
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
23 / 38
Hinzufügen von Verbindungselementen
Elemente können in HOTINT über eine Vielzahl von Gelenken und
Verbindungselementen (engl. kinematic pairs) gekoppelt werden.
Verbindungselementen werden mit AddConnector(constraintData)
zum System hinzugefügt.
Rückgabewert: Nummer des Connectors im MBS
Zwei “typische” Verbindungsmöglichkeiten
1 Element-zu-Element: lokale Position oder Knoten eines Elements
zu lokaler Position oder Knoten des zweiten Elements
2 Element-zu-Ground: lokale Position oder Knoten eines Elements
zu globaler Position
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
24 / 38
Hinzufügen von Verbindungselementen
Auswahl verfügbarer Gelenke:
•
•
•
•
•
•
•
•
PointJoint
RevoluteJoint
PrismaticJoint
CylindricalJoint
UniversalJoint
RigidJoint
RigidLink
GenericBodyJoint
•
•
•
•
•
•
•
•
•
CoordinateConstraint
VelocityCoordinateConstraint
SlidingPointJoint
SlidingPrismaticJoint
SpringDamperActuator
RotarySpringDamperActuator
Rope3D
Contact1D
FrictionConstraint
in zukünftigem Release: RollingJoint3D, MultiNodalConstraint,
AverageConstraint, ...
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
25 / 38
Hinzufügen von Verbindungselementen
Die (meisten) Verbindungselemente unterscheiden zwei Modi:
Harte vs. weiche Constraints
• Harte Constraints: realisiert mittels algebraischer Gleichungen
und Lagrange-Multiplikatoren → führt auf DAEs; kinematische
Zwangsbedingungen werden exakt erfüllt
• Weiche Constraints: Penalty-Formulierung basierend auf
Ersatz-Steifigkeiten und Dämpfungsparametern → keine
zusätzlichen Gleichungen, jedoch evtl. schlechte Konditionierung;
ermöglicht Abbildung realer Gelenkseigenschaften
Automatische Konsistenzprüfung: Elemente und Gelenke wissen“ um
”
ihre Kopplungsmöglichkeiten (→ Dokumentation)
Eigenwertanalyse momentan nur mit Penalty-Formulierung möglich!
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
26 / 38
Hinzufügen von Verbindungselementen
Beispiel PointJoint: verbindet zwei Elemente an einer Positionen
oder Knoten bzw. fixiert ein Element an globalem Punkt (ground).
Data objects of PointJoint:
Data name
element type
type
string
name
element number
Graphics
Graphics.RGB color
string
integer
vector
[0.3, 0.8, 0.3]
Graphics.show connector
Graphics.draw size
bool
double
1
-1
Graphics.
double
draw size joint local frame
Geometry
Geometry.
use joint local frame
Geometry.
joint local frame
R
default
”PointJoint”
”PointJoint”
2
0
bool
0
matrix
[0, 0, 0; 0, 0, 0;
0, 0, 0]
Geometry.
bool
use local coordinate system
AD, JG, PG, AH, SW
R
0
description
specification of element type. Once the element
is added to the mbs, you MUST NOT change this
type anymore!
name of the element
number of the element in the mbs
[red, green, blue] color of element, range = 0..1,
use default color:[-1,-1,-1]
Flag to draw connector
drawing dimensions of constraint. If set to -1,
than global draw scalar size is used.
drawing dimensions of joint local frame. If set to
-1, than global draw scalar size is used. If set to
0, than no joint local frame is drawn.
Use a special joint local frame
Prerotate stiffness vector w.r.t. global coordinate
system or local coordinate system of body 1. Just
used if use joint local frame == 1
0=use global coordinates, 1=use local coordinate
system of Body 1
HOTINT Intensivkurs: Skriptsprache
27 / 38
Hinzufügen von Verbindungselementen
Physics
Physics.
use penalty formulation
bool
0
0 = use lagrange multipliers (index 3 DAE, exact), 1 = use penalty formulation (no additional
equation added, approximate constraint)
double
0
general or penalty stiffness parameter
vector
[0, 0, 0]
double
0
penalty stiffness parameter [kx,ky,kz].
Just
used if scalar spring stiffness == 0, otherwise
kx=ky=kz=spring stiffness
damping coefficient for viscous damping (F =
d*v), applied in all constrained directions
vector
[1, 1, 1]
[x,y,z]...(1 = constrained, 0 = free), can be defined
as local or global directions (see Geometry)
integer
vector
integer
1
[0, 0, 0]
0
Number of constrained element
local position. Only used if node number == 0!
local or global (if element number == 0) node
number.
Position2
Position2.element number
Position2.position
integer
vector
0
[0, 0, 0]
Position2.node number
integer
0
Number of constrained element
local or global (if element number == 0) position.
Only used if node number == 0!
local or global (if element number == 0) node
number.
Physics.Penalty
Physics.Penalty.
spring stiffness
Physics.Penalty.
spring stiffness vector
Physics.Penalty.damping
Physics.Lagrange
Physics.Lagrange.
constrained directions
Position1
Position1.element number
Position1.position
Position1.node number
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
28 / 38
Hinzufügen von Verbindungselementen
myPointJoint
{
element_type = "PointJoint"
name = "myPointJoint"
Physics
{
use_penalty_formulation = 1
Penalty.spring_stiffness = 1e3
%
}
Position1
{
element_number = nBeamElement
%
node_number = 1
%
}
Position2
{
element_number = 0
%
position = [0.,0.,0.]
%
}
}
nPointJoint = AddConnector(myPointJoint)
AD, JG, PG, AH, SW
Gelenksteifigkeit kg/s^2
Elementnummer
lokale Knotennummer
0 = ground
globale Position
HOTINT Intensivkurs: Skriptsprache
29 / 38
Hinzufügen von Verbindungselementen
Beispiel RigidJoint: realisiert starre Verbindung des Starrkörpers
mit dem Balkenelement.
myRigidJoint
{
element_type = "RigidJoint"
name = "myRigidJoint"
Position1
{
element_number = nRigidElement
position = [0.,0.,0.]
}
Position2
{
element_number = nBeamElement
position = [lx/2,0.,0.]
}
% Schwerpunkt des Starrkörpers
% Ende des Balkenelements
}
nRigidJoint = AddConnector(myRigidJoint)
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
30 / 38
Aufbringen von Lasten
HOTINT erlaubt das Aufbringen vielfältiger Typen von Belastungen
mittels des Befehls AddLoad(loadData).
Rückgabewert: Nummer der Load im MBS
Lasten müssen bereits beim Erstellen der Elemente festgelegt sein:
elemData.loads = [load1, load2, load3, ...]
Verfügbare Lasten:
• GCLoad: Last auf eine generalisierte Koordinate
• ForceVector2D/3D: Kraftvektor auf lokalen Punkt oder Knoten
• MomentVector3D: Momentenvektor in lokalen Punkt oder Knoten
• BodyLoad: verteilte Volumenkraft; wird über Körper integriert
• Gravity: wie BodyLoad; Dichte wird zur Berechnung verwendet
• SurfacePressure: verteilte Kraft normal auf Körperoberfläche
in zukünftigem Release: RotatingForce, CentrifugalForce,
SurfaceLoad, DistributedMoment
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
31 / 38
Aufbringen von Lasten
Zeitlicher Verlauf der Kräfte und Momente
• konstanter Wert
• MathFunction: erlaubt Ausdrücke wie in Skriptsprache sowie
Interpolation von Punkten
• IOElement: freie Veränderung der Werte durch IOElemente
MathFunction
MathFunction.
piecewise mode
MathFunction.
piecewise points
MathFunction.
piecewise values
MathFunction.
piecewise diff values
MathFunction.
parsed function
MathFunction.
parsed function parameter
IOElement
IOElement.
input element number
IOElement.
input local number
AD, JG, PG, AH, SW
integer
-1
modus for piecewise interpolation: -1=not piecewise, 0=constant, 1=linear, 2=quadratic
supporting points (e.g. time or place) for piecewise interpolation
values at supporting points
vector
[]
vector
[]
vector
[]
string
””
string
””
integer
0
number of IOElement in the mbs
integer
0
number of output of IOElement connected to this
element
differential values at supporting points - for
quadratic interpolation
string representing parsed function,
e.g.
’A*sin(omega*t)’
string representing parameter of parsed function,
e.g. ’t’
HOTINT Intensivkurs: Skriptsprache
32 / 38
Aufbringen von Lasten
Beispiel BodyLoad: harmonische Volumenkraft in z-Richtung
force = 100.
omega = 1.5
myBodyLoad
{
load_type = "BodyLoad"
direction = 2
load_value = force
load_function_type = 1
% Volumenkraft in z-Richtung
% 1.. MathFunction, 2.. IOElement
MathFunction
{
parsed_function = "sin(omega*t)"
parsed_function_parameter = "t"
}
% Ergebnis: val*sin(omega*t)
% unabhängige Variable
}
nLoad = AddLoad(myBodyLoad)
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
33 / 38
Hinzufügen von Sensoren
Neben der 3D-Visualisierung nehmen Sensoren eine wesentliche Rolle
im Auswerten der Lösung ein.
Funktionalität der Sensoren
• Sensoren messen“ den Verlauf gesuchter Größen des mecha”
tronischen Systems während der Simulation
• Online-Darstellung der Größen im PlotTool
• Speichern der Größen in Ausgabe-Dateien
• Eingangsgrößen für IOElemente zur Parametervariation,
Optimierung, Regelung, etc.
Sensoren werden mit AddSensor(sensorData) erstellt. Elemente
müssen beim Erstellen der Sensoren bereits existieren.
Rückgabewert: Nummer des Sensors im MBS
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
34 / 38
Hinzufügen von Sensoren
Verfügbare Sensoren:
• FVElementSensor: speichert eine Feldgröße (field variable) an
lokaler Position oder Knoten eines Elements (Verschiebung,
Winkel, Geschwindigkeit, Spannungskomponenten, ...)
→ Observable FieldVariables in Dokumentation
• ElementSensor: speichert Element-spezifische Größen (Kräfte
im Gelenk, ...) → Observable special values in Dokumentation
• MultipleSensor: wendet mathematische Operationen (sum,
average, minimum, maximum) auf eine Liste von Sensoren an
• LoadSensor: momentaner Wert der MathFunction einer Last
• SystemSensor: speichert spezielle Werte des Systems bzw. des
Solvers (DOF, EV, jacobians, newton iterations, ...)
→ siehe Dokumentation
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
35 / 38
Hinzufügen von Sensoren
Beispiel FVElementSensor: Misst gewünschte Feldgröße eines
Elements an lokaler Position oder Elementknoten
Data objects of FVElementSensor:
Data name
sensor number
name
type
integer
string
sensor type
string
element number
integer
node number
integer
local position
vector
field variable
string
component
string
AD, JG, PG, AH, SW
R
R
default
1
”sensor”
description
number of the sensor in the mbs
name of the sensor for the output files and for the
plot tool
”FVElementSensor”
specification of sensor type. Once the sensor is
added to the mbs, you MUST NOT change this
type anymore!
1
number of the element, to which the sensor is
applied
0
local node number. If ¿ 0, then the position of
this node is used.
[0, 0, 0]
local position at which the field variable is evaluated.
”position”
name of the field variable, e.g. ’position’, see the
documentation of the elements for the available
field variables
”x”
component of the field variable, e.g. ’x’
HOTINT Intensivkurs: Skriptsprache
36 / 38
Hinzufügen von Sensoren
myFVSensor
{
sensor_type = "FVElementSensor"
name = "tip displacement"
element_number = nBeamElement
local_position = [lx/2.,0.,0.]
field_variable = "displacement"
component = "x"
}
nFVSensor = AddSensor(myFVSensor)
AD, JG, PG, AH, SW
%
%
%
%
Nummer des Balkenelements
lokale Position
Verschiebung ist Messgröße
x-Komponente
HOTINT Intensivkurs: Skriptsprache
37 / 38
Ausblick
Zukünftige Features der Skriptsprache
• Skriptsprachen-gesteuerte Simulation, Post-Processing, ...
• Integration der Mesh-Funktionalität: FE-Mesh & Struktur-Mesh
• Vollständige Abbildung des Workflows zur Simulation modal
reduzierter Mehrkörpersysteme in der Skriptsprache
• Verfügbarkeit weiterer Elemente: Solid-FE, Schalen, ...
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Skriptsprache
38 / 38
HOTINT Intensivkurs: Solver-Options
Chief Developer:
Johannes Gerstmayr
Program Manager:
Daniel Reischl
Core Developers:
GUI, Interfaces, IO:
FE, Solver:
MBS, Modal Reduction, FE:
Mechatronic Systems:
TCP/IP, FSI:
Testing, Software Architecture:
Alexander Dorninger
Peter Gruber
Alexander Humer
Daniel Reischl
Markus Schörgenhumer
Simon Weitzhofer
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
1 / 10
Übersicht
1 Übersicht Berechnungsmodi
2 Dynamische Simulation
3 Statische Rechnung
4 Eigenwertanalyse
5 Newton Solver
6 Lineare Gleichungssysteme
7 Beispiel: Kragbalken
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
2 / 10
Übersicht Berechnungsmodi
HOTINT Solver unterscheidet 3 unterschiedliche Berechnungsmodi:
• Dynamische Simulation: transiente Analyse mechatronischer
Mehrkörpersysteme
• Statische Rechnung: Lösung statischer Probleme
• Eigenwertanalyse: Berechnung von Eigenwerten und -vektoren
Die dynamischen und statischen Simulationen erfordern meist die
Lösung nichtlinearer Gleichungssysteme → Newton Solver
Newton-Verfahren und Eigenwertanalyse erfordert wiederum eine
effiziente Lösung linearer Gleichungssysteme
Solver Einstellungen können im GUI bzw. in der Skriptsprache über
den Container SolverOptions gesetzt werden.
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
3 / 10
Dynamische Simulation
Dynamischer Solver
• Gewöhnlichen Differentialgleichungen (ODEs) bzw. DifferentialAlgebraische Gleichungen (DAEs) erster und zweiter Ordnung
• Mehrstufige implizite Runge-Kutta Verfahren: Gauss, Radau und
Lobatto Schemata
• Index 2 Formulierung für algabraische Zwangsbedingungen
• Automatische adaptive Schrittweitensteuerung
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
4 / 10
Dynamische Simulation
Generelle Solver-Einstellungen: SolverOptions
• start time: Startzeit der Simulation
• end time: Endzeit der Simulation
• do static computation: 1 für statische Berechnung
Einstellungen für Dynamischen Solver: SolverOptions.Timeint
• max step size: maximale Zeitschrittweite
• min step size: minimale Zeitschrittweite
• init step size: Anfangs-Zeitschrittweite
• max index: maximaler Index der DAEs (2 oder 3)
• tableau name: Runge-Kutta Schema; siehe tableaus.txt
• assume constant mass matrix: 1, falls Massenmatrix konstant
Weitere Options → siehe Dokumentation
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
5 / 10
Statische Rechnung
Statischer Solver
• Lastschritte als virtuelle Zeitschritte
• Automatische Lastinkrementsteuerung
Einstellungen für Statischen Solver: SolverOptions.Static
• max load inc: maximales Lastinkrement
• min load inc: minimale Lastinkrement
• init load inc: Anfangs-Inkrement
• increase load inc steps: 1 für adaptives Inkrement
• load inc up: Vergrößerungsfaktor für Inkrement
• load inc down: Verkleinerungsfaktor für Inkrement
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
6 / 10
Eigenwertanalyse
Eigenwert Solver
• Berechnung der Eigenwerte und Eigenvektoren (Resonanzen,
modale Reduktion)
• Gyroskopische Terme in Rotordynamik
• Linearisierung um deformierten Zustand
• 3 unterschiedliche Solver verfügbar
• Zwangsbedingungen in Penalty-Formulierung
Verfügbare Solver:
1 Direkter Solver: LAPACK dsysgv
2 Iterativer Solver (Arnoldi): MATLAB eig bzw. eigs
3 Iterativer Solver (LOBPCG): in HOTINT implementiert;
Vorkonditionierung möglich
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
7 / 10
Eigenwertanalyse
Einstellungen der Eigenwert Solver: SolverOptions.Eigensolver
• do eigenmode computation: 1 für Eigenwertanalyse
• reuse last eigenvectors: 1 zum Laden gespeicherter
Eigenwerte und -vektoren
• solver type: 0.. LAPACK, 1.. MATLAB, 2.. HOTINT
• n eigvals: Anzahl der Eigenwerte/-vektoren (iterative Solver)
• accuracy: relative Genauigkeit der Lösung (iterative Solver)
• max iterations: Anzahl der Iterationen (iterative Solver)
• use n zero modes: 1 für Konvergenzprüfung der Nullmoden
(Starrkörpermoden) (iterative Solver)
• n zero modes: Anzahl der Nullmoden (iterative Solver)
• use gyroscopic terms: 1 für gyroskopische Terme
• linearize about actual solution: 1 für Linearisierung um
deformierten Zustand
Weitere Options (z.B. Vorkonditionierung) → siehe Dokumentation
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
8 / 10
Newton-Verfahren
Newton Solver
• Lösung nichtlinearer algebraischer Gleichungssysteme
• Lokal quadratische Konvergenz
• Modifiziertes Newton-Verfahren
Einstellungen der Eigenwert Solver: SolverOptions.Newton
• relative accuracy: relative Genauigkeit der Newton-Iteration
• absolute accuracy: absolute Genauigkeit
• use modified newton: 1 für approximierten Jacobian
• max modified newton steps: max. Anzahl Iteration mit
genähertem Jacobian vor Umschalten auf Full Newton
• max full newton steps: max. Anzahl Iteration Newton
Iteration vor Abbruch
• use central diff quotient: 1 für zentralen Differenzenquotienten bei numerischer Differentiation
• num diff parameter: Inkrement bei numerischer Differentiation
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
9 / 10
Lineare Gleichungssysteme
Linearer Solver
• Solver für vollbesetzte und Sparse-Matrizen
• Volle Matrizen: LAPACK dgesv
• Sparse-Matrizen: SuperLU (open source), Pardiso (Intel MKL)
• Solver für über-/unterbestimmte Gleichungssysteme: LAPACK
Einstellungen der Eigenwert Solver: SolverOptions.Linalg
• use sparse solver: 1 für Sparse-Matrizen
• underdetermined system: 1 für über-/unterbestimmte
Gleichungssysteme
AD, JG, PG, AH, SW
HOTINT Intensivkurs: Solver-Options
10 / 10
HOTINT Intensivkurs
Alexander Dorninger1 , Johannes Gerstmayr1 , Peter Gruber1 ,
Alexander Humer1,2 , Simon Weitzhofer1
2
1
Linz Center of Mechatronics GmbH, Linz, Austria
Institute of Technical Mechanics, Johannes Kepler University, Linz, Austria
25. Februar 2014
The support of the Comet K2 Austrian Center of Competence in Mechatronics (ACCM)
is gratefully acknowledged
AD, JG, PG, AH, SW
HOTINT Kurs
1/9
HOTINT C++: Struktur von Elementen & Beispiele
(Platten, Fluid-Struktur Interaktion)
AD, JG, PG, AH, SW
HOTINT Kurs
2/9
Linking between Kernel and Elements
HOTINT is composed into:
• KERNEL WorkingModule.dll
• CLIENT MBSElementsAndModels.dll
• GUI hotint.exe (by now only MS Windows is supported)
Additional functionality collected in static libs
math, parser, string and file manipulation, . . .
AD, JG, PG, AH, SW
HOTINT Kurs
3/9
Responsibilities
Kernel (WorkingModule.dll)
• multibody system management (access to elements, joints, etc.)
• assembling and storage of system matrices & vectors
• time integrator (explicit/implicit Runge Kutta schemes)
• static integrator
• solver for nonlinear systems (classical/modified Newton method)
• Eigenmodes solver
• optimization (parameter variation, evolutionary algorithms)
. . . utilizing linear algebra libraries such as SuperLU, Lapack/BLAS
Client (MBSElementsAndModels.dll)
• definitions of MBS Objects (elements, loads, materials, . . . )
• definitions of Models (via parsed script or coded in cpp)
AD, JG, PG, AH, SW
HOTINT Kurs
4/9
MBS Objects
ElementsLib
• all elements (mass, rigid, beam, shell, CMS, ...)
• all connectors (joints, contact, control, ...)
ServiceObjectsLib
Geometrical Elements, Material, Loads, Nodes, Sensors,
Simulink2HotintConversion, TCP/IP-Routines
FEMesh
FEMesh, FEMesh generator
AD, JG, PG, AH, SW
HOTINT Kurs
5/9
ElementsLib: Implemented Classes
Element
Body2D
Body3D
Mass2D
Constraint
Mass3D
Rigid2D
NodalMass3D
ANCFCable2D
Rigid3D
Rigid3DKardan
ANCFAxMovBeam2D
ANCFPipe2D
Plate2D
RevoluteJoint
InertialLinearSpringDamper2D
LinearRotationalSpringDamper
SphericalJoint
SpringDamperActor
ANCFBeam3DTorsion
GravityConstraint
PrismaticJoint2D
InputOutputElement
NodalConstraintCMS
CylindricalPointJoint
IODeadZone
RollingJoint3D
IOMathFunction
ANCFCable3D
RollingJoint2D
ANCFPlate3D
SlidingJoint
IOTime
ANCFThinPlate3D
SlidingJoint2D
IOLinearODE
FiniteElementGeneric<Body3D>
UniversalJoint
IOLinearTransformation
GeneralContact2D
IOQuantizer
ANCFBeam2Dlin
ANCFBeamShear2D
ReferenceFrame2D
CMSElement2D
FiniteElementGeneric<Body2D>
FiniteElement2D
SpringDamperBearing
CoordConstraint
RigidJoint
Rigid3DMinCoord
ANCFBeam2D
PrismaticJoint
Angle2DConstraint
Plate2Dquad
Trig2Dquad
RigidLinkConstraint
GeneralizedAngleConstraint
ANCFBeamShear3D
Trig2Dlin
CylindricalJoint
Beam3D
Plate2Dlin
Plate2DquadFFRF
InertialLinearSpringDamper
Pos2DConstraint
FiniteElement3D
Tetrahedral=TetrahedalGeneric<FiniteElement3D>
GeneralContact3D
IOSaturate
IOSTransferFunction
Hexahedral=HexahedalGeneric<FiniteElement3D>
AngSpringDamperActor
FiniteElement3DFFRF
KardanSDRotActor
HexahedralFFRF=HexahedalGeneric<FiniteElement3DFFRF>
SDRotActor2D
TetrahedralFFRF=TetrahedalGeneric<FiniteElement3DFFRF>
HydraulicActor
Quadrilateral
HydraulicActorDA
HydraulicActorDA2D
HydraulicActorDA2Dh
AD, JG, PG, AH, SW
HOTINT Kurs
6/9
Example Element: Mass2D
class Mass2D: public Body2D
{
Mass2D(MBS* mbsi, const Vector& x0, double radi, double massi,
const Vector3D& coli) : Body2D(mbsi)
{
ElementDefaultConstructorInitialization();
mass=massi;
size.X()=radi;
size.Y()=radi;
size.Z()=radi;
x_init = x0;
col = coli;
}
virtual void Initialize()
{
Body2D::Initialize();
}
// return 0: OK, 1: can not compute, 2: can not draw or compute
virtual int CheckConsistency(mystr& errorstr);
AD, JG, PG, AH, SW
HOTINT Kurs
7/9
Example Element: Mass2D
// for consistency check with constraints
virtual TKinematicsAccessFunctions GetKinematicsAccessFunctions(int mode = 1)
{
TKinematicsAccessFunctions kaf =
Body2D::GetKinematicsAccessFunctions(mode);
return TKinematicsAccessFunctions(
kaf+TKAF_position_2D+TKAF_velocity_2D+TKAF_D_pos_D_q_2D);
}
// for load/save/edit:
virtual const char* GetElementSpec() const {return "Mass2D";}
virtual void GetElementData(ElementDataContainer& edc);
virtual int SetElementData(ElementDataContainer& edc);
virtual void GetElementDataAuto(ElementDataContainer& edc);
virtual int SetElementDataAuto(ElementDataContainer& edc);
//for visualization and sensoring of displacements and velocities:
virtual void DrawElement();
virtual double GetFieldVariableValue(const FieldVariableDescriptor & fvd,
const Vector2D & local_position, bool flagD);
AD, JG, PG, AH, SW
HOTINT Kurs
8/9
Example Element: Mass2D
M(q, t) q̈ + GTq λ
=
G(q, q̇, t)
=
F2 (q, q̇, t)
| {z }
=F−C q̇+Qv
0
virtual void EvalM(Matrix& m, double t)
{
m(1,1) = mass; m(2,2) = mass;
}
virtual void EvalF2(Vector& f, double t)
{
Body2D::EvalF2(f,t);
if (GetMassDamping() != 0)
{
f(1) -= GetMassDamping()*mass*XGP(1);
f(2) -= GetMassDamping()*mass*XGP(2);
}
}
};
AD, JG, PG, AH, SW
HOTINT Kurs
9/9
Herunterladen