Index: /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp	(revision 17952)
@@ -17,4 +17,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
 
 	iomodel->FetchData(&requestedoutputs,&numoutputs,ThermalRequestedOutputsEnum);
@@ -25,6 +26,6 @@
 void EnthalpyAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
-	bool dakota_analysis, islevelset;
-	bool isenthalpy;
+	bool dakota_analysis,islevelset,isenthalpy;
+	int frictionlaw;
 
 	/*Now, is the model 3d? otherwise, do nothing: */
@@ -54,7 +55,4 @@
 	iomodel->FetchDataToInput(elements,SurfaceEnum);
 	iomodel->FetchDataToInput(elements,BaseEnum);
-	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
-	iomodel->FetchDataToInput(elements,FrictionPEnum);
-	iomodel->FetchDataToInput(elements,FrictionQEnum);
 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
 	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
@@ -90,5 +88,19 @@
 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum); // required for updating active nodes
 	}
-
+	
+	/*Friction law variables*/
+	switch(frictionlaw){
+		case 1:
+			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(elements,FrictionPEnum);
+			iomodel->FetchDataToInput(elements,FrictionQEnum);
+			break;
+		case 2:
+			iomodel->FetchDataToInput(elements,FrictionCEnum);
+			iomodel->FetchDataToInput(elements,FrictionMEnum);
+			break;
+		default:
+			_error_("not supported");
+	}
 	/*Free data: */
 	iomodel->DeleteData(3,TemperatureEnum,WaterfractionEnum,PressureEnum);
Index: /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp	(revision 17952)
@@ -10,6 +10,9 @@
 }/*}}}*/
 void MeltingAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
+	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
 }/*}}}*/
 void MeltingAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+
+	int frictionlaw;
 
 	/*Now, is the model 3d? otherwise, do nothing: */
@@ -30,7 +33,4 @@
 	iomodel->FetchDataToInput(elements,SurfaceEnum);
 	iomodel->FetchDataToInput(elements,BaseEnum);
-	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
-	iomodel->FetchDataToInput(elements,FrictionPEnum);
-	iomodel->FetchDataToInput(elements,FrictionQEnum);
 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
 	if(iomodel->domaintype!=Domain2DhorizontalEnum){
@@ -43,4 +43,19 @@
 	iomodel->FetchDataToInput(elements,BasalforcingsMeltingRateEnum);
 	iomodel->FetchDataToInput(elements,PressureEnum);
+	
+	/*Friction law variables*/
+	switch(frictionlaw){
+		case 1:
+			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(elements,FrictionPEnum);
+			iomodel->FetchDataToInput(elements,FrictionQEnum);
+			break;
+		case 2:
+			iomodel->FetchDataToInput(elements,FrictionCEnum);
+			iomodel->FetchDataToInput(elements,FrictionMEnum);
+			break;
+		default:
+			_error_("not supported");
+	}
 }/*}}}*/
 void MeltingAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 17952)
