2 #sys.path.append('/home/I60976/00_PROJETS/2015_INTEGRATION_ZCRACKS/zcracks_salome/zcracks')
4 import numpy, subprocess, sys
5 from os import remove, getpid, path, environ
6 from output import message
8 def calcCoordVectors(normalIN, directionIN):
9 V3TEMP=numpy.cross(normalIN,directionIN)
10 directionTEMP=numpy.cross(V3TEMP,normalIN)
12 normalOUT=numpy.array(normalIN)/numpy.linalg.norm(normalIN)
13 directionOUT=numpy.array(directionTEMP)/numpy.linalg.norm(directionTEMP)
14 V3OUT=numpy.array(V3TEMP)/numpy.linalg.norm(V3TEMP)
15 return(normalOUT, directionOUT, V3OUT)
18 def testStrictRange(x, inf=0.0, sup=False):
24 c3=(type(x[0])==type(inf))
40 c3=(type(x[0])==float)
41 c4=(type(x[1])==float)
42 c5=(type(x[2])==float)
47 def testRange(x, inf=0.0, sup=False):
53 c3=(type(x[0])==type(inf))
67 c1=(data['crackedName']!='')
71 message('E','Invalid Cracked name',goOn=True)
75 c1=path.isfile(data['saneName'])
77 c2=(data['saneName']!=data['crackedName'])
81 message('E','sane mesh and cracked mesh are identical',goOn=True)
84 message('E','Bad sane mesh file',goOn=True)
87 test=testStrictRange(data['minSize'])
89 message('E','invalid min size',goOn=True)
92 test=testStrictRange(data['maxSize'])
94 message('E','invalid max size',goOn=True)
98 test=(data['maxSize'][0]>=data['minSize'][0])
100 message('E','min size greater than max size',goOn=True)
103 test=testStrictRange(data['extractLength'])
105 message('E','invalid extract length',goOn=True)
108 test=testRange(data['gradation'], inf=1.0)
110 message('E','invalid Gradation',goOn=True)
113 test=testRange(data['layers'], inf=1)
115 message('E','invalid layers',goOn=True)
118 test=testRange(data['iterations'], inf=1)
120 message('E','invalid iterations',goOn=True)
125 def calcElemSize(A, R):
126 x=R*(1.-numpy.cos(A/2.))
130 def meshCrack(geomObject, minSize, maxSize, chordal, dim):
134 theStudy = salome.myStudy
136 import SMESH, SALOMEDS
137 from salome.smesh import smeshBuilder
138 smesh = smeshBuilder.New(theStudy)
139 Maillage = smesh.Mesh(geomObject)
142 MG_CADSurf = Maillage.Triangle(algo=smeshBuilder.MG_CADSurf)
143 MG_CADSurf_Parameters = MG_CADSurf.Parameters()
144 MG_CADSurf_Parameters.SetPhysicalMesh( 0 )
145 MG_CADSurf_Parameters.SetGeometricMesh( 1 )
146 MG_CADSurf_Parameters.SetMinSize( minSize )
147 MG_CADSurf_Parameters.SetMaxSize( maxSize )
148 MG_CADSurf_Parameters.SetChordalError( chordal )
151 Regular_1D = Maillage.Segment()
152 Adaptive = Regular_1D.Adaptive(minSize,maxSize,chordal)
153 NETGEN_2D_ONLY = Maillage.Triangle(algo=smeshBuilder.NETGEN_2D)
155 message('E',"error in mesh dimension",goOn=True)
157 isDone = Maillage.Compute()
159 #crack1 = Maillage.CreateEmptyGroup( SMESH.NODE, 'crack' )
160 #nbAdd = crack1.AddFrom( Maillage.GetMesh() )
161 #crack2 = Maillage.CreateEmptyGroup( SMESH.NODE, 'surface' )
162 #nbAdd = crack2.AddFrom( Maillage.GetMesh() )
166 def extendElsets(meshFile, outFile=None):
168 if outFile==None: outFile=meshFile
170 if not path.isfile(meshFile):
171 message('E','Mesh med file is not valid')
175 #salome.salome_init()
176 theStudy = salome.myStudy
177 from salome.smesh import smeshBuilder
178 smesh = smeshBuilder.New(theStudy)
180 ([mesh], status) = smesh.CreateMeshesFromMED(meshFile)
182 mesh=cleanGroups(mesh)
185 nodeList=mesh.GetNodesId()
186 volElemList=mesh.GetElementsByType(SMESH.VOLUME)
187 surfElemList=mesh.GetElementsByType(SMESH.FACE)
188 edgeElemList=mesh.GetElementsByType(SMESH.EDGE)
189 colorList=[-1]*len(nodeList)
192 for group in mesh.GetGroups():
193 if group.GetType()==SMESH.VOLUME and group.GetName()[:5]=='sides' : case2D=False
196 for group in mesh.GetGroups():
198 if group.GetType()==SMESH.FACE and group.GetName()[:5]=='sides':
201 if group.GetType()==SMESH.VOLUME and group.GetName()[:5]=='sides':
204 sortedSides=[None]*len(sides)
206 N=group.GetName().replace('sides','').replace('_bset','').replace(' ','')
212 for elemNodeId in mesh.GetElemNodes(elemId) :
213 colorList[elemNodeId-1]=N
217 for iN in range(len(sides)/2):
218 side0=sortedSides[2*iN]
219 side1=sortedSides[2*iN+1]
220 elemsOfside0=side0.GetIDs()
221 elemsOfside1=side1.GetIDs()
224 for elem in elemsOfside0: NodesOfside0+=mesh.GetElemNodes(elem)
225 for elem in elemsOfside1: NodesOfside1+=mesh.GetElemNodes(elem)
226 front=set(NodesOfside0).intersection(set(NodesOfside1))
227 if len(front)==0: crackOnly=False
230 mesh.ExportMED(outFile)
233 # Propagates color using elem connectivity
234 # Always propagates max color
236 #elemToTreat=volElemList
238 #while len(elemToTreat)>0 :
239 #print len(elemToTreat)
240 #for elemId in elemToTreat:
242 #maxColor=-sys.maxint
243 #for elemNodeId in mesh.GetElemNodes(elemId) :
244 #nodeColor=colorList[elemNodeId-1]
245 #if nodeColor<minColor : minColor=nodeColor
246 #if nodeColor>maxColor : maxColor=nodeColor
247 #if minColor!=maxColor :
248 #elemToTreat.remove(elemId)
249 #for elemNodeId in mesh.GetElemNodes(elemId) :
250 #colorList[elemNodeId-1]=maxColor
254 elemList=[surfElemList,edgeElemList]
257 elemList=[volElemList,surfElemList,edgeElemList]
258 grElemList=[[],[],[]]
262 for elemId in elemList[0]:
265 for elemNodeId in mesh.GetElemNodes(elemId) :
266 nodeColor=colorList[elemNodeId-1]
267 if nodeColor<minColor : minColor=nodeColor
268 if nodeColor>maxColor : maxColor=nodeColor
269 if minColor!=maxColor :
271 for elemNodeId in mesh.GetElemNodes(elemId) :
272 colorList[elemNodeId-1]=maxColor
275 for x in range(len(sides)):
278 for N, el in enumerate(elemList):
280 elemNodesId=mesh.GetElemNodes(elemId)
281 elemColor=colorList[elemNodesId[0]-1]
283 grElemList[N][elemColor].append(elemId)
285 #for elemId in surfElemList:
286 #elemNodesId=mesh.GetElemNodes(elemId)
287 #elemColor=colorList[elemNodesId[0]-1]
289 #selem[elemColor].append(elemId)
291 for n in range(len(sides)):
293 mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.FACE,grElemList[0][n])
294 mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.EDGE,grElemList[1][n])
296 mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.VOLUME,grElemList[0][n])
297 mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.FACE,grElemList[1][n])
298 mesh.MakeGroupByIds('Extended_side%d' %n ,SMESH.EDGE,grElemList[2][n])
300 if outFile==None: outFile=meshFile
301 mesh.ExportMED(outFile)
305 def cleanGroups(mesh):
307 for group in mesh.GetGroups():
308 if '_bset' in group.GetName():
309 group.SetName(group.GetName().replace('_bset',''))
311 if group.GetType()==SMESH.NODE:
312 if group.GetName() in ['SURFACE','lip','SFRONT_NODES','FRONT']: mesh.RemoveGroup(group)
314 #elif group.GetType()==SMESH.EDGE:
316 elif group.GetType()==SMESH.FACE:
317 if group.GetName() in ['SURFACE','Nlip']:
318 mesh.RemoveGroup(group)
320 elif group.GetType()==SMESH.VOLUME:
321 if (group.GetName() in ['ELSET0','AUTO']) or (group.GetName()[:4] in ['SIDE']) :
322 mesh.RemoveGroup(group)
327 def getMaxAspectRatio(tmpdir):
328 logFile=path.join(tmpdir,'MESHING_OUTPUT')
330 if not path.isfile(logFile): return(-1)
333 f = open(logFile, "r")
335 if re.search("WORST ELEMENT QUALITY", line): maxAR=line
338 for r in [' ','WORSTELEMENTQUALITY','\n']: maxAR=maxAR.replace(r,'')
342 #def extendElsets(meshFile):
343 #if not path.isfile(meshFile):
344 #message('E','Mesh med file is not valid')
347 #import SMESH, salome
348 ##salome.salome_init()
349 #theStudy = salome.myStudy
350 #from salome.smesh import smeshBuilder
351 #smesh = smeshBuilder.New(theStudy)
353 #([mesh], status) = smesh.CreateMeshesFromMED(meshFile)
356 #nodeList=mesh.GetNodesId()
357 #colorList=[0]*len(nodeList)
359 ## Init using SIDE0 SIDE1
360 #for group in mesh.GetGroups():
361 #if group.GetType()==SMESH.FACE :
363 #if group.GetName()[0:4]=='SIDE0' :
365 #elif group.GetName()[0:4]=='SIDE1' :
369 #faces=group.GetIDs()
370 ## Set faces nodes to given color
371 #for face_id in faces :
372 #for face_node_id in mesh.GetElemNodes(face_id) :
373 #colorList[face_node_id-1]=color
375 ## Propagates color using elem connectivity
376 ## Always propagates max color
377 #volElemList=mesh.GetElementsByType(SMESH.VOLUME)
383 #for elemId in volElemList:
384 #for elemNodeId in mesh.GetElemNodes(elemId) :
385 #nodeColor=colorList[elemNodeId-1]
386 #if nodeColor<minColor : minColor=nodeColor
387 #if nodeColor>maxColor : maxColor=nodeColor
388 #if minColor!=maxColor :
390 #for elemNodeId in mesh.GetElemNodes(elemId) :
391 #colorList[elemNodeId-1]=maxColor
395 #for elemId in volElemList:
396 #elemNodesId=mesh.GetElemNodes(elemId)
397 #elemColor=colorList[elemNodesId[0]-1]
398 #if(elemColor==1) : velem0.append(elemId)
399 #if(elemColor==2) : velem1.append(elemId)
401 #mesh.MakeGroupByIds('SIDE_co',SMESH.VOLUME,velem0)
402 #mesh.MakeGroupByIds('SIDE_ext',SMESH.VOLUME,velem1)
404 #surfElemList=mesh.GetElementsByType(SMESH.FACE)
410 #for elemId in surfElemList:
411 #elemNodesId=mesh.GetElemNodes(elemId)
412 #elemColor=colorList[elemNodesId[0]-1]
413 #if(elemColor==1) : selem0.append(elemId)
414 #if(elemColor==2) : selem1.append(elemId)
416 #mesh.MakeGroupByIds('SIDE_co',SMESH.FACE,selem0)
417 #mesh.MakeGroupByIds('SIDE_ext',SMESH.FACE,selem1)
420 #for elem in volElemList:
421 #maxAR=max(mesh.GetAspectRatio(elem),maxAR)
422 #for elem in surfElemList:
423 #maxAR=max(mesh.GetAspectRatio(elem),maxAR)
425 #mesh.ExportMED(meshFile)
429 def removeFromSessionPath(envVar, patern):
430 if type(patern) is not list: patern=[patern]
431 if type(envVar) is not list: envVar=[envVar]
435 listPath=path.split(':')
439 path=path.replace(p,'')
440 path.replace('::',':')
444 #def isPlane(geomObject, eps=1.e-9):
446 #salome.salome_init()
447 #theStudy = salome.myStudy
449 #import salome_notebook
450 #notebook = salome_notebook.NoteBook(theStudy)
453 #from salome.geom import geomBuilder
454 #geompy = geomBuilder.New(theStudy)
456 #Vs=geompy.SubShapeAll(geomObject, geompy.ShapeType["VERTEX"])
460 #P0=numpy.array(geompy.GetPosition(Vs[0])[:3])
461 #P1=numpy.array(geompy.GetPosition(Vs[1])[:3])
462 #P2=numpy.array(geompy.GetPosition(Vs[2])[:3])
466 #norm01=numpy.linalg.norm(V01)
467 #norm02=numpy.linalg.norm(V02)
468 #norm12=numpy.linalg.norm(V12)
469 #if (norm01<eps) or (norm02<eps) or (norm12<eps):
473 #N=numpy.cross(V01,V02)
474 #N=N/numpy.linalg.norm(N)
477 #Pi=numpy.array(geompy.GetPosition(P)[:3])
480 #maxDist=numpy.max([maxDist,numpy.abs(d)])