Skip to content

Commit

Permalink
fix bugs (CreateRigidBody, etc.), add continuous integration; fix stu…
Browse files Browse the repository at this point in the history
…b files; fix Lidar; complex eigenvalue computation
  • Loading branch information
jgerstmayr committed May 4, 2024
1 parent 05de550 commit 3caf20e
Show file tree
Hide file tree
Showing 150 changed files with 7,254 additions and 1,269 deletions.
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ Exudyn

**A flexible multibody dynamics systems simulation code with Python and C++**

Exudyn version = 1.8.0 (Jones)
Exudyn version = 1.8.28.dev1 (Jones)

+ **University of Innsbruck**, Department of Mechatronics, Innsbruck, Austria

Expand Down
2 changes: 1 addition & 1 deletion docs/RST/CCode.rst
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ No-abbreviations-rule
The code uses a \ **minimum set of abbreviations**\ ; however, the following abbreviation rules are used throughout:
In general: DO NOT ABBREVIATE function, class or variable names: GetDataPointer() instead of GetPtr(); exception: cnt, i, j, k, x or v in cases where it is really clear (short, 5-line member functions).

\ **Exceptions**\ to the NO-ABBREVIATIONS-RULE, see also \hyperref[sec:listOfAbbreviations]{\underline{List of Abbreviations}}:
\ **Exceptions**\ to the NO-ABBREVIATIONS-RULE:

+ \ :ref:`ODE <ODE>`\
+ \ :ref:`ODE2 <ODE2>`\ : marks parts related to second order differential equations (SOS2, EvalF2 in HOTINT)
Expand Down
249 changes: 249 additions & 0 deletions docs/RST/Examples/NGsolveGeometry.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@

.. _examples-ngsolvegeometry:

******************
NGsolveGeometry.py
******************

You can view and download this file on Github: `NGsolveGeometry.py <https://github.com/jgerstmayr/EXUDYN/tree/master/main/pythonDev/Examples/NGsolveGeometry.py>`_

