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)