mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-02-27 12:05:37 +05:00
218 lines
8.2 KiB
Python
218 lines
8.2 KiB
Python
![]() |
# -*- coding: utf-8 -*-
|
||
|
|
||
|
import logging
|
||
|
from geomsmesh import geompy
|
||
|
from geomsmesh import smesh
|
||
|
from salome.smesh import smeshBuilder
|
||
|
import SMESH
|
||
|
from salome.StdMeshers import StdMeshersBuilder
|
||
|
from putName import putName
|
||
|
|
||
|
# -----------------------------------------------------------------------------
|
||
|
# --- maillage du bloc partitionne
|
||
|
|
||
|
def meshBlocPart(blocPartition, faceFissure, tore, centres, edges, diams, circles, faces,
|
||
|
gencnt, facefissoutore, edgeext, facesExternes, facesExtBloc, facesExtElli,
|
||
|
aretesInternes, internalBoundary, ellipsoidep, sharedFaces, sharedEdges, edgesBords,
|
||
|
nbsegExt, nbsegGen, nbsegRad, scaleRad, reverses, reverext, nbsegCercle, nbsegFis, dmoyen, lensegEllipsoide):
|
||
|
"""
|
||
|
Maillage du bloc partitionné
|
||
|
TODO: a completer
|
||
|
"""
|
||
|
logging.info('start')
|
||
|
|
||
|
# --- edges de bord à respecter
|
||
|
|
||
|
aFilterManager = smesh.CreateFilterManager()
|
||
|
nbAdded, internalBoundary, _NoneGroup = internalBoundary.MakeBoundaryElements( SMESH.BND_1DFROM2D, '', '', 0, [ ])
|
||
|
criteres = []
|
||
|
unCritere = smesh.GetCriterion(SMESH.EDGE,SMESH.FT_FreeBorders,SMESH.FT_Undefined,0)
|
||
|
criteres.append(unCritere)
|
||
|
filtre = smesh.GetFilterFromCriteria(criteres)
|
||
|
bordsLibres = internalBoundary.MakeGroupByFilter( 'bords', filtre )
|
||
|
smesh.SetName(bordsLibres, 'bordsLibres')
|
||
|
|
||
|
# --- maillage bloc
|
||
|
|
||
|
bloc1 = smesh.Mesh(blocPartition)
|
||
|
|
||
|
for i in range(len(sharedFaces)):
|
||
|
algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN, geom=sharedFaces[i])
|
||
|
hypo2d = algo2d.Parameters(which=smesh.SIMPLE)
|
||
|
hypo2d.SetLocalLength(lensegEllipsoide)
|
||
|
hypo2d.LengthFromEdges()
|
||
|
hypo2d.SetAllowQuadrangles(0)
|
||
|
putName(algo2d.GetSubMesh(), "sharedFaces", i)
|
||
|
putName(algo2d, "algo2d_sharedFaces", i)
|
||
|
putName(hypo2d, "hypo2d_sharedFaces", i)
|
||
|
|
||
|
for i in range(len(sharedEdges)):
|
||
|
algo1d = bloc1.Segment(geom=sharedEdges[i])
|
||
|
hypo1d = algo1d.LocalLength(lensegEllipsoide)
|
||
|
putName(algo1d.GetSubMesh(), "sharedEdges", i)
|
||
|
putName(algo1d, "algo1d_sharedEdges", i)
|
||
|
putName(hypo1d, "hypo1d_sharedEdges", i)
|
||
|
|
||
|
declareAlgoEllipsoideFirst = False
|
||
|
if declareAlgoEllipsoideFirst:
|
||
|
algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
|
||
|
hypo3d = algo3d.MaxElementVolume(1000.0)
|
||
|
putName(algo3d.GetSubMesh(), "ellipsoide")
|
||
|
putName(algo3d, "algo3d_ellipsoide")
|
||
|
putName(hypo3d, "hypo3d_ellipsoide")
|
||
|
|
||
|
algo3d = bloc1.Prism(geom=tore)
|
||
|
algo2d = bloc1.Quadrangle(geom=tore)
|
||
|
algo1d = bloc1.Segment(geom=tore)
|
||
|
hypo1d = algo1d.NumberOfSegments(nbsegGen)
|
||
|
putName(algo3d.GetSubMesh(), "tore")
|
||
|
putName(algo3d, "algo3d_tore")
|
||
|
putName(algo2d, "algo2d_tore")
|
||
|
putName(algo1d, "algo1d_tore")
|
||
|
putName(hypo1d, "hypo1d_tore")
|
||
|
|
||
|
for i in range(len(faces)):
|
||
|
algo2d = bloc1.Quadrangle(geom=faces[i])
|
||
|
hypo2d = smesh.CreateHypothesis('QuadrangleParams')
|
||
|
hypo2d.SetTriaVertex( geompy.GetSubShapeID(blocPartition,centres[i]) )
|
||
|
hypo2d.SetQuadType( StdMeshersBuilder.QUAD_STANDARD )
|
||
|
status = bloc1.AddHypothesis(hypo2d,faces[i])
|
||
|
putName(algo2d.GetSubMesh(), "faces", i)
|
||
|
putName(algo2d, "algo2d_faces", i)
|
||
|
putName(hypo2d, "hypo2d_faces", i)
|
||
|
|
||
|
for i in range(len(edges)):
|
||
|
algo1d = bloc1.Segment(geom=edges[i])
|
||
|
if reverses[i] > 0:
|
||
|
hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ geompy.GetSubShapeID(blocPartition,edges[i]) ])
|
||
|
else:
|
||
|
hypo1d = algo1d.NumberOfSegments(nbsegRad, scaleRad,[ ])
|
||
|
putName(algo1d.GetSubMesh(), "edges", i)
|
||
|
putName(algo1d, "algo1d_edges", i)
|
||
|
putName(hypo1d, "hypo1d_edges", i)
|
||
|
|
||
|
for i in range(len(circles)):
|
||
|
algo1d = bloc1.Segment(geom=circles[i])
|
||
|
hypo1d = algo1d.NumberOfSegments(nbsegCercle)
|
||
|
putName(algo1d.GetSubMesh(), "circles", i)
|
||
|
putName(algo1d, "algo1d_circles", i)
|
||
|
putName(hypo1d, "hypo1d_circles", i)
|
||
|
|
||
|
if len(edgeext) == 1:
|
||
|
densite = int(round(nbsegFis/2))
|
||
|
algo1d = bloc1.Segment(geom=edgeext[0])
|
||
|
hypo1d = algo1d.NumberOfSegments(nbsegFis)
|
||
|
hypo1d.SetDistrType( 2 )
|
||
|
hypo1d.SetConversionMode( 1 )
|
||
|
hypo1d.SetTableFunction( [ 0, densite, 0.4, 1, 0.6, 1, 1, densite ] )
|
||
|
putName(algo1d.GetSubMesh(), "edgeext")
|
||
|
putName(algo1d, "algo1d_edgeext")
|
||
|
putName(hypo1d, "hypo1d_edgeext")
|
||
|
else:
|
||
|
longTotal = 0
|
||
|
longEdgeExts = []
|
||
|
for i in range(len(edgeext)):
|
||
|
props = geompy.BasicProperties(edgeext[i])
|
||
|
longEdgeExts.append(props[0])
|
||
|
longTotal += props[0]
|
||
|
for i in range(len(edgeext)):
|
||
|
local = longTotal/nbsegFis
|
||
|
nbLocal = int(round(nbsegFis*longEdgeExts[i]/longTotal))
|
||
|
densite = int(round(nbLocal/2))
|
||
|
algo1d = bloc1.Segment(geom=edgeext[i])
|
||
|
hypo1d = algo1d.NumberOfSegments(nbLocal)
|
||
|
hypo1d.SetDistrType( 2 )
|
||
|
hypo1d.SetConversionMode( 1 )
|
||
|
hypo1d.SetTableFunction( [ 0, densite, 0.8, 1, 1, 1 ] )
|
||
|
if reverext[i]:
|
||
|
hypo1d.SetReversedEdges([ geompy.GetSubShapeID(blocPartition, edgeext[i]) ])
|
||
|
putName(algo1d.GetSubMesh(), "edgeext", i)
|
||
|
putName(algo1d, "algo1d_edgeext", i)
|
||
|
putName(hypo1d, "hypo1d_edgeext", i)
|
||
|
|
||
|
algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facefissoutore)
|
||
|
hypo2d = algo2d.LengthFromEdges()
|
||
|
putName(algo2d.GetSubMesh(), "facefissoutore")
|
||
|
putName(algo2d, "algo2d_facefissoutore")
|
||
|
putName(hypo2d, "hypo2d_facefissoutore")
|
||
|
|
||
|
|
||
|
maxElemArea = 0.5*dmoyen*dmoyen
|
||
|
logging.debug("dmoyen %s, maxElemArea %s", dmoyen, maxElemArea)
|
||
|
|
||
|
for i in range(len(facesExternes)):
|
||
|
algo2d = bloc1.Triangle(algo=smeshBuilder.NETGEN_2D, geom=facesExternes[i])
|
||
|
hypo2d = algo2d.MaxElementArea(maxElemArea)
|
||
|
if edgesBords is None:
|
||
|
algo1d = bloc1.Segment(geom=facesExternes[i])
|
||
|
hypo1d = algo1d.NumberOfSegments(1)
|
||
|
putName(algo2d.GetSubMesh(), "facesExternes", i)
|
||
|
putName(algo2d, "algo2d_facesExternes", i)
|
||
|
putName(hypo2d, "hypo2d_facesExternes", i)
|
||
|
if edgesBords is None:
|
||
|
putName(algo1d, "algo1d_facesExternes", i)
|
||
|
putName(hypo1d, "hypo1d_facesExternes", i)
|
||
|
|
||
|
for i in range(len(aretesInternes)):
|
||
|
algo1d = bloc1.Segment(geom=aretesInternes[i])
|
||
|
hypo1d = algo1d.NumberOfSegments(nbsegExt)
|
||
|
putName(algo1d.GetSubMesh(), "aretesInternes", i)
|
||
|
putName(algo1d, "algo1d_aretesInternes", i)
|
||
|
putName(hypo1d, "hypo1d_aretesInternes", i)
|
||
|
|
||
|
if edgesBords is not None:
|
||
|
algo1d = bloc1.UseExisting1DElements(geom=edgesBords)
|
||
|
hypo1d = algo1d.SourceEdges([ bordsLibres ],0,0)
|
||
|
putName(algo1d.GetSubMesh(), "bordsLibres")
|
||
|
putName(algo1d, "algo1d_bordsLibres")
|
||
|
putName(hypo1d, "hypo1d_bordsLibres")
|
||
|
|
||
|
#isDone = bloc1.Compute()
|
||
|
|
||
|
if not declareAlgoEllipsoideFirst:
|
||
|
algo3d = bloc1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=ellipsoidep)
|
||
|
hypo3d = algo3d.MaxElementVolume(1000.0)
|
||
|
putName(algo3d.GetSubMesh(), "ellipsoide")
|
||
|
putName(algo3d, "algo3d_ellipsoide")
|
||
|
putName(hypo3d, "hypo3d_ellipsoide")
|
||
|
|
||
|
isDone = bloc1.Compute()
|
||
|
|
||
|
nbRemoved = bloc1.RemoveOrphanNodes()
|
||
|
|
||
|
faceFissure1 = bloc1.GroupOnGeom(faceFissure,'FACE1',SMESH.FACE)
|
||
|
noeudsFondFissure = bloc1.GroupOnGeom(gencnt,'nfondfis',SMESH.NODE)
|
||
|
|
||
|
groups_faceCommuneEllipsoideBloc = []
|
||
|
for i in range(len(sharedFaces)):
|
||
|
name = "faceCommuneEllipsoideBloc_%d"%i
|
||
|
groups_faceCommuneEllipsoideBloc.append(bloc1.GroupOnGeom(sharedFaces[i], name, SMESH.FACE))
|
||
|
groups_faceExterneBloc = []
|
||
|
for i in range(len(facesExtBloc)):
|
||
|
name = "faceExterneBloc_%d"%i
|
||
|
groups_faceExterneBloc.append(bloc1.GroupOnGeom(facesExtBloc[i], name, SMESH.FACE))
|
||
|
|
||
|
skinBlocMeshes = []
|
||
|
for i in range(len(groups_faceCommuneEllipsoideBloc)):
|
||
|
name = "faceCommuneEllipsoideBloc_%d"%i
|
||
|
skinBlocMeshes.append(smesh.CopyMesh(groups_faceCommuneEllipsoideBloc[i], name, 0, 0))
|
||
|
for i in range(len(groups_faceExterneBloc)):
|
||
|
name = "faceExterneBloc_%d"%i
|
||
|
skinBlocMeshes.append(smesh.CopyMesh(groups_faceExterneBloc[i], name, 0, 0))
|
||
|
|
||
|
meshesBloc = [internalBoundary.GetMesh()]
|
||
|
for i in range(len(skinBlocMeshes)):
|
||
|
meshesBloc.append(skinBlocMeshes[i].GetMesh())
|
||
|
blocMesh = smesh.Concatenate(meshesBloc, 1, 1, 1e-05,False)
|
||
|
|
||
|
algo3d = blocMesh.Tetrahedron(algo=smeshBuilder.NETGEN)
|
||
|
hypo3d = algo3d.MaxElementVolume(1000.0)
|
||
|
putName(algo3d.GetSubMesh(), "bloc")
|
||
|
putName(algo3d, "algo3d_bloc")
|
||
|
putName(hypo3d, "hypo3d_bloc")
|
||
|
|
||
|
is_done = blocMesh.Compute()
|
||
|
|
||
|
blocComplet = smesh.Concatenate([bloc1.GetMesh(), blocMesh.GetMesh()], 1, 1, 1e-05,False)
|
||
|
|
||
|
return bloc1, blocComplet
|