Index: /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 26361)
+++ /issm/trunk-jpl/src/c/analyses/AdjointHorizAnalysis.cpp	(revision 26362)
@@ -1187,4 +1187,6 @@
 	Element* basalelement;
 
+	if(control_interp==P0Enum) _error_("cannot require regularization for P0 controls");
+
 	/*Get basal element*/
 	element->FindParam(&domaintype,DomainTypeEnum);
@@ -1375,4 +1377,6 @@
 	/*Intermediaries*/
 	int      domaintype;
+
+	if(control_interp==P0Enum) _error_("cannot require regularization for P0 controls");
 
 	/*Get basal element*/
@@ -1440,4 +1444,5 @@
 	/*Intermediaries*/
 	int      domaintype;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Get basal element*/
@@ -1502,4 +1507,5 @@
 	/*Intermediaries*/
 	int      domaintype,dim;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Get domaintype*/
@@ -1579,4 +1585,5 @@
 	int      domaintype,dim;
 	Element* basalelement;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Get basal element*/
@@ -1661,4 +1668,5 @@
 	/*return if floating (gradient is 0)*/
 	if(element->IsAllFloating()) return;
+	if(control_interp==P0Enum) _error_("cannot require regularization for P0 controls");
 
 	/*Intermediaries*/
@@ -1755,4 +1763,5 @@
 	if(element->IsAllFloating()) return;
 	if(!element->IsOnBase()) return;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Intermediaries*/
@@ -1934,11 +1943,29 @@
 
 		/*Build gradient vector (actually -dJ/dD): */
-		for(int i=0;i<numvertices;i++){
-			if(domaintype!=Domain2DverticalEnum) ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
-			else ge[i]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i];
-			_assert_(!xIsNan<IssmDouble>(ge[i]));
-		}
-	}
-	gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+		if(control_interp==P1Enum){
+			for(int i=0;i<numvertices;i++){
+				if(domaintype!=Domain2DverticalEnum) ge[i]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight*basis[i];
+				else ge[i]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->weight*basis[i];
+				_assert_(!xIsNan<IssmDouble>(ge[i]));
+			}
+		}
+		else if(control_interp==P0Enum){
+			if(domaintype!=Domain2DverticalEnum) ge[0]+=-2.*drag*dalpha2dk*((lambda*vx+mu*vy))*Jdet*gauss->weight;
+			else ge[0]+=-2.*drag*dalpha2dk*(lambda*vx)*Jdet*gauss->weight;
+			_assert_(!xIsNan<IssmDouble>(ge[0]));
+		}
+		else{
+			_error_("not supported");
+		}
+	}
+	if(control_interp==P1Enum){
+		gradient->SetValues(numvertices,vertexpidlist,ge,ADD_VAL);
+	}
+	else if(control_interp==P0Enum){
+		gradient->SetValue(vertexpidlist[0],ge[0],ADD_VAL);
+	}
+	else{
+		_error_("not supported");
+	}
 
 	/*Clean up and return*/
@@ -2073,4 +2100,5 @@
 	if(element->IsAllFloating()) return;
 	if(!element->IsOnBase()) return;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Intermediaries*/
@@ -2171,4 +2199,5 @@
 	if(element->IsAllFloating()) return;
 	if(!element->IsOnBase()) return;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Intermediaries*/
@@ -2241,4 +2270,5 @@
 	/*return if floating (gradient is 0)*/
 	if(element->IsAllFloating()) return;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Intermediaries*/
@@ -2366,4 +2396,5 @@
 	int      domaintype,dim;
 	Element* basalelement;
+	if(control_interp!=P1Enum) _error_("not implemented yet...");
 
 	/*Get basal element*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 26361)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 26362)
@@ -220,4 +220,7 @@
 	/*Call inputs method*/
 	switch(interpolation_enum){
+		case P0Enum:
+			control_input->SetControl(interpolation_enum,1,&this->lid,values,values_min,values_max);
+			break;
 		case P1Enum:
 			control_input->SetControl(interpolation_enum,NUMVERTICES,&vertexlids[0],values,values_min,values_max);
Index: /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 26361)
+++ /issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp	(revision 26362)
@@ -177,4 +177,13 @@
 		}
 	}
+	else if(interp_in==P0Enum && this->interpolation==P0Enum){
+		_assert_(this->N==1);
+		for(int i=0;i<numindices;i++){
+			int row = indices[i];
+			_assert_(row>=0);
+			_assert_(row<this->M);
+			this->values[row] = values_in[i];
+		}
+	}
 	else if(this->interpolation!=P1Enum && interp_in==P1Enum){
 		this->Reset(interp_in);