.. code-block:: python
:linenos:
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This is an EXUDYN example
#
# Details: Example to show how to create CSG-geometry in Netgen and import as STL into exudyn
#
# Author: Johannes Gerstmayr
# Date: 2021-04-20
#
# Copyright:This file is part of Exudyn. Exudyn is free software. You can redistribute it and/or modify it under the terms of the Exudyn license. See 'LICENSE.txt' for more details.
#
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
import exudyn as exu
from exudyn.utilities import *
from exudyn.FEM import *
SC = exu.SystemContainer()
mbs = SC.AddSystem()
import numpy as np
import time
#%%+++++++++++++++++++++++++++++++++++++++++++++++++++++
#netgen/meshing part:
#geometrical parameters:
L = 0.2 #Length of body
sy = 0.04 #width of body (Y)
sz = 0.03 #height of body (Z)
dy = 0.005 #additional distance Y
r = 0.015 #radius of bolt
R = 0.025 #outer radius
x = 0.002
meshH = 0.005 #0.01 is default, 0.002 gives 100000 nodes and is fairly converged;
curvaturesafety = 5
axis = 0.15
rotBasis = np.eye(3 )
#steel: (not needed for drawing ...)
rho = 7850
Emodulus=2.1e11
nu=0.3
#test high flexibility
Emodulus=2e8
# nModes = 32
#helper function for cylinder with netgen
def CSGcylinder(p0,p1,r):
v = VSub(p1,p0)
v = Normalize(v)
cyl = Cylinder(Pnt(p0[0],p0[1],p0[2]), Pnt(p1[0],p1[1],p1[2]),
r) * Plane(Pnt(p0[0],p0[1],p0[2]), Vec(-v[0],-v[1],-v[2])) * Plane(Pnt(p1[0],p1[1],p1[2]), Vec(v[0],v[1],v[2]))
return cyl
meshCreated = False
#%%+++++++++++++++++++++++++++++++++++++++++++++++++++++
import ngsolve as ngs
import netgen
from netgen.meshing import *
from netgen.geom2d import unit_square
#import netgen.libngpy as libng
from netgen.csg import *
showCase = 'revolute'
showCase = 'spheric'
if showCase == 'revolute':
rotBasis = RotationMatrixX(-0.5*pi)
#++++++++++++++++++++++++++++++++++++++++++++++++++++
#first body
geo0 = CSGeometry()
#plate
block = OrthoBrick(Pnt(0, x, -0.5*sz),Pnt(L, sy-x, 0.5*sz))
blockCyl = CSGcylinder(p0=[0,0,0], p1=[0,sy,0], r=R)
bolt0 = CSGcylinder(p0=[0,sy,0], p1=[0,2*sy+dy,0], r=r)
geo0.Add(block+blockCyl+bolt0)
mesh0 = ngs.Mesh( geo0.GenerateMesh(maxh=meshH, curvaturesafety=curvaturesafety))
mesh0.Curve(1)
#++++++++++++++++++++++++++++++++++++++++++++++++++++
#second body
geo1 = CSGeometry()
#plate
block = OrthoBrick(Pnt(0, x, -0.5*sz),Pnt(L, sy-x, 0.5*sz))
blockCyl = CSGcylinder(p0=[0,0,0], p1=[0,sy,0], r=R)
hole = CSGcylinder(p0=[0,-sy*0.1,0], p1=[0,1.1*sy,0], r=r)
geo1.Add(block+blockCyl-hole)
mesh1 = ngs.Mesh( geo1.GenerateMesh(maxh=meshH, curvaturesafety=curvaturesafety))
mesh1.Curve(1)
if False: #set this to true, if you want to visualize the mesh inside netgen/ngsolve
import netgen.gui
ngs.Draw(mesh1)
for i in range(10000000):
netgen.Redraw() #this makes the netgen window interactive
time.sleep(0.05)
#%%+++++++++++++++++++++++++++++++++++++++++++++++++++++
#import body with fem (this could be simplified in future ...)
#body0
fem0 = FEMinterface()
fem0.ImportMeshFromNGsolve(mesh0, density=rho, youngsModulus=Emodulus, poissonsRatio=nu)
graphics0 = GraphicsDataFromPointsAndTrigs(fem0.GetNodePositionsAsArray(), fem0.GetSurfaceTriangles(),
color=color4dodgerblue, )
graphics0 = AddEdgesAndSmoothenNormals(graphics0)
mbs.CreateRigidBody(referencePosition=[0,-sy*2-dy,0],
referenceRotationMatrix=RotationMatrixX(0),
inertia=InertiaCuboid(1000, [1,1,1]),
graphicsDataList=[graphics0])
#+++++++++++++++++++++++++++++++++++++++++++++++++++++
#body1
fem1 = FEMinterface()
fem1.ImportMeshFromNGsolve(mesh1, density=rho, youngsModulus=Emodulus, poissonsRatio=nu)
graphics1 = GraphicsDataFromPointsAndTrigs(fem1.GetNodePositionsAsArray(), fem1.GetSurfaceTriangles(),
color=color4lightred)
graphics1 = AddEdgesAndSmoothenNormals(graphics1)
mbs.CreateRigidBody(referencePosition=[0,-sy,0],
referenceRotationMatrix=RotationMatrixY(1.2*pi),
inertia=InertiaCuboid(1000, [1,1,1]),
graphicsDataList=[graphics1])
if showCase == 'spheric':
#++++++++++++++++++++++++++++++++++++++++++++++++++++
#first body
geo0 = CSGeometry()
meshH *= 0.5
block = OrthoBrick(Pnt(0, -0.4*sy, -0.4*sz),Pnt(L, 0.4*sy, 0.4*sz))
sphere = Sphere( Pnt(0, 0, 0), R*1.2)
cutBlock = OrthoBrick(Pnt(-1, -sy, -sz),Pnt(-0.3*R, sy, sz))
cutSphere = Sphere( Pnt(0, 0, 0), R)
geo0.Add(block+sphere-cutBlock-cutSphere)
mesh0 = ngs.Mesh( geo0.GenerateMesh(maxh=meshH, curvaturesafety=curvaturesafety))
mesh0.Curve(1)
#++++++++++++++++++++++++++++++++++++++++++++++++++++
#second body
geo1 = CSGeometry()
#plate
block = OrthoBrick(Pnt(0, -0.4*sz, -0.4*sz),Pnt(L, 0.4*sz, 0.4*sz))
sphere = Sphere( Pnt(0, 0, 0), R)
geo1.Add(block+sphere)
mesh1 = ngs.Mesh( geo1.GenerateMesh(maxh=meshH, curvaturesafety=curvaturesafety))
mesh1.Curve(1)
if False: #set this to true, if you want to visualize the mesh inside netgen/ngsolve
import netgen.gui
ngs.Draw(mesh1)
for i in range(10000000):
netgen.Redraw() #this makes the netgen window interactive
time.sleep(0.05)
#%%+++++++++++++++++++++++++++++++++++++++++++++++++++++
#import body with fem (this could be simplified in future ...)
#body0
fem0 = FEMinterface()
fem0.ImportMeshFromNGsolve(mesh0, density=rho, youngsModulus=Emodulus, poissonsRatio=nu)
graphics0 = GraphicsDataFromPointsAndTrigs(fem0.GetNodePositionsAsArray(), fem0.GetSurfaceTriangles(),
color=color4dodgerblue, )
graphics0 = AddEdgesAndSmoothenNormals(graphics0)
mbs.CreateRigidBody(referencePosition=[0,-sy,0],
referenceRotationMatrix=RotationMatrixX(0),
inertia=InertiaCuboid(1000, [1,1,1]),
graphicsDataList=[graphics0])
#+++++++++++++++++++++++++++++++++++++++++++++++++++++
#body1
fem1 = FEMinterface()
fem1.ImportMeshFromNGsolve(mesh1, density=rho, youngsModulus=Emodulus, poissonsRatio=nu)
graphics1 = GraphicsDataFromPointsAndTrigs(fem1.GetNodePositionsAsArray(), fem1.GetSurfaceTriangles(),
color=color4lightred)
graphics1 = AddEdgesAndSmoothenNormals(graphics1)
mbs.CreateRigidBody(referencePosition=[0,-sy,0],
referenceRotationMatrix=RotationMatrixZ(-0.12*pi)@RotationMatrixY(1.15*pi),
inertia=InertiaCuboid(1000, [1,1,1]),
graphicsDataList=[graphics1])
#+++++++++++++++++++++++++++++++++++++++++++++++++
#world basis
gl=[]
gl += [GraphicsDataText(point=rotBasis@[axis,0,0],text='X')]
gl += [GraphicsDataText(point=rotBasis@[0,axis,0],text='Y')]
gl += [GraphicsDataText(point=rotBasis@[0,0,axis],text='Z')]
gl += [GraphicsDataBasis(origin=[0,0,0], rotationMatrix=rotBasis, length=axis)]
mbs.CreateGround(graphicsDataList=gl)
mbs.Assemble()
#%%++++++++++++++++++++++++++++++
SC.visualizationSettings.openGL.polygonOffset = 0.1 #to draw edges clearly
SC.visualizationSettings.openGL.lineWidth = 2
SC.visualizationSettings.openGL.multiSampling = 4
# SC.visualizationSettings.general.drawWorldBasis = True
# SC.visualizationSettings.general.worldBasisSize = axis
SC.visualizationSettings.general.drawCoordinateSystem = False
SC.visualizationSettings.general.textSize = 16
SC.visualizationSettings.window.renderWindowSize = [1600,1200]
mbs.SolveDynamic()
mbs.SolutionViewer()
Loading

0 comments on commit 3caf20e

Please sign in to comment.