Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 25207)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 25208)
@@ -27,4 +27,5 @@
 #include "../shared/io/io.h"
 #include "../shared/shared.h"
+#include "../classes/Inputs2/TransientInput2.h"
 
 #ifdef _HAVE_CODIPACK_
@@ -1716,4 +1717,97 @@
 			}
 			break;
+		case 8: { //MatArray {{{
+
+			/*variables:*/
+			int numarray;
+			IssmDouble** array=NULL; 
+			IssmDouble*  matrix=NULL;
+			IssmDouble*  times = NULL;
+			int* pM = NULL;
+			int* pN = NULL;
+			int M,N;
+
+			/*fetch array of matrices:*/
+			this->FetchData(&array,&pM,&pN,&numarray,vector_name);
+
+			for (int i=0;i<numarray;i++){
+
+				M=pM[i];
+				N=pN[i];
+				matrix=array[i];
+
+				//recover time vector: 
+				times=xNew<IssmDouble>(N);
+				for(int t=0;t<N;t++) times[t] = matrix[(M-1)*N+t];
+
+				//initialize transient input dataset:
+				TransientInput2* transientinput=inputs2->SetDatasetTransientInput(input_enum,i, times,N);
+				for(int j=0;j<elements->Size();j++){
+
+					/*Get the right transient input*/
+					Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(j));
+
+					/*Get values and lid list*/
+					const int   numvertices = element->GetNumberOfVertices();
+					int        *vertexlids = xNew<int>(numvertices);
+					int        *vertexsids = xNew<int>(numvertices);
+
+
+					/*Recover vertices ids needed to initialize inputs*/
+					_assert_(this->elements);
+					for(int k=0;k<numvertices;k++){
+						vertexsids[k] =reCast<int>(this->elements[numvertices*element->Sid()+k]); //ids for vertices are in the elements array from Matlab
+						vertexlids[k]=this->my_vertices_lids[vertexsids[k]-1];
+					}
+
+					if(M==this->numberofvertices || M==(this->numberofvertices+1)){
+
+						IssmDouble* values=xNew<IssmDouble>(numvertices);
+
+						for(int t=0;t<N;t++){
+							for (int k=0;k<numvertices;k++)values[k]=matrix[N*vertexsids[k]+t];
+
+							switch(element->ObjectEnum()){
+								case TriaEnum:  transientinput->AddTriaTimeInput( t,numvertices,vertexlids,values,P1Enum); break;
+								case PentaEnum: transientinput->AddPentaTimeInput(t,numvertices,vertexlids,values,P1Enum); break;
+								default: _error_("Not implemented yet");
+							}
+						}
+						xDelete<IssmDouble>(values);
+					}
+					else if(M==this->numberofelements || M==(this->numberofelements+1)){
+
+						IssmDouble value;
+
+						for(int t=0;t<N;t++){ 
+
+							value=matrix[N*element->Sid()+t];
+							//if(element->Sid()==188 && t==0)_printf_("value: " << value << "\n");
+							switch(element->ObjectEnum()){
+								case TriaEnum:  transientinput->AddTriaTimeInput( t,1,&element->lid,&value,P0Enum); break;
+								case PentaEnum:  transientinput->AddPentaTimeInput( t,1,&element->lid,&value,P0Enum); break;
+								default: _error_("Not implemented yet");
+							}
+						}
+					}
+					else _error_("FetchDataToInput error message: row size of MatArray elements should be either numberofelements (+1) or numberofvertices (+1)");
+					
+					xDelete<int>(vertexlids);
+					xDelete<int>(vertexsids);
+				}
+
+				xDelete<IssmDouble>(times);
+			}
+
+			/*Delete data:*/
+			for(int i=0;i<numarray;i++){
+				IssmDouble* matrix=array[i];
+				xDelete<IssmDouble>(matrix);
+			}
+			xDelete<IssmDouble*>(array);
+			xDelete<int>(pM);
+			xDelete<int>(pN); 
+			} //}}}
+			break;
 		case 7: //IssmDouble vector
 		case 10:
