Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18770)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 18771)
@@ -42,4 +42,6 @@
 		case SSAApproximationEnum: 
 			return CreateKMatrixSSA(element);
+		case L1L2ApproximationEnum: 
+			return CreateKMatrixL1L2(element);
 		case HOApproximationEnum: 
 			return CreateKMatrixHO(element);
@@ -139,4 +141,21 @@
 	return Ke;
 }/*}}}*/
+ElementMatrix* AdjointHorizAnalysis::CreateKMatrixL1L2(Element* element){/*{{{*/
+
+	/*Intermediaries*/
+	bool incomplete_adjoint;
+
+	/*Initialize Jacobian with regular L1L2 (first part of the Gateau derivative)*/
+	StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
+	ElementMatrix* Ke=analysis->CreateKMatrix(element);
+	delete analysis;
+
+	/*return*/
+	element->FindParam(&incomplete_adjoint,InversionIncompleteAdjointEnum);
+	if(!incomplete_adjoint){
+		_error_("Exact adjoint not supported yet for L1L2 model");
+	}
+	return Ke;
+}/*}}}*/
 ElementMatrix* AdjointHorizAnalysis::CreateKMatrixHO(Element* element){/*{{{*/
 
@@ -300,4 +319,6 @@
 		case SSAApproximationEnum: 
 			return CreatePVectorSSA(element);
+		case L1L2ApproximationEnum: 
+			return CreatePVectorL1L2(element);
 		case HOApproximationEnum: 
 			return CreatePVectorHO(element);
@@ -897,4 +918,9 @@
 	return pe;
 }/*}}}*/
+ElementVector* AdjointHorizAnalysis::CreatePVectorL1L2(Element* element){/*{{{*/
+
+	/*Same as SSA*/
+	return this->CreatePVectorSSA(element);
+}/*}}}*/
 void AdjointHorizAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
 	   _error_("not implemented yet");
@@ -946,4 +972,5 @@
 			switch(approximation){
 				case SSAApproximationEnum: GradientJDragSSA(element,gradient,control_index); break;
+				case L1L2ApproximationEnum:GradientJDragL1L2(element,gradient,control_index); break;
 				case HOApproximationEnum:  GradientJDragHO( element,gradient,control_index); break;
 				case FSApproximationEnum:  GradientJDragFS( element,gradient,control_index); break;
@@ -955,4 +982,5 @@
 			switch(approximation){
 				case SSAApproximationEnum: GradientJBbarSSA(element,gradient,control_index); break;
+				case L1L2ApproximationEnum:GradientJBbarL1L2(element,gradient,control_index); break;
 				case HOApproximationEnum:  GradientJBbarHO( element,gradient,control_index); break;
 				case FSApproximationEnum:  GradientJBbarFS( element,gradient,control_index); break;
@@ -1223,4 +1251,9 @@
 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
 }/*}}}*/
+void AdjointHorizAnalysis::GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+
+	/*Same as SSA*/
+	return this->GradientJDragSSA(element,gradient,control_index);
+}/*}}}*/
 void AdjointHorizAnalysis::GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
 
@@ -1446,4 +1479,9 @@
 	if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
 }/*}}}*/
+void AdjointHorizAnalysis::GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
+
+	   /*Same as SSA*/
+	   return this->GradientJBbarSSA(element,gradient,control_index);
+}/*}}}*/
 void AdjointHorizAnalysis::GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18770)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.h	(revision 18771)
@@ -26,8 +26,10 @@
 		ElementMatrix* CreateKMatrix(Element* element);
 		ElementMatrix* CreateKMatrixSSA(Element* element);
+		ElementMatrix* CreateKMatrixL1L2(Element* element);
 		ElementMatrix* CreateKMatrixHO(Element* element);
 		ElementMatrix* CreateKMatrixFS(Element* element);
 		ElementVector* CreatePVector(Element* element);
 		ElementVector* CreatePVectorSSA(Element* element);
+		ElementVector* CreatePVectorL1L2(Element* element);
 		ElementVector* CreatePVectorHO(Element* element);
 		ElementVector* CreatePVectorFS(Element* element);
@@ -37,7 +39,9 @@
 		void GradientJBGradient(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void GradientJDragSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJDragL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void GradientJDragHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void GradientJDragFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void GradientJBbarSSA(Element* element,Vector<IssmDouble>* gradient,int control_index);
+		void GradientJBbarL1L2(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void GradientJBbarHO(Element* element,Vector<IssmDouble>* gradient,int control_index);
 		void GradientJBbarFS(Element* element,Vector<IssmDouble>* gradient,int control_index);
Index: /issm/trunk-jpl/src/m/classes/inversion.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.m	(revision 18770)
+++ /issm/trunk-jpl/src/m/classes/inversion.m	(revision 18771)
@@ -146,5 +146,5 @@
 			%Only SSA, HO and FS are supported right now
 			if solution==StressbalanceSolutionEnum()
-				if ~(md.flowequation.isSSA || md.flowequation.isHO || md.flowequation.isFS),
+				if ~(md.flowequation.isSSA || md.flowequation.isHO || md.flowequation.isFS || md.flowequation.isL1L2),
 					md = checkmessage(md,['inversion can only be performed for SSA, HO or FS ice flow models']);
 				end
Index: /issm/trunk-jpl/src/m/classes/inversion.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/inversion.py	(revision 18770)
+++ /issm/trunk-jpl/src/m/classes/inversion.py	(revision 18771)
@@ -131,5 +131,5 @@
 		#Only SSA, HO and FS are supported right now
 		if solution==StressbalanceSolutionEnum():
-			if not (md.flowequation.isSSA or md.flowequation.isHO or md.flowequation.isFS):
+			if not (md.flowequation.isSSA or md.flowequation.isHO or md.flowequation.isFS or md.flowequation.isL1L2):
 				md.checkmessage("'inversion can only be performed for SSA, HO or FS ice flow models");
 
