Salome HOME
Revert "Adding Multinode method for smesh parallelism + cleanup and doc"
[modules/smesh.git] / doc / examples / creating_parallel_mesh.py
index 3096749549730b2adedc7bfce0151eedc7cb8493..809d8ef6922968d293d8c1cb7da87fb142ee300d 100644 (file)
@@ -1,6 +1,16 @@
 # contains function to compute a mesh in parallel
+from platform import java_ver
+import sys
+try:
+    from tkinter import W
+except:
+    print("warning: could not import tkinter")
+
 import salome
 
+import time
+
+
 salome.salome_init()
 import salome_notebook
 notebook = salome_notebook.NoteBook()
@@ -12,77 +22,128 @@ notebook = salome_notebook.NoteBook()
 import GEOM
 from salome.geom import geomBuilder
 from salome.smesh import smeshBuilder
+import math
 import SALOMEDS
 
 import numpy as np
 
 geompy = geomBuilder.New()
 
+smesh = smeshBuilder.New()
 
-nbox = 2
-boxsize = 100
-offset = 0
-# Create 3D faces
-boxes = []
-# First creating all the boxes
-for i in range(nbox):
-    for j in range(nbox):
-        for k in range(nbox):
-
-            x_orig = i*(boxsize+offset)
-            y_orig = j*(boxsize+offset)
-            z_orig = k*(boxsize+offset)
-
-            tmp_box = geompy.MakeBoxDXDYDZ(boxsize, boxsize, boxsize)
-
-            if not i == j == k == 0:
-                box = geompy.MakeTranslation(tmp_box, x_orig,
-                                             y_orig, z_orig)
-            else:
-                box = tmp_box
-
-            geompy.addToStudy(box, 'box_{}:{}:{}'.format(i, j, k))
-
-            boxes.append(box)
-
-# Create fuse of all boxes
-all_boxes = geompy.MakeCompound(boxes)
-geompy.addToStudy(all_boxes, 'Compound_1')
-
-# Removing duplicates faces and edges
-all_boxes = geompy.MakeGlueFaces(all_boxes, 1e-07)
-geompy.addToStudy(all_boxes, 'Glued_Faces_1')
-
-rubik_cube = geompy.MakeGlueEdges(all_boxes, 1e-07)
-geompy.addToStudy(all_boxes, 'rubik_cube')
 
+def build_seq_mesh(nbox, boxsize, offset):
+    # Create 3D faces
+    boxes = []
+    # First creating all the boxes
+    for i in range(nbox):
+        for j in range(nbox):
+            for k in range(nbox):
 
