Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 25411)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 25412)
@@ -1750,8 +1750,9 @@
 	IssmDouble  value,value_min,value_max;
 
-	int        *vertexids   = xNew<int>(numvertices);
-	IssmDouble *values      = xNew<IssmDouble>(numvertices);
-	IssmDouble *values_min  = xNew<IssmDouble>(numvertices);
-	IssmDouble *values_max  = xNew<IssmDouble>(numvertices);
+	int         vertexids[MAXVERTICES];
+	int         vertexlids[MAXVERTICES];
+	IssmDouble  values[MAXVERTICES];
+	IssmDouble  values_min[MAXVERTICES];
+	IssmDouble  values_max[MAXVERTICES];
 
 	/*Some sanity checks*/
@@ -1764,4 +1765,5 @@
 	for(int i=0;i<numvertices;i++){
 		vertexids[i]=reCast<int>(iomodel->elements[numvertices*this->Sid()+i]); //ids for vertices are in the elements array from Matlab
+		vertexlids[i]=iomodel->my_vertices_lids[vertexids[i]-1];
 	}
 
@@ -1773,5 +1775,5 @@
 			values_max[i] = scale*max_vector[vertexids[i]-1];
 		}
-		this->AddControlInput(input_enum,inputs,iomodel,values,values_min,values_max,P1Enum,id);
+		this->AddControlInput(input_enum,inputs,iomodel,&values[0],&values_min[0],&values_max[0],P1Enum,id);
 	}
 	else if(M==iomodel->numberofelements && N==1){
@@ -1779,5 +1781,5 @@
 		values_min[0] = scale*min_vector[this->Sid()];
 		values_max[0] = scale*max_vector[this->Sid()];
-		this->AddControlInput(input_enum,inputs,iomodel,values,values_min,values_max,P0Enum,id);
+		this->AddControlInput(input_enum,inputs,iomodel,&values[0],&values_min[0],&values_max[0],P0Enum,id);
 	}
 	else if(M==iomodel->numberofelements+1 && N>1){
@@ -1813,50 +1815,38 @@
 	}
 	else if(M==iomodel->numberofvertices+1 && N>1){
-		_error_("not supported tet");
-		///*create transient input: */
-		//IssmDouble* times = xNew<IssmDouble>(N);
-		//for(int t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
-		///*Create the three transient inputs for the control input*/
-		//TransientInput* values_input=new TransientInput(input_enum,times,N);
-		//TransientInput* mins_input = new TransientInput(ControlInputMinsEnum,times,N);
-		//TransientInput* maxs_input = new TransientInput(ControlInputMaxsEnum,times,N);
-		//TransientInput* grad_input = new TransientInput(ControlInputGradEnum);
-		//for(int t=0;t<N;t++){
-		//	for(int i=0;i<numvertices;i++){
-		//		values[i]=vector[N*(vertexids[i]-1)+t];
-		//		values_min[i] = min_vector[N*(vertexids[i]-1)+t];
-		//		values_max[i] = max_vector[N*(vertexids[i]-1)+t];
-		//	}
-		//	switch(this->ObjectEnum()){
-		//		case TriaEnum:
-		//			values_input->AddTimeInput(new TriaInput(input_enum,values,P1Enum));
-		//			mins_input->AddTimeInput(new TriaInput(ControlInputMinsEnum,values_min,P1Enum));
-		//			maxs_input->AddTimeInput(new TriaInput(ControlInputMaxsEnum,values_max,P1Enum));
-		//			break;
-		//		case PentaEnum:
-		//			values_input->AddTimeInput(new PentaInput(input_enum,values,P1Enum));
-		//			mins_input->AddTimeInput(new PentaInput(ControlInputMinsEnum,values_min,P1Enum));
-		//			maxs_input->AddTimeInput(new PentaInput(ControlInputMaxsEnum,values_max,P1Enum));
-		//			break;
-		//		case TetraEnum:
-		//			values_input->AddTimeInput(new TetraInput(input_enum,values,P1Enum));
-		//			mins_input->AddTimeInput(new TetraInput(ControlInputMinsEnum,values_min,P1Enum));
-		//			maxs_input->AddTimeInput(new TetraInput(ControlInputMaxsEnum,values_max,P1Enum));
-		//			break;
-		//		default: _error_("Not implemented yet");
-		//	}
-		//}
-		//this->inputs->AddInput(new ControlInput(input_enum,TransientInputEnum,values_input,mins_input,maxs_input,grad_input,P1Enum,id));
-		//xDelete<IssmDouble>(times);
+
+		/*create transient input: */
+		IssmDouble* times = xNew<IssmDouble>(N);
+		for(int t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
+		inputs->SetTransientControlInput(input_enum,id,times,N);
+
+		/*Get input*/
+		ControlInput* control_input = inputs->GetControlInput(input_enum); _assert_(control_input);
+		TransientInput* transientinput_val = control_input->GetTransientInput("value");
+		TransientInput* transientinput_min = control_input->GetTransientInput("lowerbound");
+		TransientInput* transientinput_max = control_input->GetTransientInput("upperbound");
+		for(int t=0;t<N;t++){
+			for(int i=0;i<numvertices;i++){
+				values[i]     = vector[N*(vertexids[i]-1)+t];
+				values_min[i] = scale*min_vector[N*(vertexids[i]-1)+t];
+				values_max[i] = scale*max_vector[N*(vertexids[i]-1)+t];
+			}
+			switch(this->ObjectEnum()){
+				case TriaEnum:
+					transientinput_val->AddTriaTimeInput( t,numvertices,vertexlids,&values[0],P1Enum);
+					transientinput_min->AddTriaTimeInput( t,numvertices,vertexlids,&values_min[0],P1Enum);
+					transientinput_max->AddTriaTimeInput( t,numvertices,vertexlids,&values_max[0],P1Enum);
+					break;
+				case PentaEnum:
+					//transientinput->AddPentaTimeInput(t,1,&(this->lid),&value,P0Enum);
+					_error_("to be implemented");
+					break;
+				default: _error_("Not implemented yet");
+			}
+		}
+		xDelete<IssmDouble>(times);
 	}
 	else _error_("not currently supported type of M and N attempted");
-
-	/*clean up*/
-	xDelete<IssmDouble>(values);
-	xDelete<IssmDouble>(values_min);
-	xDelete<IssmDouble>(values_max);
-	xDelete<int>(vertexids);
-}
-/*}}}*/
+}/*}}}*/
 void       Element::DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int input_enum,int code,int input_id){/*{{{*/
 	/*enum_type: the name of the DatasetInput (eg Outputdefinition1)
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 25411)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 25412)
@@ -1136,13 +1136,16 @@
 	else if(control_input->layout_enum==TransientInputEnum){
 		_assert_(N>1);
+
+		int* interp = NULL;
+		parameters->FindParam(&interp,NULL,ControlInputInterpolationEnum);
+
 		TransientInput* gradient_input = control_input->GetTransientInput("gradient"); _assert_(gradient_input);
 
 		for(int n=0;n<N;n++){
-			TriaInput* input_n = gradient_input->GetTriaInput(n); _assert_(input_n);
-			if(input_n->GetInputInterpolationType()==P1Enum){
+			if(interp[control_index]==P1Enum){
 				_error_("not implemented");
 			}
-			else if(input_n->GetInputInterpolationType()==P0Enum){
-				input_n->SetInput(P0Enum,this->lid,gradient[idlist[n]]);
+			else if(interp[control_index]==P0Enum){
+				gradient_input->AddTriaTimeInput(n,1,&(this->lid),&gradient[idlist[n]],P0Enum);
 			}
 			else{
@@ -1150,4 +1153,5 @@
 			}
 		}
+		xDelete<int>(interp);
 	}
 	else _error_("Type not supported");
@@ -2470,10 +2474,12 @@
 			TriaInput* input_n = input->GetTriaInput(n); _assert_(input_n);
 			if(input_n->GetInputInterpolationType()==P1Enum){
-				_error_("not implemented");
+				IssmDouble values[NUMVERTICES];
+				input_n->Serve(NUMVERTICES,&lidlist[0]);
+				for(int i=0;i<NUMVERTICES;i++) values[count+i] = input_n->element_values[i];
+				count=count+NUMVERTICES;
 			}
 			else if(input_n->GetInputInterpolationType()==P0Enum){
 				input_n->Serve(1,&this->lid);
 				values[n] = input_n->element_values[0];
-				count++;
 			}
 			else{
@@ -3964,5 +3970,6 @@
 			TriaInput* input_n = input->GetTriaInput(n); _assert_(input_n);
 			if(input_n->GetInputInterpolationType()==P1Enum){
-				_error_("not implemented");
+				for(int i=0;i<NUMVERTICES;i++) values[i] = vector[idlist[i]];
+				input_n->SetInput(P1Enum,NUMVERTICES,&lidlist[0],&values[0]);
 			}
 			else if(input_n->GetInputInterpolationType()==P0Enum){
