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 * #includes itemInterface and rigidBodyUtilities
 17import exudyn.graphics as graphics
 18
 19
 20#import numpy as np
 21
 22SC = exu.SystemContainer()
 23mbs = SC.AddSystem()
 24
 25print("version=", exu.config.Version())
 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 = graphics.Brick(centerPoint=[0, 0, 0], size=[2*a, 2*a, 2*a], color=graphics.color.steelblue)
 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(mass=m, inertia=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(mass=m, inertia=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.solution.file.write = False
 69
 70    #simulationSettings.solution.file.writePeriod = 0.01
 71    #simulationSettings.solution.sensors.writePeriod = 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.linearSolver.solverType=exu.LinearSolverType.EigenSparse
 83    simulationSettings.show.computationTime = True
 84    #simulationSettings.show.statistics = 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    #SC.renderer.Start()
 92    #SC.renderer.DoIdleTasks()
 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.renderer.DoIdleTasks()
133    #SC.renderer.Stop() #safely close rendering window!
134
135print("results=",results)