Index: /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 27127)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 27128)
@@ -24,4 +24,5 @@
 #include "./DatasetInput.h"
 #include "./ArrayInput.h"
+#include "./IntArrayInput.h"
 using namespace std;
 /*}}}*/
@@ -571,4 +572,21 @@
 	input->GetArrayPtr(row,pvalues,pN);
 }/*}}}*/
+void Inputs::GetIntArrayPtr(int enum_in,int row,int** pvalues,int* pN){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=IntArrayInputEnum) _error_(EnumToStringx(this->inputs[id]->ObjectEnum())<<" cannot return an int array");
+	}
+	else{
+		_error_("Input "<<EnumToStringx(enum_in)<<" not found");
+	}
+
+	/*Set input*/
+	IntArrayInput* input = xDynamicCast<IntArrayInput*>(this->inputs[id]);
+	input->GetArrayPtr(row,pvalues,pN);
+}/*}}}*/
 void Inputs::GetArray(int enum_in,int row,IssmDouble** pvalues,int* pN){/*{{{*/
 
@@ -586,4 +604,21 @@
 	/*Set input*/
 	ArrayInput* input = xDynamicCast<ArrayInput*>(this->inputs[id]);
+	input->GetArray(row,pvalues,pN);
+}/*}}}*/
+void Inputs::GetIntArray(int enum_in,int row,int** pvalues,int* pN){/*{{{*/
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=IntArrayInputEnum) _error_(EnumToStringx(this->inputs[id]->ObjectEnum())<<" cannot return an int array");
+	}
+	else{
+		_error_("Input "<<EnumToStringx(enum_in)<<" not found");
+	}
+
+	/*Set input*/
+	IntArrayInput* input = xDynamicCast<IntArrayInput*>(this->inputs[id]);
 	input->GetArray(row,pvalues,pN);
 }/*}}}*/
@@ -735,4 +770,30 @@
 	input->SetInput(row,numlayers,values);
 }/*}}}*/
+void Inputs::SetIntArrayInput(int enum_in,int row,int* values,int numlayers){/*{{{*/
+
+	bool recreate = false;
+
+	/*Get input id*/
+	int id = EnumToIndex(enum_in);
+
+	/*Create it if necessary*/
+	if(this->inputs[id]){
+		if(this->inputs[id]->ObjectEnum()!=IntArrayInputEnum){
+			delete this->inputs[id];
+			recreate = true;
+		}
+	}
+	else{
+		recreate = true;
+	}
+
+	if(recreate){
+		this->inputs[id] = new IntArrayInput(this->numberofelements_local);
+	}
+
+	/*Set input*/
+	IntArrayInput* input = xDynamicCast<IntArrayInput*>(this->inputs[id]);
+	input->SetInput(row,numlayers,values);
+}/*}}}*/
 TransientInput* Inputs::SetDatasetTransientInput(int enum_in,int dataset_id,IssmDouble* times,int numtimes){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Inputs/Inputs.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Inputs.h	(revision 27127)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Inputs.h	(revision 27128)
@@ -11,4 +11,5 @@
 class DatasetInput;
 class ArrayInput;
+class IntArrayInput;
 class ControlInput;
 class Parameters;
@@ -56,5 +57,7 @@
 		void     GetInputsInterpolations(int* pnuminputs,int** pinterpolations,int** penum);
 		void             GetArray(int enum_in,int row,IssmDouble** pvalues,int* pN);
+		void             GetIntArray(int enum_in,int row,int** pvalues,int* pN);
 		void             GetArrayPtr(int enum_in,int row,IssmDouble** pvalues,int* pN);
+		void             GetIntArrayPtr(int enum_in,int row,int** pvalues,int* pN);
 		SegInput*       GetSegInput(int enum_type);
 		TriaInput*      GetTriaInput(int enum_type);
@@ -82,4 +85,5 @@
 		TransientInput* SetDatasetTransientInput(int enum_in,int id,IssmDouble* times,int numtimes);
 		void  SetArrayInput(int enum_in,int row,IssmDouble* layers,int numlayers);
+		void  SetIntArrayInput(int enum_in,int row,int* layers,int numlayers);
 		void  SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values);
 		void  SetTriaControlInputGradient(int enum_in,int interpolation,int numindices,int* indices,IssmDouble* values,int n);
