Changeset 26553


Ignore:
Timestamp:
11/08/21 11:59:05 (3 years ago)
Author:
jdquinn
Message:

CHG: MATLAB -> Python translations; clean up

Location:
issm/trunk-jpl
Files:
4 added
12 edited

Legend:

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

    r26486 r26553  
    77
    88
    9 class SMBcomponents(object):
     9class SMBautoregression(object):
    1010    """SMBAUTOREGRESSION class definition
    1111
     
    2222        self.ar_timestep = 0
    2323        self.phi = np.nan
    24         self.covmat = np.nan
    2524        self.basin_id = np.nan
    26         self.randomflag = 1
    2725        self.steps_per_step = 1
    2826        self.averaging = 0
     
    5957    def setdefaultparameters(self): #{{{
    6058        self.ar_order = 0.0 # Autoregression model of order 0
    61         self.randomflag = 1
    6259    # }}}
    6360
     
    8784            self.phi = np.zeros((self.num_basins, self.ar_order)) # Autoregression model of order 0
    8885            print('      smb.phi (lag coefficients) not specified: order of autoregressive model set to 0')
    89         if np.all(np.isnan(self.covmat)):
    90             self.covmat = 1e-21 * np.eye(self.num_basins) # No stochasticity and no covariance
    91             print('      smb.covmat not specified: stochasticity set to 0')
    9286        return self
    9387    # }}}
     
    9892            md = checkfield(md, 'fieldname', 'smb.basin_id', 'Inf', 1, '>=', 0, '<=', md.smb.num_basins, 'size', [md.mesh.numberofelements])
    9993            md = checkfield(md, 'fieldname', 'smb.beta0', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector
    100             md = checkfield(md, 'fieldname', 'smb.beta1', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector
     94            md = checkfield(md, 'fieldname', 'smb.beta1', 'NaN', 1, 'Inf', 1, 'size', [1, md.smb.num_basins], 'numel', md.smb.num_basins) # Scheme fails if passed as column vector; NOTE: As opposed to MATLAB implementation, pass list
    10195            md = checkfield(md, 'fieldname', 'smb.ar_order', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', 0)
    10296            md = checkfield(md, 'fieldname', 'smb.ar_initialtime', 'numel', 1, 'NaN', 1, 'Inf', 1)
    10397            md = checkfield(md, 'fieldname', 'smb.ar_timestep', 'numel', 1, 'NaN', 1, 'Inf', 1, '>=', md.timestepping.time_step) # Autoregression time step cannot be finer than ISSM timestep
    10498            md = checkfield(md, 'fieldname', 'smb.phi', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, md.smb.ar_order])
    105             md = checkfield(md, 'fieldname', 'smb.covmat', 'NaN', 1, 'Inf', 1, 'size', [md.smb.num_basins, md.smb.num_basins])
    106             md = checkfield(md, 'fieldname', 'smb.randomflag', 'numel', [1], 'values', [0, 1])
    10799        md = checkfield(md, 'fieldname', 'smb.steps_per_step', '>=', 1, 'numel', [1])
    108100        md = checkfield(md, 'fieldname', 'smb.averaging', 'numel', [1], 'values', [0, 1, 2])
     
    123115        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'beta1', 'format', 'DoubleMat', 'name', 'md.smb.beta1', 'scale', 1 / (yts ** 2), 'yts', yts)
    124116        WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'phi', 'format', 'DoubleMat', 'name', 'md.smb.phi', 'yts', yts)
    125         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'covmat', 'format', 'DoubleMat', 'name', 'md.smb.covmat', 'scale', 1 / (yts ** 2), 'yts', yts)
    126         WriteData(fid, prefix, 'object', self, 'class', 'smb', 'fieldname', 'randomflag', 'format', 'Boolean')
    127117        WriteData(fid, prefix, 'object', self, 'fieldname', 'steps_per_step', 'format', 'Integer')
    128118        WriteData(fid, prefix, 'object', self, 'fieldname', 'averaging', 'format', 'Integer')
  • issm/trunk-jpl/src/m/classes/calvingvonmises.py

    r24305 r26553  
     1from checkfield import checkfield
    12from fielddisplay import fielddisplay
    2 from checkfield import checkfield
    33from WriteData import WriteData
    44
    55
    66class calvingvonmises(object):
    7     """
    8     CALVINGVONMISES class definition
     7    """CALVINGVONMISES class definition
    98
    10        Usage:
    11           calvingvonmises = calvingvonmises()
     9    Usage:
     10        calvingvonmises = calvingvonmises()
    1211    """
    1312
    1413    def __init__(self):  # {{{
    15 
    16         self.stress_threshold_groundedice = 0.
    17         self.stress_threshold_floatingice = 0.
    18         self.min_thickness = 0.
     14        self.stress_threshold_groundedice = 0
     15        self.stress_threshold_floatingice = 0
     16        self.min_thickness = 0
    1917
    2018    #set defaults
     
    2422
    2523    def __repr__(self):  # {{{
    26         string = '   Calving VonMises parameters:'
    27         string = "%s\n%s" % (string, fielddisplay(self, 'stress_threshold_groundedice', 'sigma_max applied to grounded ice only [Pa]'))
    28         string = "%s\n%s" % (string, fielddisplay(self, 'stress_threshold_floatingice', 'sigma_max applied to floating ice only [Pa]'))
    29         string = "%s\n%s" % (string, fielddisplay(self, 'min_thickness', 'minimum thickness below which no ice is allowed [m]'))
    30 
    31         return string
     24        s = '   Calving VonMises parameters:\n'
     25        s += '{}\n'.format(fielddisplay(self, 'stress_threshold_groundedice', 'sigma_max applied to grounded ice only [Pa]'))
     26        s += '{}\n'.format(fielddisplay(self, 'stress_threshold_floatingice', 'sigma_max applied to floating ice only [Pa]'))
     27        s += '{}\n'.format(fielddisplay(self, 'min_thickness', 'minimum thickness below which no ice is allowed [m]'))
     28        return s
    3229    #}}}
    3330
     
    3734
    3835    def setdefaultparameters(self):  # {{{
    39         #Default sigma max
     36        # Default sigma max
    4037        self.stress_threshold_groundedice = 1e6
    4138        self.stress_threshold_floatingice = 150e3
    4239
    43         #turn off min_thickness by default.
     40        # Turn off min_thickness by default
    4441        self.min_thickness = 0.
    4542        return self
     
    4744
    4845    def checkconsistency(self, md, solution, analyses):  # {{{
    49         #Early return
    50         if solution == 'TransientSolution' or md.transient.ismovingfront == 0:
     46        # Early return
     47        if solution == 'TransientSolution' or not md.transient.ismovingfront:
    5148            return
    5249
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignot.py

    r26493 r26553  
     1# -*- coding: utf-8 -*-
     2
    13import numpy as np
    24
     
    79
    810class frontalforcingsrignot(object):
    9     """FRONTAL FORCINGS Rignot class definition
     11    """FRONTALFORCINGSRIGNOT class definition
    1012
    1113    Usage:
  • issm/trunk-jpl/src/m/classes/frontalforcingsrignotautoregression.m

    r26526 r26553  
    77        properties (SetAccess=public)
    88                num_basins           = 0;
    9       beta0                = NaN;
    10       beta1                = NaN;
    11       ar_order             = 0;
    12       ar_initialtime       = 0;
    13       ar_timestep          = 0;
    14       phi                  = NaN;
    15       basin_id             = NaN;
     9                beta0                = NaN;
     10                beta1                = NaN;
     11                ar_order             = 0;
     12                ar_initialtime       = 0;
     13                ar_timestep          = 0;
     14                phi                  = NaN;
     15                basin_id             = NaN;
    1616                subglacial_discharge = NaN;
    1717        end
     
    4040                function self = setdefaultparameters(self) % {{{
    4141
    42                         basin_id             = NaN;
    43                         num_basins           = 0;
    44                         subglacial_discharge = NaN;
    45                         self.ar_order        = 0.0; %autoregression model of order 0
     42                        self.basin_id             = NaN;
     43                        self.num_basins           = 0;
     44                        self.subglacial_discharge = NaN;
     45                        self.ar_order             = 0.0; %autoregression model of order 0
    4646
    4747                end % }}}
     
    5252                        md = checkfield(md,'fieldname','frontalforcings.num_basins','numel',1,'NaN',1,'Inf',1,'>',0);
    5353         md = checkfield(md,'fieldname','frontalforcings.basin_id','Inf',1,'>=',0,'<=',md.frontalforcings.num_basins,'size',[md.mesh.numberofelements 1]);
    54                         md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'nan',1,'Inf',1,'timeseries',1);
     54                        md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'NaN',1,'Inf',1,'timeseries',1);
    5555                        md = checkfield(md,'fieldname','frontalforcings.beta0','NaN',1,'Inf',1,'size',[1,md.frontalforcings.num_basins],'numel',md.frontalforcings.num_basins);
    5656         md = checkfield(md,'fieldname','frontalforcings.beta1','NaN',1,'Inf',1,'size',[1,md.frontalforcings.num_basins],'numel',md.frontalforcings.num_basins);
     
    7777                        WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',55,'format','Integer');
    7878                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','num_basins','format','Integer');
    79                         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
     79                        WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
    8080         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','ar_order','format','Integer');
    8181         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','ar_initialtime','format','Double','scale',yts);
     
    8383         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','basin_id','data',self.basin_id-1,'name','md.frontalforcings.basin_id','format','IntMat','mattype',2); %0-indexed
    8484         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','beta0','format','DoubleMat','name','md.frontalforcings.beta0');
    85          WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','beta1','format','DoubleMat','name','md.frontalforcings.beta1','scale',1./yts,'yts',md.constants.yts);
    86          WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','phi','format','DoubleMat','name','md.frontalforcings.phi','yts',md.constants.yts);
     85         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','beta1','format','DoubleMat','name','md.frontalforcings.beta1','scale',1./yts,'yts',yts);
     86         WriteData(fid,prefix,'object',self,'class','frontalforcings','fieldname','phi','format','DoubleMat','name','md.frontalforcings.phi','yts',yts);
    8787                end % }}}
    8888        end
  • issm/trunk-jpl/src/m/classes/stochasticforcing.m

    r26549 r26553  
    4242                        md = checkfield(md,'fieldname','stochasticforcing.randomflag','numel',[1],'values',[0 1]);
    4343
    44                         %Check that all fields agree with the corresponding md class   
     44                        %Check that all fields agree with the corresponding md class
    4545                        for field=self.fields
    4646                                if(contains(field,'SMB'))
  • issm/trunk-jpl/src/m/classes/stochasticforcing.py

    r26539 r26553  
    4040        # Type of stabilization used
    4141        self.isstochasticforcing = 0 # stochasticforcing is turned off by default
     42        self.fields              = [] # Need to initialize to list to avoid "RuntimeError: object of type 'float' has no len()" on import of class
    4243        self.randomflag          = 1 # true randomness is implemented by default
    4344        return self
     
    7677    def marshall(self, prefix, md, fid):  # {{{
    7778        yts = md.constants.yts
    78         if (type(self.fields) is list):
    79             num_fields = len(self.fields)
    80             # Scaling covariance matrix (scale column-by-column and row-by-row)
    81             scaledfields = ['SMBautoregression'] # list of fields that need scaling * 1/yts
    82             for i in range(num_fields):
    83                 if self.fields[i] in scaledfields:
    84                     inds = range(1 + np.sum(self.dimensions[0:i]), np.sum(self.dimensions[0:i]))
    85                     for row in inds: # scale rows corresponding to scaled field
    86                         self.covariance[row, :] = 1 / yts * self.covariance[row, :]
    87                     for col in inds: # scale columns corresponding to scaled field
    88                         self.covariance[:, col] = 1 / yts * self.covariance[:, col]
     79        num_fields = len(self.fields)
    8980
    9081        WriteData(fid, prefix, 'object', self, 'fieldname', 'isstochasticforcing', 'format', 'Boolean')
     
    9283            return md
    9384        else:
     85            # Scaling covariance matrix (scale column-by-column and row-by-row)
     86            scaledfields = ['SMBautoregression'] # list of fields that need scaling * 1/yts
     87            tempcovariance = self.covariance
     88            for i in range(num_fields):
     89                if self.fields[i] in scaledfields:
     90                    inds = range(int(np.sum(self.dimensions[0:i])), int(np.sum(self.dimensions[0:i + 1])))
     91                    for row in inds: # scale rows corresponding to scaled field
     92                        tempcovariance[row, :] = 1 / yts * self.covariance[row, :]
     93                    for col in inds: # scale columns corresponding to scaled field
     94                        tempcovariance[:, col] = 1 / yts * self.covariance[:, col]
    9495            WriteData(fid, prefix, 'data', num_fields, 'name', 'md.stochasticforcing.num_fields', 'format', 'Integer')
    9596            WriteData(fid, prefix, 'object', self, 'fieldname', 'fields', 'format', 'StringArray')
    9697            WriteData(fid, prefix, 'object', self, 'fieldname','dimensions', 'format', 'IntMat')
    97             WriteData(fid, prefix, 'object', self, 'fieldname', 'covariance', 'format', 'DoubleMat')
     98            WriteData(fid, prefix, 'data', tempcovariance, 'name', 'md.stochasticforcing.covariance', 'format', 'DoubleMat')
    9899            WriteData(fid, prefix, 'object', self, 'fieldname', 'randomflag', 'format', 'Boolean')
    99100    # }}}
  • issm/trunk-jpl/src/m/miscellaneous/MatlabFuncs.py

    r26358 r26553  
    5050
    5151    return np.degrees(np.arctan2(Y, X))
     52# }}}
     53
     54def contains(str, pat):  #{{{
     55    """function contains - Determine if pattern is in strings
     56
     57    Usage:
     58        TF = contains(str, pat)
     59
     60    TODO:
     61    - Implement 'IgnoreCase' option
     62    """
     63
    5264# }}}
    5365
     
    142154# }}}
    143155
     156def intersect(A, B):  # {{{
     157    """function intersect - Set intersection of two arrays
     158
     159    Usage:
     160        C = intersect(A, B)
     161
     162    NOTE:
     163    - Only the following functionality is currently implemented:
     164        - C = intersect(A,B) returns the data common to both A and B, with no
     165        repetitions. C is in sorted order.
     166
     167    """
     168    import numpy as np
     169
     170    return np.intersect1d(A, B)
     171#}}}
     172
    144173def isa(A, dataType):  # {{{
    145     """FUNCTION ISA
     174    """function isa
    146175
    147176    NOTE:
     
    216245def mod(a, m):  # {{{
    217246    return a % m
     247# }}}
     248
     249def numel(A):  # {{{
     250    """function numel - Number of array elements
     251
     252    Usage:
     253        n = numel(A))
     254    """
     255    import numpy as np
     256
     257    return np.size(A)
    218258# }}}
    219259
  • issm/trunk-jpl/src/m/solve/WriteData.py

    r25688 r26553  
    6767                #We scale everything but the last line that holds time
    6868                data[:-1, :] = scale * data[:-1, :]
    69             else:
     69            elif type(data) is list: # Deal with "TypeError: can't multiply sequence by non-int of type 'float'" for type list
     70                scaleddata = []
     71                for i in range(len(data)):
     72                    scaleddata.append(scale * data[i])
     73                data = scaleddata
     74            else: #
    7075                data = scale * data
    7176        if np.ndim(data) > 1 and data.shape[0] == timeserieslength:
  • issm/trunk-jpl/test/NightlyRun/runme.py

    r26353 r26553  
    11#!/usr/bin/env python
     2#
     3# NOTE: Switch to,
     4#
     5#   #!/usr/bin/python3
     6#
     7# when making Python 3 default
     8#
    29import argparse
    310from glob import glob
  • issm/trunk-jpl/test/NightlyRun/test257.m

    r26532 r26553  
    55md=setflowequation(md,'SSA','all');
    66md.cluster=generic('name',oshostname(),'np',3);
    7 md.transient.requested_outputs={'default','IceVolume','SmbMassBalance',};
     7md.transient.requested_outputs={'default','IceVolume','SmbMassBalance'};
    88
    99ymax = max(md.mesh.y);
     
    6666        (md.results.TransientSolution(1).Thickness),...
    6767        (md.results.TransientSolution(1).IceVolume),...
    68    (md.results.TransientSolution(1).SmbMassBalance),...
     68        (md.results.TransientSolution(1).SmbMassBalance),...
    6969        (md.results.TransientSolution(2).Vx),...
    7070        (md.results.TransientSolution(2).Vy),...
     
    7272        (md.results.TransientSolution(2).Thickness),...
    7373        (md.results.TransientSolution(2).IceVolume),...
    74    (md.results.TransientSolution(2).SmbMassBalance),...
     74        (md.results.TransientSolution(2).SmbMassBalance),...
    7575        (md.results.TransientSolution(3).Vx),...
    7676        (md.results.TransientSolution(3).Vy),...
     
    7878        (md.results.TransientSolution(3).Thickness),...
    7979        (md.results.TransientSolution(3).IceVolume),...
    80    (md.results.TransientSolution(3).SmbMassBalance),...
     80        (md.results.TransientSolution(3).SmbMassBalance),...
    8181        };
  • issm/trunk-jpl/test/NightlyRun/test542.m

    r26532 r26553  
    3434    end
    3535end
     36
    3637md.transient.ismovingfront = 1;
    3738md.levelset.spclevelset = NaN(md.mesh.numberofvertices,1);
  • issm/trunk-jpl/test/NightlyRun/test543.m

    r26532 r26553  
    4040md.stochasticforcing.fields              = [{'FrontalForcingsRignotAutoregression'}];
    4141md.stochasticforcing.dimensions          = [md.frontalforcings.num_basins]; %dimension of each field
    42 md.stochasticforcing.covariance          = 1e-4*[[1.5,0.5];[0.5,0.4]];; %global covariance among- and between-fields
     42md.stochasticforcing.covariance          = 1e-4*[[1.5,0.5];[0.5,0.4]]; %global covariance among- and between-fields
    4343md.stochasticforcing.randomflag          = 0; %determines true/false randomness
    4444
Note: See TracChangeset for help on using the changeset viewer.