Changeset 21708


Ignore:
Timestamp:
05/05/17 23:50:08 (8 years ago)
Author:
schlegel
Message:

CHG: add CompressedMat to python

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/solve/WriteData.py

    r21646 r21708  
    234234                                for j in xrange(s[1]):
    235235                                        fid.write(struct.pack('d',float(data[i][j])))    #get to the "c" convention, hence the transpose
     236                # }}}
     237
     238        elif m.strcmpi(format,'CompressedMat'):    # {{{
     239
     240                if   isinstance(data,(bool,int,long,float)):
     241                        data=np.array([data])
     242                elif isinstance(data,(list,tuple)):
     243                        data=np.array(data).reshape(-1,)
     244                if np.ndim(data) == 1:
     245                        if np.size(data):
     246                                data=data.reshape(np.size(data),)
     247                        else:
     248                                data=data.reshape(0,0)
     249
     250                #Get size
     251                s=data.shape
     252                if np.ndim(data) == 1:
     253                   n2=1
     254                else:
     255                        n2=s[1]
     256
     257                #if matrix = NaN, then do not write anything
     258                if np.ndim(data)==1 and np.product(s)==1 and np.all(np.isnan(data)):
     259                        s=(0,0)
     260                        n2=0
     261
     262                #first write length of record
     263                recordlength=4+4+8+8+1*(s[0]-1)*n2+8*n2+4+4 #2 integers (32 bits) + the matrix + code + matrix type
     264                if recordlength > 4**31 :
     265                        raise ValueError('field %s cannot be marshalled because it is larger than 4^31 bytes!' % enum)
     266
     267                fid.write(struct.pack('i',recordlength))  #2 integers (32 bits) + the matrix + code + matrix type
     268
     269                #write data code and matrix type:
     270                fid.write(struct.pack('i',FormatToCode(format)))
     271                fid.write(struct.pack('i',mattype))
     272
     273                #Write offset and range
     274                A = data[0:s[0]-1]
     275                offsetA = A.min()
     276                rangeA = A.max() - offsetA
     277
     278                if rangeA == 0:
     279                        A = A*0
     280                else:
     281                        A = (A-offsetA)/rangeA*255.
     282               
     283                #now write matrix
     284                if np.ndim(data) == 1:
     285                        fid.write(struct.pack('i',s[0]))
     286                        fid.write(struct.pack('i',1))
     287                        fid.write(struct.pack('d',float(offsetA)))
     288                        fid.write(struct.pack('d',float(rangeA)))
     289                        for i in xrange(s[0]-1):
     290                                fid.write(struct.pack('B',int(A[i])))
     291
     292                        fid.write(struct.pack('d',float(data[s[0]-1])))    #get to the "c" convention, hence the transpose
     293
     294                elif np.product(s) > 0:
     295                        fid.write(struct.pack('i',s[0]))
     296                        fid.write(struct.pack('i',s[1]))
     297                        fid.write(struct.pack('d',float(offsetA)))
     298                        fid.write(struct.pack('d',float(rangeA)))
     299                        for i in xrange(s[0]-1):
     300                                for j in xrange(s[1]):
     301                                        fid.write(struct.pack('B',int(A[i][j])))    #get to the "c" convention, hence the transpose
     302
     303                        for j in xrange(s[1]):
     304                                fid.write(struct.pack('d',float(data[s[0]-1][j])))
     305
    236306                # }}}
    237307
     
    337407        elif m.strcmpi(format,'StringArray'):
    338408                code=9
     409        elif m.strcmpi(format,'CompressedMat'):
     410                code=10
    339411        else:
    340412                raise InputError('FormatToCode error message: data type not supported yet!')
Note: See TracChangeset for help on using the changeset viewer.