Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 25365)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 25366)
@@ -1713,8 +1713,9 @@
 	basalelement->GradientIndexing(&vertexpidlist[0],control_index);
 
-	/* get the friction law: if 11-Schoof, use a special name for the coefficient*/
+	/* get the friction law: if 2-Weertman, 11-Schoof, use a special name for the coefficient*/
 	element->FindParam(&frictionlaw, FrictionLawEnum);
 	Input2* dragcoefficient_input;
 	switch(frictionlaw) {
+		case 2:
 		case 11:
 			dragcoefficient_input = basalelement->GetInput2(FrictionCEnum); _assert_(dragcoefficient_input);
@@ -1997,4 +1998,5 @@
 			dragcoeff_input = basalelement->GetInput2(FrictionCoefficientEnum); _assert_(dragcoeff_input);
 			break;
+		case 2:
 		case 11:
 			dragcoeff_input = basalelement->GetInput2(FrictionCEnum); _assert_(dragcoeff_input);
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 25365)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.cpp	(revision 25366)
@@ -46,4 +46,7 @@
 			GetAlphaViscousComplement(palpha_complement,gauss);
 			break;
+		case 2:
+			GetAlphaWeertmanComplement(palpha_complement, gauss);
+			break;
 		case 3:
 			GetAlphaHydroComplement(palpha_complement,gauss);
@@ -134,7 +137,7 @@
 void Friction::GetAlphaViscousComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
 
-	/* FrictionGetAlpha2 computes alpha2= drag^2 * Neff ^r * vel ^s, with Neff=rho_ice*g*thickness+rho_ice*g*base, r=q/p and s=1/p.
+	/* FrictionGetAlpha2 computes 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.
 	 * FrictionGetAlphaComplement is used in control methods on drag, and it computes:
-	 * alpha_complement= Neff ^r * vel ^s*/
+	 * alpha_complement= Neff ^r * vel ^(s-1)*/
 
 	/*diverse: */
@@ -194,4 +197,27 @@
 		alpha_complement= pow(vmag, m-1.)*pow((1 + pow(C/(Cmax*Neff),1./m)*vmag), -m-1.);
 	}
+	/*Assign output pointers:*/
+	*palpha_complement=alpha_complement;
+}/*}}}*/
+void Friction::GetAlphaWeertmanComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
+
+	/* Compute the complement of Weertman's law for inversion
+	 * alpha2 = C^2 * vel^(1/m-1)
+	 * alpha_complement = vel^(1/m-1)
+	*/
+	/*diverse: */
+	IssmDouble  m;
+	IssmDouble  alpha_complement;
+
+	/*Recover parameters: */
+	element->GetInputValue(&m,gauss,FrictionMEnum);
+
+	/*Get effective pressure*/
+	IssmDouble vmag = VelMag(gauss);
+
+	/*Check to prevent dividing by zero if vmag==0*/
+	if(vmag==0. && (1./m-1.)<0.) alpha_complement=0.;
+	else alpha_complement= pow(vmag, 1.0/m-1.);
+	
 	/*Assign output pointers:*/
 	*palpha_complement=alpha_complement;
@@ -530,5 +556,5 @@
 void Friction::GetAlpha2Weertman(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
 
-	/*This routine calculates the basal friction coefficient alpha2= C^-1/m |v|^(1/m-1) */
+	/*This routine calculates the basal friction coefficient alpha2= C^2 |v|^(1/m-1) */
 
 	/*diverse: */
@@ -545,5 +571,5 @@
 	/*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.));
+	else alpha2=C*C*pow(vmag,(1./m-1.));
 
 	/*Assign output pointers:*/
Index: /issm/trunk-jpl/src/c/classes/Loads/Friction.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 25365)
+++ /issm/trunk-jpl/src/c/classes/Loads/Friction.h	(revision 25366)
@@ -29,4 +29,5 @@
 		void  GetAlphaViscousComplement(IssmDouble* alpha_complement,Gauss* gauss);
 		void  GetAlphaSchoofComplement(IssmDouble* alpha_complement,Gauss* gauss);
+		void  GetAlphaWeertmanComplement(IssmDouble* alpha_complement,Gauss* gauss);
 		void  GetAlpha2(IssmDouble* palpha2,Gauss* gauss);
 		void  GetAlpha2Coulomb(IssmDouble* palpha2,Gauss* gauss);
