Salome HOME
Remapper: PointLocator method does not make sense for srcMeshDim=2, trgtMeshDim=3...
[tools/medcoupling.git] / src / MEDLoader / Swig / CaseReader.py
index 18adfe2c5b12b5c4ef4d9ddbdd896c7a0b2ae906..56296451c28352e4f65e06d52ad96edede2757fd 100644 (file)
@@ -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