Salome HOME
e837fc9d77b1281f4abf86833cb3e297803c4fe8
[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 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     print("Creating Parallel Mesh")
102     par_mesh = smesh.ParallelMesh(geom, name="par_mesh")
103     par_mesh.AddGlobalHypothesis(netgen_parameters)
104     param = par_mesh.GetParallelismSettings()
105     param.SetNbThreads(6)
106
107     assert param.GetNbThreads() == 6, param.GetNbThreads()
108
109     print("Starting sequential compute")
110     start = time.monotonic()
111     is_done = seq_mesh.Compute()
112     assert is_done
113     stop = time.monotonic()
114     time_seq = stop-start
115
116     print("Starting parallel compute")
117     start = time.monotonic()
118     is_done = par_mesh.Compute()
119     assert is_done
120     stop = time.monotonic()
121     time_par = stop-start
122
123     print("  Tetrahedron: ", seq_mesh.NbTetras(), par_mesh.NbTetras())
124     print("  Triangle: ", seq_mesh.NbTriangles(), par_mesh.NbTriangles())
125     print("  edge: ", seq_mesh.NbEdges(), par_mesh.NbEdges())
126
127     assert  par_mesh.NbTetras() > 0
128     assert  par_mesh.NbTriangles() > 0
129     assert  par_mesh.NbEdges() > 0
130
131     print("Time elapsed (seq, par): ", time_seq, time_par)
132
133 def main():
134     if sys.platform == "win32":
135         print("Test disabled on Windows")
136         return
137     nbox = 2
138     boxsize = 100
139     run_test(nbox, boxsize)
140
141 main()