X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FMEDLoader%2FSwig%2FCaseReader.py;h=56296451c28352e4f65e06d52ad96edede2757fd;hb=248b8e5674529b26a49a70f1cc6323c2e9ee2559;hp=18adfe2c5b12b5c4ef4d9ddbdd896c7a0b2ae906;hpb=5a951212443857d9aa5306cf0bbb6b40d2dae1e9;p=tools%2Fmedcoupling.git diff --git a/src/MEDLoader/Swig/CaseReader.py b/src/MEDLoader/Swig/CaseReader.py index 18adfe2c5..56296451c 100644 --- a/src/MEDLoader/Swig/CaseReader.py +++ b/src/MEDLoader/Swig/CaseReader.py @@ -1,5 +1,5 @@ # -*- coding: iso-8859-1 -*- -# Copyright (C) 2007-2014 CEA/DEN, EDF R&D +# Copyright (C) 2007-2019 CEA/DEN, EDF R&D # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -23,7 +23,7 @@ import numpy as np from MEDLoader import * from CaseIO import CaseIO -import sys,re +import sys,re,os class CaseReader(CaseIO): """ Converting a file in the Case format (Ensight) to the MED format. @@ -38,12 +38,14 @@ class CaseReader(CaseIO): def __init__(self,fileName): """ Constructor """ + CaseIO.__init__(self) self._fileName=fileName self._dirName=os.path.dirname(self._fileName) pass def __traduceMesh(self,name,typ,coords,cells): """ Convert a CASE mesh into a MEDCouplingUMesh. """ + name = name.decode("ascii") nbCoords=len(coords) coo=np.array(coords,dtype="float64") ; coo=coo.reshape(nbCoords,3) coo=DataArrayDouble(coo) ; coo=coo.fromNoInterlace() @@ -61,7 +63,7 @@ class CaseReader(CaseIO): pass c=DataArrayInt(len(cells),nbNodesPerCell+1) ; c[:,0]=ct ; c[:,1:]=c2-1 ; c.rearrange(1) m.setConnectivity(c,cI,True) - m.checkCoherency2() + m.checkConsistency() return m def __traduceMeshForPolyhed(self,name,coords,arr0,arr1,arr2): @@ -72,13 +74,13 @@ class CaseReader(CaseIO): m.setCoords(coo) # arr2=arr2[:]-1 - arr0mc0=DataArrayInt(arr0) ; arr0mc0.computeOffsets2() - arr0mc1=DataArrayInt(arr0).deepCpy() - arr0mc2=DataArrayInt(len(arr0),2) ; arr0mc2[:,0]=DataArrayInt(arr0)-1 ; arr0mc2[:,1]=1 ; arr0mc2.rearrange(1) ; arr0mc2.computeOffsets2() + arr0mc0=DataArrayInt(arr0) ; arr0mc0.computeOffsetsFull() + arr0mc1=DataArrayInt(arr0).deepCopy() + arr0mc2=DataArrayInt(len(arr0),2) ; arr0mc2[:,0]=DataArrayInt(arr0)-1 ; arr0mc2[:,1]=1 ; arr0mc2.rearrange(1) ; arr0mc2.computeOffsetsFull() arr0mc3=DataArrayInt.Range(0,2*len(arr0),2).buildExplicitArrByRanges(arr0mc2) - arr1mc0=DataArrayInt(arr1) ; arr1mc0.computeOffsets2() - arr1mc1=arr1mc0[arr0mc0] ; arr1mc1[1:]+=arr0mc0[1:] - arr1mc2=DataArrayInt(arr1).deepCpy() ; arr1mc2+=1 ; arr1mc2.computeOffsets2() + arr1mc0=DataArrayInt(arr1) ; arr1mc0.computeOffsetsFull() + arr1mc1=arr1mc0[arr0mc0] ; arr1mc1[1:]+=arr0mc0[1:] + arr1mc2=DataArrayInt(arr1).deepCopy() ; arr1mc2+=1 ; arr1mc2.computeOffsetsFull() arr2mc0=(arr1mc2[1:])[arr0mc3] # c=DataArrayInt(arr1.size+arr2.size) @@ -88,7 +90,7 @@ class CaseReader(CaseIO): c[a]=DataArrayInt(arr2) # m.setConnectivity(c,arr1mc1,True) - m.checkCoherency2() + m.checkConsistency() return m def __traduceMeshForPolygon(self,name,coords,arr0,arr1): @@ -98,25 +100,25 @@ class CaseReader(CaseIO): m=MEDCouplingUMesh(name,2) m.setCoords(coo) # - arr0_0=DataArrayInt(arr0+1) ; arr0_0.computeOffsets2() - arr0_1=DataArrayInt(len(arr0),2) ; arr0_1[:,1]=DataArrayInt(arr0) ; arr0_1[:,0]=1 ; arr0_1.rearrange(1) ; arr0_1.computeOffsets2() + arr0_0=DataArrayInt(arr0+1) ; arr0_0.computeOffsetsFull() + arr0_1=DataArrayInt(len(arr0),2) ; arr0_1[:,1]=DataArrayInt(arr0) ; arr0_1[:,0]=1 ; arr0_1.rearrange(1) ; arr0_1.computeOffsetsFull() arr0_2=DataArrayInt.Range(1,2*len(arr0),2).buildExplicitArrByRanges(arr0_1) c=DataArrayInt(len(arr0)+len(arr1)) ; c[:]=0 ; c[arr0_0[:-1]]=NORM_POLYGON c[arr0_2]=DataArrayInt(arr1-1) # m.setConnectivity(c,arr0_0,True) - m.checkCoherency2() + m.checkConsistency() return m def __convertGeo2MED(self,geoFileName): - """ Convert all the geometry (all the meshes) contained in teh CASE file into MEDCouplingUMesh'es. """ + """ Convert all the geometry (all the meshes) contained in the CASE file into MEDCouplingUMesh'es. """ fd=open(os.path.join(self._dirName,geoFileName),"r+b") ; fd.seek(0,2) ; end=fd.tell() ; fd.seek(0) ; title=fd.read(80) title=title.strip().lower() - if "binary" not in title: + if b"binary" not in title: raise Exception("Error only binary geo files are supported for the moment !") pass zeType=True - if "fortran" in title: + if b"fortran" in title: mcmeshes=self.__convertGeo2MEDFortran(fd,end) ; zeType=False else: mcmeshes=self.__convertGeo2MEDC(fd,end) @@ -139,15 +141,15 @@ class CaseReader(CaseIO): pos=fd.tell() elt=fd.read(80) ; elt=elt.strip() ; pos=fd.tell() mcmeshes2=[] - typ="part" + typ=b"part" nbOfTurn=0 - while abs(pos-end)>8 and "part" in typ: - if "part" not in elt: + while abs(pos-end)>8 and b"part" in typ: + if b"part" not in elt: raise Exception("Error on reading mesh fortran #1 !") fd.seek(fd.tell()+4)# skip # tmp=fd.read(80) ; meshName=tmp.split("P")[-1] tmp=fd.read(80) - if "coordinates" not in tmp: + if b"coordinates" not in tmp: raise Exception("Error on reading mesh fortran #2 !") pos=fd.tell() # 644 if nbOfTurn==0: @@ -165,8 +167,8 @@ class CaseReader(CaseIO): coo=coo.reshape(nbNodes,3) pos+=nbNodes*3*4 ; fd.seek(pos)#np.array(0,dtype='float%i'%(typeOfCoo)).nbytes typ=fd.read(80).strip() ; pos=fd.tell() - zeK="" - for k in self.dictMCTyp2.keys(): + zeK=b"" + for k in self.dictMCTyp2: if k in typ: zeK=k break @@ -182,7 +184,7 @@ class CaseReader(CaseIO): mcmeshes2.append(self.__traduceMesh(meshName,zeK,coo,nodalConn)) pos+=nbNodesPerCell*nbCellsOfType*4 if abs(pos-end)>8: - fd.seek(pos) ;elt=fd.read(80) ; typ=elt[:] ; pos+=80 + fd.seek(pos) ;elt=fd.read(80) ; typ=elt[:] ; pos+=80 pass nbOfTurn+=1 pass @@ -193,17 +195,19 @@ class CaseReader(CaseIO): return mcmeshes2 def __convertGeo2MEDC(self,fd,end): - fd.readline() - name=fd.readline().strip() ; fd.readline() ; fd.readline() + #fd.readline() + #name=fd.readline().strip() ; fd.readline() ; fd.readline() + name=fd.read(80) + descrip=fd.read(80).strip() ; fd.read(80) ; fd.read(80) pos=fd.tell() mcmeshes=[] elt=fd.read(80) ; elt=elt.strip() ; pos+=80 while pos!=end: - if "part" not in elt: + if b"part" not in elt: raise Exception("Error on reading mesh #1 !") fd.seek(fd.tell()+4) meshName=fd.read(80).strip() - if fd.read(len("coordinates"))!="coordinates": + if fd.read(len("coordinates"))!=b"coordinates": raise Exception("Error on reading mesh #2 !") pos=fd.tell() typeOfCoo=np.memmap(fd,dtype='byte',mode='r',offset=int(pos),shape=(1)).tolist()[0] @@ -214,7 +218,8 @@ class CaseReader(CaseIO): pos+=nbNodes*3*4 ; fd.seek(pos)#np.array(0,dtype='float%i'%(typeOfCoo)).nbytes typ=fd.read(80).strip() ; pos=fd.tell() mcmeshes2=[] - while pos!=end and typ!="part": + while pos!=end and typ!=b"part": + if typ[0]==0: pos+=1; continue mctyp=self.dictMCTyp2[typ] nbCellsOfType=np.memmap(fd,dtype='int32',mode='r',offset=int(pos),shape=(1,)).tolist()[0] pos+=4 @@ -246,37 +251,40 @@ class CaseReader(CaseIO): elt=fd.read(80) ; elt=elt.strip() ; typ=elt[:] ; pos+=80 pass pass - coo=mcmeshes2[0].getCoords() ; name=mcmeshes2[0].getName() - for itmesh in mcmeshes2: itmesh.setCoords(coo) - m=MEDCouplingUMesh.MergeUMeshesOnSameCoords(mcmeshes2) ; m.setName(name) - mcmeshes.append(m) + if mcmeshes2: + coo=mcmeshes2[0].getCoords() ; name=mcmeshes2[0].getName() + for itmesh in mcmeshes2: itmesh.setCoords(coo) + m=MEDCouplingUMesh.MergeUMeshesOnSameCoords(mcmeshes2) ; m.setName(name) + mcmeshes.append(m) pass return mcmeshes - - + + def __convertField(self,mlfields, mcmeshes, fileName, fieldName, discr, nbCompo, locId, it): """ Convert the fields. """ stars=re.search("[\*]+",fileName).group() st="%0"+str(len(stars))+"i" trueFileName=fileName.replace(stars,st%(it)) fd=open(os.path.join(self._dirName,trueFileName),"r+b") ; fd.seek(0,2) ; end=fd.tell() ; fd.seek(0) - name=fd.readline().strip().split(" ")[0] + name=fd.read(80).strip().split(b" ")[0].decode("ascii") if name!=fieldName: raise Exception("ConvertField : mismatch") pos=fd.tell() st=fd.read(80) ; st=st.strip() ; pos=fd.tell() while pos!=end: - if st!="part": + if st!=b"part": raise Exception("ConvertField : mismatch #2") fdisc=MEDCouplingFieldDiscretization.New(self.discSpatial2[discr]) meshId=np.memmap(fd,dtype='int32',mode='r',offset=int(pos),shape=(1)).tolist()[0]-1 + if meshId >= len( mcmeshes ): + return nbOfValues=fdisc.getNumberOfTuples(mcmeshes[meshId]) vals2=DataArrayDouble(nbOfValues,nbCompo) fd.seek(pos+4) st=fd.read(80).strip() ; pos=fd.tell() offset=0 - while pos!=end and st!="part": - if st!="coordinates": + while pos!=end and st!=b"part": + if st!=b"coordinates": nbOfValsOfTyp=mcmeshes[meshId].getNumberOfCellsWithType(self.dictMCTyp2[st]) else: nbOfValsOfTyp=nbOfValues @@ -289,7 +297,7 @@ class CaseReader(CaseIO): pass f=MEDCouplingFieldDouble(self.discSpatial2[discr],ONE_TIME) ; f.setName("%s_%s"%(fieldName,mcmeshes[meshId].getName())) f.setMesh(mcmeshes[meshId]) ; f.setArray(vals2) ; f.setTime(float(it),it,-1) - f.checkCoherency() + f.checkConsistencyLight() mlfields[locId+meshId].appendFieldNoProfileSBT(f) pass @@ -309,13 +317,13 @@ class CaseReader(CaseIO): raise Exception("ConvertField : mismatch") pos=fd.tell() st=fd.read(80) ; st=st.strip() ; pos=fd.tell() - if "part" not in st: + if b"part" not in st: raise Exception("ConvertField : mismatch #2") st=fd.read(80).strip() ; pos=fd.tell() pos+=12 # I love it offset=0 nbTurn=0 - while pos!=end and "part" not in st: + while pos!=end and b"part" not in st: fdisc=MEDCouplingFieldDiscretization.New(self.discSpatial2[discr]) nbOfValues=fdisc.getNumberOfTuples(mcmeshes[nbTurn]) vals2=DataArrayDouble(nbOfValues,nbCompo) @@ -323,7 +331,7 @@ class CaseReader(CaseIO): nbOfValsOfTyp=np.memmap(fd,dtype='>i4',mode='r',offset=pos,shape=(1)).tolist()[0]/4 pos+=4 vals=np.zeros(dtype=">f4",shape=(nbOfValsOfTyp*nbCompo)) - for iii in xrange(nbCompo): + for iii in range(nbCompo): valsTmp=np.memmap(fd,dtype='>f4',mode='r',offset=int(pos),shape=(nbOfValsOfTyp)) vals[iii*nbOfValsOfTyp:(iii+1)*nbOfValsOfTyp]=valsTmp pos+=nbOfValsOfTyp*4 @@ -342,15 +350,15 @@ class CaseReader(CaseIO): pass f=MEDCouplingFieldDouble(self.discSpatial2[discr],ONE_TIME) ; f.setName("%s_%s"%(fieldName,mcmeshes[nbTurn].getName())) f.setMesh(mcmeshes[nbTurn]) ; f.setArray(vals2) ; f.setTime(float(it),it,-1) - f.checkCoherency() + f.checkConsistencyLight() mlfields[locId+nbTurn].appendFieldNoProfileSBT(f) nbTurn+=1 pass pass - + def loadInMEDFileDS(self): """ Load a CASE file into a MEDFileData object. """ - f=file(self._fileName) + f=open(self._fileName) lines=f.readlines() ind=lines.index("GEOMETRY\n") if ind==-1: @@ -364,24 +372,25 @@ class CaseReader(CaseIO): if "TIME\n" in lines: end=lines.index("TIME\n") pass - for i in xrange(ind+1,end): - m=re.match("^([\w]+)[\s]+\per[\s]+([\w]+)[\s]*\:[\s]*([\w]+)[\s]+([\S]+)$",lines[i]) + for i in range(ind + 1,end): + m=re.match("^([\w]+)[\s]+\per[\s]+([\w]+)[\s]*\:[\s]*[0-9]*[\s]*([\w]+)[\s]+([\S]+)$",lines[i]) if m: if m.groups()[0]=="constant": continue spatialDisc=m.groups()[1] ; fieldName=m.groups()[2] ; nbOfCompo=self.dictCompo2[m.groups()[0]] ; fieldFileName=m.groups()[3] - fieldsInfo.append((fieldName,spatialDisc,nbOfCompo,fieldFileName)) + if "*" in fieldFileName: + fieldsInfo.append((fieldName,spatialDisc,nbOfCompo,fieldFileName)) pass pass - + expr=re.compile("number[\s]+of[\s]+steps[\s]*\:[\s]*([\d]+)") - tmp=filter(expr.search,lines) - if len(tmp)!=0: - nbOfTimeSteps=int(expr.search(filter(expr.search,lines)[0]).group(1)) + tmp = [line for line in lines if expr.search(line)] + if tmp: + nbOfTimeSteps = int(expr.search(tmp[0]).group(1)) expr=re.compile("filename[\s]+start[\s]+number[\s]*\:[\s]*([\d]+)") - startIt=int(expr.search(filter(expr.search,lines)[0]).group(1)) + startIt = int(expr.search([line for line in lines if expr.search(line)][0]).group(1)) expr=re.compile("filename[\s]+increment[\s]*\:[\s]*([\d]+)") - incrIt=int(expr.search(filter(expr.search,lines)[0]).group(1)) + incrIt = int(expr.search([line for line in lines if expr.search(line)][0]).group(1)) else: nbOfTimeSteps=1 startIt=0 @@ -398,7 +407,7 @@ class CaseReader(CaseIO): i+=1 pass pass - for ts in xrange(nbOfTimeSteps): + for ts in range(nbOfTimeSteps): i=0 for field in fieldsInfo: if typeOfFile: @@ -412,7 +421,7 @@ class CaseReader(CaseIO): pass ret=MEDFileData() ret.setMeshes(m2) - del mlfields[filter(lambda x: len(mlfields[x])==0,range(len(mlfields)))] + del mlfields[[x for x in range(len(mlfields)) if len(mlfields[x]) == 0]] ret.setFields(mlfields) return ret