Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 19479)
@@ -828,4 +828,10 @@
 			iomodel->FetchDataToInput(elements,TemperatureEnum);
 			break;
+		case 7:
+			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(elements,FrictionCoefficientcoulombEnum);
+			iomodel->FetchDataToInput(elements,FrictionPEnum);
+			iomodel->FetchDataToInput(elements,FrictionQEnum);
+			break;
 		default:
 			_error_("not supported");
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 19479)
@@ -9,4 +9,5 @@
 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
 #endif
+#include <math.h>
 #include <stdio.h>
 #include <string.h>
@@ -1648,4 +1649,29 @@
 }
 /*}}}*/
+void       Element::MismipFloatingiceMeltingRate(){/*{{{*/
+
+	int numvertices      = this->GetNumberOfVertices();
+	IssmDouble  meltratefactor,thresholdthickness,upperdepthmelt;
+	IssmDouble* base     = xNew<IssmDouble>(numvertices);
+	IssmDouble* bed      = xNew<IssmDouble>(numvertices);
+	IssmDouble* values   = xNew<IssmDouble>(numvertices);
+
+	parameters->FindParam(&meltratefactor,BasalforcingsMeltrateFactorEnum);
+	parameters->FindParam(&thresholdthickness,BasalforcingsThresholdThicknessEnum);
+	parameters->FindParam(&upperdepthmelt,BasalforcingsUpperdepthMeltEnum);
+
+	this->GetInputListOnVertices(base,BaseEnum);
+	this->GetInputListOnVertices(bed,BedEnum);
+	for(int i=0;i<numvertices;i++){
+		if(base[i]<upperdepthmelt)  values[i]=0;
+		else values[i]=meltratefactor*(tanh(base[i]-bed[i])/thresholdthickness)*(upperdepthmelt-bed[i]);
+	}
+
+	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	xDelete<IssmDouble>(base);
+	xDelete<IssmDouble>(bed);
+	xDelete<IssmDouble>(values);
+
+}/*}}}*/
 ElementMatrix* Element::NewElementMatrix(int approximation_enum){/*{{{*/
 	return new ElementMatrix(nodes,this->GetNumberOfNodes(),this->parameters,approximation_enum);
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 19478)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 19479)
@@ -123,4 +123,5 @@
 		void               MarshallElement(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction,int numanalyses);
 		void               MigrateGroundingLine(IssmDouble* sheet_ungrounding);
+		void               MismipFloatingiceMeltingRate(); 
 		ElementMatrix*     NewElementMatrix(int approximation_enum=NoneApproximationEnum);
 		ElementMatrix*     NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 19479)
@@ -211,8 +211,82 @@
 			GetAlpha2WeertmanTemp(palpha2,gauss);
 			break;
+		case 7:
+			GetAlpha2Coulomb(palpha2,gauss);
+			break;
 	  default:
 			_error_("not supported");
 	}
 