@@ -106,4 +106,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceShelfDampeningEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(StressbalanceViscosityOvershootEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
 
 	/*XTH parameters*/
@@ -125,5 +126,5 @@
 	/*Intermediaries*/
 	int    materials_type,finiteelement;
-	int    approximation;
+	int    approximation,frictionlaw;
 	int*   finiteelement_list=NULL;
 	bool   isSSA,isL1L2,isHO,isFS,iscoupling;
@@ -142,4 +143,5 @@
 	iomodel->Constant(&materials_type,MaterialsEnum);
 	iomodel->Constant(&islevelset,TransientIslevelsetEnum);
+	iomodel->Constant(&frictionlaw,FrictionLawEnum);
 
 	/*return if no processing required*/
@@ -205,7 +207,4 @@
 	iomodel->FetchDataToInput(elements,SurfaceEnum);
 	iomodel->FetchDataToInput(elements,BaseEnum);
-	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
-	iomodel->FetchDataToInput(elements,FrictionPEnum);
-	iomodel->FetchDataToInput(elements,FrictionQEnum);
 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
 	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
@@ -238,4 +237,19 @@
 	if(islevelset){
 		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
+	}
+
+	/*Friction law variables*/
+	switch(frictionlaw){
+		case 1:
+			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(elements,FrictionPEnum);
+			iomodel->FetchDataToInput(elements,FrictionQEnum);
+			break;
+		case 2:
+			iomodel->FetchDataToInput(elements,FrictionCEnum);
+			iomodel->FetchDataToInput(elements,FrictionMEnum);
+			break;
+		default:
+			_error_("not supported");
 	}
 
Index: /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp	(revision 17952)
@@ -21,4 +21,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsenthalpyEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(ThermalIsdynamicbasalspcEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(FrictionLawEnum));
 
 	iomodel->FetchData(&requestedoutputs,&numoutputs,ThermalRequestedOutputsEnum);
@@ -29,4 +30,6 @@
 }/*}}}*/
 void ThermalAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
+
+	int frictionlaw;
 
 	/*Now, is the model 3d? otherwise, do nothing: */
@@ -51,7 +54,4 @@
 	iomodel->FetchDataToInput(elements,SurfaceEnum);
 	iomodel->FetchDataToInput(elements,BaseEnum);
-	iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
-	iomodel->FetchDataToInput(elements,FrictionPEnum);
-	iomodel->FetchDataToInput(elements,FrictionQEnum);
 	iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum);
 	iomodel->FetchDataToInput(elements,MaskGroundediceLevelsetEnum);
@@ -84,4 +84,18 @@
 		iomodel->FetchDataToInput(elements,IceMaskNodeActivationEnum);
 		iomodel->FetchDataToInput(elements,MeshVertexonbaseEnum); // required for updating active nodes
+	}
+	/*Friction law variables*/
+	switch(frictionlaw){
+		case 1:
+			iomodel->FetchDataToInput(elements,FrictionCoefficientEnum);
+			iomodel->FetchDataToInput(elements,FrictionPEnum);
+			iomodel->FetchDataToInput(elements,FrictionQEnum);
+			break;
+		case 2:
+			iomodel->FetchDataToInput(elements,FrictionCEnum);
+			iomodel->FetchDataToInput(elements,FrictionMEnum);
+			break;
+		default:
+			_error_("not supported");
 	}
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 17952)
@@ -20,4 +20,6 @@
 	this->element=NULL;
 	this->dim=0;
+	this->law=0;
+
 }
 /*}}}*/
@@ -27,4 +29,5 @@
 	this->element=element_in;
 	this->dim=dim_in;
+	element_in->FindParam(&this->law,FrictionLawEnum);
 }
 /*}}}*/
