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))