Salome HOME
9cfc0ee8000c872906f251625ccaccfb7bc5622a
[modules/smesh.git] / test / SMESH_ParallelCompute.py
1 # contains function to compute a mesh in parallel
2 from platform import java_ver
3 import sys
4 from tkinter import W
5 import salome
6
7 import time
8
9
10 salome.salome_init()
11 import salome_notebook
12 notebook = salome_notebook.NoteBook()
13
14 ###
15 ### GEOM component
16 ###
17
18 import GEOM
19 from salome.geom import geomBuilder
20 from salome.smesh import smeshBuilder
21 import math
22 import SALOMEDS
23
24 import numpy as np
25
26 geompy = geomBuilder.New()
27
28 smesh = smeshBuilder.New()
29
30
31 def build_seq_mesh(nbox, boxsize, offset):
32     # Create 3D faces
33     boxes = []
34     # First creating all the boxes
35     for i in range(nbox):
36         for j in range(nbox):
37             for k in range(nbox):
38
39                 x_orig = i*(boxsize+offset)
40                 y_orig = j*(boxsize+offset)
41                 z_orig = k*(boxsize+offset)
42
43                 tmp_box = geompy.MakeBoxDXDYDZ(boxsize, boxsize, boxsize)
44
45                 if not i == j == k == 0:
46                     box = geompy.MakeTranslation(tmp_box, x_orig,
47                                                  y_orig, z_orig)
48                 else:
49                     box = tmp_box
50
51                 geompy.addToStudy(box, 'box_{}:{}:{}'.format(i, j, k))
52
53                 boxes.append(box)
54
55     # Create fuse of all boxes
56     all_boxes = geompy.MakeCompound(boxes)
57     geompy.addToStudy(all_boxes, 'Compound_1')
58
59     # Removing duplicates faces and edges
60     all_boxes = geompy.MakeGlueFaces(all_boxes, 1e-07)
61     geompy.addToStudy(all_boxes, 'Glued_Faces_1')
62
63     all_boxes = geompy.MakeGlueEdges(all_boxes, 1e-07)
64     geompy.addToStudy(all_boxes, 'rubik_cube')
65
66
67     # Building sequetial mesh
68     print("Creating mesh")
69     all_box_mesh = smesh.Mesh(all_boxes, "seq_mesh")
70
71     print("Adding algo")
72     algo3d = all_box_mesh.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D)
73
74     netgen_parameters = algo3d.Parameters()
75     netgen_parameters.SetMaxSize(34.641)
76     netgen_parameters.SetMinSize(0.141421)
77     netgen_parameters.SetOptimize(1)
78     netgen_parameters.SetCheckOverlapping(0)
79     netgen_parameters.SetCheckChartBoundary(0)
80     netgen_parameters.SetFineness(5)
81     netgen_parameters.SetNbSegPerEdge(16*(boxsize//100))
82     netgen_parameters.SetNbSegPerRadius(1.5)
83     netgen_parameters.SetGrowthRate(0.15)
84     netgen_parameters.SetChordalError(-1)
85     netgen_parameters.SetChordalErrorEnabled(0)
86     netgen_parameters.SetUseSurfaceCurvature(1)
87     netgen_parameters.SetQuadAllowed(0)
88     netgen_parameters.SetCheckOverlapping(False)
89     netgen_parameters.SetNbThreads(2)
90
91     return all_boxes, all_box_mesh, netgen_parameters
92
93 def run_test(nbox=2, boxsize=100):
94     """ Run sequential mesh and parallel version of it
95
96     nbox: NUmber of boxes
97     boxsize: Size of each box
98     """
99     geom, seq_mesh, netgen_parameters = build_seq_mesh(nbox, boxsize, 0)
100
101     par_mesh = smesh.ParallelMesh(geom, name="par_mesh")
102     par_mesh.AddGlobalHypothesis(netgen_parameters)
103     par_mesh.SetNbThreads(6)
104
105     start = time.monotonic()
106     is_done = seq_mesh.Compute()
107     assert is_done
108     stop = time.monotonic()
109     time_seq = stop-start
110
111     start = time.monotonic()
112     is_done = par_mesh.Compute()
113     assert is_done
114     stop = time.monotonic()
115     time_par = stop-start
116
117     print("  Tetrahedron: ", seq_mesh.NbTetras(), par_mesh.NbTetras())
118     print("  Triangle: ", seq_mesh.NbTriangles(), par_mesh.NbTriangles())
119     print("  edge: ", seq_mesh.NbEdges(), par_mesh.NbEdges())
120
121     assert  par_mesh.NbTetras() > 0
122     assert  par_mesh.NbTriangles() > 0
123     assert  par_mesh.NbEdges() > 0
124
125     print("Time elapsed (seq, par): ", time_seq, time_par)
126
127 def main():
128     if sys.platform == "win32":
129         print("Test disabled on Windows")
130         return
131     nbox = 2
132     boxsize = 100
133     run_test(nbox, boxsize)
134
135 main()