multiprocessingTest.py

You can view and download this file on Github: multiprocessingTest.py

 1#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2# This is an EXUDYN example
 3#
 4# Details:  Example to show how to use parallel computation of EXUDYN models;
 5#           Using multiprocessing, several instances of EXUDYN are executed (graphics DISABLED!!!)
 6#           This represents a very simple possibility to run parallel simulations;
 7#           More advanced parameter variation is available in exudyn.processing.ParameterVariation(...)
 8#
 9# Author:   Johannes Gerstmayr
10# Date:     2020-11-12
11#
12# 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.
13#
14#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15
16
17import exudyn as exu
18from exudyn.itemInterface import *
19from exudyn.utilities import *
20
21import numpy as np
22from multiprocessing import Pool
23
24#function, which creates and runs model; executed in parallel!
25def TestExudyn(x):
26
27    #create an environment for mini example
28    SC = exu.SystemContainer()
29    mbs = SC.AddSystem()
30
31    oGround=mbs.AddObject(ObjectGround(referencePosition= [0,0,0]))
32    nGround = mbs.AddNode(NodePointGround(referenceCoordinates=[0,0,0]))
33
34    testError=1 #set default error, if failed
35    exu.Print("start mini example for class ObjectMass1D")
36
37    node = mbs.AddNode(Node1D(referenceCoordinates = [0],
38                              initialCoordinates=[0.],
39                              initialVelocities=[1*x]))
40    mass = mbs.AddObject(Mass1D(nodeNumber = node, physicsMass=1))
41
42    #assemble and solve system for default parameters
43    mbs.Assemble()
44    #mbs.SolveDynamic(exu.SimulationSettings())
45
46    h=1e-6
47    tEnd = 10
48    simulationSettings = exu.SimulationSettings()
49    simulationSettings.timeIntegration.numberOfSteps = int(tEnd/h)
50    simulationSettings.timeIntegration.endTime = tEnd
51    simulationSettings.solutionSettings.coordinatesSolutionFileName = "coordinatesSolution"+str(int(x))+".txt"
52    simulationSettings.solutionSettings.writeSolutionToFile = True #no concurrent writing to files ...!
53    #exu.StartRenderer() #don't do this in parallelization: will crash
54    mbs.SolveDynamic(simulationSettings)
55    #exu.StopRenderer() #don't do this in parallelization: will crash
56
57    #check result, get current mass position at local position [0,0,0]
58    result = mbs.GetObjectOutputBody(mass, exu.OutputVariableType.Position, [0,0,0])[0]
59    print("result ",x, "=",result)
60    return result
61    #final x-coordinate of position shall be 2
62
63if __name__ == '__main__':
64    vInput = np.linspace(1,10,20) #start 20 tasks in parallel ...
65    with Pool(len(vInput)) as p:
66        print(p.map(TestExudyn, vInput))