@@ -43,4 +46,19 @@
 /*FUNCTION Friction::GetAlpha2{{{*/
 void Friction::GetAlpha2(IssmDouble* palpha2, Gauss* gauss){
+
+	switch(this->law){
+		case 1:
+			GetAlpha2Viscous(palpha2,gauss);
+			break;
+		case 2:
+			GetAlpha2Weertman(palpha2,gauss);
+			break;
+		default:
+			_error_("not supported");
+	}
+
+}/*}}}*/
+/*FUNCTION Friction::GetAlpha2{{{*/
+void Friction::GetAlpha2Viscous(IssmDouble* palpha2, Gauss* gauss){
 
 	/*This routine calculates the basal friction coefficient 
@@ -102,4 +120,46 @@
 	*palpha2=alpha2;
 }/*}}}*/
+/*FUNCTION Friction::GetAlpha2Weertman{{{*/
+void Friction::GetAlpha2Weertman(IssmDouble* palpha2, Gauss* gauss){
+
+	/*This routine calculates the basal friction coefficient alpha2= C^-1/m |v|^(1/m-1) */
+
+	/*diverse: */
+	IssmDouble  C,m;
+	IssmDouble  vx,vy,vz,vmag;
+	IssmDouble  alpha2;
+
+	/*Recover parameters: */
+	element->GetInputValue(&C,gauss,FrictionCEnum);
+	element->GetInputValue(&m,FrictionMEnum);
+
+	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. && (1./m-1.)<0.) alpha2=0.;
+	else alpha2=pow(C,-1./m)*pow(vmag,(1./m-1.));
+	_assert_(!xIsNan<IssmDouble>(alpha2));
+
+	/*Assign output pointers:*/
+	*palpha2=alpha2;
+}/*}}}*/
 /*FUNCTION Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss,int vxenum,int vyenum,int vzenum) {{{*/
 void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){
@@ -108,4 +168,6 @@
 	 * FrictionGetAlphaComplement is used in control methods on drag, and it computes: 
 	 * alpha_complement= Neff ^r * vel ^s*/
+
+	if(this->law!=1)_error_("not supported");
 
 	/*diverse: */
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 17951)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 17952)
@@ -21,4 +21,5 @@
 		Element* element;
 		int      dim;
+		int      law;
 
 		/*methods: */
@@ -29,4 +30,6 @@
 		void  Echo(void);
 		void  GetAlpha2(IssmDouble* palpha2,Gauss* gauss);
+		void  GetAlpha2Viscous(IssmDouble* palpha2,Gauss* gauss);
+		void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
 		void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
 };
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17951)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17952)
@@ -84,4 +84,7 @@
 	FrictionPEnum,
 	FrictionQEnum,
+	FrictionMEnum,
+	FrictionCEnum,
+	FrictionLawEnum,
 	GeometryHydrostaticRatioEnum,
 	HydrologyModelEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17952)
@@ -92,4 +92,7 @@
 		case FrictionPEnum : return "FrictionP";
 		case FrictionQEnum : return "FrictionQ";
+		case FrictionMEnum : return "FrictionM";
+		case FrictionCEnum : return "FrictionC";
+		case FrictionLawEnum : return "FrictionLaw";
 		case GeometryHydrostaticRatioEnum : return "GeometryHydrostaticRatio";
 		case HydrologyModelEnum : return "HydrologyModel";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17951)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17952)
@@ -92,4 +92,7 @@
 	      else if (strcmp(name,"FrictionP")==0) return FrictionPEnum;
 	      else if (strcmp(name,"FrictionQ")==0) return FrictionQEnum;
+	      else if (strcmp(name,"FrictionM")==0) return FrictionMEnum;
+	      else if (strcmp(name,"FrictionC")==0) return FrictionCEnum;
+	      else if (strcmp(name,"FrictionLaw")==0) return FrictionLawEnum;
 	      else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
 	      else if (strcmp(name,"HydrologyModel")==0) return HydrologyModelEnum;
@@ -134,11 +137,11 @@
 	      else if (strcmp(name,"HydrologyLayer")==0) return HydrologyLayerEnum;
 	      else if (strcmp(name,"HydrologySediment")==0) return HydrologySedimentEnum;
-	      else if (strcmp(name,"HydrologyEfficient")==0) return HydrologyEfficientEnum;
-	      else if (strcmp(name,"HydrologySedimentKmax")==0) return HydrologySedimentKmaxEnum;
-	      else if (strcmp(name,"IndependentObject")==0) return IndependentObjectEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"InversionControlParameters")==0) return InversionControlParametersEnum;
+	      if (strcmp(name,"HydrologyEfficient")==0) return HydrologyEfficientEnum;
+	      else if (strcmp(name,"HydrologySedimentKmax")==0) return HydrologySedimentKmaxEnum;
+	      else if (strcmp(name,"IndependentObject")==0) return IndependentObjectEnum;
+	      else if (strcmp(name,"InversionControlParameters")==0) return InversionControlParametersEnum;
 	      else if (strcmp(name,"InversionCostFunctionThreshold")==0) return InversionCostFunctionThresholdEnum;
 	      else if (strcmp(name,"InversionCostFunctionsCoefficients")==0) return InversionCostFunctionsCoefficientsEnum;
