Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 10187)
+++ /issm/trunk/src/c/Makefile.am	(revision 10188)
@@ -306,4 +306,5 @@
 					./shared/Matlab/matlabshared.h\
 					./shared/Matlab/ModuleBoot.cpp\
+					./shared/Matlab/ModuleEnd.cpp\
 					./shared/Matlab/mxGetAssignedField.cpp\
 					./shared/Matlab/mxGetField.cpp\
Index: /issm/trunk/src/c/include/macros.h
===================================================================
--- /issm/trunk/src/c/include/macros.h	(revision 10187)
+++ /issm/trunk/src/c/include/macros.h	(revision 10188)
@@ -49,5 +49,5 @@
 	try{
 
-#define MODULEEND(); }\
+#define MODULEEND(); ModuleEnd(); }\
 	catch(ErrorException &exception){\
 		exception.Report(); \
Index: /issm/trunk/src/c/shared/Matlab/ModuleBoot.cpp
===================================================================
--- /issm/trunk/src/c/shared/Matlab/ModuleBoot.cpp	(revision 10187)
+++ /issm/trunk/src/c/shared/Matlab/ModuleBoot.cpp	(revision 10188)
@@ -15,4 +15,28 @@
 	num_procs=1;
 
+	/*Some test for MPI_Init crash with mpich2 1.4 on larsen, just ignore*/
+	if(0){
+		int              mp_init = 0;
+		PetscErrorCode   ierr;
+		extern PetscBool PetscBeganMPI;
+		MPI_Initialized(&mp_init); 
+		if(mp_init!=1){
+			MPI_Init(NULL,NULL); 
+			PetscBeganMPI = PETSC_TRUE;
+			ierr=PetscInitializeNoArguments();CHKERRQ(ierr);
+		} 
+	}
+	else if (0){
+		PetscBool flg;
+		ierr=PetscInitialized(&flg);CHKERRQ(ierr);
+		if(flg){
+			extern PetscBool PetscBeganMPI;
+			PetscBeganMPI = PETSC_FALSE;
+			ierr=PetscFinalize();CHKERRQ(ierr);
+		}
+		ierr=PetscInitializeNoArguments();CHKERRQ(ierr);
+		ierr=PetscPopSignalHandler();CHKERRQ(ierr);
+	}
+
 	/*Initialize Petsc: */
 	PetscInitializeNoArguments();
Index: /issm/trunk/src/c/shared/Matlab/ModuleEnd.cpp
===================================================================
--- /issm/trunk/src/c/shared/Matlab/ModuleEnd.cpp	(revision 10188)
+++ /issm/trunk/src/c/shared/Matlab/ModuleEnd.cpp	(revision 10188)
@@ -0,0 +1,21 @@
+/* \file ModuleBoot.cpp
+ * \brief Carry out operations needed to boot, for example, petsc, MPI, plapack, etc ... 
+ * at the beginning of a module
+ */
+
+#include "../../toolkits/toolkits.h"
+
+int ModuleEnd(void){
+
+	if(0){
+		PetscBool        flg;
+		PetscErrorCode   ierr;
+		extern PetscBool PetscBeganMPI;
+
+		/*Close PETSc but do not close MPI*/
+		PetscBeganMPI = PETSC_FALSE;
+		ierr=PetscFinalize();CHKERRQ(ierr);
+	}
+
+	return 1;
+}
Index: /issm/trunk/src/c/shared/Matlab/matlabshared.h
===================================================================
--- /issm/trunk/src/c/shared/Matlab/matlabshared.h	(revision 10187)
+++ /issm/trunk/src/c/shared/Matlab/matlabshared.h	(revision 10188)
@@ -11,5 +11,7 @@
 #ifdef _SERIAL_
 #include "mex.h"
+#include "engine.h"
 	int ModuleBoot(void);
+	int ModuleEnd(void);
 	mxArray* mxGetAssignedField(const mxArray* pmxa_array,int number, char* field);
 	int CheckNumMatlabArguments(int nlhs,int NLHS, int nrhs,int NRHS, char* THISFUNCTION, void (*function)( void ));
