Changeset 21644
- Timestamp:
- 03/30/17 02:04:17 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py
r21356 r21644 1 1 from netCDF4 import Dataset, stringtochar 2 import numpy as 2 import numpy as np 3 3 import time 4 4 import collections … … 23 23 NCData.history = 'Created ' + time.ctime(time.time()) 24 24 25 # gather geometry and timestepping asdimensions25 #define netCDF dimensions 26 26 try: 27 27 StepNum=np.shape(dict.values(md.results.__dict__))[1] … … 39 39 DimDict[len(NewDim)]='DimNum'+str(dimindex) 40 40 41 #get all model classes and create respective groups42 41 typelist=[bool,str,unicode,int,float,complex, 43 42 collections.OrderedDict, 44 43 np.int64,np.ndarray,np.float64] 45 44 groups=dict.keys(md.__dict__) 45 #get all model classes and create respective groups 46 46 for group in groups: 47 47 NCgroup=NCData.createGroup(str(group)) … … 58 58 else: 59 59 StdList=type(md.__dict__[group].__dict__[field][0]) in typelist 60 60 NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__) 61 61 if StdList: #this is a standard or empty list just proceed 62 NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__)63 62 Var=md.__dict__[group].__dict__[field] 64 DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict ,False)63 DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict) 65 64 else: #this is a list of fields, specific treatment needed 66 65 Listsize=len(md.__dict__[group].__dict__[field]) 67 NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__)68 66 Subgroup=NCgroup.createGroup(str(field)) 69 67 Subgroup.__setattr__('classtype',md.__dict__[group].__dict__[field].__class__.__name__) … … 87 85 except AttributeError: 88 86 Var=md.__dict__[group].__dict__[field].__getitem__(listindex)[subfield] 89 DimDict=CreateVar(NCData,Var,subfield,Listgroup,DimDict,False,md.__dict__[group],field,listindex) 87 DimDict=CreateVar(NCData,Var,subfield,Listgroup,DimDict,md.__dict__[group],field,listindex) 88 90 89 #No subgroup, we directly treat the variable 91 90 elif type(md.__dict__[group].__dict__[field]) in typelist or field=='bamg': 92 91 NCgroup.__setattr__('classtype', md.__dict__[group].__class__.__name__) 93 92 Var=md.__dict__[group].__dict__[field] 94 DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict,False) 95 else: 93 DimDict=CreateVar(NCData,Var,field,NCgroup,DimDict) 94 elif md.__dict__[group].__dict__[field] is None: 95 print( 'field md.{}.{} is None'.format(group,field)) 96 #do nothing 97 else: 96 98 NCgroup.__setattr__('classtype', str(group)) 97 99 Subgroup=NCgroup.createGroup(str(field)) … … 102 104 if str(subfield)!='outlog': 103 105 Var=md.__dict__[group].__dict__[field].__dict__[subfield] 104 DimDict=CreateVar(NCData,Var,subfield,Subgroup,DimDict ,False)106 DimDict=CreateVar(NCData,Var,subfield,Subgroup,DimDict) 105 107 106 108 NCData.close() … … 108 110 #============================================================================ 109 111 #Define the variables 110 def CreateVar(NCData,var,field,Group,DimDict, istime,*step_args):112 def CreateVar(NCData,var,field,Group,DimDict,*step_args): 111 113 #grab type 112 114 try: … … 136 138 #treating list as string table 137 139 elif val_type==list: 138 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim ,istime)140 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim) 139 141 #try to get the type from the first element 140 142 try: … … 150 152 #treating bool tables as string tables 151 153 elif val_type=='bool': 152 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim ,istime)154 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim) 153 155 ncvar = Group.createVariable(str(field),str,dimensions,zlib=True) 154 156 for elt in range(0,val_shape[0]): … … 156 158 #treating dictionaries as tables of strings 157 159 elif val_type==collections.OrderedDict or val_type==dict: 158 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim ,istime)160 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim) 159 161 ncvar = Group.createVariable(str(field),str,dimensions,zlib=True) 160 162 for elt in range(0,val_dim): … … 163 165 #Now dealing with numeric variables 164 166 else: 165 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim ,istime)167 dimensions,DimDict=GetDim(NCData,var,val_shape,DimDict,val_dim) 166 168 ncvar = Group.createVariable(str(field),TypeDict[val_type],dimensions,zlib=True) 167 if istime: 168 md=step_args[0] 169 supfield=step_args[1] 170 index=step_args[2] 171 vartab=var 172 timevar=md.__dict__[supfield].__getitem__(index).__dict__[field] 173 try: 174 ncvar[:,:]=timevar[:,:] 175 except ValueError: 176 ncvar[:]=timevar.T[:] 177 else: 178 try: 179 nan_val=np.isnan(var) 180 if nan_val.all(): 181 ncvar [:] = 'NaN' 182 else: 183 ncvar[:] = var 184 except TypeError: #type does not accept nan, get vallue of the variable 169 try: 170 nan_val=np.isnan(var) 171 if nan_val.all(): 172 ncvar [:] = 'NaN' 173 else: 185 174 ncvar[:] = var 175 except TypeError: #type does not accept nan, get vallue of the variable 176 ncvar[:] = var 186 177 return DimDict 187 178 188 179 #============================================================================ 189 180 #retriev the dimension tuple from a dictionnary 190 def GetDim(NCData,var,shape,DimDict,i ,istime):181 def GetDim(NCData,var,shape,DimDict,i): 191 182 output=[] 192 183 #grab dimension … … 211 202 output=[str(DimDict[np.shape(dict.keys(var))[0]])]+[DimDict[2]] 212 203 break 213 if istime:214 output=output+['DimNum1']215 204 return tuple(output), DimDict
Note:
See TracChangeset
for help on using the changeset viewer.