@@ -257,11 +260,11 @@
 	      else if (strcmp(name,"QmuMaterialsRheologyB")==0) return QmuMaterialsRheologyBEnum;
 	      else if (strcmp(name,"RiftsNumrifts")==0) return RiftsNumriftsEnum;
-	      else if (strcmp(name,"RiftsRiftstruct")==0) return RiftsRiftstructEnum;
-	      else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
-	      else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"SettingsLowmem")==0) return SettingsLowmemEnum;
+	      if (strcmp(name,"RiftsRiftstruct")==0) return RiftsRiftstructEnum;
+	      else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
+	      else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
+	      else if (strcmp(name,"SettingsLowmem")==0) return SettingsLowmemEnum;
 	      else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
 	      else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
@@ -380,11 +383,11 @@
 	      else if (strcmp(name,"SmoothedSurfaceSlopeYAnalysis")==0) return SmoothedSurfaceSlopeYAnalysisEnum;
 	      else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
-	      else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
-	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
-	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
+	      if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
+	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
+	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
+	      else if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
 	      else if (strcmp(name,"MeshdeformationSolution")==0) return MeshdeformationSolutionEnum;
 	      else if (strcmp(name,"MeshdeformationAnalysis")==0) return MeshdeformationAnalysisEnum;
@@ -503,11 +506,11 @@
 	      else if (strcmp(name,"QmuSurface")==0) return QmuSurfaceEnum;
 	      else if (strcmp(name,"QmuMelting")==0) return QmuMeltingEnum;
-	      else if (strcmp(name,"QmuVxMesh")==0) return QmuVxMeshEnum;
-	      else if (strcmp(name,"QmuVyMesh")==0) return QmuVyMeshEnum;
-	      else if (strcmp(name,"QmuVzMesh")==0) return QmuVzMeshEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
+	      if (strcmp(name,"QmuVxMesh")==0) return QmuVxMeshEnum;
+	      else if (strcmp(name,"QmuVyMesh")==0) return QmuVyMeshEnum;
+	      else if (strcmp(name,"QmuVzMesh")==0) return QmuVzMeshEnum;
+	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
 	      else if (strcmp(name,"ResetPenalties")==0) return ResetPenaltiesEnum;
 	      else if (strcmp(name,"SegmentOnIceShelf")==0) return SegmentOnIceShelfEnum;
@@ -626,11 +629,11 @@
 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
 	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
-	      else if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum;
-	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
-	      else if (strcmp(name,"MaxVy")==0) return MaxVyEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"MaxAbsVy")==0) return MaxAbsVyEnum;
+	      if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum;
+	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
+	      else if (strcmp(name,"MaxVy")==0) return MaxVyEnum;
+	      else if (strcmp(name,"MaxAbsVy")==0) return MaxAbsVyEnum;
 	      else if (strcmp(name,"MinVz")==0) return MinVzEnum;
 	      else if (strcmp(name,"MaxVz")==0) return MaxVzEnum;
Index: /issm/trunk-jpl/src/m/classes/friction.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.m	(revision 17951)
+++ /issm/trunk-jpl/src/m/classes/friction.m	(revision 17952)
@@ -48,4 +48,5 @@
 			yts=365.0*24.0*3600.0;
 
+			WriteData(fid,'enum',FrictionLawEnum,'data',1,'format','Integer');
 			WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
 			%WriteData(fid,'object',obj,'fieldname','coefficient','format','DoubleMat','mattype',1);
