Changeset 27264
- Timestamp:
- 09/05/22 02:05:50 (3 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.m
r26968 r27264 41 41 DimValue(2)=DimSize(2).value; 42 42 % adding mesh related dimensions 43 dimlist=[2 ,40,md.mesh.numberofelements,md.mesh.numberofvertices,size(md.mesh.elements,2)];43 dimlist=[2 40 md.mesh.numberofelements md.mesh.numberofvertices size(md.mesh.elements,2)]; 44 44 dimnames=["DictDummy" "StringLength" "EltNum" "VertNum" "VertPerElt"]; 45 if isprop(md.mesh, 'edges'), 46 dimlist(end+1)=md.mesh.numberofedges; 47 dimnames(end+1)="EdgeNum"; 48 else 49 dimlist(end+1)=0; 50 dimnames(end+1)="EdgeNum"; 51 end 45 52 if verbose > 0, 46 53 disp('===Creating dimensions ==='); 47 54 end 48 55 %define netcdf dimensions 49 for i=1: 556 for i=1:length(dimlist) 50 57 % do not add the dimension if it exists already 51 58 if sum(dimlist(i) == DimValue) == 0 … … 61 68 62 69 for cl=1:length(issmclasses), 63 subclasses=fieldnames(md.(issmclasses{cl}))'; 64 for sc=1:length(subclasses), 65 if sum(strcmp(class(md.(issmclasses{cl}).(subclasses{sc})), typelist)) == 0, 66 issmclasses = [issmclasses class(md.(issmclasses{cl}).(subclasses{sc}))]; 70 if isempty(md.(issmclasses{cl})), 71 disp(sprintf("md.%s is empty and will be left as default",issmclasses{cl})); 72 else 73 subclasses=fieldnames(md.(issmclasses{cl}))'; 74 for sc=1:length(subclasses), 75 if sum(strcmp(class(md.(issmclasses{cl}).(subclasses{sc})), typelist)) == 0, 76 issmclasses = [issmclasses class(md.(issmclasses{cl}).(subclasses{sc}))]; 77 end 67 78 end 68 79 end … … 83 94 groupID=netcdf.defGrp(ncid,groups{i}); 84 95 %In each group gather the fields of the class 96 if isempty(md.(groups{i})), 97 disp(sprintf("WARNING: md.%s is empty, we skip it.",groups{i})) 98 continue 99 end 85 100 fields=fieldnames(md.(groups{i})); 86 101 if isempty(fields), … … 169 184 elseif isa(Var,'struct') % structures need special treatment 170 185 if strcmp(groups{i}, 'results'), 171 klasstring= 'results.results';186 klasstring=strcat(groups{i} ,'.', groups{i}); 172 187 netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring); 173 188 Listsize= length(md.(groups{i}).(fields{j})); … … 212 227 end 213 228 end 229 elseif strcmp(groups{i}, 'toolkits'), 230 klasstring=strcat(groups{i} ,'.', groups{i}); 231 netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring); 232 if verbose > 4, 233 disp(sprintf("=}{=creating var for %s.%s",groups{i}, fields{j})); 234 end 235 236 [DimSize,DimValue,varid]=CreateVar(ncid,Var,groupID,fields{j},DimSize,DimValue); 237 if ~isempty(varid), 238 FillVar(Var,groupID,varid); 239 end 240 214 241 elseif isempty(fieldnames(md.(groups{i}).(fields{j}))) % this is an empty struct, jus treat it as normal 215 242 klass=class(md.(groups{i})); … … 399 426 elseif isa(Var,'struct'), 400 427 %Start by getting the structure fields and size 401 locfields=fieldnames(Var) 428 locfields=fieldnames(Var); 402 429 for i=1:length(locfields), 403 430 for j=1:2, 404 431 if j==1, 405 CharVar=locfields{i}; 432 CharVar=locfields{i}'; 433 disp(size(CharVar)) 406 434 if length(CharVar)==0 407 435 CharVar='emptystruct'; 408 436 end 409 startpoint=[ i-1,0,0];437 startpoint=[0,0,i-1] 410 438 else 411 439 if isa(Var.(locfields{i}),'char'), 412 CharVar=Var.(locfields{i}) ;440 CharVar=Var.(locfields{i})'; 413 441 else 414 CharVar=num2str(Var.(locfields{i})) ;442 CharVar=num2str(Var.(locfields{i}))'; 415 443 end 416 444 if length(CharVar)==0 417 445 CharVar='emptystruct'; 418 446 end 419 startpoint=[ i-1,1,0];420 end 421 422 extent=[ 1,1,min(length(CharVar),40)];447 startpoint=[0,1,i-1] 448 end 449 450 extent=[min(length(CharVar),40), 1, 1] 423 451 if length(CharVar)>40, 424 452 netcdf.putVar(groupID,varid,startpoint,extent,CharVar(1:40)); … … 458 486 if dim>0, 459 487 for i=1:alldim, 460 if size(Var, i)>1 || i>dim , %we skip dimensions with zero lenght but want to add dimensions from cells488 if size(Var, i)>1 || i>dim || isa(Var, 'struct'), %we skip dimensions with zero lenght but want to add dimensions from cells 461 489 indsize=find(varsize(i)==DimValue); 462 490 if length(indsize)>0 … … 478 506 % struct also need an extra dimension 2, but only if non empty 479 507 if isa(Var,'struct'), 480 dims=[ dims DimSize(3).index DimSize(4).index];508 dims=[DimSize(4).index DimSize(3).index, dims]; 481 509 end 482 510 end -
issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py
r26968 r27264 99 99 dimlist = [2, 40, md.mesh.numberofelements, md.mesh.numberofvertices, np.shape(md.mesh.elements)[1]] 100 100 dimnames = ['DictDummy', 'StringLength', 'EltNum', 'VertNum', 'VertPerElt'] 101 try: 102 dimlist = dimlist + [md.mesh.numberofedges] 103 dimnames = dimnames + ['EdgeNum'] 104 except AttributeError: 105 #no edges on this mesh, we fix it at 0 106 dimlist += [0] 107 dimnames += ['EdgeNum'] 101 108 if verbose > 0: 102 109 print('===Creating dimensions ===') … … 315 322 if val_type.startswith('<U'): 316 323 val_type = 'stringarray' 317 print(var)318 324 except AttributeError: 319 325 val_type = type(var) -
issm/trunk-jpl/src/m/io/loadvars.py
r26968 r27264 55 55 56 56 timeindex = False 57 SteadySols = ['ThermalSolution', 'HydrologySolution', 'StressbalanceSolution'] 57 58 58 59 for key, value in kwargs.items(): … … 105 106 #here we have a more NC approach with time being a dimension 106 107 listtype = split(r'\.', classtype[mod][0])[1] 107 print(listtype) 108 if len(NCFile.dimensions['Time']) == 1: 108 try: 109 soltype = str(getattr(curclass, 'SolutionType')) 110 except AttributeError: 111 #might be an older format try that instead : 112 soltype = str(getattr(curclass, 'sOLUTIONtYPE')) 113 if len(NCFile.dimensions['Time']) == 1 or soltype in SteadySols: 109 114 nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(classtype[mod][1], listtype)() 110 115 Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] … … 148 153 Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[defname][defindex - 1] 149 154 #}}} 155 elif classtype[mod][0] == 'collections.OrderedDict': #Treating multiple toolkits {{{ 156 nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(classtype[mod][1], 'OrderedDict') 157 Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] 150 158 else: 151 159 if verbose > 0: … … 184 192 else: 185 193 groupclass = [curclass] 186 #==== We deal with Variables {{{187 194 for groupindex, listclass in enumerate(groupclass): 195 try: 196 soltype = str(getattr(listclass, 'SolutionType')) 197 except AttributeError: 198 soltype = 'NoSol' 199 #==== We deal with Variables {{{ 188 200 for var in listclass.variables: 189 201 if not resname or var == resname: … … 217 229 else: 218 230 print('table dimension greater than 3 not implemented yet') 231 elif soltype in SteadySols: 232 Tree.__dict__[str(var)] = varval[:].data 219 233 else: #old format had step sorted in difeerent group so last group is last time 220 234 Tree[0].__dict__[str(var)] = varval[:].data 221 235 else: 222 236 if NewFormat: 223 incomplete = 'Time' not in varval.dimensions 237 incomplete = 'Time' not in varval.dimensions and soltype not in SteadySols 224 238 if incomplete: 225 239 try: … … 230 244 #just one step, so no dimension, we just put it on the first solutionstep 231 245 timelist = [0] 246 elif soltype in SteadySols: 247 timelist = [0] 232 248 else: 233 249 timelist = np.arange(0, len(NCFile.dimensions['Time'])) 234 for t in timelist: 235 if verbose > 5: 236 print("filing step {} for {}".format(t, var)) 237 if vardim == 0: 238 Tree[t].__dict__[str(var)] = varval[:].data 239 elif vardim == 1: 240 stepval = ma.masked_array(varval[t].data, mask=np.where(np.isnan(varval[t]), 1, 0)) 241 Tree[t].__dict__[str(var)] = ma.compressed(stepval) 242 elif vardim == 2: 243 stepval = ma.masked_array(varval[t, :].data, mask=np.where(np.isnan(varval[t, :]), 1, 0)) 244 Tree[t].__dict__[str(var)] = ma.compressed(stepval) 245 elif vardim == 3: 246 stepval = ma.masked_array(varval[t, :, :].data, mask=np.where(np.isnan(varval[t, :, :]), 1, 0)) 247 Tree[t].__dict__[str(var)] = ma.compressed(stepval).reshape((stepval.count(0)[0], stepval.count(1)[0])) 248 else: 249 print('table dimension greater than 3 not implemented yet') 250 if soltype in SteadySols: 251 Tree.__dict__[str(var)] = varval[:].data 252 else: 253 for t in timelist: 254 if verbose > 5: 255 print("filing step {} for {}".format(t, var)) 256 if vardim == 0: 257 Tree[t].__dict__[str(var)] = varval[:].data 258 elif vardim == 1: 259 stepval = ma.masked_array(varval[t].data, mask=np.where(np.isnan(varval[t]), 1, 0)) 260 Tree[t].__dict__[str(var)] = ma.compressed(stepval) 261 elif vardim == 2: 262 stepval = ma.masked_array(varval[t, :].data, mask=np.where(np.isnan(varval[t, :]), 1, 0)) 263 Tree[t].__dict__[str(var)] = ma.compressed(stepval) 264 elif vardim == 3: 265 stepval = ma.masked_array(varval[t, :, :].data, mask=np.where(np.isnan(varval[t, :, :]), 1, 0)) 266 Tree[t].__dict__[str(var)] = ma.compressed(stepval).reshape((stepval.count(0)[0], stepval.count(1)[0])) 267 else: 268 print('table dimension greater than 3 not implemented yet') 250 269 else: 251 270 if verbose > 0: … … 315 334 Tree.__dict__[str(var)] = varval[:, :].data 316 335 elif vardim == 3: 317 Tree.__dict__[str(var)] = varval[:, :, :].data 336 if varval.dtype == "|S1": #that is for matlab chararcter arrays 337 #most likely that is a toolkit dictionar so should be treated as such 338 #first we convert the character table to strings 339 stringtable = [] 340 for i in range(np.shape(varval)[0]): 341 stringtable.append([chartostring(varval[i, 0, :]), chartostring(varval[i, 1, :])]) 342 stringtable = np.asarray(stringtable, dtype=str) 343 Tree.__dict__[str(var)] = OrderedDict([('toolkit', str(varval[np.where(stringtable[:, 0] == 'toolkit')[0][0], 1]))]) 344 strings1 = [str(arg[0]) for arg in stringtable if arg[0] != 'toolkits'] 345 strings2 = [str(arg[1]) for arg in stringtable if arg[0] != 'toolkits'] 346 Tree.__dict__[str(var)].update(list(zip(strings1, strings2))) 347 else: 348 Tree.__dict__[str(var)] = varval[:, :, :].data 318 349 else: 319 350 print('table dimension greater than 3 not implemented yet') … … 387 418 if class_dict[classe][0] not in ['dict', 'list', 'cell']: 388 419 modulename = split(r'\.', class_dict[classe][0])[0] 389 if modulename == "giaivins": 390 print("WARNING: module {} does not exist anymore and is skipped".format(modulename)) 391 else: 420 try: 392 421 class_dict[classe].append(import_module(modulename)) 393 422 class_tree[classe] = [group, ] 423 except ModuleNotFoundError: 424 print("WARNING: module {} does not exist anymore and is skipped".format(modulename)) 425 394 426 except AttributeError: 395 427 print(('group {} is empty'.format(group)))
Note:
See TracChangeset
for help on using the changeset viewer.