Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 23896)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 23897)
@@ -875,4 +875,9 @@
 			iomodel->FetchDataToInput(elements,"md.friction.Cmax",FrictionCmaxEnum);
 			break;
+		case 12:
+			iomodel->FetchDataToInput(elements,"md.friction.m",FrictionMEnum);
+			iomodel->FetchDataToInput(elements,"md.friction.C",FrictionCEnum);
+			iomodel->FetchDataToInput(elements,"md.friction.f",FrictionfEnum);
+			break;
 		default:
 			_error_("friction law "<< frictionlaw <<" not supported");
@@ -972,4 +977,7 @@
 			parameters->AddObject(new IntParam(FrictionCouplingEnum,2));
 			break;
+		case 12:
+			parameters->AddObject(new IntParam(FrictionCouplingEnum,2));
+			break;
 		default: _error_("Friction law "<<frictionlaw<<" not implemented yet");
 	}
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 23896)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 23897)
@@ -197,4 +197,7 @@
 		case 11:
 			GetAlpha2Schoof(palpha2,gauss);
+			break;
+		case 12:
+			GetAlpha2Tsai(palpha2,gauss);
 			break;
 	  default:
@@ -629,4 +632,39 @@
 	else{
 		alpha2= (C*pow(ub,m-1.)) / pow(1.+  pow(C/(Cmax*N),1./m)*ub,m);
+	}
+
+	/*Assign output pointers:*/
+	*palpha2=alpha2;
+}/*}}}*/
+void Friction::GetAlpha2Tsai(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
+
+	/*This routine calculates the basal friction coefficient 
+	 *
+	 * alpha2= min(C |ub|^m , f N ) / |ub|
+	 *
+	 * */
+
+	/*diverse: */
+	IssmDouble  C,f,m,alpha2;
+
+	/*Recover parameters: */
+	element->GetInputValue(&f,gauss,FrictionfEnum);
+	element->GetInputValue(&C,gauss,FrictionCEnum);
+	element->GetInputValue(&m,FrictionMEnum);
+
+	/*Get effective pressure and velocity magnitude*/
+	IssmDouble N  = EffectivePressure(gauss);
+	IssmDouble ub = VelMag(gauss);
+
+	/*Compute alpha^2*/
+	if(ub<1e-10){
+		alpha2 = 0.;
+	}
+	else{
+		alpha2= C*pow(ub,m);
+
+		if(alpha2>f*N) alpha2 = f*N;
+
+		alpha2 = alpha2/ub;
 	}
 
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 23896)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 23897)
@@ -42,4 +42,5 @@
 		void  GetAlpha2PISM(IssmDouble* palpha2,Gauss* gauss);
 		void  GetAlpha2Schoof(IssmDouble* palpha2,Gauss* gauss);
+		void  GetAlpha2Tsai(IssmDouble* palpha2,Gauss* gauss);
 
 		IssmDouble EffectivePressure(Gauss* gauss);
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 23896)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 23897)
@@ -517,4 +517,5 @@
 	FrictionCoefficientEnum,
 	FrictionEffectivePressureEnum,
+	FrictionfEnum,
 	FrictionMEnum,
 	FrictionPEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 23896)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 23897)
@@ -523,4 +523,5 @@
 		case FrictionCoefficientEnum : return "FrictionCoefficient";
 		case FrictionEffectivePressureEnum : return "FrictionEffectivePressure";
+		case FrictionfEnum : return "Frictionf";
 		case FrictionMEnum : return "FrictionM";
 		case FrictionPEnum : return "FrictionP";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 23896)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 23897)
@@ -535,4 +535,5 @@
 	      else if (strcmp(name,"FrictionCoefficient")==0) return FrictionCoefficientEnum;
 	      else if (strcmp(name,"FrictionEffectivePressure")==0) return FrictionEffectivePressureEnum;
+	      else if (strcmp(name,"Frictionf")==0) return FrictionfEnum;
 	      else if (strcmp(name,"FrictionM")==0) return FrictionMEnum;
 	      else if (strcmp(name,"FrictionP")==0) return FrictionPEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"SealevelUEsa")==0) return SealevelUEsaEnum;
 	      else if (strcmp(name,"SealevelRSLEustaticRate")==0) return SealevelRSLEustaticRateEnum;
-	      else if (strcmp(name,"SealevelriseSpcthickness")==0) return SealevelriseSpcthicknessEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"SealevelriseStericRate")==0) return SealevelriseStericRateEnum;
+	      if (strcmp(name,"SealevelriseSpcthickness")==0) return SealevelriseSpcthicknessEnum;
+	      else if (strcmp(name,"SealevelriseStericRate")==0) return SealevelriseStericRateEnum;
 	      else if (strcmp(name,"SealevelNEsa")==0) return SealevelNEsaEnum;
 	      else if (strcmp(name,"SealevelUGia")==0) return SealevelUGiaEnum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"StressTensorxz")==0) return StressTensorxzEnum;
 	      else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
-	      else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;
+	      if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum;
+	      else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;
 	      else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;
 	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"Outputdefinition76")==0) return Outputdefinition76Enum;
 	      else if (strcmp(name,"Outputdefinition77")==0) return Outputdefinition77Enum;
-	      else if (strcmp(name,"Outputdefinition78")==0) return Outputdefinition78Enum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum;
+	      if (strcmp(name,"Outputdefinition78")==0) return Outputdefinition78Enum;
+	      else if (strcmp(name,"Outputdefinition79")==0) return Outputdefinition79Enum;
 	      else if (strcmp(name,"Outputdefinition7")==0) return Outputdefinition7Enum;
 	      else if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"FrontalForcingsDefault")==0) return FrontalForcingsDefaultEnum;
 	      else if (strcmp(name,"FrontalForcingsRignot")==0) return FrontalForcingsRignotEnum;
-	      else if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Fset")==0) return FsetEnum;
+	      if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;
+	      else if (strcmp(name,"Fset")==0) return FsetEnum;
 	      else if (strcmp(name,"FSpressure")==0) return FSpressureEnum;
 	      else if (strcmp(name,"FSSolver")==0) return FSSolverEnum;
@@ -1120,9 +1121,9 @@
 	      else if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
 	      else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
-	      else if (strcmp(name,"NoFrictionOnPartiallyFloating")==0) return NoFrictionOnPartiallyFloatingEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"NoMeltOnPartiallyFloating")==0) return NoMeltOnPartiallyFloatingEnum;
+	      if (strcmp(name,"NoFrictionOnPartiallyFloating")==0) return NoFrictionOnPartiallyFloatingEnum;
+	      else if (strcmp(name,"NoMeltOnPartiallyFloating")==0) return NoMeltOnPartiallyFloatingEnum;
 	      else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
 	      else if (strcmp(name,"None")==0) return NoneEnum;
@@ -1243,9 +1244,9 @@
 	      else if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum;
 	      else if (strcmp(name,"Water")==0) return WaterEnum;
-	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
          else stage=11;
    }
    if(stage==11){
-	      if (strcmp(name,"XY")==0) return XYEnum;
+	      if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+	      else if (strcmp(name,"XY")==0) return XYEnum;
 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
 	      else if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum;
Index: /issm/trunk-jpl/src/m/classes/frictiontsai.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/frictiontsai.m	(revision 23896)
+++ /issm/trunk-jpl/src/m/classes/frictiontsai.m	(revision 23897)
@@ -15,4 +15,6 @@
 				case 0
 					self=setdefaultparameters(self);
+				case 1
+					self=structtoobj(frictiontsai(),varargin{1});
 				otherwise
 					error('constructor not supported');
