Changeset 22278


Ignore:
Timestamp:
11/28/17 09:35:48 (7 years ago)
Author:
bdef
Message:

NEW: Implementing substep framework in hydrologydc

Location:
issm/trunk-jpl/src/m/classes
Files:
2 edited

Legend:

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

    r21966 r22278  
    1212                rel_tol                  = 0;
    1313                max_iter                 = 0;
     14    steps_per_step           = 0;
    1415                sedimentlimit_flag       = 0;
    1516                sedimentlimit            = 0;
     
    1819                leakage_factor           = 0;
    1920                basal_moulin_input       = NaN;
     21    requested_outputs        = {};
    2022
    2123                spcsediment_head         = NaN;
     
    5961                end
    6062                % }}}
     63    function list = defaultoutputs(self,md) % {{{
     64        list = {'SedimentHead','SedimentHeadResidual','EffectivePressure'};
     65        if self.isefficientlayer,
     66            list=[list,{'EplHead','HydrologydcMaskEplactiveNode', ...
     67                        'HydrologydcMaskEplactiveElt','EplHeadSlopeX','EplHeadSlopeY','HydrologydcEplThickness'}];
     68        end
     69        if self.steps_per_step>1,
     70            list = [list,'TimeAverageEffectivePressure'];
     71        end
     72    end % }}}   
     73
    6174                function self = initialize(self,md) % {{{
    6275                        if isnan(self.basal_moulin_input),
     
    7790                        self.rel_tol                  = 1.0e-06;
    7891                        self.max_iter                 = 100;
     92                        self.steps_per_step           = 1;
    7993                        self.sedimentlimit_flag       = 0;
    8094                        self.sedimentlimit            = 0;
     
    8296                        self.unconfined_flag          = 0;
    8397                        self.leakage_factor           = 10.0;
     98      self.requested_outputs        = {'default'};
     99
    84100
    85101                        self.sediment_compressibility = 1.0e-08;
     
    113129                        md = checkfield(md,'fieldname','hydrology.rel_tol','>',0,'numel',1);
    114130                        md = checkfield(md,'fieldname','hydrology.max_iter','>',0,'numel',1);
     131                        md = checkfield(md,'fieldname','hydrology.steps_per_step','>',0,'numel',1);
    115132                        md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0 1 2 3]);
    116133                        md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0 1]);
    117134                        md = checkfield(md,'fieldname','hydrology.unconfined_flag','numel',[1],'values',[0 1]);
     135      md = checkfield(md,'fieldname','hydrology.requested_outputs','stringrow',1);
    118136                        if self.sedimentlimit_flag==1,
    119137                                md = checkfield(md,'fieldname','hydrology.sedimentlimit','>',0,'numel',1);
     
    159177                        fielddisplay(self,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]');
    160178                        fielddisplay(self,'max_iter','maximum number of nonlinear iteration');
     179                        fielddisplay(self,'steps_per_step','number of hydrology steps per timestep');
    161180                        fielddisplay(self,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer');
    162181                        disp(sprintf('%55s  0: no limit',' '));
     
    176195                        disp(sprintf('%55s  0: confined only',' '));
    177196                        disp(sprintf('%55s  1: confined unconfined'));
     197      fielddisplay(self,'requested_outputs','additional outputs requested');
    178198                        fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]');
    179199                        disp(sprintf('   - for the sediment layer'));
     
    211231                        WriteData(fid,prefix,'object',self,'fieldname','rel_tol','format','Double');
    212232                        WriteData(fid,prefix,'object',self,'fieldname','max_iter','format','Integer');
     233                        WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer');
    213234                        WriteData(fid,prefix,'object',self,'fieldname','sedimentlimit_flag','format','Integer');
    214235                        WriteData(fid,prefix,'object',self,'fieldname','transfer_flag','format','Integer');
     
    240261                                WriteData(fid,prefix,'object',self,'fieldname','eplflip_lock','format','Integer');
    241262                        end
     263      outputs = self.requested_outputs;
     264      pos  = find(ismember(outputs,'default'));
     265      if ~isempty(pos),
     266        outputs(pos) = [];  %remove 'default' from outputs
     267        outputs      = [outputs defaultoutputs(self,md)]; %add defaults
     268      end
     269      WriteData(fid,prefix,'data',outputs,'name','md.hydrology.requested_outputs','format','StringArray');
    242270                end
    243271
  • issm/trunk-jpl/src/m/classes/hydrologydc.py

    r22270 r22278  
    2020                self.rel_tol                  = 0
    2121                self.max_iter                 = 0
     22                self.steps_per_step           = 0
    2223                self.sedimentlimit_flag       = 0
    2324                self.sedimentlimit            = 0
     
    2627                self.leakage_factor           = 0
    2728                self.basal_moulin_input       = float('NaN')
     29                self.requested_outputs        = []
    2830
    2931                self.spcsediment_head         = float('NaN')
     
    3234                self.sediment_porosity        = 0
    3335                self.sediment_thickness       = 0
    34 
    3536
    3637                self.spcepl_head              = float('NaN')
     
    5758                string="%s\n%s"%(string,fielddisplay(self,'rel_tol','tolerance of the nonlinear iteration for the transfer between layers [dimensionless]'))
    5859                string="%s\n%s"%(string,fielddisplay(self,'max_iter','maximum number of nonlinear iteration'))
     60                string="%s\n%s"%(string,fielddisplay(self,'steps_per_step','number of hydrology steps per time step'))
    5961                string="%s\n%s"%(string,fielddisplay(self,'basal_moulin_input','water flux at a given point [m3 s-1]'))
     62                string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
    6063                string="%s\n%s"%(string,fielddisplay(self,'sedimentlimit_flag','what kind of upper limit is applied for the inefficient layer'))
    6164                string="%s\n\t\t%s"%(string,'0: no limit')
     
    109112        #}}}
    110113        def setdefaultparameters(self): #{{{
    111 
    112114                #Parameters from de Fleurian 2014
    113115                self.water_compressibility    = 5.04e-10
     
    117119                self.rel_tol                  = 1.0e-06
    118120                self.max_iter                 = 100
     121                self.steps_per_step           = 1
    119122                self.sedimentlimit_flag       = 0
    120123                self.sedimentlimit            = 0
     
    122125                self.unconfined_flag          = 0
    123126                self.leakage_factor           = 10.0
     127                self.requested_outputs        = ['default']
    124128
    125129                self.sediment_compressibility = 1.0e-08
     
    139143                return self
    140144        # }}}
     145
     146        def defaultoutputs(self,md): # {{{
     147                list = ['SedimentHead','SedimentHeadResidual','EffectivePressure']
     148                if self.isefficientlayer==1:
     149                        list.extend(['EplHead','HydrologydcMaskEplactiveNode','HydrologydcMaskEplactiveElt','EplHeadSlopeX','EplHeadSlopeY','HydrologydcEplThickness'])
     150                if self.steps_per_step>1:
     151                        list.extend(['TimeAverageEffectivePressure'])
     152
     153                return list
     154
     155        #}}}
     156
    141157        def initialize(self,md): # {{{
    142158                if np.all(np.isnan(self.basal_moulin_input)):
     
    158174                md = checkfield(md,'fieldname','hydrology.rel_tol','>',0.,'numel',[1])
    159175                md = checkfield(md,'fieldname','hydrology.max_iter','>',0.,'numel',[1])
     176                md = checkfield(md,'fieldname','hydrology.steps_per_step','>',0.,'numel',[1])
    160177                md = checkfield(md,'fieldname','hydrology.sedimentlimit_flag','numel',[1],'values',[0,1,2,3])
    161178                md = checkfield(md,'fieldname','hydrology.transfer_flag','numel',[1],'values',[0,1])
    162179                md = checkfield(md,'fieldname','hydrology.unconfined_flag','numel',[1],'values',[0,1])
     180                md = checkfield(md,'fieldname','hydrology.requested_outputs','stringrow',1);
    163181
    164182                if self.sedimentlimit_flag==1:
     
    196214                WriteData(fid,prefix,'object',self,'fieldname','rel_tol','format','Double')
    197215                WriteData(fid,prefix,'object',self,'fieldname','max_iter','format','Integer')
     216                WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer')
    198217                WriteData(fid,prefix,'object',self,'fieldname','sedimentlimit_flag','format','Integer')
    199218                WriteData(fid,prefix,'object',self,'fieldname','transfer_flag','format','Integer')
     
    223242                        WriteData(fid,prefix,'object',self,'fieldname','epl_conductivity','format','Double')
    224243                        WriteData(fid,prefix,'object',self,'fieldname','eplflip_lock','format','Integer')
    225         # }}}
     244
     245                #process requested outputs
     246                outputs = self.requested_outputs
     247                indices = [i for i, x in enumerate(outputs) if x == 'default']
     248                if len(indices) > 0:
     249                        outputscopy=outputs[0:max(0,indices[0]-1)]+self.defaultoutputs(md)+outputs[indices[0]+1:]
     250                        outputs    =outputscopy
     251                WriteData(fid,prefix,'data',outputs,'name','md.hydrology.requested_outputs','format','StringArray')
     252        # }}}
Note: See TracChangeset for help on using the changeset viewer.