1 # contains function to compute a mesh in parallel
2 from platform import java_ver
7 print("warning: could not import tkinter")
15 import salome_notebook
16 notebook = salome_notebook.NoteBook()
23 from salome.geom import geomBuilder
24 from salome.smesh import smeshBuilder
30 geompy = geomBuilder.New()
32 smesh = smeshBuilder.New()
35 def build_seq_mesh(nbox, boxsize, offset):
38 # First creating all the boxes
43 x_orig = i*(boxsize+offset)
44 y_orig = j*(boxsize+offset)
45 z_orig = k*(boxsize+offset)
47 tmp_box = geompy.MakeBoxDXDYDZ(boxsize, boxsize, boxsize)
49 if not i == j == k == 0:
50 box = geompy.MakeTranslation(tmp_box, x_orig,
55 geompy.addToStudy(box, 'box_{}:{}:{}'.format(i, j, k))
59 # Create fuse of all boxes
60 all_boxes = geompy.MakeCompound(boxes)
61 geompy.addToStudy(all_boxes, 'Compound_1')
63 # Removing duplicates faces and edges
64 all_boxes = geompy.MakeGlueFaces(all_boxes, 1e-07)
65 geompy.addToStudy(all_boxes, 'Glued_Faces_1')
67 all_boxes = geompy.MakeGlueEdges(all_boxes, 1e-07)
68 geompy.addToStudy(all_boxes, 'rubik_cube')
71 # Building sequetial mesh
72 print("Creating mesh")
73 all_box_mesh = smesh.Mesh(all_boxes, "seq_mesh")
76 algo3d = all_box_mesh.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D)
78 netgen_parameters = algo3d.Parameters()
79 netgen_parameters.SetMaxSize(34.641)
80 netgen_parameters.SetMinSize(0.141421)
81 netgen_parameters.SetOptimize(1)
82 netgen_parameters.SetCheckOverlapping(0)
83 netgen_parameters.SetCheckChartBoundary(0)
84 netgen_parameters.SetFineness(5)
85 netgen_parameters.SetNbSegPerEdge(16*(boxsize//100))
86 netgen_parameters.SetNbSegPerRadius(1.5)
87 netgen_parameters.SetGrowthRate(0.15)
88 netgen_parameters.SetChordalError(-1)
89 netgen_parameters.SetChordalErrorEnabled(0)
90 netgen_parameters.SetUseSurfaceCurvature(1)
91 netgen_parameters.SetQuadAllowed(0)
92 netgen_parameters.SetCheckOverlapping(False)
93 netgen_parameters.SetNbThreads(2)
95 return all_boxes, all_box_mesh, netgen_parameters
97 def run_test(nbox=2, boxsize=100):
98 """ Run sequential mesh and parallel version of it
100 nbox: NUmber of boxes
101 boxsize: Size of each box
103 geom, seq_mesh, netgen_parameters = build_seq_mesh(nbox, boxsize, 0)
105 print("Creating Parallel Mesh")
106 par_mesh = smesh.ParallelMesh(geom, name="par_mesh")
107 par_mesh.AddGlobalHypothesis(netgen_parameters)
108 param = par_mesh.GetParallelismSettings()
109 param.SetNbThreads(6)
111 assert param.GetNbThreads() == 6, param.GetNbThreads()
113 print("Starting sequential compute")
114 start = time.monotonic()
115 is_done = seq_mesh.Compute()
117 stop = time.monotonic()
118 time_seq = stop-start
120 print("Starting parallel compute")
121 start = time.monotonic()
122 is_done = par_mesh.Compute()
124 stop = time.monotonic()
125 time_par = stop-start
127 print(" Tetrahedron: ", seq_mesh.NbTetras(), par_mesh.NbTetras())
128 print(" Triangle: ", seq_mesh.NbTriangles(), par_mesh.NbTriangles())
129 print(" edge: ", seq_mesh.NbEdges(), par_mesh.NbEdges())
131 assert par_mesh.NbTetras() > 0
132 assert par_mesh.NbTriangles() > 0
133 assert par_mesh.NbEdges() > 0
135 print("Time elapsed (seq, par): ", time_seq, time_par)
138 if sys.platform == "win32":
139 print("Test disabled on Windows")
143 run_test(nbox, boxsize)