Index: /issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 20976)
+++ /issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 20977)
@@ -412,5 +412,5 @@
 
 	bool autodiff,iscontrol;
-	int  num_independent_objects;
+	int  num_independent_objects,temp;
 	int  Xcount=0;
 
@@ -427,5 +427,6 @@
 		this->FetchData(&num_independent_objects,"md.autodiff.num_independent_objects");
 		if(num_independent_objects){
-			this->FetchData(&names,NULL,"md.autodiff.independent_object_names");
+			this->FetchData(&names,&temp,"md.autodiff.independent_object_names");
+			_assert_(temp==num_independent_objects);
 			this->FetchData(&types,NULL,NULL,"md.autodiff_independent_object_types");
 
@@ -980,4 +981,61 @@
 }
 /*}}}*/
+void  IoModel::FetchData(char*** pstrings,int* pnumstrings,const char* data_name){/*{{{*/
+
+	/*output: */
+	char** strings = NULL;
+	char*  string  = NULL;
+	int    numstrings;
+	int    string_size;
+	int    code;
+
+	/*recover my_rank:*/
+	int my_rank=IssmComm::GetRank();
+
+	/*Set file pointer to beginning of the data: */
+	fid=this->SetFilePointerToData(&code,NULL,data_name);
+
+	if(code!=9)_error_("expecting a string array for \""<<data_name<<"\"");
+
+	/*Now fetch: */
+
+	if(my_rank==0){  
+		if(fread(&numstrings,sizeof(int),1,fid)!=1) _error_("could not read length of string array");
+	}
+	ISSM_MPI_Bcast(&numstrings,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 
+
+	/*Now allocate string array: */
+	if(numstrings){
+		strings=xNew<char*>(numstrings);
+		for(int i=0;i<numstrings;i++) strings[i]=NULL;
+
+		/*Go through strings, and read: */
+		for(int i=0;i<numstrings;i++){
+
+			if(my_rank==0){  
+				if(fread(&string_size,sizeof(int),1,fid)!=1) _error_("could not read length of string ");
+			}
+			ISSM_MPI_Bcast(&string_size,1,ISSM_MPI_INT,0,IssmComm::GetComm()); 
+			if(string_size){
+				string=xNew<char>((string_size+1));
+				string[string_size]='\0';
+				if(my_rank==0){  
+					if(fread(string,string_size*sizeof(char),1,fid)!=1)_error_(" could not read string ");
+				}
+				ISSM_MPI_Bcast(string,string_size,ISSM_MPI_CHAR,0,IssmComm::GetComm()); 
+			}
+			else{
+				string=xNew<char>(1);
+				string[0]='\0';
+			}
+			strings[i]=string;
+		}
+	}
+
+	/*Assign output pointers: */
+	*pstrings = strings;
+	if(pnumstrings) *pnumstrings = numstrings;
+}
+/*}}}*/
 void  IoModel::FetchData(int** pmatrix,int* pM,int* pN,const char* data_name){/*{{{*/
 	int i,j;
Index: /issm/trunk-jpl/src/c/classes/IoModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 20976)
+++ /issm/trunk-jpl/src/c/classes/IoModel.h	(revision 20977)
@@ -121,4 +121,5 @@
 		void        FetchData(IssmDouble* pscalar,const char* data_name);
 		void        FetchData(char** pstring,const char* data_name);
+		void        FetchData(char*** pstrings,int* pnumstrings,const char* data_name);
 		void        FetchData(int** pmatrix,int* pM,int* pN,const char* data_name);
 		void        FetchData(IssmDouble**  pscalarmatrix,int* pM,int* pN,const char* data_name);
