Salome HOME
fccec13004cd413103483135123ac6fd80086c21
[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, netgen_parameters, 6, name="par_mesh")
102
103     start = time.monotonic()
104     is_done = seq_mesh.Compute()
105     assert is_done
106     stop = time.monotonic()
107     time_seq = stop-start
108
109     start = time.monotonic()
110     is_done = par_mesh.Compute()
111     assert is_done
112     stop = time.monotonic()
113     time_par = stop-start
114
115     print("  Tetrahedron: ", seq_mesh.NbTetras(), par_mesh.NbTetras())
116     print("  Triangle: ", seq_mesh.NbTriangles(), par_mesh.NbTriangles())
117     print("  edge: ", seq_mesh.NbEdges(), par_mesh.NbEdges())
118
119     assert  par_mesh.NbTetras() > 0
120     assert  par_mesh.NbTriangles() > 0
121     assert  par_mesh.NbEdges() > 0
122
123     print("Time elapsed (seq, par): ", time_seq, time_par)
124
125 def main():
126     if sys.platform == "win32":
127         print("Test disabled on Windows")
128         return
129     nbox = 2
130     boxsize = 100
131     run_test(nbox, boxsize)
132
133 main()