Changeset 9862


Ignore:
Timestamp:
09/20/11 17:12:50 (13 years ago)
Author:
Mathieu Morlighem
Message:

Done with model consistency checks

Location:
issm/trunk/src/m
Files:
11 deleted
14 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/classes/hydrology.m

    r9854 r9862  
    5454                        if ~ismember(HydrologyAnalysisEnum,analyses), return; end
    5555
    56 
    57                         fields={'spcwatercolumn'};
    58                         checkforcing(md,'hydrology',fields);
    59 
     56                        checkfield(md,'hydrology.spcwatercolumn','forcing',1);
     57                        checkfield(md,'hydrology.stabilization','>=',0);
    6058                end % }}}
    6159                function disp(obj) % {{{
  • issm/trunk/src/m/classes/initialization.m

    r9855 r9862  
    4444                        if ismember(DiagnosticHorizAnalysisEnum,analyses)
    4545                                if ~isnan(md.initialization.vx) & ~isnan(md.initialization.vy),
    46                                         fields={'vx','vy'};
    47                                         checknan(md, 'initialization',fields);
    48                                         checksize(md,'initialization',fields,[md.mesh.numberofvertices 1]);
     46                                        checkfield(md,'initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
     47                                        checkfield(md,'initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
    4948                                end
    5049                        end
    5150                        if ismember(PrognosticAnalysisEnum,analyses),
    52                                 fields={'vx','vy'};
    53                                 checknan(md, 'initialization',fields);
    54                                 checksize(md,'initialization',fields,[md.mesh.numberofvertices 1]);
     51                                checkfield(md,'initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
     52                                checkfield(md,'initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
    5553                        end
    5654                        if ismember(HydrologyAnalysisEnum,analyses),
    57                                 fields={'watercolumn'};
    58                                 checksize(md,'initialization',fields,[md.mesh.numberofvertices 1]);
     55                                checkfield(md,'initialization.watercolumn','NaN',1,'size',[md.mesh.numberofvertices 1]);
    5956                        end
    6057                        if ismember(BalancethicknessAnalysisEnum,analyses),
    61                                 fields={'vx','vy'};
    62                                 checksize(md,'initialization',fields,[md.mesh.numberofvertices 1]);
    63                                 checknan(md, 'initialization',fields);
     58                                checkfield(md,'initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
     59                                checkfield(md,'initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
    6460                                %Triangle with zero velocity
    6561                                if any(sum(abs(md.initialization.vx(md.mesh.elements)),2)==0 & sum(abs(md.initialization.vy(md.mesh.elements)),2)==0)
     
    6864                        end
    6965                        if ismember(ThermalAnalysisEnum,analyses),
    70                                 fields={'vx','vy','vz','pressure'};
    71                                 checksize(md,'initialization',fields,[md.mesh.numberofvertices 1]);
    72                                 checknan(md, 'initialization',fields);
     66                                checkfield(md,'initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
     67                                checkfield(md,'initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
     68                                checkfield(md,'initialization.vz','NaN',1,'size',[md.mesh.numberofvertices 1]);
     69                                checkfield(md,'initialization.pressure','NaN',1,'size',[md.mesh.numberofvertices 1]);
    7370                        end
    7471                end % }}}
  • issm/trunk/src/m/classes/inversion.m

    r9853 r9862  
    88                iscontrol                   = modelfield('default',0,'marshall',true,'format','Boolean');
    99                control_parameters          = modelfield('default',NaN,'marshall',true,'preprocess','marshallcontroltype','format','DoubleMat','mattype',3);
    10                 cost_functions_coefficients = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
    1110                nsteps                      = modelfield('default',0,'marshall',true,'format','Integer');
    1211                maxiter_per_step            = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
    1312                cost_functions              = modelfield('default',NaN,'marshall',true,'preprocess','marshallcmresponses','format','DoubleMat','mattype',3);
     13                cost_functions_coefficients = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',1);
    1414                gradient_scaling            = modelfield('default',NaN,'marshall',true,'format','DoubleMat','mattype',3);
    1515                cost_function_threshold     = modelfield('default',0,'marshall',true,'format','Double');
     
    9191                        if ~obj.iscontrol, return; end
    9292
    93                         %Check NaN
    94                         fields={'nsteps','maxiter_per_step'};
    95                         checknan(md,'inversion',fields);
    96 
    97                         %CONTROL TYPE
    9893                        num_controls=numel(md.inversion.control_parameters);
    9994                        num_costfunc=size(md.inversion.cost_functions,2);
    100                         if ~iscell(md.inversion.control_parameters)
    101                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' inversion.control_parameters field should be a cell of strings']);
    102                         end
    103                         if ~ismember(md.inversion.control_parameters,{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'Vx' 'Vy'});
    104                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' inversion.control_parameters field should be ''BalancethicknessThickeningRate'' ''FrictionCoefficient'' ''MaterialsRheologyBbar'' ''Vx'' ''Vy''']);
    105                         end
    10695
    107                         %LENGTH CONTROL FIELDS
    108                         fields={'maxiter_per_step','step_threshold'};
    109                         checksize(md,'inversion',fields,[md.inversion.nsteps 1]);
    110                         fields={'cost_functions'};
    111                         checksize(md,'inversion',fields,[md.inversion.nsteps num_costfunc]);
    112                         fields={'gradient_scaling'};
    113                         checksize(md,'inversion',fields,[md.inversion.nsteps num_controls]);
    114                         fields={'min_parameters','max_parameters'};
    115                         checksize(md,'inversion',fields,[md.mesh.numberofvertices num_controls]);
     96                        checkfield(md,'inversion.iscontrol','values',[0 1]);
     97                        checkfield(md,'inversion.control_parameters','cell',1,'values',{'BalancethicknessThickeningRate' 'FrictionCoefficient' 'MaterialsRheologyBbar' 'Vx' 'Vy'});
     98                        checkfield(md,'inversion.nsteps','numel',1,'>=',1);
     99                        checkfield(md,'inversion.maxiter','numel',1,'>=',0);
     100                        checkfield(md,'inversion.maxiter_per_step','size',[md.inversion.nsteps 1]);
     101                        checkfield(md,'inversion.step_threshold','size',[md.inversion.nsteps 1]);
     102                        checkfield(md,'inversion.cost_functions','size',[md.inversion.nsteps num_costfunc],'values',[101:105 201 501:503]);
     103                        checkfield(md,'inversion.cost_functions_coefficients','size',[md.inversion.numberofvertices num_costfunc],'>=',0);
     104                        checkfield(md,'inversion.gradient_only','values',[0 1]);
     105                        checkfield(md,'inversion.gradient_scaling','size',[md.inversion.nsteps num_controls]);
     106                        checkfield(md,'inversion.min_parameters','size',[md.mesh.numberofvertices num_controls]);
     107                        checkfield(md,'inversion.max_parameters','size',[md.mesh.numberofvertices num_controls]);
    116108
    117                         %RESPONSES
    118                         checkvalues(md,'inversion',{'cost_functions'},[101:105 201 501:503]);
    119 
    120                         %WEIGHTS
    121                         fields={'cost_functions_coefficients'};
    122                         checksize(md,'inversion',fields,[md.mesh.numberofvertices num_costfunc]);
    123                         checkgreater(md,'inversion',fields,0);
    124 
    125                         %OBSERVED VELOCITIES
    126109                        if solution==BalancethicknessSolutionEnum
    127                                 fields={'thickness_obs'};
    128                                 checksize(md,'inversion',fields,[md.mesh.numberofvertices 1]);
    129                                 checknan(md,'inversion',fields);
     110                                checkfield(md,'inversion.thickness_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
    130111                        else
    131                                 fields={'vx_obs','vy_obs'};
    132                                 checksize(md,'inversion',fields,[md.mesh.numberofvertices 1]);
    133                                 checknan(md,'inversion',fields);
    134                         end
    135 
    136                         %DIRICHLET IF THICKNESS <= 0
    137                         if any(md.geometry.thickness<=0),
    138                                 pos=find(md.geometry.thickness<=0);
    139                                 if any(isnan(md.balancethickness.spcthickness(pos))),
    140                                         checkmessage(['model not consistent: model ' md.miscellaneous.name ' has some nodes with 0 thickness']);
    141                                 end
     112                                checkfield(md,'inversion.vx_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
     113                                checkfield(md,'inversion.vy_obs','size',[md.mesh.numberofvertices 1],'NaN',1);
    142114                        end
    143115                end % }}}
  • issm/trunk/src/m/classes/mask.m

    r9853 r9862  
    4141                function checkconsistency(obj,md,solution,analyses) % {{{
    4242
    43                         fields=properties('mask');
    44                         checknan(md,'mask',fields);
    45                         checkvalues(md,'mask',fields,[0 1]);
    46 
    47                         fields={'elementonfloatingice','elementongroundedice','elementonwater'};
    48                         checksize(md,'mask',fields,[md.mesh.numberofelements 1]);
    49 
    50                         fields={'vertexonfloatingice','vertexongroundedice','vertexonwater'};
    51                         checksize(md,'mask',fields,[md.mesh.numberofvertices 1]);
     43                        checkfield(md,'mask.elementonfloatingice','size',[md.mesh.numberofelements 1],'values',[0 1]);
     44                        checkfield(md,'mask.elementongroundedice','size',[md.mesh.numberofelements 1],'values',[0 1]);
     45                        checkfield(md,'mask.elementonwater'      ,'size',[md.mesh.numberofelements 1],'values',[0 1]);
     46                        checkfield(md,'mask.vertexonfloatingice','size',[md.mesh.numberofvertices 1],'values',[0 1]);
     47                        checkfield(md,'mask.vertexongroundedice','size',[md.mesh.numberofvertices 1],'values',[0 1]);
     48                        checkfield(md,'mask.vertexonwater'      ,'size',[md.mesh.numberofvertices 1],'values',[0 1]);
    5249                end % }}}
    5350                function disp(obj) % {{{
  • issm/trunk/src/m/classes/materials.m

    r9853 r9862  
    7676                end % }}}
    7777                function checkconsistency(obj,md,solution,analyses) % {{{
    78                         fields={'rho_ice','rho_water','rheology_B','rheology_n'};
    79                         checknan(md,'materials',fields);
    80                         checkgreater(md,'materials',fields,0);
    81 
    82                         fields={'rheology_n'};
    83                         checksize(md,'materials',fields,[md.mesh.numberofelements 1]);
    84 
    85                         fields={'rheology_B'};
    86                         checksize(md,'materials',fields,[md.mesh.numberofvertices 1]);
    87 
    88                         if ~ismember({md.materials.rheology_law},{'None' 'Paterson' 'Arrhenius'}),
    89                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' rheology_law field should be ''none'' ''paterson'' or ''arrhenius''']);
    90                         end
     78                        checkfield(md,'materials.rho_ice','>',0);
     79                        checkfield(md,'materials.rho_water','>',0);
     80                        checkfield(md,'materials.rheology_B','>',0,'size',[md.mesh.numberofvertices 1]);
     81                        checkfield(md,'materials.rheology_n','>',0,'size',[md.mesh.numberofelements 1]);
     82                        checkfield(md,'materials.rheology_law','values',{'None' 'Paterson' 'Arrhenius'});
    9183                end % }}}
    9284                function disp(obj) % {{{
  • issm/trunk/src/m/classes/miscellaneous.m

    r9853 r9862  
    2828                function checkconsistency(obj,md,solution,analyses) % {{{
    2929
    30                         fields={'name'};
    31                         checknonempty(md,'miscellaneous',fields);
     30                        checkfield(md,'miscellaneous.name','empty',1);
    3231
    3332                end % }}}
  • issm/trunk/src/m/classes/prognostic.m

    r9854 r9862  
    5151                        if ~ismember(PrognosticAnalysisEnum,analyses), return; end
    5252
    53                         if ~ismember(md.prognostic.hydrostatic_adjustment,{'Absolute' 'Incremental'}),
    54                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' prognostic.hydrostatic_adjustment field should be AbsoluteEnum or IncrementalEnum']);
    55                         end
    56 
    57                         fields={'spcthickness'};
    58                         checkforcing(md,'prognostic',fields);
    59                         if ~ismember(obj.stabilization,[0 1 3]),
    60                                 checkmessage('prognostic.stabilization should be a scalar (0 or 1 or 3)');
    61                         end
     53                        checkfield(md,'prognostic.spcthickness','forcing',1);
     54                        checkfield(md,'prognostic.hydrostatic_adjustment','values',{'Absolute' 'Incremental'});
     55                        checkfield(md,'prognostic.stabilization','values',[0 1 3]);
    6256
    6357                end % }}}
  • issm/trunk/src/m/classes/rifts.m

    r9853 r9862  
    4747                                        checkmessage(['model should be processed for rifts (run meshprocessrifts)!']);
    4848                                end
    49                                 %Check that rifts are filled with proper material
    50                                 checkvalues(md,'rifts',{'riftstruct.fill'},[WaterEnum() AirEnum() IceEnum() MelangeEnum()]);
     49                                checkfield(md,'rifts.riftstruct.fill','values',[WaterEnum() AirEnum() IceEnum() MelangeEnum()]);
    5150                        else
    5251                                if ~isnans(obj.riftstruct),
  • issm/trunk/src/m/classes/settings.m

    r9853 r9862  
    5454                function checkconsistency(obj,md,solution,analyses) % {{{
    5555
    56                         fields={'lowmem'};
    57                         checknan(md,'settings',fields);
    58                         checkvalues(md,'settings',fields,[0 1]);
     56                        checkfield(md,'settings.io_gather','numel',1,'values',[0 1]);
     57                        checkfield(md,'settings.lowmem','numel',1,'values',[0 1]);
     58                        checkfield(md,'settings.results_on_vertices','numel',1,'values',[0 1]);
     59                        checkfield(md,'settings.output_frequency','numel',1,'>=',1);
     60                        checkfield(md,'settings.waitonlock','numel',1);
    5961
    6062                end % }}}
  • issm/trunk/src/m/classes/surfaceforcings.m

    r9854 r9862  
    3838
    3939                        if ismember(PrognosticAnalysisEnum,analyses),
    40                                 fields={'mass_balance'};
    41                                 checkforcing(md,'surfaceforcings',fields);
     40                                checkfield(md,'surfaceforcings.mass_balance','forcing',1,'NaN',1);
    4241                        end
    4342                        if ismember(BalancethicknessAnalysisEnum,analyses),
    44                                 fields={'mass_balance'};
    45                                 checksize(md,'surfaceforcings',fields,[md.mesh.numberofvertices 1]);
    46                                 checknan(md, 'surfaceforcings',fields);
     43                                checkfield(md,'surfaceforcings.mass_balance','size',[md.mesh.numberofvertices 1],'NaN',1);
    4744                        end
    4845                end % }}}
  • issm/trunk/src/m/classes/thermal.m

    r9854 r9862  
    5555                        if ~ismember(ThermalAnalysisEnum,analyses), return; end
    5656
    57                         if ~ismember(obj.stabilization,[0 1 2]),
    58                                 checkmessage('thermal.stabilization should be a scalar (0 or 1 or 2)');
    59                         end
    60 
    61                         fields={'spctemperature'};
    62                         checkforcing(md,'thermal',fields);
    63 
     57                        checkfield(md,'thermal.stabilization','numel',1,'values',[0 1 2]);
     58                        checkfield(md,'thermal.spctemperature','forcing',1);
    6459                end % }}}
    6560                function disp(obj) % {{{
  • issm/trunk/src/m/classes/timestepping.m

    r9853 r9862  
    4747                end % }}}
    4848                function checkconsistency(obj,md,solution,analyses) % {{{
    49                         if ~ismember(md.timestepping.time_adapt,[0 1]),
    50                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' time_adapt field should be 0 or 1']);
    51                         end
    52                         if(md.timestepping.cfl_coefficient>1 | md.timestepping.cfl_coefficient<0),
    53                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' cfl_coefficient field should between  0 and 1']);
    54                         end
    55                         if(md.timestepping.cfl_coefficient>1 | md.timestepping.cfl_coefficient<0),
    56                                 checkmessage(['model not consistent: model ' md.miscellaneous.name ' cfl_coefficient field should between  0 and 1']);
    57                         end
     49
     50                        checkfield(md,'timestepping.time_adapt','numel',1,'values',[0 1]);
     51                        checkfield(md,'timestepping.cfl_coefficient','numel',1,'>',0,'<=',1);
    5852                end % }}}
    5953                function disp(obj) % {{{
  • issm/trunk/src/m/classes/transient.m

    r9854 r9862  
    4949                        if solution~=TransientSolutionEnum, return; end
    5050
    51                         %check flags
    52                         if ~ismember(md.transient.isdiagnostic,[0 1]),
    53                                 checkmessage('model not consistent: transient.isdiagnostic should be a scalar (1 or 0)');
    54                         end
    55                         if ~ismember(md.transient.isprognostic,[0 1]),
    56                                 checkmessage('model not consistent: transient.isprognostic should be a scalar (1 or 0)');
    57                         end
    58                         if ~ismember(md.transient.isthermal,[0 1]),
    59                                 checkmessage('model not consistent: transient.isthermal should be a scalar (1 or 0)');
    60                         end
    61                         if ~ismember(md.transient.isgroundingline,[0 1]),
    62                                 checkmessage('model not consistent: transient.isgroundingline should be a scalar (1 or 0)');
    63                         end
     51                        checkfield(md,'transient.isprognostic','numel',1,'values',[0 1]);
     52                        checkfield(md,'transient.isdiagnostic','numel',1,'values',[0 1]);
     53                        checkfield(md,'transient.isthermal','numel',1,'values',[0 1]);
     54                        checkfield(md,'transient.isgroundingline','numel',1,'values',[0 1]);
    6455
    6556                        %check that groundingline is not activated in serial model
  • issm/trunk/src/m/utils/consistency/checkfield.m

    r9860 r9862  
    1313%      - values: cell of strings or vector of acceptable values
    1414%      - numel: list of acceptable number of elements
     15%      - cell: 1 if check that is cell
     16%      - empty: 1 if check that non empty
    1517%      - message: overloaded error message
    1618%
     
    2830%get field from model
    2931eval(['field=md.' fieldname ';']);
     32
     33%check empty
     34if exist(options,'empty')
     35        if isempty(field),
     36                checkmessage(getfieldvalue(options,'message',...
     37                        ['field ''' fieldname ''' is empty']));
     38        end
     39end
    3040
    3141%Check size
     
    7383                checkmessage(getfieldvalue(options,'message',...
    7484                        ['NaN values found in field ''' fieldname '''']));
     85        end
     86end
     87
     88%check NaN
     89if getfieldvalue(options,'cell',0);
     90        if ~iscell(field),
     91                checkmessage(getfieldvalue(options,'message',...
     92                        ['field ''' fieldname ''' should be a cell']));
    7593        end
    7694end
Note: See TracChangeset for help on using the changeset viewer.