Index: /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 25365)
+++ /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 25366)
@@ -67,4 +67,5 @@
 	Input2* drag_input;
 	switch(frictionlaw) {
+		case 2:
 		case 11:
 			drag_input = basalelement->GetInput2(FrictionCEnum); _assert_(drag_input);
Index: /issm/trunk-jpl/src/m/classes/frictionweertman.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/frictionweertman.m	(revision 25365)
+++ /issm/trunk-jpl/src/m/classes/frictionweertman.m	(revision 25366)
@@ -9,4 +9,9 @@
 		m = NaN;
 	end
+   methods (Static)
+      function self = loadobj(self) % {{{
+			disp('Warning: the Weertman friciton law is updated to Sigma_b = C^2*|u_b|^(1/m-1)*u_b, since 2020-08-10');
+		end
+	end %}}}
 	methods
 		function self = frictionweertman(varargin) % {{{
@@ -32,10 +37,11 @@
 			md = checkfield(md,'fieldname','friction.m','NaN',1,'Inf',1,'size',[md.mesh.numberofelements 1]);
 		end % }}}
-		function disp(self) % {{{
+		function disp(self) % {{{z
 			disp('Weertman sliding law parameters:');
 			disp('   Weertman''s sliding law reads:');
-			disp('      v_b = C * Sigma_b^m');
+			disp('      v_b = C_w * Sigma_b^m');
 			disp('   In ISSM, this law is rewritten as:');
-			disp('      Sigma_b = C^(-1/m) * |u_b|^(1/m-1)  u_b');
+			disp('      Sigma_b = C^2 * |u_b|^(1/m-1) * u_b');
+			disp('   where C_w=C^(-2m)');
 			disp(' ');
 			fielddisplay(self,'C','friction coefficient [SI]');
Index: /issm/trunk-jpl/src/m/classes/frictionweertmantemp.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 25365)
+++ /issm/trunk-jpl/src/m/classes/frictionweertmantemp.m	(revision 25366)
@@ -10,4 +10,10 @@
 		m = NaN;
 	end
+   methods (Static)
+      function self = loadobj(self) % {{{
+			disp('Warning: the Weertman friciton law is updated to Sigma_b = C^2*|u_b|^(1/m-1)*u_b, since 2020-08-10');
+			disp(' and friction coefficient in the temprature dependent version is updated accordingly.');
+		end
+	end %}}}
 	methods
 		function self = frictionweertmantemp(varargin) % {{{
@@ -31,5 +37,5 @@
 		function disp(self) % {{{
 			disp('Weertman sliding law parameters:');
-			disp('      Sigma_b = C^(-1/m) * |u_b|^(1/m-1)  u_b * 1/f(T)');
+			disp('      Sigma_b = C^2 * |u_b|^(1/m-1)  u_b * 1/f(T)');
 			disp(' ');
 			fielddisplay(self,'gamma','submelt sliding parameter f(T) = exp((T-Tpmp)/gamma)');
Index: /issm/trunk-jpl/test/NightlyRun/test357.m
===================================================================
--- /issm/trunk-jpl/test/NightlyRun/test357.m	(revision 25366)
+++ /issm/trunk-jpl/test/NightlyRun/test357.m	(revision 25366)
@@ -0,0 +1,40 @@
+%Test Name: SquareSheetConstrainedCMDragWeertmanSSA2d
+md=triangle(model(),'../Exp/Square.exp',200000.);
+md=setmask(md,'','');
+md=parameterize(md,'../Par/SquareSheetConstrained.par');
+md=setflowequation(md,'SSA','all');
+
+%use Schoof's law
+Cmax = 0.8;
+md.friction = frictionweertman();
+md.friction.m = 3.0*ones(md.mesh.numberofelements,1);
+md.friction.C = 20*ones(md.mesh.numberofvertices,1);
+	
+%control parameters
+md.inversion.iscontrol=1;
+md.inversion.control_parameters={'FrictionC'};
+md.inversion.min_parameters=1e-4.*ones(md.mesh.numberofvertices,1);
+md.inversion.max_parameters=10000.*ones(md.mesh.numberofvertices,1);
+md.inversion.nsteps=2;
+md.inversion.cost_functions=[101  501];
+md.inversion.cost_functions_coefficients=ones(md.mesh.numberofvertices,2); md.inversion.cost_functions_coefficients(:,2)=2.*10^-4;
+md.inversion.gradient_scaling=3.*ones(md.inversion.nsteps,1);
+md.inversion.maxiter_per_step=2*ones(md.inversion.nsteps,1);
+md.inversion.step_threshold=0.3*ones(md.inversion.nsteps,1);
+md.inversion.vx_obs=md.initialization.vx; md.inversion.vy_obs=md.initialization.vy;
+
+md.cluster=generic('name',oshostname(),'np',3);
+md=solve(md,'Stressbalance');
+
+%Fields and tolerances to track changes
+field_names     ={'Gradient','Misfits','FrictionC','Pressure','Vel','Vx','Vy'};
+field_tolerances={1e-12,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13,1e-13};
+field_values={...
+	(md.results.StressbalanceSolution.Gradient1),...
+	(md.results.StressbalanceSolution.J),...
+	(md.results.StressbalanceSolution.FrictionC),...
+	(md.results.StressbalanceSolution.Pressure),...
+	(md.results.StressbalanceSolution.Vel),...
+	(md.results.StressbalanceSolution.Vx),...
+	(md.results.StressbalanceSolution.Vy)
+};
