Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 19222)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 19223)
@@ -611,4 +611,5 @@
 	int   femmodel_size;
 	char* femmodel_buffer=NULL;
+	char* femmodel_buffer_ini=NULL;
 
 	/*First, recover the name of the restart file: */
@@ -618,13 +619,22 @@
 	restartfid=pfopen(restartfilename,"wb");
 
+	/*Initialize: */
+	femmodel_size=0;
+
 	/*Create buffer to hold marshalled femmodel: */
 	this->Marshall(NULL,&femmodel_size,MARSHALLING_SIZE);
-	femmodel_buffer=xNew<char>(femmodel_size);
-
+	femmodel_buffer=xNew<char>(femmodel_size); 
+
+	/*Keep track of initial position of femmodel_buffer: */
+	femmodel_buffer_ini=femmodel_buffer;
+	
 	/*Marshall:*/
-	this->Marshall(&femmodel_buffer,&femmodel_size,MARSHALLING_FORWARD);
+	this->Marshall(&femmodel_buffer,NULL,MARSHALLING_FORWARD);
+
+	/*Reset position of buffer: */
+	femmodel_buffer=femmodel_buffer_ini;
 
 	/*write buffer: */
-	fwrite(femmodel_buffer,femmodel_size,sizeof(IssmPDouble),restartfid);
+	fwrite(femmodel_buffer,femmodel_size,sizeof(char),restartfid);
 
 	/*Done, close file :*/
@@ -637,8 +647,59 @@
 }
 /*}}}*/
-void FemModel::Restart(void){/*{{{*/
+void FemModel::Restart(){ /*{{{*/
+
+	FILE* restartfid=NULL;
+	char* restartfilename = NULL;
+	int   femmodel_size=0; 
+	int   fread_return=0; 
+	char* femmodel_buffer=NULL;
+	char* femmodel_buffer_ini=NULL;
+
+	/*First, recover the name of the restart file: */
+	parameters->FindParam(&restartfilename,RestartFileNameEnum);
+
+	/*Now, figure out whether this file actually exists!: */
+	restartfid=pfopen(restartfilename,"r",false);
+
+	if(restartfid==NULL)return; //could not find the file, so no restart possible.
+
+	/*Figure out size of buffer to be read: */
+	fseek(restartfid, 0L, SEEK_END); 
+	femmodel_size = ftell(restartfid);
+	fseek(restartfid, 0L, SEEK_SET);
+
+	/*Allocate buffer: */
+	femmodel_buffer=xNew<char>(femmodel_size); 
+
+	/*Read buffer from file: */
+	fread_return=fread(femmodel_buffer,femmodel_size,1,restartfid); if(fread_return!=1)_error_("error reading the buffer from marshalled file!");
+	femmodel_buffer_ini=femmodel_buffer; //keep track of the initial position, so as to free later.
+
+	/*Create new FemModel by demarshalling the buffer: */
+	this->Marshall(&femmodel_buffer,NULL,MARSHALLING_BACKWARD);
+
+	/*Done, close file :*/
+	pfclose(restartfid,restartfilename);
+	
+	/*Free ressources: */
+	xDelete<char>(restartfilename);
+	xDelete<char>(femmodel_buffer);
+	
 }
 /*}}}*/
 void FemModel::Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	if(marshall_direction==MARSHALLING_BACKWARD){
+		delete profiler; profiler=new Profiler;
+		delete elements; elements=new Elements();
+		delete nodes; nodes=new Nodes();
+		delete vertices; vertices=new Vertices();
+		delete constraints; constraints=new Constraints();
+		delete loads; loads=new Loads();
+		delete materials; materials=new Materials();
+		delete parameters; parameters=new Parameters();
+		delete results; results=new Results();
+		xDelete<int>(analysis_type_list);
+	}
 
 	MARSHALLING_ENUM(FemModelEnum);
@@ -648,16 +709,4 @@
 	MARSHALLING_DYNAMIC(analysis_type_list,int,analysis_counter);
 
-	if(marshall_direction==MARSHALLING_BACKWARD){
-		profiler=new Profiler;
-		elements=new Elements();
-		nodes=new Nodes();
-		vertices=new Vertices();
-		constraints=new Constraints();
-		loads=new Loads();
-		materials=new Materials();
-		parameters=new Parameters();
-		results=new Results();
-	}
-	
 	profiler->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
 	elements->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
@@ -670,5 +719,4 @@
 	results->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
 
-	MARSHALLING(comm);
 }
 /*}}}*/
