Changeset 21235
- Timestamp:
- 09/28/16 07:45:35 (9 years ago)
- Location:
- issm/trunk-jpl/src/m
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py
r21130 r21235 1 1 from netCDF4 import Dataset, stringtochar 2 import numpy 2 import numpy as np 3 3 import time 4 4 import collections … … 26 26 Duration=md.timestepping.final_time-md.timestepping.start_time 27 27 if Duration>0 and md.timestepping.time_step*md.settings.output_frequency>0: 28 StepNum= Duration/(md.timestepping.time_step*md.settings.output_frequency)28 StepNum=int(Duration/(md.timestepping.time_step*md.settings.output_frequency)) 29 29 else: 30 30 StepNum=1 … … 32 32 Dimension1=NCData.createDimension('Dimension1',md.mesh.numberofelements) 33 33 Dimension2=NCData.createDimension('Dimension2',md.mesh.numberofvertices) 34 Dimension3=NCData.createDimension('Dimension3',n umpy.shape(md.mesh.elements)[1])34 Dimension3=NCData.createDimension('Dimension3',np.shape(md.mesh.elements)[1]) 35 35 Dimension4=NCData.createDimension('Dimension4',StepNum) 36 36 Dimension5=NCData.createDimension('Dimension5',2) … … 40 40 len(Dimension3):'Dimension3', 41 41 len(Dimension4):'Dimension4', 42 len(Dimension5):'Dimension 6'}42 len(Dimension5):'Dimension5'} 43 43 44 44 #get all model classes and create respective groups … … 54 54 NCgroup.__setattr__('classtype', "results") 55 55 Subgroup=NCgroup.createGroup(str(supfield)) 56 Subgroup.__setattr__('classtype',str(supfield)) 56 #Subgroup.__setattr__('classtype',md.results.__dict__[supfield].__class__.__name__) 57 Subgroup.__setattr__('classtype',md.results.__class__.__name__) 57 58 if type(md.results.__dict__[supfield])==list:#the solution have several timestep 58 59 #get last timesteps and output frequency 59 last_step = n umpy.size(md.results.__dict__[supfield])60 last_step = np.size(md.results.__dict__[supfield]) 60 61 step_freq = md.settings.output_frequency 61 62 #grab first time step … … 70 71 for field in subfields: 71 72 if str(field)!='errlog' and str(field)!='outlog' and str(field)!='SolutionType': 72 print 'Treating '+str(group)+'.'+str(supfield)+'.'+str(field)73 73 Var=md.results.__dict__[supfield].__dict__[field] 74 74 DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict,False) 75 75 else: 76 print 'Result format not suported'76 print ('Result format not suported') 77 77 else: 78 78 79 79 for field in fields: 80 print 'Treating ' +str(group)+'.'+str(field)81 80 NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__) 82 81 Var=md.__dict__[group].__dict__[field] … … 96 95 val_shape=dict.keys(var) 97 96 except TypeError: 98 val_shape=n umpy.shape(var)97 val_shape=np.shape(var) 99 98 100 99 … … 104 103 'int64':'i8'} 105 104 106 val_dim=n umpy.shape(val_shape)[0]105 val_dim=np.shape(val_shape)[0] 107 106 #Now define and fill up variable 108 107 #treating scalar string or bool as atribute 109 if val_type==str or val_type== bool:108 if val_type==str or val_type==unicode or val_type==bool: 110 109 Group.__setattr__(str(field), str(var)) 111 112 110 #treating list as string table 113 #matlab does not recognise strings so we have to settle down with char arrays114 111 elif val_type==list: 115 112 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime) … … 119 116 ncvar[elt] = var[elt] 120 117 except IndexError: 121 ncvar [0]= " "122 118 ncvar= [] 119 #treating bool tables as string tables 123 120 elif val_type=='bool': 124 121 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime) … … 126 123 for elt in range(0,val_shape[0]): 127 124 ncvar[elt] = str(var[elt]) 128 #treating dictionaries as string tables of dim 2125 #treating dictionaries as tables of strings 129 126 elif val_type==collections.OrderedDict: 130 127 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime) … … 133 130 ncvar[elt,0]=dict.keys(var)[elt] 134 131 ncvar[elt,1]=str(dict.values(var)[elt]) #converting to str to avoid potential problems 135 132 #Now dealing with numeric variables 136 133 else: 137 134 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim,istime) 138 135 ncvar = Group.createVariable(str(field),TypeDict[val_type],dimensions,zlib=True) 139 140 136 if istime: 141 137 last=step_args[0] 142 freq=step_args[1]143 138 md=step_args[2] 144 139 supfield=step_args[3] 145 140 vartab=var 146 for time in range( freq-1,last,freq):141 for time in range(0,last,1): 147 142 if time!=0: 148 143 timevar=md.results.__dict__[supfield].__getitem__(time).__dict__[field] 149 print 'Treating results.'+str(supfield)+'.'+str(field)+' for time '+str(time) 150 vartab=numpy.column_stack((vartab,timevar)) 151 #print numpy.shape(vartab) 144 vartab=np.column_stack((vartab,timevar)) 152 145 try: 153 146 ncvar[:,:]=vartab[:,:] … … 156 149 else: 157 150 try: 158 nan_val=n umpy.isnan(var)151 nan_val=np.isnan(var) 159 152 if nan_val.all(): 160 153 ncvar [:] = 'NaN' … … 171 164 #grab dimension 172 165 for dim in range(0,i): #loop on the dimensions 173 if type(shape[0])==int: 166 if type(shape[0])==int: 174 167 try: 175 168 output=output+[str(DimDict[shape[dim]])] #test if the dimension allready exist 176 169 except KeyError: #if not create it 177 if (shape[dim])> 1:170 if (shape[dim])>0: 178 171 index=len(DimDict)+1 179 172 NewDim=NCData.createDimension('Dimension'+str(index),(shape[dim])) 180 173 DimDict[len(NewDim)]='Dimension'+str(index) 181 174 output=output+[str(DimDict[shape[dim]])] 182 #print 'Defining dimension ' +'Dimension'+str(index)183 175 elif type(shape[0])==str:#dealling with a dictionnary 184 176 try: 185 output=[str(DimDict[numpy.shape(shape)[0]])]+['DictDim'] 177 #dimension5 is 2 to treat with dict 178 output=[str(DimDict[np.shape(shape)[0]])]+['Dimension5'] 186 179 except KeyError: 187 180 index=len(DimDict)+1 188 NewDim=NCData.createDimension('Dimension'+str(index),n umpy.shape(shape)[0])181 NewDim=NCData.createDimension('Dimension'+str(index),np.shape(shape)[0]) 189 182 DimDict[len(NewDim)]='Dimension'+str(index) 190 output=[str(DimDict[numpy.shape(dict.keys(var))[0]])]+['Dimension5'] 191 #print 'Defining dimension ' +'Dimension'+str(index) 183 output=[str(DimDict[np.shape(dict.keys(var))[0]])]+['Dimension5'] 192 184 break 193 185 if istime: -
issm/trunk-jpl/src/m/io/loadmodel.py
r17497 r21235 1 1 from loadvars import loadvars 2 2 from whichdb import whichdb 3 from netCDF4 import Dataset 3 4 4 5 def loadmodel(path): … … 17 18 pass 18 19 else: 19 raise IOError("loadmodel error message: file '%s' does not exist" % path) 20 try: 21 NCFile=Dataset(path,mode='r') 22 NCFile.close() 23 pass 24 except RuntimeError: 25 raise IOError("loadmodel error message: file '%s' does not exist" % path) 26 # try: 27 #recover model on file and name it md 28 struc=loadvars(path) 29 name=[key for key in struc.iterkeys()] 30 if len(name)>1: 31 raise IOError("loadmodel error message: file '%s' contains several variables. Only one model should be present." % path) 20 32 21 try: 22 #recover model on file and name it md 23 struc=loadvars(path) 24 25 name=[key for key in struc.iterkeys()] 26 if len(name)>1: 27 raise IOError("loadmodel error message: file '%s' contains several variables. Only one model should be present." % path) 28 29 md=struc[name[0]] 30 return md 31 32 except Exception as me: 33 print me 34 raise IOError("could not load model '%s'" % path) 35 33 md=struc[name[0]] 34 return md -
issm/trunk-jpl/src/m/io/loadvars.py
r15494 r21235 1 1 import shelve 2 2 import os.path 3 import numpy as np 4 from netCDF4 import Dataset 5 from netCDF4 import chartostring 6 from os import path 3 7 from whichdb import whichdb 8 from model import * 4 9 5 10 def loadvars(*args): … … 51 56 if whichdb(filename): 52 57 print "Loading variables from file '%s'." % filename 53 else: 54 raise IOError("File '%s' not found." % filename) 58 59 my_shelf = shelve.open(filename,'r') # 'r' for read-only 60 if nvdict: 61 for name in nvdict.iterkeys(): 62 try: 63 nvdict[name] = my_shelf[name] 64 print "Variable '%s' loaded." % name 65 except KeyError: 66 value = None 67 print "Variable '%s' not found." % name 55 68 56 my_shelf = shelve.open(filename,'r') # 'r' for read-only 57 58 if nvdict: 59 for name in nvdict.iterkeys(): 60 try: 69 else: 70 for name in my_shelf.iterkeys(): 61 71 nvdict[name] = my_shelf[name] 62 72 print "Variable '%s' loaded." % name 63 except KeyError: 64 value = None 65 print "Variable '%s' not found." % name 73 74 my_shelf.close() 66 75 67 76 else: 68 for name in my_shelf.iterkeys(): 69 nvdict[name] = my_shelf[name] 70 print "Variable '%s' loaded." % name 77 try: 78 NCFile=Dataset(filename,mode='r') 79 NCFile.close() 80 classtype,classtree=netCDFread(filename) 81 nvdict['md']=model() 82 module=map(__import__,dict.values(classtype)) 83 for i,mod in enumerate(dict.keys(classtype)): 84 # print('treating md.{}'.format(mod)) 85 if np.size(classtree[mod])>1: 86 if classtree[mod][0]=='results': 87 #treating results (Dimension4 is time) 88 resdim=len(NCFile.dimensions['Dimension4']) 89 curclass=NCFile.groups[classtree[mod][0]].groups[classtree[mod][1]] 90 nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = [getattr(module[i],classtype[mod])()] 91 if resdim>1: 92 for t in range(1,resdim): 93 nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]].append(getattr(module[i],classtype[mod])()) 94 Tree=nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]][:] 95 else: 96 curclass=NCFile.groups[classtree[mod][0]].groups[classtree[mod][1]] 97 nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(module[i],classtype[mod])() 98 Tree=nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] 99 else: 100 curclass=NCFile.groups[classtree[mod][0]] 101 nvdict['md'].__dict__[mod] = getattr(module[i],classtype[mod])() 102 Tree=nvdict['md'].__dict__[classtree[mod][0]] 103 for var in curclass.variables: 104 #print(' treating {}'.format(var)) 105 varval=curclass.variables[str(var)] 106 vardim=varval.ndim 107 try: 108 val_type=str(varval.dtype) 109 except AttributeError: 110 val_type=type(varval) 111 if vardim==0: 112 try: 113 Tree.__dict__[str(var)]=varval.getValue() 114 if varval.getValue()=='True': 115 Tree.__dict__[str(var)]=True 116 elif varval.getValue()=='False': 117 Tree.__dict__[str(var)]=False 118 except IndexError: 119 Tree.__dict__[str(var)]=[] 120 elif vardim==1: 121 if varval.dtype==str: 122 if varval.shape==1: 123 Tree.__dict__[str(var)]=varval[0] 124 if 'True' in varval[:] or 'False' in varval[:]: 125 Tree.__dict__[str(var)]=np.asarray(varval[:],dtype=bool) 126 else: 127 if classtree[mod][0]=='results' and resdim>1: 128 for t in range(0,resdim): 129 Tree[t].__dict__[str(var)]=varval[t] 130 else: 131 Tree.__dict__[str(var)]=varval[:] 132 elif vardim==2: 133 #dealling with dict 134 if varval.dtype==str: 135 Tree.__dict__[str(var)]=dict(zip(varval[:,0], varval[:,1])) 136 else: 137 if classtree[mod][0]=='results' and resdim>1: 138 for t in range(0,resdim): 139 Tree[t].__dict__[str(var)]=varval[:,t] 140 else: 141 Tree.__dict__[str(var)]=varval[:,:] 142 elif vardim==3: 143 if classtree[mod][0]=='results' and resdim>1: 144 for t in range(0,resdim): 145 Tree[t].__dict__[str(var)]=varval[:,:,t] 146 else: 147 Tree.__dict__[str(var)]=varval[:,:,:] 148 else: 149 print 'table dimension greater than 3 not implemented yet' 150 for attr in curclass.ncattrs(): 151 #print(' treating {}'.format(attr)) 152 if classtree[mod][0]!='results': #no attributes in results 153 Tree.__dict__[str(attr)]=curclass.getncattr(attr) 154 if curclass.getncattr(attr)=='True': 155 Tree.__dict__[str(attr)]=True 156 elif curclass.getncattr(attr)=='False': 157 Tree.__dict__[str(attr)]=False 71 158 72 my_shelf.close() 159 except RuntimeError: 160 raise IOError("File '%s' not found." % filename) 73 161 74 162 if len(args) >= 2 and isinstance(args[1],(str,unicode)): # (value) … … 83 171 return nvdict 84 172 173 174 def netCDFread(filename): 175 def walktree(data): 176 keys = data.groups.keys() 177 for key in keys: 178 yield [str(key)] 179 for children in walktree(data.groups[str(key)]): 180 child=[str(key)] 181 child.append(str(children[0])) 182 yield child 183 print ('Opening {} for reading '.format(filename)) 184 NCData=Dataset(filename, 'r') 185 class_dict={} 186 class_tree={} 187 188 for children in walktree(NCData): 189 classe=str(children[0]) 190 if np.size(children)>1: 191 for name in children[1:]: 192 classe=classe+'.'+name 193 class_dict[classe]=str(getattr(NCData.groups[children[0]].groups[children[1]],'classtype')) 194 else: 195 class_dict[classe]=str(getattr(NCData.groups[classe],'classtype')) 196 class_tree[classe]=children 197 198 return class_dict,class_tree
Note:
See TracChangeset
for help on using the changeset viewer.