+}/*}}}*/
+void Friction::GetAlpha2Coulomb(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+
+	/*This routine calculates the basal friction coefficient 
+	  alpha2= drag^2 * Neff ^r * | vel | ^(s-1), with Neff=rho_ice*g*thickness+rho_ice*g*base, r=q/p and s=1/p**/
+
+	/*diverse: */
+	IssmDouble  r,s;
+	IssmDouble  drag_p, drag_q;
+	IssmDouble  Neff;
+	IssmDouble  thickness,base,bed,floatation_thickness;
+	IssmDouble  vx,vy,vz,vmag;
+	IssmDouble  drag_coefficient,drag_coefficient_coulomb;
+	IssmDouble  alpha2,alpha2_coulomb;
+
+	/*Recover parameters: */
+	element->GetInputValue(&drag_p,FrictionPEnum);
+	element->GetInputValue(&drag_q,FrictionQEnum);
+	element->GetInputValue(&thickness, gauss,ThicknessEnum);
+	element->GetInputValue(&base, gauss,BaseEnum);
+	element->GetInputValue(&bed, gauss,BedEnum);
+	element->GetInputValue(&drag_coefficient, gauss,FrictionCoefficientEnum);
+	element->GetInputValue(&drag_coefficient_coulomb, gauss,FrictionCoefficientcoulombEnum);
+	IssmDouble rho_freshwater   = element->GetMaterialParameter(MaterialsRhoFreshwaterEnum);
+	IssmDouble rho_water        = element->GetMaterialParameter(MaterialsRhoSeawaterEnum);
+	IssmDouble rho_ice          = element->GetMaterialParameter(MaterialsRhoIceEnum);
+	IssmDouble gravity          = element->GetMaterialParameter(ConstantsGEnum);
+
+	//compute r and q coefficients: */
+	r=drag_q/drag_p;
+	s=1./drag_p;
+
+	//From base and thickness, compute effective pressure when drag is viscous:
+	Neff=gravity*(rho_ice*thickness+rho_water*base);
+	if(Neff<0)Neff=0;
+
+	switch(dim){
+		case 1:
+			element->GetInputValue(&vx,gauss,VxEnum);
+			vmag=sqrt(vx*vx);
+			break;
+		case 2:
+			element->GetInputValue(&vx,gauss,VxEnum);
+			element->GetInputValue(&vy,gauss,VyEnum);
+			vmag=sqrt(vx*vx+vy*vy);
+			break;
+		case 3:
+			element->GetInputValue(&vx,gauss,VxEnum);
+			element->GetInputValue(&vy,gauss,VyEnum);
+			element->GetInputValue(&vz,gauss,VzEnum);
+			vmag=sqrt(vx*vx+vy*vy+vz*vz);
+			break;
+		default:
+			_error_("not supported");
+	}
+
+	/*Check to prevent dividing by zero if vmag==0*/
+	if(vmag==0. && (s-1.)<0.) alpha2=0.;
+	else alpha2=drag_coefficient*drag_coefficient*pow(Neff,r)*pow(vmag,(s-1.));
+
+	floatation_thickness=0;
+	if(bed<0) floatation_thickness=-rho_freshwater/rho_ice*bed;
+	if(vmag==0.) alpha2_coulomb=0.;
+	else alpha2_coulomb=drag_coefficient_coulomb*drag_coefficient_coulomb*rho_water*gravity*(thickness-floatation_thickness)/vmag;
+
+	if(alpha2_coulomb<alpha2) alpha2=alpha2_coulomb;
+
+	_assert_(!xIsNan<IssmDouble>(alpha2));
+
+	/*Assign output pointers:*/
+	*palpha2=alpha2;
 }/*}}}*/
 void Friction::GetAlpha2Hydro(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 19478)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 19479)
@@ -33,4 +33,5 @@
 		void  GetAlphaHydroComplement(IssmDouble* alpha_complement,Gauss* gauss);
 		void  GetAlpha2(IssmDouble* palpha2,Gauss* gauss);
+		void  GetAlpha2Coulomb(IssmDouble* palpha2,Gauss* gauss);
 		void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
 		void  GetAlpha2Temp(IssmDouble* palpha2,Gauss* gauss);
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp	(revision 19479)
@@ -24,4 +24,8 @@
 			LinearFloatingiceMeltingRatex(femmodel);
 			break;
+		case MismipFloatingMeltRateEnum:
+			if(VerboseSolution())_printf_("	call Mismip Floating melting rate module\n");
+			MismipFloatingiceMeltingRatex(femmodel);
+			break;
 		default:
 			_error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet");
@@ -38,2 +42,10 @@
 
 }/*}}}*/
+void MismipFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/
+
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		element->MismipFloatingiceMeltingRate();
+	}
+
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 19478)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 19479)
@@ -11,4 +11,5 @@
 void FloatingiceMeltingRatex(FemModel* femmodel);
 void LinearFloatingiceMeltingRatex(FemModel* femmodel);
+void MismipFloatingiceMeltingRatex(FemModel* femmodel);
 
 #endif  /* _FloatingiceMeltingRatex_H*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 19479)
@@ -182,4 +182,9 @@
 			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsUpperwaterElevationEnum));
 			break;