-smesh = smeshBuilder.New()
-print("Creating Parallel Mesh")
-par_mesh = smesh.ParallelMesh(rubik_cube, name="par_mesh")
-
-print("Creating hypoehtesis for netgen")
-NETGEN_3D_Parameters_1 = smesh.CreateHypothesisByAverageLength( 'NETGEN_Parameters',
-                                         'NETGENEngine', 34.641, 0 )
-print("Adding hypothesis")
-par_mesh.AddGlobalHypothesis(NETGEN_3D_Parameters_1)
-
-print("Setting parallelism method")
-par_mesh.SetParallelismMethod(smeshBuilder.MULTITHREAD)
-
-print("Setting parallelism options")
-param = par_mesh.GetParallelismSettings()
-param.SetNbThreads(6)
-
-print("Starting parallel compute")
-is_done = par_mesh.Compute()
-if not is_done:
-    raise Exception("Error when computing Mesh")
-
-print("  Tetrahedron: ",  par_mesh.NbTetras())
-print("  Triangle: ", par_mesh.NbTriangles())
-print("  edge: ", par_mesh.NbEdges())
-
-assert  par_mesh.NbTetras() > 0
-assert  par_mesh.NbTriangles() > 0
-assert  par_mesh.NbEdges() > 0
+                x_orig = i*(boxsize+offset)
+                y_orig = j*(boxsize+offset)
+                z_orig = k*(boxsize+offset)
+
+                tmp_box = geompy.MakeBoxDXDYDZ(boxsize, boxsize, boxsize)
+
+                if not i == j == k == 0:
+                    box = geompy.MakeTranslation(tmp_box, x_orig,
+                                                 y_orig, z_orig)
+                else:
+                    box = tmp_box
+
+                geompy.addToStudy(box, 'box_{}:{}:{}'.format(i, j, k))
+
+                boxes.append(box)
+
+    # Create fuse of all boxes
+    all_boxes = geompy.MakeCompound(boxes)
+    geompy.addToStudy(all_boxes, 'Compound_1')
+
+    # Removing duplicates faces and edges
+    all_boxes = geompy.MakeGlueFaces(all_boxes, 1e-07)
+    geompy.addToStudy(all_boxes, 'Glued_Faces_1')
+
+    all_boxes = geompy.MakeGlueEdges(all_boxes, 1e-07)
+    geompy.addToStudy(all_boxes, 'rubik_cube')
+
+
+    # Building sequetial mesh
+    print("Creating mesh")
+    all_box_mesh = smesh.Mesh(all_boxes, "seq_mesh")
+
+    print("Adding algo")
+    algo3d = all_box_mesh.Tetrahedron(algo=smeshBuilder.NETGEN_1D2D3D)
+
+    netgen_parameters = algo3d.Parameters()
+    netgen_parameters.SetMaxSize(34.641)
+    netgen_parameters.SetMinSize(0.141421)
+    netgen_parameters.SetOptimize(1)
+    netgen_parameters.SetCheckOverlapping(0)
+    netgen_parameters.SetCheckChartBoundary(0)
+    netgen_parameters.SetFineness(5)
+    netgen_parameters.SetNbSegPerEdge(16*(boxsize//100))
+    netgen_parameters.SetNbSegPerRadius(1.5)
+    netgen_parameters.SetGrowthRate(0.15)
+    netgen_parameters.SetChordalError(-1)
+    netgen_parameters.SetChordalErrorEnabled(0)
+    netgen_parameters.SetUseSurfaceCurvature(1)
+    netgen_parameters.SetQuadAllowed(0)
+    netgen_parameters.SetCheckOverlapping(False)
+    netgen_parameters.SetNbThreads(2)
+
+    return all_boxes, all_box_mesh, netgen_parameters
+
+def run_test(nbox=2, boxsize=100):
+    """ Run sequential mesh and parallel version of it
+
+    nbox: NUmber of boxes
+    boxsize: Size of each box
+    """
+    geom, seq_mesh, netgen_parameters = build_seq_mesh(nbox, boxsize, 0)
+
+    print("Creating Parallel Mesh")
+    par_mesh = smesh.ParallelMesh(geom, name="par_mesh")
+    par_mesh.AddGlobalHypothesis(netgen_parameters)
+    param = par_mesh.GetParallelismSettings()
+    param.SetNbThreads(6)
+
+    assert param.GetNbThreads() == 6, param.GetNbThreads()
+
+    print("Starting sequential compute")
+    start = time.monotonic()
+    is_done = seq_mesh.Compute()
+    if not is_done:
+        raise Exception("Error when computing Mesh")
+
+    stop = time.monotonic()
+    time_seq = stop-start
+
+    print("Starting parallel compute")
+    start = time.monotonic()
+    is_done = par_mesh.Compute()
+    if not is_done:
+        raise Exception("Error when computing Mesh")
+
+    stop = time.monotonic()
+    time_par = stop-start
+
+    print("  Tetrahedron: ", seq_mesh.NbTetras(), par_mesh.NbTetras())
+    print("  Triangle: ", seq_mesh.NbTriangles(), par_mesh.NbTriangles())
+    print("  edge: ", seq_mesh.NbEdges(), par_mesh.NbEdges())
+
+    assert  par_mesh.NbTetras() > 0
+    assert  par_mesh.NbTriangles() > 0
+    assert  par_mesh.NbEdges() > 0
+
+    print("Time elapsed (seq, par): ", time_seq, time_par)
+
+def main():
+    if sys.platform == "win32":
+        print("Test disabled on Windows")
+        return
+    nbox = 2
+    boxsize = 100
+    run_test(nbox, boxsize)
+
+main()