Ignore:
Timestamp:
04/12/16 21:32:01 (9 years ago)
Author:
Mathieu Morlighem
Message:

merged trunk-jpl and trunk for revision 20497

Location:
issm/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk

  • issm/trunk/src

  • issm/trunk/src/m/classes/stressbalance.m

    r19105 r20500  
    2626        end
    2727        methods
    28                 function createxml(self,fid) % {{{
    29                         fprintf(fid, '\n\n');
    30                         fprintf(fid, '%s\n', '<!-- StressBalance solution parameters: -->');
    31 
    32                         % Convergence criteria           
    33                         fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Convergence criteria">','<section name="stressbalance" />');
    34                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="restol" type="',      class(self.restol),'" default="',        convert2str(self.restol),'">',      '     <section name="stressbalance" />','     <help> mechanical equilibrium residual convergence criterion </help>','</parameter>');
    35                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="reltol" type="',          class(self.reltol),'" default="',            convert2str(self.reltol),'">',     '     <section name="stressbalance" />','     <help> velocity relative convergence criterion, NaN: not applied </help>','</parameter>');
    36                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n', '<parameter key ="abstol" type="',        class(self.abstol),'" default="',          convert2str(self.abstol),'">',     '     <section name="stressbalance" />','     <help> velocity absolute convergence criterion, NaN: not applied </help>','</parameter>');
    37 
    38                         %is newton drop-down (0,1,or 2)
    39                         fprintf(fid,'%s\n%s\n%s\n%s\n',    '<parameter key ="isnewton" type="alternative" optional="false">',   '     <section name="stressbalance" />','     <help> 0: Picards fixed point, 1: Newtons method, 2: hybrid </help>');
    40                         fprintf(fid,'%s\n','       <option value="0" type="string" default="true"> </option>');
    41                         fprintf(fid,'%s\n','       <option value="1" type="string" default="false"> </option>');
    42                         fprintf(fid,'%s\n%s\n','       <option value="2" type="string" default="false"> </option>','</parameter>');
    43 
    44                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="maxiter" type="',          class(self.maxiter),'" default="',       convert2str(self.maxiter),'">',     '     <section name="stressbalance" />','     <help> maximum number of nonlinear iterations </help>','</parameter>');
    45                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="viscosity_overshoot" type="',         class(self.viscosity_overshoot),'" default="',           convert2str(self.viscosity_overshoot),'">', '     <section name="stressbalance" />','     <help> over-shooting constant new=new+C*(new-old) </help>','</parameter>');
    46                         fprintf(fid,'%s\n%s\n','</frame>');
    47 
    48                         % boundary conditions   
    49                         fprintf(fid,'%s\n%s\n%s\n','<frame key="2" label="Boundary conditions">','<section name="stressbalance" />');                   
    50                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvx" type="',            class(self.spcvx),'" default="',        convert2str(self.spcvx),'">',     '     <section name="stressbalance" />','     <help> x-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
    51                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvy" type="',            class(self.spcvy),'" default="',        convert2str(self.spcvy),'">',   '     <section name="stressbalance" />','     <help> y-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
    52                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="spcvz" type="',            class(self.spcvz),'" default="',        convert2str(self.spcvz),'">',     '     <section name="stressbalance" />','     <help> z-axis velocity constraint (NaN means no constraint) [m/yr] </help>','</parameter>');
    53                         fprintf(fid,'%s\n%s\n','</frame>');
    54 
    55                         % Rift options   
    56                         fprintf(fid,'%s\n%s\n%s\n','<frame key="3" label="Rift options">','<section name="stressbalance" />'); 
    57                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="rift_penalty_threshold" type="',           class(self.rift_penalty_threshold),'" default="',       convert2str(self.rift_penalty_threshold),'">',     '     <section name="stressbalance" />','     <help> threshold for instability of mechanical constraints </help>','</parameter>');
    58                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',         '<parameter key ="rift_penalty_lock" type="',         class(self.rift_penalty_lock),'" default="',           convert2str(self.rift_penalty_lock),'">',  '     <section name="stressbalance" />','     <help> number of iterations before rift penalties are locked </help>','</parameter>');
    59                         fprintf(fid,'%s\n%s\n','</frame>');
    60 
    61                         %others
    62                         fprintf(fid,'%s\n%s\n%s\n','<frame key="4" label="Other">','<section name="stressbalance" />');         
    63                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="shelf_dampening" type="',          class(self.shelf_dampening),'" default="',       convert2str(self.shelf_dampening),'">',     '     <section name="stressbalance" />','     <help> use dampening for floating ice ? Only for FS model </help>','</parameter>');
    64                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',         '<parameter key ="FSreconditioning" type="',    class(self.FSreconditioning),'" default="',           convert2str(self.FSreconditioning),'">',  '     <section name="stressbalance" />','     <help> multiplier for incompressibility equation. Only for FS model </help>','</parameter>');
    65                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="referential" type="',      class(self.referential),'" default="',       convert2str(self.referential),'">',     '     <section name="stressbalance" />','     <help> local referential </help>','</parameter>');
    66                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',         '<parameter key ="loadingforce" type="',        class(self.loadingforce),'" default="',           convert2str(self.loadingforce),'">',  '     <section name="stressbalance" />','     <help> loading force applied on each point [N/m^3] </help>','</parameter>');
    67                         fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="requested_outputs" type="',        class(self.requested_outputs),'" default="',       convert2str(self.requested_outputs),'">',     '     <section name="stressbalance" />','     <help> additional outputs requested </help>','</parameter>');
    68 
    69 
    70                         fprintf(fid,'%s\n%s\n','</frame>');
    71                 end % }}}
    7228                function self = extrude(self,md) % {{{
    7329                        self.spcvx=project3d(md,'vector',self.spcvx,'type','node');
     
    13389                        %Early return
    13490                        if ~ismember(StressbalanceAnalysisEnum(),analyses), return; end
    135 
    136                         md = checkfield(md,'fieldname','stressbalance.spcvx','timeseries',1);
    137                         md = checkfield(md,'fieldname','stressbalance.spcvy','timeseries',1);
    138                         md = checkfield(md,'fieldname','stressbalance.spcvz','timeseries',1);
    139                         md = checkfield(md,'fieldname','stressbalance.restol','size',[1 1],'>',0,'NaN',1);
     91                        if (solution==TransientSolutionEnum & md.transient.isstressbalance == 0), return; end
     92
     93                        md = checkfield(md,'fieldname','stressbalance.spcvx','Inf',1,'timeseries',1);
     94                        md = checkfield(md,'fieldname','stressbalance.spcvy','Inf',1,'timeseries',1);
     95                        md = checkfield(md,'fieldname','stressbalance.spcvz','Inf',1,'timeseries',1);
     96                        md = checkfield(md,'fieldname','stressbalance.restol','size',[1 1],'>',0,'NaN',1,'Inf',1);
    14097                        md = checkfield(md,'fieldname','stressbalance.reltol','size',[1 1]);
    14198                        md = checkfield(md,'fieldname','stressbalance.abstol','size',[1 1]);
    14299                        md = checkfield(md,'fieldname','stressbalance.isnewton','numel',[1],'values',[0 1 2]);
    143                         md = checkfield(md,'fieldname','stressbalance.FSreconditioning','size',[1 1],'NaN',1);
    144                         md = checkfield(md,'fieldname','stressbalance.viscosity_overshoot','size',[1 1],'NaN',1);
     100                        md = checkfield(md,'fieldname','stressbalance.FSreconditioning','size',[1 1],'NaN',1,'Inf',1);
     101                        md = checkfield(md,'fieldname','stressbalance.viscosity_overshoot','size',[1 1],'NaN',1,'Inf',1);
    145102                        md = checkfield(md,'fieldname','stressbalance.maxiter','size',[1 1],'>=',1);
    146103                        md = checkfield(md,'fieldname','stressbalance.referential','size',[md.mesh.numberofvertices 6]);
     
    150107                        %singular solution
    151108                        if ((~(any(~isnan(md.stressbalance.spcvx)) | any(~isnan(md.stressbalance.spcvy)))) & ~any(md.mask.groundedice_levelset>0)),
    152                                 md = checkmessage(md,['model is not well posed (singular). You need at least one node with fixed velocity!']);
     109                                disp(sprintf('\n !!! Warning: no spc applied, model might not be well posed if no basal friction is applied, check for solution crash\n'));
    153110                        end
    154111                        %CHECK THAT EACH LINES CONTAINS ONLY NAN VALUES OR NO NAN VALUES
     
    238195                        WriteData(fid,'object',self,'class','stressbalance','fieldname','referential','format','DoubleMat','mattype',1);
    239196
    240                         WriteData(fid,'data',self.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
    241                         WriteData(fid,'data',self.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
    242                         WriteData(fid,'data',self.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
     197                        if size(self.loadingforce,2)==3,
     198                                WriteData(fid,'data',self.loadingforce(:,1),'format','DoubleMat','mattype',1,'enum',LoadingforceXEnum);
     199                                WriteData(fid,'data',self.loadingforce(:,2),'format','DoubleMat','mattype',1,'enum',LoadingforceYEnum);
     200                                WriteData(fid,'data',self.loadingforce(:,3),'format','DoubleMat','mattype',1,'enum',LoadingforceZEnum);
     201                        end
    243202
    244203                        %process requested outputs
     
    251210                        WriteData(fid,'data',outputs,'enum',StressbalanceRequestedOutputsEnum,'format','StringArray');
    252211                end % }}}
     212                function savemodeljs(self,fid,modelname) % {{{
     213               
     214                        writejs1Darray(fid,[modelname '.stressbalance.spcvx'],self.spcvx);
     215                        writejs1Darray(fid,[modelname '.stressbalance.spcvy'],self.spcvy);
     216                        writejs1Darray(fid,[modelname '.stressbalance.spcvz'],self.spcvz);
     217                        writejsdouble(fid,[modelname '.stressbalance.restol'],self.restol);
     218                        writejsdouble(fid,[modelname '.stressbalance.reltol'],self.reltol);
     219                        writejsdouble(fid,[modelname '.stressbalance.abstol'],self.abstol);
     220                        writejsdouble(fid,[modelname '.stressbalance.isnewton'],self.isnewton);
     221                        writejsdouble(fid,[modelname '.stressbalance.FSreconditioning'],self.FSreconditioning);
     222                        writejsdouble(fid,[modelname '.stressbalance.viscosity_overshoot'],self.viscosity_overshoot);
     223                        writejsdouble(fid,[modelname '.stressbalance.maxiter'],self.maxiter);
     224                        writejsdouble(fid,[modelname '.stressbalance.shelf_dampening'],self.shelf_dampening);
     225                        writejs1Darray(fid,[modelname '.stressbalance.vertex_pairing'],self.vertex_pairing);
     226                        writejsdouble(fid,[modelname '.stressbalance.penalty_factor'],self.penalty_factor);
     227                        writejsdouble(fid,[modelname '.stressbalance.rift_penalty_lock'],self.rift_penalty_lock);
     228                        writejsdouble(fid,[modelname '.stressbalance.rift_penalty_threshold'],self.rift_penalty_threshold);
     229                        writejs2Darray(fid,[modelname '.stressbalance.referential'],self.referential);
     230                        writejs2Darray(fid,[modelname '.stressbalance.loadingforce'],self.loadingforce);
     231                        writejscellstring(fid,[modelname '.stressbalance.requested_outputs'],self.requested_outputs);
     232
     233                end % }}}
    253234        end
    254235end
Note: See TracChangeset for help on using the changeset viewer.