+		case MismipFloatingMeltRateEnum:
+			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsMeltrateFactorEnum));
+			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsThresholdThicknessEnum));
+			parameters->AddObject(iomodel->CopyConstantObject(BasalforcingsUpperdepthMeltEnum));
+			break;
 		default:
 			_error_("Basal forcing model "<<EnumToStringx(smb_model)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19478)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 19479)
@@ -48,6 +48,10 @@
 	BasalforcingsDeepwaterElevationEnum,
 	BasalforcingsUpperwaterElevationEnum,
+	BasalforcingsMeltrateFactorEnum,
+	BasalforcingsThresholdThicknessEnum,
+	BasalforcingsUpperdepthMeltEnum,
 	FloatingMeltRateEnum,
 	LinearFloatingMeltRateEnum,
+	MismipFloatingMeltRateEnum,
 	BedEnum,
 	BaseEnum,
@@ -93,4 +97,5 @@
 	FrictionAsEnum,
 	FrictionCoefficientEnum,
+	FrictionCoefficientcoulombEnum,
 	FrictionPEnum,
 	FrictionQEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 19479)
@@ -54,6 +54,10 @@
 		case BasalforcingsDeepwaterElevationEnum : return "BasalforcingsDeepwaterElevation";
 		case BasalforcingsUpperwaterElevationEnum : return "BasalforcingsUpperwaterElevation";
+		case BasalforcingsMeltrateFactorEnum : return "BasalforcingsMeltrateFactor";
+		case BasalforcingsThresholdThicknessEnum : return "BasalforcingsThresholdThickness";
+		case BasalforcingsUpperdepthMeltEnum : return "BasalforcingsUpperdepthMelt";
 		case FloatingMeltRateEnum : return "FloatingMeltRate";
 		case LinearFloatingMeltRateEnum : return "LinearFloatingMeltRate";
+		case MismipFloatingMeltRateEnum : return "MismipFloatingMeltRate";
 		case BedEnum : return "Bed";
 		case BaseEnum : return "Base";
@@ -99,4 +103,5 @@
 		case FrictionAsEnum : return "FrictionAs";
 		case FrictionCoefficientEnum : return "FrictionCoefficient";
+		case FrictionCoefficientcoulombEnum : return "FrictionCoefficientcoulomb";
 		case FrictionPEnum : return "FrictionP";
 		case FrictionQEnum : return "FrictionQ";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19478)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 19479)
@@ -54,6 +54,10 @@
 	      else if (strcmp(name,"BasalforcingsDeepwaterElevation")==0) return BasalforcingsDeepwaterElevationEnum;
 	      else if (strcmp(name,"BasalforcingsUpperwaterElevation")==0) return BasalforcingsUpperwaterElevationEnum;
+	      else if (strcmp(name,"BasalforcingsMeltrateFactor")==0) return BasalforcingsMeltrateFactorEnum;
+	      else if (strcmp(name,"BasalforcingsThresholdThickness")==0) return BasalforcingsThresholdThicknessEnum;
+	      else if (strcmp(name,"BasalforcingsUpperdepthMelt")==0) return BasalforcingsUpperdepthMeltEnum;
 	      else if (strcmp(name,"FloatingMeltRate")==0) return FloatingMeltRateEnum;
 	      else if (strcmp(name,"LinearFloatingMeltRate")==0) return LinearFloatingMeltRateEnum;
+	      else if (strcmp(name,"MismipFloatingMeltRate")==0) return MismipFloatingMeltRateEnum;
 	      else if (strcmp(name,"Bed")==0) return BedEnum;
 	      else if (strcmp(name,"Base")==0) return BaseEnum;
@@ -99,4 +103,5 @@
 	      else if (strcmp(name,"FrictionAs")==0) return FrictionAsEnum;
 	      else if (strcmp(name,"FrictionCoefficient")==0) return FrictionCoefficientEnum;
+	      else if (strcmp(name,"FrictionCoefficientcoulomb")==0) return FrictionCoefficientcoulombEnum;
 	      else if (strcmp(name,"FrictionP")==0) return FrictionPEnum;
 	      else if (strcmp(name,"FrictionQ")==0) return FrictionQEnum;
