performanceMultiThreadingNG.py
You can view and download this file on Github: performanceMultiThreadingNG.py
1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2# This is an EXUDYN example
3#
4# Details: Test performance of unconstrained bodies
5# Uses NGsolve multi-threading tools
6#
7# Author: Johannes Gerstmayr
8# Date: 2020-09-15
9#
10# 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.
11#
12#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13
14import exudyn as exu
15from exudyn.itemInterface import *
16from exudyn.utilities import *
17from exudyn.graphicsDataUtilities import *
18
19
20#import numpy as np
21
22SC = exu.SystemContainer()
23mbs = SC.AddSystem()
24
25print("version=", exu.GetVersionString())
26
27#nBodiesList = [10,20,50,100,200,500,1000,2000,5000,10000]
28nBodiesList = [20,40,100,400,1000,5000]
29#nBodiesList = [10,100,1000,10000]
30results = []
31
32for nBodies in nBodiesList:
33
34 mbs.Reset()
35
36 a=0.03
37 gBody = GraphicsDataOrthoCube(-a, -a, -a, a, a, a, color=color4steelblue)
38
39 m = 1 #mass
40 J=[1,2,3,0,0,0] #inertia
41 omega0 = [0.01,0.03,0]
42
43 useEulerParameters = False
44
45 if useEulerParameters:
46 ep_t0 = list(AngularVelocity2EulerParameters_t(omega0, eulerParameters0))
47 for i in range(nBodies):
48 n = mbs.AddNode(RigidEP(referenceCoordinates=[0.1*i,0,0]+list(eulerParameters0),
49 initialVelocities=[0,0,0]+ ep_t0))
50 o = mbs.AddObject(RigidBody(physicsMass=m, physicsInertia=J, nodeNumber=n,
51 visualization=VObjectRigidBody(graphicsData=[gBody])))
52 else:
53 for i in range(nBodies):
54 n = mbs.AddNode(RigidRxyz(referenceCoordinates=[0.1*i,0,0]+[0]*3,
55 initialVelocities=[0,0,0]+ omega0))
56 o = mbs.AddObject(RigidBody(physicsMass=m, physicsInertia=J, nodeNumber=n,
57 visualization=VObjectRigidBody(graphicsData=[gBody])))
58
59 mbs.Assemble()
60
61 simulationSettings = exu.SimulationSettings() #takes currently set values or default values
62
63 tEnd = 1*1000/nBodies
64 h=0.0005 #no visual differences for step sizes smaller than 0.0005
65
66 simulationSettings.timeIntegration.numberOfSteps = int(tEnd/h)
67 simulationSettings.timeIntegration.endTime = tEnd
68 simulationSettings.solutionSettings.writeSolutionToFile = False
69
70 #simulationSettings.solutionSettings.solutionWritePeriod = 0.01
71 #simulationSettings.solutionSettings.sensorsWritePeriod = h*4
72 simulationSettings.timeIntegration.verboseMode = 1
73 simulationSettings.timeIntegration.verboseModeFile = 0
74
75 simulationSettings.timeIntegration.newton.useModifiedNewton = True
76
77 simulationSettings.timeIntegration.generalizedAlpha.useIndex2Constraints = True
78 simulationSettings.timeIntegration.generalizedAlpha.useNewmark = True
79 simulationSettings.timeIntegration.generalizedAlpha.spectralRadius = 0.5#0.5
80 simulationSettings.timeIntegration.generalizedAlpha.computeInitialAccelerations=True
81
82 simulationSettings.linearSolverType=exu.LinearSolverType.EigenSparse
83 simulationSettings.displayComputationTime = True
84 #simulationSettings.displayStatistics = True
85
86 SC.visualizationSettings.nodes.show = True
87 SC.visualizationSettings.nodes.drawNodesAsPoint = False
88 SC.visualizationSettings.nodes.showBasis = True
89 SC.visualizationSettings.nodes.basisSize = 0.015
90
91 #exu.StartRenderer()
92 #mbs.WaitForUserToContinue()
93
94 threadsList = [1,2,3,4,6,8,10,12]#,14,16]#,20,24]
95 #threadsList = [1,4,10]#,14,16]#,20,24]
96 tTotalList = []
97 tODE2RHSlist = []
98 tMassMatrixList = []
99 tNewtonIncrementList = []
100
101 for nThreads in threadsList:
102 simulationSettings.parallel.numberOfThreads = nThreads
103 #print("=====================================================")
104 print("compute with", nThreads, " threads")
105 #print("=======================================")
106 solver = exu.MainSolverImplicitSecondOrder()
107 solver.SolveSystem(mbs, simulationSettings)
108
109 #tNewtonIncrement = solver.timer.newtonIncrement
110
111 tTotalList += [solver.timer.total]
112 tODE2RHSlist += [solver.timer.ODE2RHS]
113 tMassMatrixList += [solver.timer.massMatrix]
114 tNewtonIncrementList += [solver.timer.newtonIncrement]
115
116 print("=====================================================")
117 print("nBodies =",nBodies)
118 print("thread count =",threadsList)
119 print("CPU times =",tTotalList)
120 print("ODE2RHS times =",tODE2RHSlist)
121 print("massMatrix times =",tMassMatrixList)
122 print("newtonIncrement t=",tNewtonIncrementList)
123
124 results += [{'nBodies':nBodies,
125 'threads':threadsList,
126 'CPU time':tTotalList,
127 'RHS CPU time':tODE2RHSlist,
128 'mass matrix CPU time':tMassMatrixList,
129 'newton increment CPU time':tNewtonIncrementList,
130 }]
131
132 #SC.WaitForRenderEngineStopFlag()
133 #exu.StopRenderer() #safely close rendering window!
134
135print("results=",results)