Changeset 18503


Ignore:
Timestamp:
09/11/14 07:03:33 (11 years ago)
Author:
Mathieu Morlighem
Message:

CHG: working on sea ice model

Location:
issm/trunk-jpl/src/m
Files:
10 added
1 deleted
8 edited

Legend:

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

    r17720 r18503  
    66classdef constants
    77        properties (SetAccess=public)
    8                 g                    = 0;
    9                 yts                  = 0;
    10                 referencetemperature = 0;
     8                g                    = 0.;
     9                omega                = 0.;
     10                yts                  = 0.;
     11                referencetemperature = 0.;
    1112        end
    1213        methods
     
    3132                        obj.g=9.81;
    3233
     34                        %Earth's rotation speed
     35                        obj.omega = 7.292*1e-5;
     36
    3337                        %converstion from year to seconds
    3438                        obj.yts=365*24*3600;
     
    4044                function md = checkconsistency(obj,md,solution,analyses) % {{{
    4145
    42 %                       md = checkfield(md,'fieldname','constants.g','>',0,'size',[1 1]);
     46                        md = checkfield(md,'fieldname','constants.g','>=',0,'size',[1 1]); %We allow 0 for validation tests
     47                        md = checkfield(md,'fieldname','constants.omega','>=',0,'size',[1 1]);
    4348                        md = checkfield(md,'fieldname','constants.yts','>',0,'size',[1 1]);
    4449                        md = checkfield(md,'fieldname','constants.referencetemperature','size',[1 1]);
     
    4954
    5055                        fielddisplay(obj,'g','gravitational acceleration [m/s^2]');
     56                        fielddisplay(obj,'omega','angular velocity of Earth [rad/s]');
    5157                        fielddisplay(obj,'yts','number of seconds in a year [s/yr]');
    5258                        fielddisplay(obj,'referencetemperature','reference temperature used in the enthalpy model [K]');
     
    5561                function marshall(obj,md,fid) % {{{
    5662                        WriteData(fid,'object',obj,'fieldname','g','format','Double');
     63                        WriteData(fid,'object',obj,'fieldname','omega','format','Double');
    5764                        WriteData(fid,'object',obj,'fieldname','yts','format','Double');
    5865                        WriteData(fid,'object',obj,'fieldname','referencetemperature','format','Double');
  • issm/trunk-jpl/src/m/classes/matseaice.m

    r18494 r18503  
    99                poisson                = 0.;
    1010                young_modulus          = 0.;
    11                 damage                 = NaN;
    1211                ridging_exponent       = 0.;
    1312                cohesion               = 0.;
     
    1514                compression_coef       = 0.;
    1615                traction_coef          = 0.;
     16                time_relaxation_stress  = 0.;
     17                time_relaxation_damage  = 0.;
    1718        end
    1819        methods
     
    6162                        obj.traction_coef=5./6.;
    6263
     64                        %Time relaxation stress
     65                        %1e20 for the elastic case (perfect memory of the stress), equal to the timestep for the viscous case (no memory of the stress)
     66                        obj.time_relaxation_stress=1.e+20;
     67
     68                        %Time relaxation damage
     69                        %1e20 for the brittle case (perfect memory of the damage), equal to the timestep for the plastic case (no memory of the damage)
     70                        obj.time_relaxation_damage=1.e+20;
     71
    6372                end % }}}
    6473                function md = checkconsistency(obj,md,solution,analyses) % {{{
     
    6675                        md = checkfield(md,'fieldname','materials.poisson','NaN',1,'>',0,'<',.5,'numel',1);
    6776                        md = checkfield(md,'fieldname','materials.young_modulus','NaN',1,'>',0,'numel',1);
    68                         md = checkfield(md,'fieldname','materials.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
    6977                        md = checkfield(md,'fieldname','materials.ridging_exponent','NaN',1,'<',0,'numel',1);
    7078                        md = checkfield(md,'fieldname','materials.cohesion','NaN',1,'>',0,'numel',1);
     
    7280                        md = checkfield(md,'fieldname','materials.compression_coef','NaN',1,'>',1,'numel',1);
    7381                        md = checkfield(md,'fieldname','materials.traction_coef','NaN',1,'>',0,'<',1,'numel',1);
     82                        md = checkfield(md,'fieldname','materials.time_relaxation_stress','NaN',1,'>',md.timestepping.time_step,'numel',1);
    7483                end % }}}
    7584                function disp(obj) % {{{
    7685                        disp(sprintf('   Sea Ice Material:'));
    77 
    7886                        fielddisplay(obj,'rho_ice','ice density [kg/m^3]');
    7987                        fielddisplay(obj,'poisson','poisson ratio for undamaged ice [no unit]');
    8088                        fielddisplay(obj,'young_modulus','Young modulus for undamaged ice [Pa]');
    81                         fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
    8289                        fielddisplay(obj,'ridging_exponent','Riging exponent (c, Hibler parameter) [no unit]');
    8390                        fielddisplay(obj,'cohesion','cohesion (C) [Pa]');
     
    8592                        fielddisplay(obj,'compression_coef','Ratio between cutoff compressive strength and the cohesion [no unit]');
    8693                        fielddisplay(obj,'traction_coef','Ratio between cutoff tensile strength and Mohr-Coulomb tensile strength [no unit]');
     94                        fielddisplay(obj,'time_relaxation_stress','Relaxation time for stress (1e+20: elastic, dt: viscous) [s]');
     95                        fielddisplay(obj,'time_relaxation_damage','Relaxation time for damage (1e+20: brittle, dt: plastic) [s]');
    8796                end % }}}
    8897                function marshall(obj,md,fid) % {{{
     
    91100                        WriteData(fid,'object',obj,'class','materials','fieldname','poisson','format','Double');
    92101                        WriteData(fid,'object',obj,'class','materials','fieldname','young_modulus','format','Double');
    93                         WriteData(fid,'object',obj,'class','materials','fieldname','damage','format','DoubleMat','mattype',2);
    94102                        WriteData(fid,'object',obj,'class','materials','fieldname','ridging_exponent','format','Double');
    95103                        WriteData(fid,'object',obj,'class','materials','fieldname','cohesion','format','Double');
     
    97105                        WriteData(fid,'object',obj,'class','materials','fieldname','compression_coef','format','Double');
    98106                        WriteData(fid,'object',obj,'class','materials','fieldname','traction_coef','format','Double');
     107                        WriteData(fid,'object',obj,'class','materials','fieldname','time_relaxation_stress','format','Double');
     108                        WriteData(fid,'object',obj,'class','materials','fieldname','time_relaxation_damage','format','Double');
    99109                end % }}}
    100110        end
  • issm/trunk-jpl/src/m/classes/model.m

    r18492 r18503  
    137137                                        if strcmpi(varargin{1},'seaice'),
    138138                                                md=setdefaultparameters(md);
    139                                                 md.materials = matseaice();
     139
     140                                                %Specific subject for sea ice model
     141                                                md.materials       = matseaice();
    140142                                                md.surfaceforcings = seaiceatm();
    141143                                                md.basalforcings   = seaiceocean();
    142144                                                md.initialization  = seaiceinitialization();
     145
     146                                                %Change some of the defauls
     147                                                md.timestepping.in_years = false;
     148                                                md.constants.g           = 9.80616; %Same as TOPAZ
    143149                                        else
    144150                                                error('model constructor not supported yet');
  • issm/trunk-jpl/src/m/classes/seaice.m

    r18497 r18503  
    66classdef seaice
    77        properties (SetAccess=public)
    8                 thickness       = NaN;
    9                 concentration   = NaN;
    10                 spcvx           = NaN;
    11                 spcvy           = NaN;
    12                 coriolis_factor = NaN;
     8                min_concentration = 0.;
     9                min_thickness     = 0.;
     10                max_thickness     = 0.;
     11                spcvx             = NaN;
     12                spcvy             = NaN;
     13                coriolis_factor   = NaN;
    1314        end
    1415        methods
     
    1617                        switch nargin
    1718                                case 0
     19                                        obj=setdefaultparameters(obj);
    1820                                        return;
    1921                                otherwise
     
    2325                function md = checkconsistency(obj,md,solution,analyses) % {{{
    2426                        if solution~=SeaiceSolutionEnum(), return; end
    25                         md = checkfield(md,'fieldname','seaice.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
    26                         md = checkfield(md,'fieldname','seaice.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
     27                        md = checkfield(md,'fieldname','seaice.min_concentration','NaN',1,'>=',0,'numel',1);
     28                        md = checkfield(md,'fieldname','seaice.min_thickness','NaN',1,'>=',0,'numel',1);
     29                        md = checkfield(md,'fieldname','seaice.max_thickness','NaN',1,'>',0,'numel',1);
    2730                        md = checkfield(md,'fieldname','seaice.spcvx','size',[md.mesh.numberofvertices 1]);
    2831                        md = checkfield(md,'fieldname','seaice.spcvy','size',[md.mesh.numberofvertices 1]);
    2932                        md = checkfield(md,'fieldname','seaice.coriolis_factor','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
    3033                end % }}}
     34                function obj = setdefaultparameters(obj) % {{{
     35
     36                        %Minimum ice concentration allowed in the simulation
     37                        obj.min_concentration=0.;
     38
     39                        %Minimum ice thickness allowed in the simulation
     40                        obj.min_thickness=0.;
     41
     42                        %Maxmimum ice thickness allowed in the simulation
     43                        obj.max_thickness=25.;
     44
     45                end % }}}
    3146                function disp(obj) % {{{
    3247                        disp(sprintf('   seaice parameters:'));
    33                         fielddisplay(obj,'thickness','sea ice thickness [m]');
    34                         fielddisplay(obj,'concentration','sea ice concentration (between 0 and 1)');
     48                        fielddisplay(obj,'min_concentration','minimum ice concentration allowed in the simulation [no unit]');
     49                        fielddisplay(obj,'min_thickness','minimum ice thickness allowed in the simulation [m]');
     50                        fielddisplay(obj,'max_thickness','maximum ice thickness allowed in the simulation [m]');
    3551                        fielddisplay(obj,'spcvx','x-axis velocity constraint (NaN means no constraint) [m/s]');
    3652                        fielddisplay(obj,'spcvy','y-axis velocity constraint (NaN means no constraint) [m/s]');
     
    3854                end % }}}
    3955                function marshall(obj,md,fid) % {{{
    40                         WriteData(fid,'object',obj,'fieldname','thickness','format','DoubleMat','mattype',2);
    41                         WriteData(fid,'object',obj,'fieldname','concentration','format','DoubleMat','mattype',2);
     56                        WriteData(fid,'object',obj,'fieldname','min_concentration','format','Double');
     57                        WriteData(fid,'object',obj,'fieldname','min_thickness','format','Double');
     58                        WriteData(fid,'object',obj,'fieldname','max_thickness','format','Double');
    4259                        WriteData(fid,'object',obj,'fieldname','spcvx','format','DoubleMat','mattype',1);
    4360                        WriteData(fid,'object',obj,'fieldname','spcvy','format','DoubleMat','mattype',1);
  • issm/trunk-jpl/src/m/classes/seaiceinitialization.m

    r18492 r18503  
    66classdef seaiceinitialization
    77        properties (SetAccess=public)
    8                 vx          = NaN;
    9                 vy          = NaN;
    10                 vx_coriolis = NaN;
    11                 vy_coriolis = NaN;
     8                thickness          = NaN;
     9                concentration      = NaN;
     10                vx                 = NaN;
     11                vy                 = NaN;
     12                vx_coriolis        = NaN;
     13                vy_coriolis        = NaN;
     14                sigma_predictor_xx = NaN;
     15                sigma_predictor_yy = NaN;
     16                sigma_predictor_xy = NaN;
     17                damage             = NaN;
     18                mesh_x             = NaN;
     19                mesh_y             = NaN;
    1220        end
    1321        methods
     
    2129                end % }}}
    2230                function md = checkconsistency(obj,md,solution,analyses) % {{{
     31                        md = checkfield(md,'fieldname','initialization.thickness','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
     32                        md = checkfield(md,'fieldname','initialization.concentration','size',[md.mesh.numberofelements 1],'NaN',1,'>=',0);
    2333                        md = checkfield(md,'fieldname','initialization.vx','NaN',1,'size',[md.mesh.numberofvertices 1]);
    2434                        md = checkfield(md,'fieldname','initialization.vy','NaN',1,'size',[md.mesh.numberofvertices 1]);
    2535                        md = checkfield(md,'fieldname','initialization.vx_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
    2636                        md = checkfield(md,'fieldname','initialization.vy_coriolis','NaN',1,'size',[md.mesh.numberofvertices 1]);
     37                        md = checkfield(md,'fieldname','initialization.sigma_predictor_xx','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
     38                        md = checkfield(md,'fieldname','initialization.sigma_predictor_yy','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
     39                        md = checkfield(md,'fieldname','initialization.sigma_predictor_xy','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
     40                        md = checkfield(md,'fieldname','initialization.damage','NaN',1,'>=',0,'<',1,'size',[md.mesh.numberofelements 1]);
     41                        md = checkfield(md,'fieldname','initialization.mesh_x','NaN',1,'size',[md.mesh.numberofvertices 1]);
     42                        md = checkfield(md,'fieldname','initialization.mesh_y','NaN',1,'size',[md.mesh.numberofvertices 1]);
    2743                end % }}}
    2844                function disp(obj) % {{{
    2945                        disp(sprintf('   initial field values:'));
     46                        fielddisplay(obj,'thickness','sea ice thickness [m]');
     47                        fielddisplay(obj,'concentration','sea ice concentration (between 0 and 1)');
    3048                        fielddisplay(obj,'vx','x component of the ice velocity [m/s]');
    3149                        fielddisplay(obj,'vy','y component of the ice velocity [m/s]');
    3250                        fielddisplay(obj,'vx_coriolis','x component of the ice velocity used to calculate coriolis forces [m/s]');
    3351                        fielddisplay(obj,'vy_coriolis','y component of the ice velocity used to calculate coriolis forces [m/s]');
     52                        fielddisplay(obj,'sigma_predictor_xx','Predictor for the xx component of the Cauchy stress tensor [Pa]');
     53                        fielddisplay(obj,'sigma_predictor_yy','Predictor for the yy component of the Cauchy stress tensor [Pa]');
     54                        fielddisplay(obj,'sigma_predictor_xy','Predictor for the xy component of the Cauchy stress tensor [Pa]');
     55                        fielddisplay(obj,'damage','damage, between 0 (no damage) and 1 (fully damaged)');
     56                        fielddisplay(obj,'mesh_x','x position of each vertex of the mesh using a Lagrangian approach');
     57                        fielddisplay(obj,'mesh_y','y position of each vertex of the mesh using a Lagrangian approach');
    3458                end % }}}
    3559                function marshall(obj,md,fid) % {{{
     60                        WriteData(fid,'data',obj.thickness,'format','DoubleMat','mattype',2,'enum',SeaiceThicknessEnum());
     61                        WriteData(fid,'data',obj.concentration,'format','DoubleMat','mattype',2,'enum',SeaiceConcentrationEnum());
    3662                        WriteData(fid,'data',obj.vx,'format','DoubleMat','mattype',1,'enum',VxEnum);
    3763                        WriteData(fid,'data',obj.vy,'format','DoubleMat','mattype',1,'enum',VyEnum);
    38                         WriteData(fid,'data',obj.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum);
    39                         WriteData(fid,'data',obj.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum);
     64                        WriteData(fid,'data',obj.vx_coriolis,'format','DoubleMat','mattype',1,'enum',VxStarEnum());
     65                        WriteData(fid,'data',obj.vy_coriolis,'format','DoubleMat','mattype',1,'enum',VyStarEnum());
     66                        WriteData(fid,'data',obj.sigma_predictor_xx,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxxEnum());
     67                        WriteData(fid,'data',obj.sigma_predictor_yy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictoryyEnum());
     68                        WriteData(fid,'data',obj.sigma_predictor_xy,'format','DoubleMat','mattype',2,'enum',StressTensorPredictorxyEnum());
     69                        WriteData(fid,'data',obj.damage,'format','DoubleMat','mattype',2,'enum',DamageEnum());
     70                        WriteData(fid,'data',obj.mesh_x,'format','DoubleMat','mattype',1,'enum',MeshXEnum());
     71                        WriteData(fid,'data',obj.mesh_y,'format','DoubleMat','mattype',1,'enum',MeshYEnum());
    4072                end % }}}
    4173        end
  • issm/trunk-jpl/src/m/classes/seaiceocean.m

    r18492 r18503  
    3737
    3838                        %Turning angle in degrees (McPhee 1998)
    39                         obj.ocean_turning_angle = 25.;
     39                        obj.ocean_turning_angle = deg2rad(25.);
    4040
    4141                end % }}}
     
    5757                        fielddisplay(obj,'ocean_lin_drag_coef','ocean linear drag coefficient [Pa/(m/s)]');
    5858                        fielddisplay(obj,'ocean_quad_drag_coef','ocean quadratic drag coefficient [Pa/(m/s)^2]');
    59                         fielddisplay(obj,'ocean_turning_angle','ocean turning angle [degree]');
     59                        fielddisplay(obj,'ocean_turning_angle','ocean turning angle [rad]');
    6060                        fielddisplay(obj,'ocean_ssh','ocean sea surface height [m]');
    6161                        fielddisplay(obj,'ocean_vx','ocean speed x-component [m/s]');
  • issm/trunk-jpl/src/m/classes/timestepping.m

    r18000 r18503  
    1212                cfl_coefficient = 0.;
    1313                interp_forcings = 1;
     14                in_years        = 0;
    1415        end
    1516        methods
     
    5051                        %should we interpolate forcings between timesteps?
    5152                        obj.interp_forcings=1;
     53
     54                        %In years by default
     55                        obj.in_years = 1;
    5256                end % }}}
    5357                function md = checkconsistency(obj,md,solution,analyses) % {{{
     
    6670                        disp(sprintf('   timestepping parameters:'));
    6771
    68                         fielddisplay(obj,'start_time','simulation starting time [yr]');
    69                         fielddisplay(obj,'final_time','final time to stop the simulation [yr]');
    70                         fielddisplay(obj,'time_step','length of time steps [yr]');
     72                        if(obj.in_years)
     73                                unit = 'yr';
     74                        else
     75                                unit = 's';
     76                        end
     77                        fielddisplay(obj,'start_time',['simulation starting time [' unit ']']);
     78                        fielddisplay(obj,'final_time',['final time to stop the simulation [' unit ']']);
     79                        fielddisplay(obj,'time_step',['length of time steps [' unit ']']);
    7180                        fielddisplay(obj,'time_adapt','use cfl condition to define time step ? (0 or 1) ');
    7281                        fielddisplay(obj,'cfl_coefficient','coefficient applied to cfl condition');
    7382                        fielddisplay(obj,'interp_forcings','interpolate in time between requested forcing values ? (0 or 1)');
     83                        fielddisplay(obj,'in_years','time unit, 1: years, 0: seconds');
    7484
    7585                end % }}}
    7686                function marshall(obj,md,fid) % {{{
    7787
    78                         yts=365.0*24.0*3600.0;
    79 
    80                         WriteData(fid,'object',obj,'fieldname','start_time','format','Double','scale',yts);
    81                         WriteData(fid,'object',obj,'fieldname','final_time','format','Double','scale',yts);
    82                         WriteData(fid,'object',obj,'fieldname','time_step','format','Double','scale',yts);
     88                        if obj.in_years,
     89                                scale = 365.0*24.0*3600.0;
     90                        else
     91                                scale = 1.;
     92                        end
     93                        WriteData(fid,'object',obj,'fieldname','start_time','format','Double','scale',scale);
     94                        WriteData(fid,'object',obj,'fieldname','final_time','format','Double','scale',scale);
     95                        WriteData(fid,'object',obj,'fieldname','time_step','format','Double','scale',scale);
    8396                        WriteData(fid,'object',obj,'fieldname','time_adapt','format','Boolean');
    8497                        WriteData(fid,'object',obj,'fieldname','cfl_coefficient','format','Double');
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r18497 r18503  
    5050def BaseEnum(): return StringToEnum("Base")[0]
    5151def ConstantsGEnum(): return StringToEnum("ConstantsG")[0]
     52def ConstantsOmegaEnum(): return StringToEnum("ConstantsOmega")[0]
    5253def ConstantsReferencetemperatureEnum(): return StringToEnum("ConstantsReferencetemperature")[0]
    5354def ConstantsYtsEnum(): return StringToEnum("ConstantsYts")[0]
     
    198199def DamageEvolutionNumRequestedOutputsEnum(): return StringToEnum("DamageEvolutionNumRequestedOutputs")[0]
    199200def DamageEvolutionRequestedOutputsEnum(): return StringToEnum("DamageEvolutionRequestedOutputs")[0]
     201def DamageEnum(): return StringToEnum("Damage")[0]
    200202def NewDamageEnum(): return StringToEnum("NewDamage")[0]
    201203def MaterialsRhoIceEnum(): return StringToEnum("MaterialsRhoIce")[0]
     
    700702def SeaiceThicknessEnum(): return StringToEnum("SeaiceThickness")[0]
    701703def SeaiceConcentrationEnum(): return StringToEnum("SeaiceConcentration")[0]
     704def SeaiceMinConcentrationEnum(): return StringToEnum("SeaiceMinConcentration")[0]
     705def SeaiceMinThicknessEnum(): return StringToEnum("SeaiceMinThickness")[0]
     706def SeaiceMaxThicknessEnum(): return StringToEnum("SeaiceMaxThickness")[0]
    702707def SeaiceSpcvxEnum(): return StringToEnum("SeaiceSpcvx")[0]
    703708def SeaiceSpcvyEnum(): return StringToEnum("SeaiceSpcvy")[0]
     
    720725def MaterialsPoissonEnum(): return StringToEnum("MaterialsPoisson")[0]
    721726def MaterialsYoungModulusEnum(): return StringToEnum("MaterialsYoungModulus")[0]
    722 def MaterialsDamageEnum(): return StringToEnum("MaterialsDamage")[0]
     727def MaterialsTimeRelaxationStressEnum(): return StringToEnum("MaterialsTimeRelaxationStress")[0]
     728def MaterialsTimeRelaxationDamageEnum(): return StringToEnum("MaterialsTimeRelaxationDamage")[0]
    723729def MaterialsRidgingExponentEnum(): return StringToEnum("MaterialsRidgingExponent")[0]
    724730def MaterialsCohesionEnum(): return StringToEnum("MaterialsCohesion")[0]
     
    728734def VxStarEnum(): return StringToEnum("VxStar")[0]
    729735def VyStarEnum(): return StringToEnum("VyStar")[0]
     736def StressTensorPredictorxxEnum(): return StringToEnum("StressTensorPredictorxx")[0]
     737def StressTensorPredictoryyEnum(): return StringToEnum("StressTensorPredictoryy")[0]
     738def StressTensorPredictorxyEnum(): return StringToEnum("StressTensorPredictorxy")[0]
    730739def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
Note: See TracChangeset for help on using the changeset viewer.