@@ -132,13 +137,13 @@
 	      else if (strcmp(name,"HydrologydcSedimentTransmitivity")==0) return HydrologydcSedimentTransmitivityEnum;
 	      else if (strcmp(name,"HydrologydcWaterCompressibility")==0) return HydrologydcWaterCompressibilityEnum;
-	      else if (strcmp(name,"HydrologydcSpceplHead")==0) return HydrologydcSpceplHeadEnum;
+         else stage=2;
+   }
+   if(stage==2){
+	      if (strcmp(name,"HydrologydcSpceplHead")==0) return HydrologydcSpceplHeadEnum;
 	      else if (strcmp(name,"HydrologydcMaskEplactiveNode")==0) return HydrologydcMaskEplactiveNodeEnum;
 	      else if (strcmp(name,"HydrologydcMaskEplactiveElt")==0) return HydrologydcMaskEplactiveEltEnum;
 	      else if (strcmp(name,"HydrologydcEplCompressibility")==0) return HydrologydcEplCompressibilityEnum;
 	      else if (strcmp(name,"HydrologydcEplPorosity")==0) return HydrologydcEplPorosityEnum;
-         else stage=2;
-   }
-   if(stage==2){
-	      if (strcmp(name,"HydrologydcEplInitialThickness")==0) return HydrologydcEplInitialThicknessEnum;
+	      else if (strcmp(name,"HydrologydcEplInitialThickness")==0) return HydrologydcEplInitialThicknessEnum;
 	      else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
 	      else if (strcmp(name,"HydrologydcEplMaxThickness")==0) return HydrologydcEplMaxThicknessEnum;
@@ -255,13 +260,13 @@
 	      else if (strcmp(name,"MaterialsMantleDensity")==0) return MaterialsMantleDensityEnum;
 	      else if (strcmp(name,"MeshAverageVertexConnectivity")==0) return MeshAverageVertexConnectivityEnum;
-	      else if (strcmp(name,"MeshElements2d")==0) return MeshElements2dEnum;
+         else stage=3;
+   }
+   if(stage==3){
+	      if (strcmp(name,"MeshElements2d")==0) return MeshElements2dEnum;
 	      else if (strcmp(name,"MeshElements")==0) return MeshElementsEnum;
 	      else if (strcmp(name,"MeshLowerelements")==0) return MeshLowerelementsEnum;
 	      else if (strcmp(name,"MeshNumberofelements2d")==0) return MeshNumberofelements2dEnum;
 	      else if (strcmp(name,"MeshNumberofelements")==0) return MeshNumberofelementsEnum;
-         else stage=3;
-   }
-   if(stage==3){
-	      if (strcmp(name,"MeshNumberoflayers")==0) return MeshNumberoflayersEnum;
+	      else if (strcmp(name,"MeshNumberoflayers")==0) return MeshNumberoflayersEnum;
 	      else if (strcmp(name,"MeshNumberofvertices2d")==0) return MeshNumberofvertices2dEnum;
 	      else if (strcmp(name,"MeshNumberofvertices")==0) return MeshNumberofverticesEnum;
@@ -378,13 +383,13 @@
 	      else if (strcmp(name,"SurfaceforcingsDpermil")==0) return SurfaceforcingsDpermilEnum;
 	      else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
-	      else if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum;
 	      else if (strcmp(name,"SurfaceforcingsHref")==0) return SurfaceforcingsHrefEnum;
 	      else if (strcmp(name,"SurfaceforcingsSmbref")==0) return SurfaceforcingsSmbrefEnum;
 	      else if (strcmp(name,"SurfaceforcingsBPos")==0) return SurfaceforcingsBPosEnum;
 	      else if (strcmp(name,"SurfaceforcingsBNeg")==0) return SurfaceforcingsBNegEnum;
-         else stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
+	      else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
 	      else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
 	      else if (strcmp(name,"SurfaceforcingsAccumulation")==0) return SurfaceforcingsAccumulationEnum;
@@ -501,13 +506,13 @@
 	      else if (strcmp(name,"IntParam")==0) return IntParamEnum;
 	      else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
-	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
 	      else if (strcmp(name,"Matice")==0) return MaticeEnum;
 	      else if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum;
 	      else if (strcmp(name,"Matpar")==0) return MatparEnum;
 	      else if (strcmp(name,"Node")==0) return NodeEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
+	      else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
 	      else if (strcmp(name,"NumericalfluxType")==0) return NumericalfluxTypeEnum;
 	      else if (strcmp(name,"Param")==0) return ParamEnum;
@@ -624,13 +629,13 @@
 	      else if (strcmp(name,"DrivingStressX")==0) return DrivingStressXEnum;
 	      else if (strcmp(name,"DrivingStressY")==0) return DrivingStressYEnum;
-	      else if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
 	      else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
 	      else if (strcmp(name,"StressTensorxx")==0) return StressTensorxxEnum;
 	      else if (strcmp(name,"StressTensorxy")==0) return StressTensorxyEnum;
 	      else if (strcmp(name,"StressTensorxz")==0) return StressTensorxzEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
+	      else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
 	      else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum;
 	      else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;
@@ -747,13 +752,13 @@
 	      else if (strcmp(name,"Outputdefinition58")==0) return Outputdefinition58Enum;
 	      else if (strcmp(name,"Outputdefinition59")==0) return Outputdefinition59Enum;
-	      else if (strcmp(name,"Outputdefinition60")==0) return Outputdefinition60Enum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"Outputdefinition60")==0) return Outputdefinition60Enum;
 	      else if (strcmp(name,"Outputdefinition61")==0) return Outputdefinition61Enum;
 	      else if (strcmp(name,"Outputdefinition62")==0) return Outputdefinition62Enum;
 	      else if (strcmp(name,"Outputdefinition63")==0) return Outputdefinition63Enum;
 	      else if (strcmp(name,"Outputdefinition64")==0) return Outputdefinition64Enum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"Outputdefinition65")==0) return Outputdefinition65Enum;
