Changeset 13966


Ignore:
Timestamp:
11/15/12 13:56:25 (12 years ago)
Author:
jschierm
Message:

CHG: Changed format of results storage for Python.

Location:
issm/trunk-jpl/src/m
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/model/model.py

    r13857 r13966  
    3131from inversion import inversion
    3232from qmu import qmu
     33from results import results
    3334from radaroverlay import radaroverlay
    3435from miscellaneous import miscellaneous
    3536from private import private
    36 from collections import OrderedDict
    3737from EnumDefinitions import *
    3838from ismumps import *
     
    8787                self.qmu              = qmu()
    8888
    89                 self.results          = OrderedDict()
     89                self.results          = results()
    9090                self.radaroverlay     = radaroverlay()
    9191                self.miscellaneous    = miscellaneous()
     
    410410                #Results fields
    411411                if md1.results:
    412                         md2.results=OrderedDict()
    413                         for solutionfield in md1.results.iterkeys():
    414                                 #get time step
    415                                 for i in m1.results[solutionfield].iterkeys():
    416                                         #get subfields
    417                                         for solutionsubfield,field in m1.results[solutionfield][i].iteritems():
    418                                                 if   numpy.size(field)==numberofvertices1:
    419                                                         md2.results[solutionfield][i][solutionsubfield]=field[pos_node]
    420                                                 elif numpy.size(field)==numberofelements1:
    421                                                         md2.results[solutionfield][i][solutionsubfield]=field[pos_elem]
     412                        md2.results=results()
     413                        for solutionfield,field in md1.results.__dict__.iteritems():
     414                                if   isinstance(field,list):
     415                                        setattr(md2.results,solutionfield,[])
     416                                        #get time step
     417                                        for i,fieldi in enumerate(field):
     418                                                if isinstance(fieldi,results) and fieldi:
     419                                                        getattr(md2.results,solutionfield).append(results())
     420                                                        fieldr=getattr(md2.results,solutionfield)[i]
     421                                                        #get subfields
     422                                                        for solutionsubfield,subfield in fieldi.__dict__.iteritems():
     423                                                                if   numpy.size(subfield)==numberofvertices1:
     424                                                                        setattr(fieldr,solutionsubfield,subfield[pos_node])
     425                                                                elif numpy.size(subfield)==numberofelements1:
     426                                                                        setattr(fieldr,solutionsubfield,subfield[pos_elem])
     427                                                                else:
     428                                                                        setattr(fieldr,solutionsubfield,subfield)
    422429                                                else:
    423                                                         md2.results[solutionfield][i][solutionsubfield]=field
     430                                                        getattr(md2.results,solutionfield).append(None)
     431                                elif isinstance(field,results):
     432                                        setattr(md2.results,solutionfield,results())
     433                                        if isinstance(field,results) and field:
     434                                                fieldr=getattr(md2.results,solutionfield)
     435                                                #get subfields
     436                                                for solutionsubfield,subfield in field.__dict__.iteritems():
     437                                                        if   numpy.size(subfield)==numberofvertices1:
     438                                                                setattr(fieldr,solutionsubfield,subfield[pos_node])
     439                                                        elif numpy.size(subfield)==numberofelements1:
     440                                                                setattr(fieldr,solutionsubfield,subfield[pos_elem])
     441                                                        else:
     442                                                                setattr(fieldr,solutionsubfield,subfield)
    424443
    425444                #Keep track of pos_node and pos_elem
  • issm/trunk-jpl/src/m/solve/MatlabProcessPatch.py

    r13023 r13966  
    88
    99        #loop over steps
    10         for structurei in structure.itervalues():
     10        for structurei in structure:
    1111
    1212                #return if there is no field Patch
    13                 if 'Patch' not in structurei:
     13                if not hasattr(structurei,'Patch'):
    1414                        continue
    1515
  • issm/trunk-jpl/src/m/solve/loadresultsfromdisk.py

    r13116 r13966  
    11import os
    2 from collections import OrderedDict
     2from results import *
    33from parseresultsfromdisk import *
    44from EnumToString import EnumToString
     5from MatlabFuncs import *
    56
    67def loadresultsfromdisk(md,filename):
     
    2324
    2425                #initialize md.results if not a structure yet
    25                 if not isinstance(md.results,dict):
    26                         md.results=OrderedDict()
     26                if not isinstance(md.results,results):
     27                        md.results=results()
    2728
    2829                #load results onto model
    29                 structure=parseresultsfromdisk(filename,~md.settings.io_gather)
     30                structure=parseresultsfromdisk(filename,not md.settings.io_gather)
    3031                if not len(structure):
    3132                        raise RuntimeError("No result found in binary file '%s'. Check for solution crash." % filename)
    32                 md.results[structure[1]['SolutionType']]=structure;
     33                setattr(md.results,structure[0].SolutionType,structure)
    3334
    3435                #recover solution_type from results
    35                 md.private.solution=structure[1]['SolutionType']
     36                md.private.solution=structure[0].SolutionType
    3637
    3738                #read log files onto fields
    3839                if os.path.exists(md.miscellaneous.name+'.errlog'):
    3940                        with open(md.miscellaneous.name+'.errlog','r') as f:
    40                                 md.results[structure[1]['SolutionType']]['errlog']=[line[:-1] for line in f]
     41                                setattr(getattr(md.results,structure[0].SolutionType)[0],'errlog',[line[:-1] for line in f])
    4142                else:
    42                         md.results[structure[1]['SolutionType']]['errlog']=[]
     43                        setattr(getattr(md.results,structure[0].SolutionType)[0],'errlog',[])
    4344
    4445                if os.path.exists(md.miscellaneous.name+'.outlog'):
    4546                        with open(md.miscellaneous.name+'.outlog','r') as f:
    46                                 md.results[structure[1]['SolutionType']]['outlog']=[line[:-1] for line in f]
     47                                setattr(getattr(md.results,structure[0].SolutionType)[0],'outlog',[line[:-1] for line in f])
    4748                else:
    48                         md.results[structure[1]['SolutionType']]['outlog']=[]
     49                        setattr(getattr(md.results,structure[0].SolutionType)[0],'outlog',[])
    4950
    50                 if len(md.results[structure[1]['SolutionType']]['errlog']):
     51                if len(getattr(md.results,structure[0].SolutionType)[0].errlog):
    5152                        print ("loadresultsfromcluster info message: error during solution. Check your errlog and outlog model fields.")
     53
     54                #if only one solution, extract it from list for user friendliness
     55                if len(structure) == 1 and not strcmp(structure[0].SolutionType,'TransientSolution'):
     56                        setattr(md.results,structure[0].SolutionType,structure[0])
    5257
    5358        #post processes qmu results if necessary
  • issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py

    r13462 r13966  
    22import numpy
    33from collections import OrderedDict
     4import results as resultsclass
    45from MatlabFuncs import *
    56from MatlabProcessPatch import *
     
    3738                raise IOError("loadresultsfromdisk error message: could not open '%s' for binary reading." % filename)
    3839
    39         results=OrderedDict()
     40        results=[]
    4041
    4142        #Read fields until the end of the file.
    4243        result=ReadData(fid)
    4344        while result:
     45                if result['step'] > len(results):
     46                        for i in xrange(len(results),result['step']-1):
     47                                results.append(None)
     48                        results.append(resultsclass.results())
    4449                #Get time and step
    45                 if result['step'] not in results:
    46                         results[result['step']]=OrderedDict()
    47                         results[result['step']]['step']=result['step']
    48                         results[result['step']]['time']=result['time']
     50                setattr(results[result['step']-1],'step',result['step'])
     51                setattr(results[result['step']-1],'time',result['time'])
    4952       
    5053                #Add result
    51                 if result['step'] in results and \
    52                    result['fieldname'] in results[result['step']] and \
    53                    not strcmp(result['fieldname'],'SolutionType'):
    54                         results[result['step']][result['fieldname']]=numpy.vstack((results[result['step']][result['fieldname']],result['field']))
    55                 else:
    56                         results[result['step']][result['fieldname']]=result['field']
     54                if hasattr(results[result['step']-1],result['fieldname']) and not strcmp(result['fieldname'],'SolutionType'):
     55                        setattr(results[result['step']-1],result['fieldname'],numpy.vstack((getattr(results[result['step']-1],result['fieldname']),result['field'])))
     56                else:
     57                        setattr(results[result['step']-1],result['fieldname'],result['field'])
    5758
    5859                #read next result
     
    7879                raise IOError("loadresultsfromdisk error message: could not open '%s' for binary reading." % filename)
    7980
    80         results=OrderedDict()
     81        results=[]
    8182
    8283        #if we have done split I/O, ie, we have results that are fragmented across patches,
     
    8687
    8788                #Get time and step
    88                 if result['step'] not in results:
    89                         results[result['step']]=OrderedDict()
    90                         results[result['step']]['step']=result['step']
    91                         results[result['step']]['time']=result['time']
     89                if result['step'] > len(results):
     90                        for i in xrange(len(results),result['step']-1):
     91                                results.append(None)
     92                        results.append(resultsclass.results())
     93                setattr(results[result['step']-1],'step',result['step'])
     94                setattr(results[result['step']-1],'time',result['time'])
    9295
    9396                #Add result
    9497                if strcmpi(result['fieldname'],'Patch'):
    95                         results[result['step']][result['fieldname']]=[0,result['N']]
    96                 else:
    97                         results[result['step']][result['fieldname']]=float('NaN')
     98                        setattr(results[result['step']-1],result['fieldname'],[0,result['N']])
     99                else:
     100                        setattr(results[result['step']-1],result['fieldname'],float('NaN'))
    98101
    99102                #read next result
     
    107110                #Add result
    108111                if strcmpi(result['fieldname'],'Patch'):
    109                         patchdimensions=results[result['step']][result['fieldname']]
    110                         results[result['step']][result['fieldname']]=[patchdimensions[0]+result['M'],result['N']]
     112                        patchdimensions=getattr(results[result['step']-1],result['fieldname'])
     113                        setattr(results[result['step']-1],result['fieldname'],[patchdimensions[0]+result['M'],result['N']])
    111114
    112115                #read next result
     
    116119        for result in results.itervalues():
    117120                if 'Patch' in result:
    118                         result['Patch']=numpy.zeros(shape=(result['Patch'][0],result['Patch'][1]),dtype=float)
    119                         result['counter']=0    #use to index into the patch
     121                        setattr(result,'Patch',numpy.zeros((result['Patch'][0],result['Patch'][1])))
     122                        setattr(result,'counter',0)    #use to index into the patch
    120123
    121124        #third pass, this time to read the real information
     
    125128
    126129                #Get time and step
    127                 if result['step'] not in results:
    128                         results[result['step']]=OrderedDict()
    129                         results[result['step']]['step']=result['step']
    130                         results[result['step']]['time']=result['time']
     130                if result['step']> len(results):
     131                        for i in xrange(len(results),result['step']-1):
     132                                results.append(None)
     133                        results.append(resultsclass.results())
     134                setattr(results[result['step']-1],'step',result['step'])
     135                setattr(results[result['step']-1],'time',result['time'])
    131136
    132137                #Add result
    133138                if strcmpi(result['fieldname'],'Patch'):
    134                         counter=results[result['step']]['counter']
     139                        counter=results[result['step']-1].counter
    135140                        counter2=counter+result['field'].shape[0]-1
    136                         results[result['step']][result['fieldname']][counter:counter2,:]=result['field']
    137 
     141                        getattr(results[result['step']-1],result['fieldname'])[counter:counter2,:]=result['field']
    138142                        #increment counter:
    139                         results[result['step']]['counter']=counter2+1
    140                 else:
    141                         results[result['step']][result['fieldname']]=result['field']
     143                        results[result['step']-1].counter=counter2+1
     144                else:
     145                        setattr(results[result['step']-1],result['fieldname'],result['field'])
    142146
    143147                #read next result
     
    188192
    189193        except struct.error as e:
    190                 result=OrderedDict()
     194                result=None
    191195
    192196        return result
     
    230234
    231235        except struct.error as e:
    232                 result=OrderedDict()
     236                result=None
    233237
    234238        return result
Note: See TracChangeset for help on using the changeset viewer.