Index: /issm/trunk-jpl/src/m/classes/friction.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/friction.py	(revision 17951)
+++ /issm/trunk-jpl/src/m/classes/friction.py	(revision 17952)
@@ -45,4 +45,5 @@
 	# }}}
 	def marshall(self,md,fid):    # {{{
+		WriteData(fid,'enum',FrictionLawEnum(),'data',1,'format','Integer')
 		WriteData(fid,'object',self,'fieldname','coefficient','format','DoubleMat','mattype',1)
 		WriteData(fid,'object',self,'fieldname','p','format','DoubleMat','mattype',2)
Index: /issm/trunk-jpl/src/m/classes/frictionweertman.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/frictionweertman.m	(revision 17952)
+++ /issm/trunk-jpl/src/m/classes/frictionweertman.m	(revision 17952)
@@ -0,0 +1,54 @@
+%FRICTIONWEERTMAN class definition
+%
+%   Usage:
+%      frictionweertman=frictionweertman();
+
+classdef frictionweertman
+	properties (SetAccess=public) 
+		C = NaN;
+		m = NaN;
+	end
+	methods
+        function createxml(obj,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="frictionweertman" />');   
+            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="coefficient" type="',   	class(obj.coefficient),'" default="',     	convert2str(obj.coefficient),'">',              '     <section name="frictionweertman" />','     <help> frictionweertman coefficient [SI] </help>','</parameter>');
+            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n',    '<parameter key ="p" type="',               class(obj.p),'" default="',                 convert2str(obj.p),'">',   '     <section name="frictionweertman" />','     <help> p exponent </help>','</parameter>');
+            fprintf(fid,'%s%s%s%s%s\n%s\n%s\n',        '<parameter key ="q" type="',               class(obj.q),'" default="',                 convert2str(obj.q),'">',            '     <section name="frictionweertman" />','     <help> q exponent </help>','</parameter>');
+            fprintf(fid,'%s\n%s\n','</frame>');
+        end % }}}
+		function obj = frictionweertman(varargin) % {{{
+			switch nargin
+				case 0
+					obj=setdefaultparameters(obj);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function obj = setdefaultparameters(obj) % {{{
+
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+
+			%Early return
+			if ~ismember(StressbalanceAnalysisEnum(),analyses) & ~ismember(ThermalAnalysisEnum(),analyses), return; end
+			md = checkfield(md,'fieldname','frictionweertman.C','forcing',1,'NaN',1);
+			md = checkfield(md,'fieldname','frictionweertman.m','NaN',1,'size',[md.mesh.numberofelements 1]);
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('Weertman sliding law parameters: Sigma_b = C^2 * |u_b|^(1/m-1) * u_b'));
+			fielddisplay(obj,'coefficient','friction coefficient [SI]');
+			fielddisplay(obj,'m','m exponent');
+		end % }}}
+		function marshall(obj,md,fid) % {{{
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',FrictionLawEnum,'data',1,'format','Integer');
+			WriteData(fid,'class','friction','object',obj,'fieldname','C','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'class','friction','object',obj,'fieldname','m','format','DoubleMat','mattype',2);
+			
+
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/frictionweertman.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/frictionweertman.py	(revision 17952)
+++ /issm/trunk-jpl/src/m/classes/frictionweertman.py	(revision 17952)
@@ -0,0 +1,47 @@
+from fielddisplay import fielddisplay
+from EnumDefinitions import *
+from checkfield import checkfield
+from WriteData import WriteData
+
+class frictionweertman(object):
+	"""
+	FRICTIONWEERTMAN class definition
+
+	   Usage:
+	      frictionweertman=frictionweertman();
+	"""
+
+	def __init__(self): # {{{
+		self.C = float('NaN')
+		self.m = float('NaN')
+
+		#set defaults
+		self.setdefaultparameters()
+
+		#}}}
+	def __repr__(self): # {{{
+		string="Weertman sliding law parameters: Sigma_b = C^2 * |u_b|^(1/m-1) * u_b"
+
+		string="%s\n%s"%(string,fielddisplay(self,"C","friction coefficient [SI]"))
+		string="%s\n%s"%(string,fielddisplay(self,"m","m exponent"))
+		return string
+		#}}}
+	def setdefaultparameters(self): # {{{
+		return self
+	#}}}
+	def checkconsistency(self,md,solution,analyses):    # {{{
+
+		#Early return
+		if StressbalanceAnalysisEnum() not in analyses and ThermalAnalysisEnum() not in analyses:
+			return md
+
+		md = checkfield(md,'fieldname','friction.C','forcing',1,'NaN',1)
+		md = checkfield(md,'fieldname','friction.m','NaN',1,'size',[md.mesh.numberofelements])
+
+		return md
+	# }}}
+	def marshall(self,md,fid):    # {{{
+		WriteData(fid,'enum',FrictionLawEnum(),'data',2,'format','Integer')
+		WriteData(fid,'class','friction','object',self,'fieldname','C','format','DoubleMat','mattype',1)
+		WriteData(fid,'class','friction','object',self,'fieldname','m','format','DoubleMat','mattype',2)
+	# }}}
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17951)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17952)
@@ -84,4 +84,7 @@
 def FrictionPEnum(): return StringToEnum("FrictionP")[0]
 def FrictionQEnum(): return StringToEnum("FrictionQ")[0]
+def FrictionMEnum(): return StringToEnum("FrictionM")[0]
+def FrictionCEnum(): return StringToEnum("FrictionC")[0]
+def FrictionLawEnum(): return StringToEnum("FrictionLaw")[0]
 def GeometryHydrostaticRatioEnum(): return StringToEnum("GeometryHydrostaticRatio")[0]
 def HydrologyModelEnum(): return StringToEnum("HydrologyModel")[0]
Index: /issm/trunk-jpl/src/m/enum/FrictionCEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/FrictionCEnum.m	(revision 17952)
+++ /issm/trunk-jpl/src/m/enum/FrictionCEnum.m	(revision 17952)
@@ -0,0 +1,11 @@
+function macro=FrictionCEnum()
+%FRICTIONCENUM - Enum of FrictionC
+%
+%   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=FrictionCEnum()
+
+macro=StringToEnum('FrictionC');
Index: /issm/trunk-jpl/src/m/enum/FrictionLawEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/FrictionLawEnum.m	(revision 17952)
+++ /issm/trunk-jpl/src/m/enum/FrictionLawEnum.m	(revision 17952)
@@ -0,0 +1,11 @@
+function macro=FrictionLawEnum()
+%FRICTIONLAWENUM - Enum of FrictionLaw
+%
+%   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=FrictionLawEnum()
+
+macro=StringToEnum('FrictionLaw');
Index: /issm/trunk-jpl/src/m/enum/FrictionMEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/FrictionMEnum.m	(revision 17952)
+++ /issm/trunk-jpl/src/m/enum/FrictionMEnum.m	(revision 17952)
@@ -0,0 +1,11 @@
+function macro=FrictionMEnum()
+%FRICTIONMENUM - Enum of FrictionM
+%
+%   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=FrictionMEnum()
+
+macro=StringToEnum('FrictionM');
Index: /issm/trunk-jpl/src/m/plot/plot_overlay.py
===================================================================
--- /issm/trunk-jpl/src/m/plot/plot_overlay.py	(revision 17951)
+++ /issm/trunk-jpl/src/m/plot/plot_overlay.py	(revision 17952)
@@ -2,8 +2,11 @@
 from processmesh import processmesh
 from processdata import processdata
-from osgeo import gdal
 import matplotlib.pyplot as plt
 import matplotlib as mpl
 import os
+try:
+	from osgeo import gdal
+except ImportError:
+	print 'osgeo/gdal for python not installed, plot_overlay is disabled'
 
 def plot_overlay(md,data,options,ax):
