# 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()
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()