+	      else if (strcmp(name,"Outputdefinition65")==0) return Outputdefinition65Enum;
 	      else if (strcmp(name,"Outputdefinition66")==0) return Outputdefinition66Enum;
 	      else if (strcmp(name,"Outputdefinition67")==0) return Outputdefinition67Enum;
@@ -870,13 +875,13 @@
 	      else if (strcmp(name,"ToolkitsOptionsAnalyses")==0) return ToolkitsOptionsAnalysesEnum;
 	      else if (strcmp(name,"ToolkitsOptionsStrings")==0) return ToolkitsOptionsStringsEnum;
-	      else if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"QmuErrName")==0) return QmuErrNameEnum;
 	      else if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
 	      else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
 	      else if (strcmp(name,"Regular")==0) return RegularEnum;
 	      else if (strcmp(name,"Scaled")==0) return ScaledEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"Separate")==0) return SeparateEnum;
+	      else if (strcmp(name,"Separate")==0) return SeparateEnum;
 	      else if (strcmp(name,"Sset")==0) return SsetEnum;
 	      else if (strcmp(name,"Verbose")==0) return VerboseEnum;
Index: /issm/trunk-jpl/src/m/classes/frictioncoulomb.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/frictioncoulomb.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/classes/frictioncoulomb.m	(revision 19479)
@@ -0,0 +1,67 @@
+%FRICTIONCOULOMB class definition
+%
+%   Usage:
+%      frictioncoulomb=frictioncoulomb();
+
+classdef frictioncoulomb
+	properties (SetAccess=public) 
+		coefficient        = NaN;
+		p                  = NaN;
+		q                  = NaN;
+		coefficientcoulomb = NaN;
+	end
+	methods
+		function createxml(self,fid) % {{{
+			fprintf(fid, '\n\n');
+			fprintf(fid, '%s\n', '<!-- Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p -->');
+			fprintf(fid,'%s\n%s\n%s\n','<frame key="1" label="Friction: Sigma= drag^2 * Neff ^r * u ^s, with Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p">','<section name="frictioncoulomb" />');   
+			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(self.coefficient),'" default="',     	convert2str(self.coefficient),'">',              '     <section name="frictioncoulomb" />','     <help> friction coefficient [SI] </help>','</parameter>');
+			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(self.p),'" default="',                 convert2str(self.p),'">',   '     <section name="frictioncoulomb" />','     <help> p exponent </help>','</parameter>');
+			fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(self.q),'" default="',                 convert2str(self.q),'">',            '     <section name="frictioncoulomb" />','     <help> q exponent </help>','</parameter>');
+			fprintf(fid,'%s\n%s\n','</frame>');
+		end % }}}
+		function self = extrude(self,md) % {{{
+			self.coefficient=project3d(md,'vector',self.coefficient,'type','node','layer',1);
+			self.coefficientcoulomb=project3d(md,'vector',self.coefficientcoulomb,'type','node','layer',1);
+			self.p=project3d(md,'vector',self.p,'type','element');
+			self.q=project3d(md,'vector',self.q,'type','element');
+		end % }}}
+		function self = frictioncoulomb(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			%Early return
+			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+			md = checkfield(md,'fieldname','friction.coefficient','timeseries',1,'NaN',1);
+			md = checkfield(md,'fieldname','friction.coefficientcoulomb','timeseries',1,'NaN',1);
+			md = checkfield(md,'fieldname','friction.q','NaN',1,'size',[md.mesh.numberofelements 1]);
+			md = checkfield(md,'fieldname','friction.p','NaN',1,'size',[md.mesh.numberofelements 1]);
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('Basal shear stress parameters: Sigma_b = min( coefficient^2 * Neff ^r * |u_b|^(s-1) * u_b\n, coefficientcoulomb^2 * rho_i * g * (h-h_f) (effective stress Neff=rho_ice*g*thickness+rho_water*g*bed, r=q/p and s=1/p, floatation thickness h_f=max(0,-rho_fw / rho_i * bed))'));
+			fielddisplay(self,'coefficient','friction coefficient [SI]');
+			fielddisplay(self,'coefficientcoulomb','coulomb friction coefficient [SI]');
+			fielddisplay(self,'p','p exponent');
+			fielddisplay(self,'q','q exponent');
+		end % }}}
+		function marshall(self,md,fid) % {{{
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',FrictionLawEnum,'data',7,'format','Integer');
+			WriteData(fid,'object',self,'fieldname','coefficient','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'enum',FrictionCoefficientEnum());
+			WriteData(fid,'object',self,'fieldname','coefficientcoulomb','format','DoubleMat','mattype',1,'enum',FrictionCoefficientcoulombEnum());
+			WriteData(fid,'object',self,'fieldname','p','format','DoubleMat','mattype',2,'enum',FrictionPEnum());
+			WriteData(fid,'object',self,'fieldname','q','format','DoubleMat','mattype',2,'enum',FrictionQEnum());
+
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/mismipbasalforcings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/mismipbasalforcings.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/classes/mismipbasalforcings.m	(revision 19479)
@@ -0,0 +1,96 @@
+%MISMIP BASAL FORCINGS class definition
+%
+%   Usage:
+%      mismipbasalforcings=mismipbasalforcings();
+
+classdef mismipbasalforcings
+	properties (SetAccess=public) 
+		groundedice_melting_rate  = NaN;
+		meltrate_factor           = NaN;
+		threshold_thickness       = NaN;
+		upperdepth_melt           = NaN;
+		geothermalflux            = NaN;
+	end
+	methods
+     function createxml(self,fid) % {{{
+            fprintf(fid, '\n\n');
+            fprintf(fid, '%s\n', '<!-- basalforcings -->');
+			 fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="melting_rate" type="',            class(self.melting_rate),'" default="',              num2str(self.melting_rate),'">',              '     <section name="basalforcings" />','     <help> basal melting rate (positive if melting) [m/yr] </help>','</parameter>');
+             fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="geothermalflux" type="',          class(self.geothermalflux),'" default="',            num2str(self.geothermalflux),'">',            '     <section name="basalforcings" />','     <help> geothermal heat flux [W/m^2] </help>','</parameter>');
+             
+        end % }}}
+		function self = mismipbasalforcings(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				case 1
+					self=structtoobj(mismipbasalforcings(),varargin{1});
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+			if isnan(self.groundedice_melting_rate),
+				self.groundedice_melting_rate=zeros(md.mesh.numberofvertices,1);
+				disp('      no basalforcings.groundedice_melting_rate specified: values set as zero');
+			end
+
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+
+			%default values for melting parameterization
+			self.meltrate_factor        = 0.2;
+			self.threshold_thickness    = 75;
+			self.upperdepth_melt        = -100;
+
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			if ismember(MasstransportAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.ismasstransport==0),
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
+				md = checkfield(md,'fieldname','basalforcings.meltrate_factor','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.threshold_thickness','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperdepth_melt','<=',0,'numel',1);
+			end
+			if ismember(BalancethicknessAnalysisEnum(),analyses),
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'size',[md.mesh.numberofvertices 1]);
+				md = checkfield(md,'fieldname','basalforcings.meltrate_factor','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.threshold_thickness','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperdepth_melt','<=',0,'numel',1);
+			end
+			if ismember(ThermalAnalysisEnum(),analyses) & ~(solution==TransientSolutionEnum() & md.transient.isthermal==0),
+				md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'timeseries',1);
+				md = checkfield(md,'fieldname','basalforcings.meltrate_factor','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.threshold_thickness','>=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.upperdepth_melt','<=',0,'numel',1);
+				md = checkfield(md,'fieldname','basalforcings.geothermalflux','NaN',1,'timeseries',1,'>=',0);
+			end
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   mismip basal forcings parameters:'));
+
+			fielddisplay(self,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
+			fielddisplay(self,'meltrate_factor','Melt-rate rate factor [1/yr]');
+			fielddisplay(self,'threshold_thickness','threshold thickness for saturation of basal melting [m]');
+			fielddisplay(self,'upperdepth_melt','depth above which the melt rate is zero [m]');
+			fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
+
+		end % }}}
+		function marshall(self,md,fid) % {{{
+
+			yts=365.2422*24.0*3600.0;
+
+			floatingice_melting_rate=zeros(md.mesh.numberofvertices,1);
+			floatingice_melting_rate=md.basalforcings.meltrate_factor*tanh((md.geometry.base-md.geometry.bed)./md.basalforcings.threshold_thickness).*max(md.basalforcings.upperdepth_melt-md.geometry.base,0);
+
+			WriteData(fid,'enum',BasalforcingsEnum(),'data',MismipFloatingMeltRateEnum(),'format','Integer');
+			WriteData(fid,'data',floatingice_melting_rate,'format','DoubleMat','enum',BasalforcingsFloatingiceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+			WriteData(fid,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','enum',BasalforcingsGroundediceMeltingRateEnum(),'mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
+			WriteData(fid,'object',self,'fieldname','geothermalflux','enum',BasalforcingsGeothermalfluxEnum(),'format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',self,'fieldname','meltrate_factor','format','Double','enum',BasalforcingsMeltrateFactorEnum(),'scale',1./yts)
+			WriteData(fid,'object',self,'fieldname','threshold_thickness','format','Double','enum',BasalforcingsThresholdThicknessEnum())
+			WriteData(fid,'object',self,'fieldname','upperdepth_melt','format','Double','enum',BasalforcingsUpperdepthMeltEnum())
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/enum/BasalforcingsMeltrateFactorEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/BasalforcingsMeltrateFactorEnum.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/enum/BasalforcingsMeltrateFactorEnum.m	(revision 19479)
@@ -0,0 +1,11 @@
+function macro=BasalforcingsMeltrateFactorEnum()
+%BASALFORCINGSMELTRATEFACTORENUM - Enum of BasalforcingsMeltrateFactor
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=BasalforcingsMeltrateFactorEnum()
+
+macro=StringToEnum('BasalforcingsMeltrateFactor');
Index: /issm/trunk-jpl/src/m/enum/BasalforcingsThresholdThicknessEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/BasalforcingsThresholdThicknessEnum.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/enum/BasalforcingsThresholdThicknessEnum.m	(revision 19479)
@@ -0,0 +1,11 @@
+function macro=BasalforcingsThresholdThicknessEnum()
+%BASALFORCINGSTHRESHOLDTHICKNESSENUM - Enum of BasalforcingsThresholdThickness
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=BasalforcingsThresholdThicknessEnum()
+
+macro=StringToEnum('BasalforcingsThresholdThickness');
Index: /issm/trunk-jpl/src/m/enum/BasalforcingsUpperdepthMeltEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/BasalforcingsUpperdepthMeltEnum.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/enum/BasalforcingsUpperdepthMeltEnum.m	(revision 19479)
@@ -0,0 +1,11 @@
+function macro=BasalforcingsUpperdepthMeltEnum()
+%BASALFORCINGSUPPERDEPTHMELTENUM - Enum of BasalforcingsUpperdepthMelt
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=BasalforcingsUpperdepthMeltEnum()
+
+macro=StringToEnum('BasalforcingsUpperdepthMelt');
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19478)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 19479)
@@ -46,6 +46,10 @@
 def BasalforcingsDeepwaterElevationEnum(): return StringToEnum("BasalforcingsDeepwaterElevation")[0]
 def BasalforcingsUpperwaterElevationEnum(): return StringToEnum("BasalforcingsUpperwaterElevation")[0]
+def BasalforcingsMeltrateFactorEnum(): return StringToEnum("BasalforcingsMeltrateFactor")[0]
+def BasalforcingsThresholdThicknessEnum(): return StringToEnum("BasalforcingsThresholdThickness")[0]
+def BasalforcingsUpperdepthMeltEnum(): return StringToEnum("BasalforcingsUpperdepthMelt")[0]
 def FloatingMeltRateEnum(): return StringToEnum("FloatingMeltRate")[0]
 def LinearFloatingMeltRateEnum(): return StringToEnum("LinearFloatingMeltRate")[0]
+def MismipFloatingMeltRateEnum(): return StringToEnum("MismipFloatingMeltRate")[0]
 def BedEnum(): return StringToEnum("Bed")[0]
 def BaseEnum(): return StringToEnum("Base")[0]
@@ -91,4 +95,5 @@
 def FrictionAsEnum(): return StringToEnum("FrictionAs")[0]
 def FrictionCoefficientEnum(): return StringToEnum("FrictionCoefficient")[0]
+def FrictionCoefficientcoulombEnum(): return StringToEnum("FrictionCoefficientcoulomb")[0]
 def FrictionPEnum(): return StringToEnum("FrictionP")[0]
 def FrictionQEnum(): return StringToEnum("FrictionQ")[0]
Index: /issm/trunk-jpl/src/m/enum/FrictionCoefficientcoulombEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/FrictionCoefficientcoulombEnum.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/enum/FrictionCoefficientcoulombEnum.m	(revision 19479)
@@ -0,0 +1,11 @@
+function macro=FrictionCoefficientcoulombEnum()
+%FRICTIONCOEFFICIENTCOULOMBENUM - Enum of FrictionCoefficientcoulomb
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=FrictionCoefficientcoulombEnum()
+
+macro=StringToEnum('FrictionCoefficientcoulomb');
Index: /issm/trunk-jpl/src/m/enum/MismipFloatingMeltRateEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MismipFloatingMeltRateEnum.m	(revision 19479)
+++ /issm/trunk-jpl/src/m/enum/MismipFloatingMeltRateEnum.m	(revision 19479)
@@ -0,0 +1,11 @@
+function macro=MismipFloatingMeltRateEnum()
+%MISMIPFLOATINGMELTRATEENUM - Enum of MismipFloatingMeltRate
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=MismipFloatingMeltRateEnum()
+
+macro=StringToEnum('MismipFloatingMeltRate');
