You can view and download this file on Github: performanceMultiThreadingNG.py
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# This is an EXUDYN example
#
# Details: Test performance of unconstrained bodies
# Uses NGsolve multi-threading tools
#
# Author: Johannes Gerstmayr
# Date: 2020-09-15
#
# 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.itemInterface import *
from exudyn.utilities import *
from exudyn.graphicsDataUtilities import *
#import numpy as np
SC = exu.SystemContainer()
mbs = SC.AddSystem()
print("version=", exu.GetVersionString())
#nBodiesList = [10,20,50,100,200,500,1000,2000,5000,10000]
nBodiesList = [20,40,100,400,1000,5000]
#nBodiesList = [10,100,1000,10000]
results = []
for nBodies in nBodiesList:
mbs.Reset()
a=0.03
gBody = GraphicsDataOrthoCube(-a, -a, -a, a, a, a, color=color4steelblue)
m = 1 #mass
J=[1,2,3,0,0,0] #inertia
omega0 = [0.01,0.03,0]
useEulerParameters = False
if useEulerParameters:
ep_t0 = list(AngularVelocity2EulerParameters_t(omega0, eulerParameters0))
for i in range(nBodies):
n = mbs.AddNode(RigidEP(referenceCoordinates=[0.1*i,0,0]+list(eulerParameters0),
initialVelocities=[0,0,0]+ ep_t0))
o = mbs.AddObject(RigidBody(physicsMass=m, physicsInertia=J, nodeNumber=n,
visualization=VObjectRigidBody(graphicsData=[gBody])))
else:
for i in range(nBodies):
n = mbs.AddNode(RigidRxyz(referenceCoordinates=[0.1*i,0,0]+[0]*3,
initialVelocities=[0,0,0]+ omega0))
o = mbs.AddObject(RigidBody(physicsMass=m, physicsInertia=J, nodeNumber=n,
visualization=VObjectRigidBody(graphicsData=[gBody])))
mbs.Assemble()
simulationSettings = exu.SimulationSettings() #takes currently set values or default values
tEnd = 1*1000/nBodies
h=0.0005 #no visual differences for step sizes smaller than 0.0005
simulationSettings.timeIntegration.numberOfSteps = int(tEnd/h)
simulationSettings.timeIntegration.endTime = tEnd
simulationSettings.solutionSettings.writeSolutionToFile = False
#simulationSettings.solutionSettings.solutionWritePeriod = 0.01
#simulationSettings.solutionSettings.sensorsWritePeriod = h*4
simulationSettings.timeIntegration.verboseMode = 1
simulationSettings.timeIntegration.verboseModeFile = 0
simulationSettings.timeIntegration.newton.useModifiedNewton = True
simulationSettings.timeIntegration.generalizedAlpha.useIndex2Constraints = True
simulationSettings.timeIntegration.generalizedAlpha.useNewmark = True
simulationSettings.timeIntegration.generalizedAlpha.spectralRadius = 0.5#0.5
simulationSettings.timeIntegration.generalizedAlpha.computeInitialAccelerations=True
simulationSettings.linearSolverType=exu.LinearSolverType.EigenSparse
simulationSettings.displayComputationTime = True
#simulationSettings.displayStatistics = True
SC.visualizationSettings.nodes.show = True
SC.visualizationSettings.nodes.drawNodesAsPoint = False
SC.visualizationSettings.nodes.showBasis = True
SC.visualizationSettings.nodes.basisSize = 0.015
#exu.StartRenderer()
#mbs.WaitForUserToContinue()
threadsList = [1,2,3,4,6,8,10,12]#,14,16]#,20,24]
#threadsList = [1,4,10]#,14,16]#,20,24]
tTotalList = []
tODE2RHSlist = []
tMassMatrixList = []
tNewtonIncrementList = []
for nThreads in threadsList:
simulationSettings.parallel.numberOfThreads = nThreads
#print("=====================================================")
print("compute with", nThreads, " threads")
#print("=======================================")
solver = exu.MainSolverImplicitSecondOrder()
solver.SolveSystem(mbs, simulationSettings)
#tNewtonIncrement = solver.timer.newtonIncrement
tTotalList += [solver.timer.total]
tODE2RHSlist += [solver.timer.ODE2RHS]
tMassMatrixList += [solver.timer.massMatrix]
tNewtonIncrementList += [solver.timer.newtonIncrement]
print("=====================================================")
print("nBodies =",nBodies)
print("thread count =",threadsList)
print("CPU times =",tTotalList)
print("ODE2RHS times =",tODE2RHSlist)
print("massMatrix times =",tMassMatrixList)
print("newtonIncrement t=",tNewtonIncrementList)
results += [{'nBodies':nBodies,
'threads':threadsList,
'CPU time':tTotalList,
'RHS CPU time':tODE2RHSlist,
'mass matrix CPU time':tMassMatrixList,
'newton increment CPU time':tNewtonIncrementList,
}]
#SC.WaitForRenderEngineStopFlag()
#exu.StopRenderer() #safely close rendering window!
print("results=",results)