Changeset 24140
- Timestamp:
- 09/11/19 09:30:58 (6 years ago)
- Location:
- issm/trunk-jpl
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
r24136 r24140 275 275 parameters->AddObject(iomodel->CopyConstantObject("md.thermal.isenthalpy",ThermalIsenthalpyEnum)); 276 276 parameters->AddObject(iomodel->CopyConstantObject("md.thermal.isdynamicbasalspc",ThermalIsdynamicbasalspcEnum)); 277 parameters->AddObject(iomodel->CopyConstantObject("md.thermal.isdrainicecolumn",ThermalIsdrainicecolumnEnum)); 278 parameters->AddObject(iomodel->CopyConstantObject("md.thermal.watercolumn_upperlimit",ThermalWatercolumnUpperlimitEnum)); 277 279 parameters->AddObject(iomodel->CopyConstantObject("md.friction.law",FrictionLawEnum)); 278 280 … … 424 426 element->GetInputListOnNodes(basalmeltingrates,BasalforcingsGroundediceMeltingRateEnum); 425 427 428 IssmDouble watercolumnupperlimit = element->FindParam(ThermalWatercolumnUpperlimitEnum); 429 426 430 Gauss* gauss=element->NewGauss(); 427 431 for(is=0;is<numsegments;is++){ … … 484 488 watercolumns[nodedown]+=dt*meltingrate_enthalpy[is]; 485 489 } 490 if(watercolumns[nodedown]>watercolumnupperlimit) watercolumns[nodedown]=watercolumnupperlimit; 486 491 } 487 492 else{ … … 1168 1173 1169 1174 for(k=0;k<numnodes;k++){ 1170 waterfractions[k]-=dt*drainage[k]; 1175 if(dt==0.) 1176 waterfractions[k]-=drainage[k]; 1177 else 1178 waterfractions[k]-=dt*drainage[k]; 1179 1171 1180 element->ThermalToEnthalpy(&enthalpies[k], temperatures[k], waterfractions[k], pressures[k]); 1172 1181 } … … 1187 1196 IssmDouble thermalconductivity = element->FindParam(MaterialsThermalconductivityEnum); 1188 1197 1189 if(enthalpy < PureIceEnthalpy(element,pressure)) {1198 if(enthalpy < PureIceEnthalpy(element,pressure)) 1190 1199 return thermalconductivity/heatcapacity; 1191 } 1192 else{ 1200 else 1193 1201 return temperateiceconductivity/heatcapacity; 1194 }1195 1202 }/*}}}*/ 1196 1203 IssmDouble EnthalpyAnalysis::EnthalpyDiffusionParameterVolume(Element* element,int enthalpy_enum){/*{{{*/ … … 1678 1685 /*Intermediaries*/ 1679 1686 bool computebasalmeltingrates=true; 1680 bool drainicecolumn=true;1687 bool isdrainicecolumn; 1681 1688 IssmDouble dt; 1682 1689 1683 1690 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 1684 1685 if(drainicecolumn && (dt>0.)) DrainWaterfraction(femmodel); 1691 femmodel->parameters->FindParam(&isdrainicecolumn,ThermalIsdrainicecolumnEnum); 1692 1693 if(isdrainicecolumn) DrainWaterfraction(femmodel); 1686 1694 if(computebasalmeltingrates) ComputeBasalMeltingrate(femmodel); 1687 1695 -
issm/trunk-jpl/src/c/shared/Elements/DrainageFunctionWaterfraction.cpp
r23066 r24140 31 31 /*drain only up to w0*/ 32 32 if(dt==0.){ 33 if( (waterfraction>w0) && (waterfraction-Dret*yts<w0))33 if(waterfraction>w0) 34 34 return waterfraction-w0; 35 35 else 36 return Dret *yts;36 return Dret; 37 37 } 38 38 else{ -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r24139 r24140 389 389 StressbalanceRiftPenaltyThresholdEnum, 390 390 StressbalanceShelfDampeningEnum, 391 ThermalIsdrainicecolumnEnum, 391 392 ThermalIsdynamicbasalspcEnum, 392 393 ThermalIsenthalpyEnum, … … 399 400 ThermalRequestedOutputsEnum, 400 401 ThermalStabilizationEnum, 402 ThermalWatercolumnUpperlimitEnum, 401 403 TimeEnum, 402 404 TimesteppingCflCoefficientEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r24139 r24140 397 397 case StressbalanceRiftPenaltyThresholdEnum : return "StressbalanceRiftPenaltyThreshold"; 398 398 case StressbalanceShelfDampeningEnum : return "StressbalanceShelfDampening"; 399 case ThermalIsdrainicecolumnEnum : return "ThermalIsdrainicecolumn"; 399 400 case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc"; 400 401 case ThermalIsenthalpyEnum : return "ThermalIsenthalpy"; … … 407 408 case ThermalRequestedOutputsEnum : return "ThermalRequestedOutputs"; 408 409 case ThermalStabilizationEnum : return "ThermalStabilization"; 410 case ThermalWatercolumnUpperlimitEnum : return "ThermalWatercolumnUpperlimit"; 409 411 case TimeEnum : return "Time"; 410 412 case TimesteppingCflCoefficientEnum : return "TimesteppingCflCoefficient"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r24139 r24140 406 406 else if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum; 407 407 else if (strcmp(name,"StressbalanceShelfDampening")==0) return StressbalanceShelfDampeningEnum; 408 else if (strcmp(name,"ThermalIsdrainicecolumn")==0) return ThermalIsdrainicecolumnEnum; 408 409 else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum; 409 410 else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum; … … 416 417 else if (strcmp(name,"ThermalRequestedOutputs")==0) return ThermalRequestedOutputsEnum; 417 418 else if (strcmp(name,"ThermalStabilization")==0) return ThermalStabilizationEnum; 419 else if (strcmp(name,"ThermalWatercolumnUpperlimit")==0) return ThermalWatercolumnUpperlimitEnum; 418 420 else if (strcmp(name,"Time")==0) return TimeEnum; 419 421 else if (strcmp(name,"TimesteppingCflCoefficient")==0) return TimesteppingCflCoefficientEnum; … … 504 506 else if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum; 505 507 else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum; 506 else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;507 else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum;508 508 else stage=5; 509 509 } 510 510 if(stage==5){ 511 if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum; 511 if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum; 512 else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum; 513 else if (strcmp(name,"DeviatoricStressyy")==0) return DeviatoricStressyyEnum; 512 514 else if (strcmp(name,"DeviatoricStressyz")==0) return DeviatoricStressyzEnum; 513 515 else if (strcmp(name,"DeviatoricStresszz")==0) return DeviatoricStresszzEnum; … … 627 629 else if (strcmp(name,"MaterialsRheologyN")==0) return MaterialsRheologyNEnum; 628 630 else if (strcmp(name,"MeshScaleFactor")==0) return MeshScaleFactorEnum; 629 else if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;630 else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum;631 631 else stage=6; 632 632 } 633 633 if(stage==6){ 634 if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum; 634 if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum; 635 else if (strcmp(name,"MeshVertexonboundary")==0) return MeshVertexonboundaryEnum; 636 else if (strcmp(name,"MeshVertexonsurface")==0) return MeshVertexonsurfaceEnum; 635 637 else if (strcmp(name,"Misfit")==0) return MisfitEnum; 636 638 else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum; … … 750 752 else if (strcmp(name,"SmbTini")==0) return SmbTiniEnum; 751 753 else if (strcmp(name,"SmbTmean")==0) return SmbTmeanEnum; 752 else if (strcmp(name,"SmbTz")==0) return SmbTzEnum;753 else if (strcmp(name,"SmbV")==0) return SmbVEnum;754 754 else stage=7; 755 755 } 756 756 if(stage==7){ 757 if (strcmp(name,"SmbVmean")==0) return SmbVmeanEnum; 757 if (strcmp(name,"SmbTz")==0) return SmbTzEnum; 758 else if (strcmp(name,"SmbV")==0) return SmbVEnum; 759 else if (strcmp(name,"SmbVmean")==0) return SmbVmeanEnum; 758 760 else if (strcmp(name,"SmbVz")==0) return SmbVzEnum; 759 761 else if (strcmp(name,"SmbW")==0) return SmbWEnum; … … 873 875 else if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum; 874 876 else if (strcmp(name,"Outputdefinition53")==0) return Outputdefinition53Enum; 875 else if (strcmp(name,"Outputdefinition54")==0) return Outputdefinition54Enum;876 else if (strcmp(name,"Outputdefinition55")==0) return Outputdefinition55Enum;877 877 else stage=8; 878 878 } 879 879 if(stage==8){ 880 if (strcmp(name,"Outputdefinition56")==0) return Outputdefinition56Enum; 880 if (strcmp(name,"Outputdefinition54")==0) return Outputdefinition54Enum; 881 else if (strcmp(name,"Outputdefinition55")==0) return Outputdefinition55Enum; 882 else if (strcmp(name,"Outputdefinition56")==0) return Outputdefinition56Enum; 881 883 else if (strcmp(name,"Outputdefinition57")==0) return Outputdefinition57Enum; 882 884 else if (strcmp(name,"Outputdefinition58")==0) return Outputdefinition58Enum; … … 996 998 else if (strcmp(name,"Domain3Dsurface")==0) return Domain3DsurfaceEnum; 997 999 else if (strcmp(name,"DoubleArrayInput")==0) return DoubleArrayInputEnum; 998 else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;999 else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum;1000 1000 else stage=9; 1001 1001 } 1002 1002 if(stage==9){ 1003 if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum; 1003 if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum; 1004 else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum; 1005 else if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum; 1004 1006 else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum; 1005 1007 else if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum; … … 1119 1121 else if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum; 1120 1122 else if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum; 1121 else if (strcmp(name,"Materials")==0) return MaterialsEnum;1122 else if (strcmp(name,"Matestar")==0) return MatestarEnum;1123 1123 else stage=10; 1124 1124 } 1125 1125 if(stage==10){ 1126 if (strcmp(name,"Matice")==0) return MaticeEnum; 1126 if (strcmp(name,"Materials")==0) return MaterialsEnum; 1127 else if (strcmp(name,"Matestar")==0) return MatestarEnum; 1128 else if (strcmp(name,"Matice")==0) return MaticeEnum; 1127 1129 else if (strcmp(name,"Matlitho")==0) return MatlithoEnum; 1128 1130 else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum; … … 1242 1244 else if (strcmp(name,"StressbalanceSolution")==0) return StressbalanceSolutionEnum; 1243 1245 else if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum; 1244 else if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum;1245 else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"StringParam")==0) return StringParamEnum; 1249 if (strcmp(name,"StringArrayParam")==0) return StringArrayParamEnum; 1250 else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum; 1251 else if (strcmp(name,"StringParam")==0) return StringParamEnum; 1250 1252 else if (strcmp(name,"SubelementFriction1")==0) return SubelementFriction1Enum; 1251 1253 else if (strcmp(name,"SubelementFriction2")==0) return SubelementFriction2Enum; -
issm/trunk-jpl/src/m/classes/thermal.js
r24136 r24140 28 28 //will basal boundary conditions be set dynamically 29 29 this.isdynamicbasalspc=0; 30 31 //wether waterfraction drainage is enabled 32 this.isdrainicecolumn=1; 33 34 //set an upper limit for local stored watercolumn 35 this.watercolumn_upperlimit=1000; 30 36 31 37 //Linear elements by default … … 41 47 42 48 fielddisplay(this,'spctemperature','temperature constraints (NaN means no constraint) [K]'); 43 fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG , 3: anisotropic SUPG');49 fielddisplay(this,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG'); 44 50 fielddisplay(this,'reltol','relative tolerance convergence criterion for enthalpy'); 45 51 fielddisplay(this,'maxiter','maximum number of non linear iterations'); … … 49 55 fielddisplay(this,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)'); 50 56 fielddisplay(this,'isdynamicbasalspc','enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)'); 57 fielddisplay(this,'isdrainicecolumn','wether waterfraction drainage is enabled for enthalpy formulation (default is 1)'); 58 fielddisplay(this,'watercolumn_upperlimit','upper limit of basal watercolumn for enthalpy formulation (default is 1000m)'); 51 59 fielddisplay(this,'fe','Finite Element type: "P1" (default), "P1xP2"'); 52 60 fielddisplay(this,'requested_outputs','additional outputs requested'); … … 56 64 return "thermal"; 57 65 }// }}} 58 59 60 61 62 66 this.extrude = function(md) {//{{{ 67 this.spctemperature=project3d(md,'vector',this.spctemperature,'type','node','layer',md.mesh.numberoflayers,'padding',NaN); 68 if (md.initialization.temperature.length===md.mesh.numberofvertices) { 69 this.spctemperature = NewArrayFill(md.mesh.numberofvertices, NaN); 70 var pos=ArrayFindNot(md.mesh.vertexonsurface, 0); 63 71 // impose observed temperature on surface 64 72 for (var i=0,posIndex=0,count=0;i<md.initialization.temperature.length;i++){ … … 81 89 // } 82 90 // } 83 91 } 84 92 85 86 93 return this; 94 }//}}} 87 95 this.checkconsistency = function(md,solution,analyses){ // {{{ 88 96 … … 90 98 if(!ArrayAnyEqual(ArrayIsMember('ThermalAnalysis',analyses),1) & !ArrayAnyEqual(ArrayIsMember('EnthalpyAnalysis',analyses),1) | (solution == 'TransientSolution' & md.trans.isthermal==0)) return; 91 99 92 checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 ,1, 2 , 3]);100 checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0 ,1, 2]); 93 101 checkfield(md,'fieldname','thermal.spctemperature','Inf',1,'timeseries',1); 94 102 checkfield(md,'fieldname','thermal.fe','values',['P1','P1xP2','P1xP3']); 95 103 if(ArrayAnyEqual(ArrayIsMember('EnthalpyAnalysis',analyses),1) & md.thermal.isenthalpy & md.mesh.dimension() == 3){ 96 104 checkfield(md,'fieldname','thermal.isdrainicecolumn','numel',[1],'values',[0, 1]); 105 checkfield(md,'fieldname','thermal.watercolumn_upperlimit','>=',0); 106 97 107 for(var i=0;i<md.mesh.numberofvertices;i++){ 98 108 for(var j=0;j<md.thermal.spctemperature[0].length;j++){ … … 127 137 WriteData(fid,prefix,'object',this,'fieldname','penalty_factor','format','Double'); 128 138 WriteData(fid,prefix,'object',this,'fieldname','isenthalpy','format','Boolean'); 139 WriteData(fid,prefix,'object',this,'fieldname','isdrainicecolumn','format','Boolean'); 140 WriteData(fid,prefix,'object',this,'fieldname','watercolumn_upperlimit','format','Double'); 129 141 WriteData(fid,prefix,'object',this,'fieldname','fe','format','String'); 130 142 WriteData(fid,prefix,'object',this,'fieldname','isdynamicbasalspc','format','Boolean'); … … 155 167 this.penalty_threshold = 0; 156 168 this.stabilization = 0; 157 this.reltol 169 this.reltol = 0; 158 170 this.maxiter = 0; 159 171 this.penalty_lock = 0; … … 161 173 this.isenthalpy = 0; 162 174 this.isdynamicbasalspc = 0; 175 this.isdrainicecolumn = 0; 176 this.watercolumn_upperlimit=0; 163 177 this.fe = 'P1'; 164 178 this.requested_outputs = []; -
issm/trunk-jpl/src/m/classes/thermal.m
r24136 r24140 15 15 isenthalpy = 0; 16 16 isdynamicbasalspc = 0; 17 isdrainicecolumn = 0; 18 watercolumn_upperlimit= 0; 17 19 fe = 'P1'; 18 20 requested_outputs = {}; … … 66 68 %will basal boundary conditions be set dynamically 67 69 self.isdynamicbasalspc=0; 70 71 %wether waterfraction drainage is enabled 72 self.isdrainicecolumn=1; 73 74 %set an upper limit for local stored watercolumn 75 self.watercolumn_upperlimit=1000; 68 76 69 77 %Linear elements by default … … 82 90 md = checkfield(md,'fieldname','thermal.fe','values',{'P1','P1xP2','P1xP3'}); 83 91 if (ismember('EnthalpyAnalysis',analyses) & md.thermal.isenthalpy & dimension(md.mesh)==3), 92 md = checkfield(md,'fieldname','thermal.isdrainicecolumn','numel',[1],'values',[0 1]); 93 md = checkfield(md,'fieldname','thermal.watercolumn_upperlimit','>=',0); 84 94 85 95 %Make sure the spc are less than melting point … … 99 109 md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message','reltol must be larger than zero'); 100 110 end 101 111 end 102 112 103 113 md = checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1); … … 114 124 fielddisplay(self,'penalty_factor','scaling exponent (default is 3)'); 115 125 fielddisplay(self,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)'); 116 fielddisplay(self,'isdynamicbasalspc',['enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)']); 126 fielddisplay(self,'isdynamicbasalspc','enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)'); 127 fielddisplay(self,'isdrainicecolumn','wether waterfraction drainage is enabled for enthalpy formulation (default is 1)'); 128 fielddisplay(self,'watercolumn_upperlimit','upper limit of basal watercolumn for enthalpy formulation (default is 1000m)'); 117 129 fielddisplay(self,'fe','Finite Element type: ''P1'' (default), ''P1xP2'''); 118 130 fielddisplay(self,'requested_outputs','additional outputs requested'); … … 128 140 WriteData(fid,prefix,'object',self,'fieldname','penalty_factor','format','Double'); 129 141 WriteData(fid,prefix,'object',self,'fieldname','isenthalpy','format','Boolean'); 142 WriteData(fid,prefix,'object',self,'fieldname','isdrainicecolumn','format','Boolean'); 143 WriteData(fid,prefix,'object',self,'fieldname','watercolumn_upperlimit','format','Double'); 130 144 WriteData(fid,prefix,'object',self,'fieldname','fe','format','String'); 131 145 WriteData(fid,prefix,'object',self,'fieldname','isdynamicbasalspc','format','Boolean'); … … 150 164 writejsdouble(fid,[modelname '.thermal.penalty_factor'],self.penalty_factor); 151 165 writejsdouble(fid,[modelname '.thermal.isenthalpy'],self.isenthalpy); 166 writejsdouble(fid,[modelname '.thermal.isdrainicecolumn'],self.isdrainicecolumn); 167 writejsdouble(fid,[modelname '.thermal.watercolumn_upperlimit'],self.watercolumn_upperlimit); 152 168 writejsdouble(fid,[modelname '.thermal.isdynamicbasalspc'],self.isdynamicbasalspc); 153 169 writejscellstring(fid,[modelname '.thermal.requested_outputs'],self.requested_outputs); -
issm/trunk-jpl/src/m/classes/thermal.py
r24136 r24140 23 23 self.isenthalpy = 0 24 24 self.isdynamicbasalspc = 0 25 isdrainicecolumn = 0; 26 watercolumn_upperlimit = 0; 25 27 self.fe = 'P1' 26 28 self.requested_outputs = [] … … 33 35 string=' Thermal solution parameters:' 34 36 string="%s\n%s"%(string,fielddisplay(self,'spctemperature','temperature constraints (NaN means no constraint) [K]')) 35 string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG , 3: anisotropic SUPG'))37 string="%s\n%s"%(string,fielddisplay(self,'stabilization','0: no, 1: artificial_diffusivity, 2: SUPG')) 36 38 string="%s\n%s"%(string,fielddisplay(self,'maxiter','maximum number of non linear iterations')) 37 39 string="%s\n%s"%(string,fielddisplay(self,'reltol','relative tolerance criterion')) … … 40 42 string="%s\n%s"%(string,fielddisplay(self,'isenthalpy','use an enthalpy formulation to include temperate ice (default is 0)')) 41 43 string="%s\n%s"%(string,fielddisplay(self,'isdynamicbasalspc','enable dynamic setting of basal forcing. required for enthalpy formulation (default is 0)')) 44 string="%s\n%s"%(string,fielddisplay(self,'isdrainicecolumn','wether waterfraction drainage is enabled for enthalpy formulation (default is 1)') 45 string="%s\n%s"%(string,fielddisplay(self,'watercolumn_upperlimit','upper limit of basal watercolumn for enthalpy formulation (default is 1000m)') 42 46 string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested')) 43 47 return string … … 82 86 self.isdynamicbasalspc=0 83 87 88 #wether waterfraction drainage is enabled 89 self.isdrainicecolumn=1 90 91 #set an upper limit for local stored watercolumn 92 self.watercolumn_upperlimit=1000 93 84 94 #Finite element interpolation 85 95 self.fe='P1' … … 96 106 return md 97 107 98 md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0,1,2 ,3])108 md = checkfield(md,'fieldname','thermal.stabilization','numel',[1],'values',[0,1,2]) 99 109 md = checkfield(md,'fieldname','thermal.spctemperature','Inf',1,'timeseries',1) 100 110 md = checkfield(md,'fieldname','thermal.requested_outputs','stringrow',1) 101 111 102 112 if 'EnthalpyAnalysis' in analyses and md.thermal.isenthalpy and md.mesh.dimension()==3: 113 md = checkfield(md,'fieldname','thermal.isdrainicecolumn','numel',[1],'values',[0,1]) 114 md = checkfield(md,'fieldname','thermal.watercolumn_upperlimit','>=',0) 115 103 116 TEMP = md.thermal.spctemperature[:-1].flatten(-1) 104 117 pos=np.where(~np.isnan(TEMP)) … … 114 127 md = checkfield(md,'fieldname','thermal.spctemperature','field',md.thermal.spctemperature.flatten(-1)[pos],'<=',control[pos],'message',"spctemperature should be below the adjusted melting point") 115 128 md = checkfield(md,'fieldname','thermal.isenthalpy','numel',[1],'values',[0,1]) 116 md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel',[1],'values',[0,1]) ;129 md = checkfield(md,'fieldname','thermal.isdynamicbasalspc','numel',[1],'values',[0,1]) 117 130 if(md.thermal.isenthalpy): 118 131 if np.isnan(md.stressbalance.reltol): 119 132 md.checkmessage("for a steadystate computation, thermal.reltol (relative convergence criterion) must be defined!") 120 md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message',"reltol must be larger than zero") ;133 md = checkfield(md,'fieldname','thermal.reltol','>',0.,'message',"reltol must be larger than zero") 121 134 122 135 … … 127 140 WriteData(fid,prefix,'object',self,'fieldname','penalty_threshold','format','Integer') 128 141 WriteData(fid,prefix,'object',self,'fieldname','stabilization','format','Integer') 129 WriteData(fid,prefix,'object',self,'fieldname','reltol','format','Double') ;142 WriteData(fid,prefix,'object',self,'fieldname','reltol','format','Double') 130 143 WriteData(fid,prefix,'object',self,'fieldname','maxiter','format','Integer') 131 144 WriteData(fid,prefix,'object',self,'fieldname','penalty_lock','format','Integer') 132 145 WriteData(fid,prefix,'object',self,'fieldname','penalty_factor','format','Double') 133 146 WriteData(fid,prefix,'object',self,'fieldname','isenthalpy','format','Boolean') 134 WriteData(fid,prefix,'object',self,'fieldname','fe','format','String'); 135 WriteData(fid,prefix,'object',self,'fieldname','isdynamicbasalspc','format','Boolean'); 147 WriteData(fid,prefix,'object',self,'fieldname','isdrainicecolumn','format','Boolean') 148 WriteData(fid,prefix,'object',self,'fieldname','watercolumn_upperlimit','format','Double') 149 WriteData(fid,prefix,'object',self,'fieldname','fe','format','String') 150 WriteData(fid,prefix,'object',self,'fieldname','isdynamicbasalspc','format','Boolean') 136 151 137 152 #process requested outputs
Note:
See TracChangeset
for help on using the changeset viewer.