Index: /issm/trunk-jpl/src/c/classes/Inputs/IntArrayInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/IntArrayInput.cpp	(revision 27128)
+++ /issm/trunk-jpl/src/c/classes/Inputs/IntArrayInput.cpp	(revision 27128)
@@ -0,0 +1,145 @@
+/*!\file IntArrayInput.c
+ * \brief: implementation of the IntArrayInput object
+ */
+
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+#include "./IntArrayInput.h"
+
+/*IntArrayInput constructors and destructor*/
+IntArrayInput::IntArrayInput(void){/*{{{*/
+
+	this->numberofelements_local = -1;
+	this->N                      = NULL;
+	this->values                 = NULL;
+
+}/*}}}*/
+IntArrayInput::IntArrayInput(int nbe_in){/*{{{*/
+
+	_assert_(nbe_in>0);
+	_assert_(nbe_in<1e11);
+	this->numberofelements_local = nbe_in;
+	this->N                      = xNewZeroInit<int>(this->numberofelements_local);
+	this->values                 = xNewZeroInit<int*>(this->numberofelements_local);
+
+}/*}}}*/
+IntArrayInput::~IntArrayInput(){/*{{{*/
+	if(this->values){
+		for(int i=0;i<this->numberofelements_local;i++) if(this->values[i]) xDelete<int>(this->values[i]);
+		xDelete<int>(this->values);
+	}
+	if(this->N) xDelete<int>(this->N);
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Input* IntArrayInput::copy() {/*{{{*/
+
+	IntArrayInput* output = new IntArrayInput(this->numberofelements_local);
+
+	output->N = xNew<int>(this->numberofelements_local);
+	xMemCpy<int>(output->N,this->N,this->numberofelements_local);
+
+	output->values = xNew<int*>(this->numberofelements_local);
+	for(int i=0;i<this->numberofelements_local;i++){
+		if(this->values[i]){
+			_assert_(this->N[i]>0);
+			output->values[i] = xNew<int>(this->N[i]);
+			xMemCpy<int>(output->values[i],this->values[i],this->N[i]);
+		}
+		else{
+			output->values[i] = NULL;
+		}
+	}
+
+	return output;
+}
+/*}}}*/
+void IntArrayInput::DeepEcho(void){/*{{{*/
+	_printf_("IntArrayInput Echo:\n");
+	///_printf_("   Size:          "<<N<<"\n");
+	//printarray(this->values,this->M,this->N);
+	//_printf_(setw(15)<<"   IntArrayInput "<<setw(25)<<left<<EnumToStringx(this->enum_type)<<" "<<(value?"true":"false") << "\n");
+}
+/*}}}*/
+void IntArrayInput::Echo(void){/*{{{*/
+	this->DeepEcho();
+}
+/*}}}*/
+int  IntArrayInput::Id(void){/*{{{*/
+	return -1;
+}/*}}}*/
+void IntArrayInput::Marshall(MarshallHandle* marshallhandle){ /*{{{*/
+
+	int object_enum = IntArrayInputEnum;
+	marshallhandle->call(object_enum);
+	marshallhandle->call(this->numberofelements_local);
+	if(this->numberofelements_local){
+		marshallhandle->call(this->N,this->numberofelements_local);
+		for(int i=0;i<this->numberofelements_local;i++){
+			if(this->values[i]){
+				marshallhandle->call(this->values[i],this->N[i]);
+			}
+		}
+	}
+	else{
+		this->N      = NULL;
+		this->values = NULL;
+	}
+
+}
+/*}}}*/
+int  IntArrayInput::ObjectEnum(void){/*{{{*/
+	return IntArrayInputEnum;
+}
+/*}}}*/
+
+/*IntArrayInput management*/
+void IntArrayInput::SetInput(int row,int numindices,int* values_in){/*{{{*/
+
+	_assert_(this);
+	_assert_(row>=0 && row<this->numberofelements_local);
+
+	if(this->N[row] != numindices){
+		if(this->values[row]) xDelete<int>(this->values[row]);
+		this->values[row] = xNew<int>(numindices);
+	}
+
+	int *el_values = this->values[row];
+	for(int i=0;i<numindices;i++) el_values[i] = values_in[i];
+
+	this->N[row] = numindices;
+}
+/*}}}*/
+void IntArrayInput::GetArray(int row,int** pvalues,int* pN){/*{{{*/
+
+	_assert_(this);
+	_assert_(row>=0 && row<this->numberofelements_local);
+	if(pvalues){
+		int* outvalues = xNew<int>(this->N[row]);
+		xMemCpy<int>(outvalues,this->values[row],this->N[row]);
+		*pvalues = outvalues;
+	}
+	if(pN){
+		*pN = this->N[row];
+	}
+}
+/*}}}*/
+void IntArrayInput::GetArrayPtr(int row,int** pvalues,int* pN){/*{{{*/
+
+	_assert_(this);
+	_assert_(row>=0 && row<this->numberofelements_local);
+	if(pvalues){
+		*pvalues = this->values[row];
+	}
+	if(pN){
+		*pN = this->N[row];
+	}
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs/IntArrayInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/IntArrayInput.h	(revision 27128)
+++ /issm/trunk-jpl/src/c/classes/Inputs/IntArrayInput.h	(revision 27128)
@@ -0,0 +1,34 @@
+#ifndef _INTARRAYINPUT_H_
+#define _INTARRAYINPUT_H_
+
+/*Headers:*/
+#include "./Input.h"
+
+class IntArrayInput: public Input{
+
+	private:
+		int         numberofelements_local;
+		int*        N;
+		int** values;
+
+	public:
+		/*IntArrayInput constructors, destructors: {{{*/
+		IntArrayInput();
+		IntArrayInput(int nbe_in);
+		~IntArrayInput();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Input *copy();
+		void    DeepEcho();
+		void    Echo();
+		int     Id();
+		void    Marshall(MarshallHandle* marshallhandle);
+		int     ObjectEnum();
+		/*}}}*/
+		/*IntArrayInput management:*/
+		void SetInput(int row,int numinds,int* values_in);
+		void GetArray(int row,int** pvalues,int* pN);
+		void GetArrayPtr(int row,int** pvalues,int* pN);
+
+};
+#endif  /* _INTARRAYINPUT_H */
