Ignore:
Timestamp:
12/08/22 00:23:36 (2 years ago)
Author:
jdquinn
Message:

CHG: MATLAB > Python translation; cleanup

File:
1 edited

Legend:

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

    r27427 r27458  
     1from fielddisplay import fielddisplay
     2from iluasmoptions import iluasmoptions
    13from IssmConfig import IssmConfig
    2 from mumpsoptions import mumpsoptions
    3 from iluasmoptions import iluasmoptions
    4 from fielddisplay import fielddisplay
    54from issmgslsolver import issmgslsolver
    65from issmmumpssolver import issmmumpssolver
     6from mumpsoptions import mumpsoptions
    77
    88
    99class toolkits(object):
    10     """TOOLKITS class definition
     10    """toolkits class definition
    1111
    1212    Usage:
     
    1414    """
    1515
    16     def __init__(self): #{{{
     16    def __init__(self, *args):  # {{{
     17        self.DefaultAnalysis = None
     18        self.RecoveryAnalysis = None
     19
     20        nargs = len(args)
     21        if nargs == 0:
     22            self.setdefaultparameters()
     23        elif nargs == 1:
     24            # TODO: Replace the following with constructor
     25            self.setdefaultparameters()
     26        else:
     27            raise Exception('constructor not supported')
     28    # }}}
     29
     30    def __repr__(self):  # {{{
     31        s = "List of toolkits options per analysis:\n\n"
     32        for analysis in list(vars(self).keys()):
     33            s += "{}\n".format(fielddisplay(self, analysis, ''))
     34
     35        return s
     36    # }}}
     37
     38    def addoptions(self, analysis, *args):  # {{{
     39        """addoptions - add analysis to md.toolkits.analysis
     40
     41        Optional third parameter adds toolkits options to analysis.
     42       
     43        Usage:
     44            md.toolkits = addoptions(md.toolkits, 'StressbalanceAnalysis', FSoptions())
     45            md.toolkits = addoptions(md.toolkits, 'StressbalanceAnalysis')
     46        """
     47
     48        # Create dynamic property if property does not exist yet
     49        if not hasattr(self, analysis):
     50            setattr(self, analysis, None)
     51
     52        # Add toolkits options to analysis
     53        if len(args) == 1:
     54            setattr(self, analysis, args[0])
     55
     56        return self
     57    # }}}
     58
     59    def setdefaultparameters(self):  # {{{
    1760        # Default toolkits
    1861        if IssmConfig('_HAVE_PETSC_')[0]:
     
    2871                self.DefaultAnalysis = issmgslsolver()
    2972            else:
    30                 raise IOError("ToolkitsFile error: need at least Mumps or Gsl to define issm solver type")
     73                raise IOError('ToolkitsFile error: need at least MUMPS or GSL to define ISSM solver type, no default solver assigned')
    3174
    3275        # Use same solver for Recovery mode
    3376        self.RecoveryAnalysis = self.DefaultAnalysis
    3477
    35         # The other properties are dynamic
    36     #}}}
     78        return self
     79    # }}}
    3780
    38     def __repr__(self): #{{{
    39         s = "List of toolkits options per analysis:\n\n"
    40         for analysis in list(vars(self).keys()):
    41             s += "{}\n".format(fielddisplay(self, analysis, ''))
     81    def checkconsistency(self, md, solution, analyses):  # {{{
     82        supported_analyses = [
     83            'DefaultAnalysis',
     84            'RecoveryAnalysis',
     85            'StressbalanceAnalysis',
     86            'GLheightadvectionAnalysis',
     87            'MasstransportAnalysis',
     88            'ThermalAnalysis',
     89            'EnthalpyAnalysis',
     90            'AdjointBalancethicknessAnalysis',
     91            'BalancethicknessAnalysis',
     92            'Balancethickness2Analysis',
     93            'BalancethicknessSoftAnalysis',
     94            'BalancevelocityAnalysis',
     95            'DamageEvolutionAnalysis',
     96            'LoveAnalysis',
     97            'EsaAnalysis',
     98            'SealevelchangeAnalysis',
     99            'FreeSurfaceBaseAnalysis',
     100            'FreeSurfaceTopAnalysis',
     101            'LevelsetAnalysis',
     102            'DebrisAnalysis',
     103            'L2ProjectionBaseAnalysis',
     104            'ExtrudeFromBaseAnalysis',
     105            'ExtrudeFromTopAnalysis'
     106        ]
     107        analyses = list(vars(self).keys())
     108        for analysis in analyses:
     109            if analysis not in supported_analyses:
     110                md.checkmessage('md.toolkits.{} not supported yet'.format(analysis))
    42111
    43         return s
    44     #}}}
    45 
    46     def addoptions(self, analysis, *args): #{{{
    47         # Usage example:
    48         #    md.toolkits = addoptions(md.toolkits, 'StressbalanceAnalysis', FSoptions())
    49         #    md.toolkits = addoptions(md.toolkits, 'StressbalanceAnalysis')
    50 
    51         # Create dynamic property if property does not exist yet
    52         if not hasattr(self, analysis):
    53             setattr(self, analysis, None)
    54 
    55         # Add toolkits options to analysis
    56         if len(args) == 1:
    57             setattr(self, analysis, args[0])
    58 
    59         return self
    60     #}}}
    61 
    62     def checkconsistency(self, md, solution, analyses): #{{{
    63         # TODO:
    64         # - Implement something closer to a switch as in
    65         # src/m/classes/toolkits.m?
    66         #
    67         for analysis in list(vars(self).keys()):
    68112            if not getattr(self, analysis):
    69                 md.checkmessage("md.toolkits.{} is empty".format(analysis))
     113                md.checkmessage('md.toolkits.{} is empty'.format(analysis))
    70114
    71115        return md
    72     #}}}
     116    # }}}
    73117
    74     def ToolkitsFile(self, filename): #{{{
    75         """TOOLKITSFILE - build toolkits file
     118    def ToolkitsFile(self, filename):  # {{{
     119        """ToolkitsFile - build toolkits file
    76120
    77         Build a PETSc compatible options file, from the toolkits model field + return options string.
     121        Build a PETSc compatible options file, from the toolkits model field and return options string.
    78122        This file will also be used when the toolkit used is 'issm' instead of 'petsc'.
    79123
     
    86130            fid = open(filename, 'w')
    87131        except IOError as e:
    88             raise IOError("ToolkitsFile error: could not open {}' for writing due to".format(filename), e)
     132            raise IOError('ToolkitsFile error: could not open {} for writing due to {}'.format(filename), e)
    89133
    90134        # Write header
    91         fid.write("%s%s%s\n" % ('%Toolkits options file: ', filename, ' written from Python toolkits array'))
     135        fid.write('{}{}{}\n'.format('%Toolkits options file: ', filename, ' written from Python toolkits array'))
    92136
    93137        # Start writing options
     
    96140
    97141            # First write analysis
    98             fid.write("\n+{}\n".format(analysis))  # Append a + to recognize it's an analysis enum
     142            fid.write('\n+{}\n'.format(analysis))  # Append a + to recognize it's an analysis enum
     143
    99144            # Now, write options
    100145            for optionname, optionvalue in list(options.items()):
     
    102147                if not optionvalue:
    103148                    # This option has only one argument
    104                     fid.write("-{}\n".format(optionname))
     149                    fid.write('-{}\n'.format(optionname))
    105150                else:
    106151                    # Option with value. Value can be string or scalar.
    107152                    if isinstance(optionvalue, (bool, int, float)):
    108                         fid.write("-{} {}\n".format(optionname, optionvalue))
     153                        fid.write('-{} {}\n'.format(optionname, optionvalue))
    109154                    elif isinstance(optionvalue, str):
    110                         fid.write("-{} {}\n".format(optionname, optionvalue))
     155                        fid.write('-{} {}\n'.format(optionname, optionvalue))
    111156                    else:
    112                         raise TypeError("ToolkitsFile error: option '{}' is not well formatted.".format(optionname))
     157                        raise TypeError('ToolkitsFile error: option {} is not well formatted'.format(optionname))
    113158
    114159        fid.close()
    115     #}}}
     160    # }}}
Note: See TracChangeset for help on using the changeset viewer.