Changeset 26187
- Timestamp:
- 04/08/21 14:07:35 (4 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r26155 r26187 921 921 break; 922 922 case 11: 923 iomodel->FindConstant(&FrictionCoupling,"md.friction.coupling"); 923 924 iomodel->FetchDataToInput(inputs,elements,"md.friction.m",FrictionMEnum); 924 925 iomodel->FetchDataToInput(inputs,elements,"md.friction.C",FrictionCEnum); 925 926 iomodel->FetchDataToInput(inputs,elements,"md.friction.Cmax",FrictionCmaxEnum); 927 if(FrictionCoupling==3){ 928 iomodel->FetchDataToInput(inputs,elements,"md.friction.effective_pressure",FrictionEffectivePressureEnum);} 929 else if(FrictionCoupling==4){ 930 iomodel->FetchDataToInput(inputs,elements,"md.friction.effective_pressure",EffectivePressureEnum); 931 } 926 932 break; 927 933 case 12: … … 938 944 else if(FrictionCoupling==4){ 939 945 iomodel->FetchDataToInput(inputs,elements,"md.friction.effective_pressure",EffectivePressureEnum); 940 941 946 } 942 947 break; … … 1047 1052 break; 1048 1053 case 11: 1049 parameters->AddObject( new IntParam(FrictionCouplingEnum,2));1054 parameters->AddObject(iomodel->CopyConstantObject("md.friction.coupling",FrictionCouplingEnum)); 1050 1055 parameters->AddObject(iomodel->CopyConstantObject("md.friction.effective_pressure_limit",FrictionEffectivePressureLimitEnum)); 1051 1056 break; -
issm/trunk-jpl/src/c/classes/IoModel.cpp
r26073 r26187 616 616 if(fread(record_name,record_name_size*sizeof(char),1,fid)!=0){}; 617 617 618 _error_("error while looking in binary file. String " << record_name << "a string of size "<<record_name_size);618 _error_("error while looking in binary file. String \"" << record_name << "\" is a string of size "<<record_name_size); 619 619 } 620 620 -
issm/trunk-jpl/src/m/classes/friction.m
r25688 r26187 6 6 classdef friction 7 7 properties (SetAccess=public) 8 coefficient = NaN;9 p = NaN;10 q = NaN;11 coupling = 0;12 effective_pressure = NaN;8 coefficient = NaN; 9 p = NaN; 10 q = NaN; 11 coupling = 0; 12 effective_pressure = NaN; 13 13 effective_pressure_limit = 0; 14 14 end … … 18 18 self.p=project3d(md,'vector',self.p,'type','element'); 19 19 self.q=project3d(md,'vector',self.q,'type','element'); 20 switch self.coupling 21 case 0 22 case 1 23 case 2 24 case 3 25 self.effective_pressure=project3d(md,'vector',self.effective_pressure,'type','node','layer',1); 26 case 4 27 self.effective_pressure=project3d(md,'vector',self.effective_pressure,'type','node','layer',1); 28 otherwise 29 error('not supported yet'); 20 if self.coupling==3 || self.coupling==4 21 self.effective_pressure=project3d(md,'vector',self.effective_pressure,'type','node','layer',1); 30 22 end 31 23 end % }}} … … 57 49 md = checkfield(md,'fieldname','friction.coupling','numel',[1],'values',[0:4]); 58 50 md = checkfield(md,'fieldname','friction.effective_pressure_limit','numel',[1],'>=',0); 59 switch self.coupling 60 case 0 61 case 1 62 case 2 63 case 3 64 md = checkfield(md,'fieldname','friction.effective_pressure','NaN',1,'Inf',1,'timeseries',1); 65 case 4 66 67 otherwise 68 error('not supported yet'); 51 if self.coupling==3 52 md = checkfield(md,'fieldname','friction.effective_pressure','NaN',1,'Inf',1,'timeseries',1); 69 53 end 70 54 end % }}} … … 92 76 WriteData(fid,prefix,'class','friction','object',self,'fieldname','coupling','format','Integer'); 93 77 WriteData(fid,prefix,'object',self,'class','friction','fieldname','effective_pressure_limit','format','Double'); 94 switch self.coupling 95 case 0 96 case 1 97 case 2 98 case 3 99 WriteData(fid,prefix,'class','friction','object',self,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts); 100 case 4 101 WriteData(fid,prefix,'class','friction','object',self,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts); 102 otherwise 103 error('not supported yet'); 78 if self.coupling==3 || self.coupling==4 79 WriteData(fid,prefix,'class','friction','object',self,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts); 104 80 end 105 81 end % }}} -
issm/trunk-jpl/src/m/classes/friction.py
r25688 r26187 23 23 self.setdefaultparameters() 24 24 #}}} 25 26 25 def __repr__(self): # {{{ 27 26 s = 'Basal shear stress parameters: Sigma_b = coefficient^2 * Neff ^r * |u_b|^(s - 1) * u_b,\n' … … 35 34 return s 36 35 #}}} 37 38 36 def setdefaultparameters(self): # {{{ 39 37 self.effective_pressure_limit = 0 40 38 return self 41 39 #}}} 42 43 40 def extrude(self, md): # {{{ 44 41 self.coefficient = project3d(md, 'vector', self.coefficient, 'type', 'node', 'layer', 1) 45 42 self.p = project3d(md, 'vector', self.p, 'type', 'element') 46 43 self.q = project3d(md, 'vector', self.q, 'type', 'element') 47 # If self.coupling == 0: #doesnt work with empty loop, so just skip it?48 44 if self.coupling in[3, 4]: 49 45 self.effective_pressure = project3d(md, 'vector', self.effective_pressure, 'type', 'node', 'layer', 1) 50 elif self.coupling > 4:51 raise ValueError('md.friction.coupling larger than 4, not supported yet')52 46 return self 53 47 #}}} 54 55 48 def defaultoutputs(self, md): # {{{ 56 49 list = [] 57 50 return list 58 51 #}}} 59 60 52 def checkconsistency(self, md, solution, analyses): # {{{ 61 53 # Early return … … 71 63 if self.coupling == 3: 72 64 md = checkfield(md, 'fieldname', 'friction.effective_pressure', 'NaN', 1, 'Inf', 1, 'timeseries', 1) 73 elif self.coupling > 4:74 raise ValueError('not supported yet')75 65 return md 76 66 # }}} 77 78 67 def marshall(self, prefix, md, fid): # {{{ 79 68 WriteData(fid, prefix, 'name', 'md.friction.law', 'data', 1, 'format', 'Integer') … … 89 78 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'coupling', 'format', 'Integer') 90 79 WriteData(fid, prefix, 'object', self, 'class', 'friction', 'fieldname', 'effective_pressure_limit', 'format', 'Double') 91 if self.coupling == 3 :80 if self.coupling == 3 or self.coupling == 4: 92 81 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'effective_pressure', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts) 93 elif self.coupling == 4:94 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'effective_pressure', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts)95 elif self.coupling > 4:96 raise ValueError('not supported yet')97 82 # }}} -
issm/trunk-jpl/src/m/classes/frictionschoof.m
r25514 r26187 6 6 classdef frictionschoof 7 7 properties (SetAccess=public) 8 C = NaN; 9 Cmax = NaN; 10 m = NaN; 8 C = NaN; 9 Cmax = NaN; 10 m = NaN; 11 coupling = 0; 12 effective_pressure = NaN; 11 13 effective_pressure_limit = 0; 12 14 end … … 26 28 self.Cmax = project3d(md,'vector',self.Cmax,'type','node'); 27 29 self.m = project3d(md,'vector',self.m,'type','element'); 30 if self.coupling==3 || self.coupling==4 31 self.effective_pressure=project3d(md,'vector',self.effective_pressure,'type','node','layer',1); 32 end 28 33 end % }}} 29 34 function self = setdefaultparameters(self) % {{{ 30 35 36 self.coupling = 0; 31 37 self.effective_pressure_limit = 0; 32 38 … … 36 42 %Early return 37 43 if ~ismember('StressbalanceAnalysis',analyses) & ~ismember('ThermalAnalysis',analyses), return; end 38 md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1,'Inf',1,'> ',0.);44 md = checkfield(md,'fieldname','friction.C','timeseries',1,'NaN',1,'Inf',1,'>=',0.); 39 45 md = checkfield(md,'fieldname','friction.Cmax','timeseries',1,'NaN',1,'Inf',1,'>',0.); 40 46 md = checkfield(md,'fieldname','friction.m','NaN',1,'Inf',1,'>',0.,'size',[md.mesh.numberofelements,1]); 41 47 md = checkfield(md,'fieldname','friction.effective_pressure_limit','numel',[1],'>=',0); 48 md = checkfield(md,'fieldname','friction.coupling','numel',[1],'values',[0:4]); 49 if self.coupling==3 50 md = checkfield(md,'fieldname','friction.effective_pressure','NaN',1,'Inf',1,'timeseries',1); 51 end 42 52 end % }}} 43 53 function disp(self) % {{{ … … 52 62 fielddisplay(self,'Cmax','Iken''s bound (typically between 0.17 and 0.84) [SI]'); 53 63 fielddisplay(self,'m','m exponent (generally taken as m = 1/n = 1/3)'); 64 fielddisplay(self,'effective_pressure','Effective Pressure for the forcing if not coupled [Pa]'); 65 fielddisplay(self,'coupling','Coupling flag 0: uniform sheet (negative pressure ok, default), 1: ice pressure only, 2: water pressure assuming uniform sheet (no negative pressure), 3: use provided effective_pressure, 4: use coupled model (not implemented yet)'); 54 66 fielddisplay(self,'effective_pressure_limit','Neff do not allow to fall below a certain limit: effective_pressure_limit*rho_ice*g*thickness (default 0)'); 55 67 end % }}} … … 62 74 WriteData(fid,prefix,'class','friction','object',self,'fieldname','m','format','DoubleMat','mattype',2); 63 75 WriteData(fid,prefix,'object',self,'class','friction','fieldname','effective_pressure_limit','format','Double'); 76 WriteData(fid,prefix,'class','friction','object',self,'fieldname','coupling','format','Integer'); 77 if self.coupling==3 || self.coupling==4 78 WriteData(fid,prefix,'class','friction','object',self,'fieldname','effective_pressure','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts); 79 end 64 80 end % }}} 65 81 end -
issm/trunk-jpl/src/m/classes/frictionschoof.py
r25806 r26187 16 16 17 17 def __init__(self, *args): # {{{ 18 self.C = np.nan 19 self.Cmax = np.nan 20 self.m = np.nan 21 self.effective_pressure_limit = 0 18 self.C = np.nan 19 self.Cmax = np.nan 20 self.m = np.nan 21 self.coupling = 0 22 self.effective_pressure = np.nan 23 self.effective_pressure_limit = 0 22 24 23 25 nargs = len(args) … … 29 31 raise Exception('constructor not supported') 30 32 #}}} 31 32 33 def __repr__(self): # {{{ 33 34 # See Brondex et al. 2019 https://www.the-cryosphere.net/13/177/2019/ … … 41 42 s += "{}\n".format(fielddisplay(self, 'Cmax', 'Iken\'s bound (typically between 0.17 and 0.84) [SI]')) 42 43 s += "{}\n".format(fielddisplay(self, 'm', 'm exponent (generally taken as m = 1/n = 1/3)')) 44 s += '{}\n'.format(fielddisplay(self, 'coupling', 'Coupling flag 0: uniform sheet (negative pressure ok, default), 1: ice pressure only, 2: water pressure assuming uniform sheet (no negative pressure), 3: use provided effective_pressure, 4: used coupled model (not implemented yet)')) 45 s += '{}\n'.format(fielddisplay(self, 'effective_pressure', 'Effective Pressure for the forcing if not coupled [Pa]')) 43 46 s += "{}\n".format(fielddisplay(self, 'effective_pressure_limit', 'fNeff do not allow to fall below a certain limit: effective_pressure_limit*rho_ice*g*thickness (default 0)')) 44 47 return s 45 48 #}}} 46 47 49 def setdefaultparameters(self): # {{{ 48 50 self.effective_pressure_limit = 0 49 51 return self 50 52 #}}} 51 52 53 def extrude(self, md): # {{{ 53 54 self.C = project3d(md, 'vector', self.C, 'type', 'node') 54 55 self.Cmax = project3d(md, 'vector', self.Cmax, 'type', 'node') 55 56 self.m = project3d(md, 'vector', self.m, 'type', 'element') 57 if self.coupling in[3, 4]: 58 self.effective_pressure = project3d(md, 'vector', self.effective_pressure, 'type', 'node', 'layer', 1) 56 59 return self 57 60 #}}} 58 59 61 def checkconsistency(self, md, solution, analyses): # {{{ 60 62 # Early return … … 65 67 md = checkfield(md, 'fieldname', 'friction.m', 'NaN', 1, 'Inf', 1, '>', 0., 'size', [md.mesh.numberofelements, 1]) 66 68 md = checkfield(md, 'fieldname', 'friction.effective_pressure_limit', 'numel', [1], '>=', 0) 69 md = checkfield(md, 'fieldname', 'friction.coupling', 'numel', [1], 'values', [0, 1, 2, 3, 4]) 70 if self.coupling == 3: 71 md = checkfield(md, 'fieldname', 'friction.effective_pressure', 'NaN', 1, 'Inf', 1, 'timeseries', 1) 67 72 return md 68 73 # }}} 69 70 74 def marshall(self, prefix, md, fid): # {{{ 71 75 yts = md.constants.yts … … 75 79 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'Cmax', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts) 76 80 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'm', 'format', 'DoubleMat', 'mattype', 2) 81 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'coupling', 'format', 'Integer') 77 82 WriteData(fid, prefix, 'object', self, 'class', 'friction', 'fieldname', 'effective_pressure_limit', 'format', 'Double') 83 if self.coupling == 3 or self.coupling == 4: 84 WriteData(fid, prefix, 'class', 'friction', 'object', self, 'fieldname', 'effective_pressure', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', md.constants.yts) 78 85 # }}} 79
Note:
See TracChangeset
for help on using the changeset viewer.