Salome HOME
Check result of Compute() in test and examples
[modules/smesh.git] / doc / examples / creating_parallel_mesh.py
1 # contains function to compute a mesh in parallel
2 from platform import java_ver
3 import sys
4 try:
5     from tkinter import W
6 except:
7     print("warning: could not import tkinter")
8
9 import salome
10
11 import time
12
13
14 salome.salome_init()
15 import salome_notebook
16 notebook = salome_notebook.NoteBook()
17
18 ###
19 ### GEOM component
20 ###
21
22 import GEOM
23 from salome.geom import geomBuilder
24 from salome.smesh import smeshBuilder
25 import math
26 import SALOMEDS
27
28 import numpy as np
29
30 geompy = geomBuilder.New()
31
32 smesh = smeshBuilder.New()
33
34
35 def build_seq_mesh(nbox, boxsize, offset):
36     # Create 3D faces
37     boxes = []
38     # First creating all the boxes
39     for i in range(nbox):
40         for j in range(nbox):
41             for k in range(nbox):
42
43                 x_orig = i*(boxsize+offset)
44                 y_orig = j*(boxsize+offset)
45                 z_orig = k*(boxsize+offset)
46
47                 tmp_box = geompy.MakeBoxDXDYDZ(boxsize, boxsize, boxsize)
48
49                 if not i == j == k == 0:
50                     box = geompy.MakeTranslation(tmp_box, x_orig,
51                                                  y_orig, z_orig)
52                 else:
53                     box = tmp_box
54
55                 geompy.addToStudy(box, 'box_{}:{}:{}'.format(i, j, k))
56
57                 boxes.append(box)
58
59     # Create fuse of all boxes
60     all_boxes = geompy.MakeCompound(boxes)
61     geompy.addToStudy(all_boxes, 'Compound_1')
62
63     # Removing duplicates faces and edges
64     all_boxes = geompy.MakeGlueFaces(all_boxes, 1e-07)
65     geompy.addToStudy(all_boxes, 'Glued_Faces_1')
66
67     all_boxes = geompy.MakeGlueEdges(all_boxes, 1e-07)
68     geompy.addToStudy(all_boxes, 'rubik_cube')
69
70
71     # Building sequetial mesh
72     print("Creating mesh")
73     all_box_mesh = smesh.Mesh(all_boxes, "seq_mesh")
74
75     print("Adding algo")
76     algo3d = all_box_mesh.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D)
77
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)
94
95     return all_boxes, all_box_mesh, netgen_parameters
96
97 def run_test(nbox=2, boxsize=100):
98     """ Run sequential mesh and parallel version of it
99
100     nbox: NUmber of boxes
101     boxsize: Size of each box
102     """
103     geom, seq_mesh, netgen_parameters = build_seq_mesh(nbox, boxsize, 0)
104
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)
110
111     assert param.GetNbThreads() == 6, param.GetNbThreads()
112
113     print("Starting sequential compute")
114     start = time.monotonic()
115     is_done = seq_mesh.Compute()
116     if not is_done:
117         raise Exception("Error when computing Mesh")
118
119     stop = time.monotonic()
120     time_seq = stop-start
121
122     print("Starting parallel compute")
123     start = time.monotonic()
124     is_done = par_mesh.Compute()
125     if not is_done:
126         raise Exception("Error when computing Mesh")
127
128     stop = time.monotonic()
129     time_par = stop-start
130
131     print("  Tetrahedron: ", seq_mesh.NbTetras(), par_mesh.NbTetras())
132     print("  Triangle: ", seq_mesh.NbTriangles(), par_mesh.NbTriangles())
133     print("  edge: ", seq_mesh.NbEdges(), par_mesh.NbEdges())
134
135     assert  par_mesh.NbTetras() > 0
136     assert  par_mesh.NbTriangles() > 0
137     assert  par_mesh.NbEdges() > 0
138
139     print("Time elapsed (seq, par): ", time_seq, time_par)
140
141 def main():
142     if sys.platform == "win32":
143         print("Test disabled on Windows")
144         return
145     nbox = 2
146     boxsize = 100
147     run_test(nbox, boxsize)
148
149 main()