Index: /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h	(revision 13533)
+++ /issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h	(revision 13534)
@@ -323,4 +323,5 @@
 	PentaEnum,
 	PentaP1InputEnum,
+	ProfilerEnum,
 	MatrixParamEnum,
 	VectorParamEnum,
Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 13533)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 13534)
@@ -159,4 +159,6 @@
 					./classes/objects/Params/DataSetParam.h\
 					./classes/objects/Params/DataSetParam.cpp\
+					./classes/objects/Profiler.h\
+					./classes/objects/Profiler.cpp\
 					./Container/Container.h\
 					./Container/Constraints.h\
@@ -351,4 +353,5 @@
 					./solutions/CorePointerFromSolutionEnum.cpp\
 					./solutions/EnvironmentInit.cpp\
+					./solutions/EnvironmentFinalize.cpp\
 					./solvers/solver_linear.cpp\
 					./solvers/solver_nonlinear.cpp\
Index: /issm/trunk-jpl/src/c/classes/objects/Profiler.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Profiler.cpp	(revision 13534)
+++ /issm/trunk-jpl/src/c/classes/objects/Profiler.cpp	(revision 13534)
@@ -0,0 +1,139 @@
+/*!\file Profiler.c
+ * \brief: implementation of the Profiler object
+ */
+
+/*Include files: {{{*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./Profiler.h"
+/*}}}*/
+
+/*Profiler constructors and destructors:*/
+/*FUNCTION Profiler::Profiler() default constructor {{{*/
+Profiler::Profiler(){
+		 this->timetags=new Parameters();
+}
+/*}}}*/
+/*FUNCTION Profiler::~Profiler(){{{*/
+Profiler::~Profiler(){
+	delete timetags;
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+/*FUNCTION Profiler::Echo{{{*/
+void Profiler::Echo(void){
+
+	_printLine_("Profiler:");
+	_printLine_("   time tags: ");
+	this->timetags->Echo();
+
+}
+/*}}}*/
+/*FUNCTION Profiler::DeepEcho{{{*/
+void Profiler::DeepEcho(void){
+
+	_printLine_("Profiler:");
+	_printLine_("   time tags: ");
+	this->timetags->DeepEcho();
+
+}
+/*}}}*/
+/*FUNCTION Profiler::Id{{{*/
+int    Profiler::Id(void){ return -1; }
+/*}}}*/
+/*FUNCTION Profiler::ObjectEnum{{{*/
+int Profiler::ObjectEnum(void){
+
+	return ProfilerEnum;
+
+}
+/*}}}*/
+
+/*Profiler routines:*/
+/*FUNCTION Profiler::Tag {{{*/
+void  Profiler::Tag(int tagenum,bool dontmpisync){
+
+	double time;
+
+	/*If mpisync requested, make sure all the cpus are at the same point 
+	 *in the execution: */
+	if(!dontmpisync){
+		#ifdef _HAVE_MPI_
+		MPI_Barrier(MPI_COMM_WORLD); 
+		#endif
+	}
+
+	/*Now capture time: */
+	#ifdef _HAVE_MPI_
+	time=MPI_Wtime();
+	#else
+	time=(IssmPDouble)clock();
+	#endif
+
+	/*Plug into this->timetags: */
+	this->timetags->AddObject(new DoubleParam(tagenum,time));
+
+}
+/*}}}*/
+/*FUNCTION Profiler::Delta {{{*/
+double  Profiler::Delta(int inittag, int finaltag){
+
+	double init, final;
+	this->timetags->FindParam(&init,inittag);
+	this->timetags->FindParam(&final,finaltag);
+
+	#ifdef _HAVE_MPI_
+	return final-init;
+	#else
+	return (final-init)/CLOCKS_PER_SEC;
+	#endif
+}
+/*}}}*/
+/*FUNCTION Profiler::DeltaModHour {{{*/
+int Profiler::DeltaModHour(int inittag, int finishtag){
+
+	double init, finish;
+	this->timetags->FindParam(&init,inittag);
+	this->timetags->FindParam(&finish,finishtag);
+
+	#ifdef _HAVE_MPI_
+	return int((finish-init)/3600);
+	#else
+	return int((finish-init)/CLOCKS_PER_SEC/3600);
+	#endif
+
+}
+/*}}}*/
+/*FUNCTION Profiler::DeltaModMin {{{*/
+int Profiler::DeltaModMin(int inittag, int finishtag){
+
+	double init, finish;
+	this->timetags->FindParam(&init,inittag);
+	this->timetags->FindParam(&finish,finishtag);
+
+	#ifdef _HAVE_MPI_
+	return int(int(finish-init)%3600/60);
+	#else
+	return int(int(finish-init)/CLOCKS_PER_SEC%3600/60);
+	#endif
+}
+/*}}}*/
+/*FUNCTION Profiler::DeltaModSec {{{*/
+int Profiler::DeltaModSec(int inittag, int finishtag){
+
+	double init, finish;
+	this->timetags->FindParam(&init,inittag);
+	this->timetags->FindParam(&finish,finishtag);
+
+	#ifdef _HAVE_MPI_
+	return int(finish-init)%60;
+	#else
+	return int(finish-init)/CLOCKS_PER_SEC%60;
+	#endif
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/objects/Profiler.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Profiler.h	(revision 13534)
+++ /issm/trunk-jpl/src/c/classes/objects/Profiler.h	(revision 13534)
@@ -0,0 +1,52 @@
+/*!\file Profiler.h
+ * \brief: header file for node object
+ */
+
+#ifndef _PROFILER_H_
+#define _PROFILER_H_
+
+/*Headers:*/
+/*{{{*/
+#include "./Object.h"
+#include "../../shared/shared.h"
+/*}}}*/
+
+class DataSet;
+class Parameters;
+
+enum ProfilerEnums {
+	Start,
+	StartInit,
+	FinishInit,
+	StartCore,
+	FinishCore,
+	Finish
+};
+
+
+class Profiler: public Object{
+
+	public: 
+		Parameters*  timetags;
+
+		/*Profiler constructors, destructors {{{*/
+		Profiler();
+		~Profiler();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		void    Echo();
+		void    DeepEcho();
+		int     Id();
+		int     ObjectEnum();
+		Object *copy()        {_error_("Not implemented yet"); };
+		/*}}}*/
+		/*Profiler routines {{{*/
+		void    Tag(int tagenum,bool dontmpisync=false);
+		double  Delta(int inittag, int finaltag);
+		int     DeltaModHour(int inittag, int finaltag);
+		int     DeltaModMin(int inittag, int finaltag);
+		int     DeltaModSec(int inittag, int finaltag);
+		/*}}}*/
+};
+
+#endif  /* _PROFILER_H_ */
Index: /issm/trunk-jpl/src/c/classes/objects/objects.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/objects.h	(revision 13533)
+++ /issm/trunk-jpl/src/c/classes/objects/objects.h	(revision 13534)
@@ -13,4 +13,5 @@
 #include "./Vertex.h"
 #include "./Node.h"
+#include "./Profiler.h"
 #include "./DependentObject.h"
 #include "./IndependentObject.h"
Index: /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 13533)
+++ /issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp	(revision 13534)
@@ -320,4 +320,5 @@
 		case PentaEnum : return "Penta";
 		case PentaP1InputEnum : return "PentaP1Input";
+		case ProfilerEnum : return "Profiler";
 		case MatrixParamEnum : return "MatrixParam";
 		case VectorParamEnum : return "VectorParam";
Index: /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 13533)
+++ /issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp	(revision 13534)
@@ -327,4 +327,5 @@
 	      else if (strcmp(name,"Penta")==0) return PentaEnum;
 	      else if (strcmp(name,"PentaP1Input")==0) return PentaP1InputEnum;
+	      else if (strcmp(name,"Profiler")==0) return ProfilerEnum;
 	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
@@ -383,9 +384,9 @@
 	      else if (strcmp(name,"SurfaceAbsVelMisfit")==0) return SurfaceAbsVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceArea")==0) return SurfaceAreaEnum;
-	      else if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
+	      if (strcmp(name,"SurfaceAverageVelMisfit")==0) return SurfaceAverageVelMisfitEnum;
+	      else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
 	      else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
@@ -506,9 +507,9 @@
 	      else if (strcmp(name,"Scaled")==0) return ScaledEnum;
 	      else if (strcmp(name,"Separate")==0) return SeparateEnum;
-	      else if (strcmp(name,"Sset")==0) return SsetEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"Verbose")==0) return VerboseEnum;
+	      if (strcmp(name,"Sset")==0) return SsetEnum;
+	      else if (strcmp(name,"Verbose")==0) return VerboseEnum;
 	      else if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum;
 	      else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
Index: /issm/trunk-jpl/src/c/solutions/EnvironmentFinalize.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/EnvironmentFinalize.cpp	(revision 13534)
+++ /issm/trunk-jpl/src/c/solutions/EnvironmentFinalize.cpp	(revision 13534)
@@ -0,0 +1,24 @@
+/*!\file:  EnvironmentFinalize.cpp
+ * \brief: finalize Petsc, MPI, you name it
+ */ 
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+#include "../include/include.h"
+#include "../toolkits/toolkits.h"
+#include "../shared/shared.h"
+
+void EnvironmentFinalize(void){
+
+	#ifdef _HAVE_PETSC_
+	_pprintLine_("closing MPI and Petsc");
+	PetscFinalize(); 
+	#else
+	#ifdef _HAVE_MPI_
+	_pprintLine_("closing MPI and Petsc");
+	MPI_Finalize();
+	#endif
+	#endif
+}
Index: /issm/trunk-jpl/src/c/solutions/EnvironmentInit.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/EnvironmentInit.cpp	(revision 13533)
+++ /issm/trunk-jpl/src/c/solutions/EnvironmentInit.cpp	(revision 13534)
@@ -9,7 +9,9 @@
 #include "../include/include.h"
 #include "../toolkits/toolkits.h"
-#include "../include/globals.h"
 
 void EnvironmentInit(int argc,char** argv){
+	
+	extern int my_rank;
+	extern int num_procs;
 
 	/*Initialize environments: Petsc, MPI, etc...: */
Index: /issm/trunk-jpl/src/c/solutions/issm.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/issm.cpp	(revision 13533)
+++ /issm/trunk-jpl/src/c/solutions/issm.cpp	(revision 13534)
@@ -6,4 +6,6 @@
 #include "../include/globals.h"
 	
+void ProfilerEcho(Profiler* profiler);
+
 int main(int argc,char **argv){
 
@@ -34,9 +36,6 @@
 	char *rootpath       = NULL;
 
-	/*time*/
-	IssmPDouble   finish;
-	IssmPDouble   start_core, finish_core;
-
 	/*profiling*/   
+	Profiler* profiler=NULL;
 	bool profiling = false;
 	IssmPDouble Time_start, Flops_start;
@@ -185,38 +184,31 @@
 
 	/*Get finish time and close*/
-	#ifdef _HAVE_MPI_
-	MPI_Barrier(MPI_COMM_WORLD); finish = MPI_Wtime( );
-	_pprintLine_("");
-	_pprintLine_("   "<<setw(40)<<left<<"FemModel initialization elapsed time:"<<finish_init-start_init);
-	_pprintLine_("   "<<setw(40)<<left<<"Core solution elapsed time:"<<finish_core-start_core);
-	_pprintLine_("");
-	_pprintLine_("   Total elapsed time:"<<int((finish-start)/3600)<<" hrs "<<int(int(finish-start)%3600/60)<<" min "<<int(finish-start)%60<<" sec");
-	_pprintLine_("");
-	#else
-	finish=(IssmPDouble)clock();
-	_pprintLine_("");
-	_pprintLine_("   "<<setw(40)<<left<<"FemModel initialization elapsed time:"<<(finish_init-start_init)/CLOCKS_PER_SEC);
-	_pprintLine_("   "<<setw(40)<<left<<"Core solution elapsed time:"<<(finish_core-start_core)/CLOCKS_PER_SEC);
-	_pprintLine_("");
-	_pprintLine_("   Total elapsed time:"
-				<<int((finish-start)/CLOCKS_PER_SEC/3600)<<" hrs "
-				<<int(int(finish-start)/CLOCKS_PER_SEC%3600/60)<<" min "
-				<<int(finish-start)/CLOCKS_PER_SEC%60<<" sec");
-	_pprintLine_("");
-	#endif
-	
-	#ifdef _HAVE_PETSC_
-	_pprintLine_("closing MPI and Petsc");
-	PetscFinalize(); 
-	#else
-	#ifdef _HAVE_MPI_
-	_pprintLine_("closing MPI and Petsc");
-	MPI_Finalize();
-	#endif
-	#endif
+	profiler->Tag(Finish); ProfilerEcho(profiler);
+
+	/*Finalize environment:*/
+	EnvironmentFinalize();
 
 	/*Finalize exception trapping: */
 	ExceptionTrapEnd();
 
-	return 0; //unix success return;
+	/*Return unix success: */
+	return 0; 
 }
+	
+
+
+void ProfilerEcho(Profiler* profiler){
+
+	_pprintLine_("");
+	_pprintLine_("   "<<setw(40)<<left<<"FemModel initialization elapsed time:"<<profiler->Delta(StartInit,FinishInit));
+	_pprintLine_("   "<<setw(40)<<left<<"Core solution elapsed time:"<<profiler->Delta(StartCore,FinishCore));
+	_pprintLine_("");
+	_pprintLine_("   Total elapsed time:"
+		<<profiler->DeltaModHour(Start,Finish)<<" hrs "
+		<<profiler->DeltaModMin(Start,Finish)<<" min "
+		<<profiler->DeltaModSec(Start,Finish)<<" sec"
+		);
+	_pprintLine_("");
+
+}
+
Index: /issm/trunk-jpl/src/c/solutions/kriging.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/kriging.cpp	(revision 13533)
+++ /issm/trunk-jpl/src/c/solutions/kriging.cpp	(revision 13534)
@@ -89,13 +89,6 @@
 	delete results;
 
-#ifdef _HAVE_PETSC_
-	_pprintLine_("closing MPI and Petsc");
-	PetscFinalize(); 
-#else
-#ifdef _HAVE_MPI_
-	_pprintLine_("closing MPI and Petsc");
-	MPI_Finalize();
-#endif
-#endif
+	/*Finalize environment:*/
+	EnvironmentFinalize();
 
 	/*Finalize exception trapping: */
Index: /issm/trunk-jpl/src/c/solutions/solutions.h
===================================================================
--- /issm/trunk-jpl/src/c/solutions/solutions.h	(revision 13533)
+++ /issm/trunk-jpl/src/c/solutions/solutions.h	(revision 13534)
@@ -46,4 +46,5 @@
 void ResetBoundaryConditions(FemModel* femmodel, int analysis_type);
 void EnvironmentInit(int argc,char** argv);
+void EnvironmentFinalize(void);
 
 //solution configuration
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 13533)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 13534)
@@ -3039,4 +3039,14 @@
 	return StringToEnum('PentaP1Input')[0]
 
+def ProfilerEnum():
+	"""
+	PROFILERENUM - Enum of Profiler
+
+	   Usage:
+	      macro=ProfilerEnum()
+	"""
+
+	return StringToEnum('Profiler')[0]
+
 def MatrixParamEnum():
 	"""
@@ -4967,4 +4977,4 @@
 	"""
 
-	return 495
-
+	return 496
+
Index: /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 13533)
+++ /issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m	(revision 13534)
@@ -9,3 +9,3 @@
 %      macro=MaximumNumberOfEnums()
 
-macro=495;
+macro=496;
Index: /issm/trunk-jpl/src/m/enum/ProfilerEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/ProfilerEnum.m	(revision 13534)
+++ /issm/trunk-jpl/src/m/enum/ProfilerEnum.m	(revision 13534)
@@ -0,0 +1,11 @@
+function macro=ProfilerEnum()
+%PROFILERENUM - Enum of Profiler
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/EnumDefinitions/Synchronize.sh
+%            Please read src/c/EnumDefinitions/README for more information
+%
+%   Usage:
+%      macro=ProfilerEnum()
+
+macro=StringToEnum('Profiler');
Index: /issm/trunk-jpl/src/m/enum/SurfaceforcingsHrefEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/SurfaceforcingsHrefEnum.m	(revision 13534)
+++ /issm/trunk-jpl/src/m/enum/SurfaceforcingsHrefEnum.m	(revision 13534)
@@ -0,0 +1,11 @@
+function macro=SurfaceforcingsHrefEnum()
+%SURFACEFORCINGSHREFENUM - Enum of SurfaceforcingsHref
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/EnumDefinitions/Synchronize.sh
+%            Please read src/c/EnumDefinitions/README for more information
+%
+%   Usage:
+%      macro=SurfaceforcingsHrefEnum()
+
+macro=StringToEnum('SurfaceforcingsHref');
Index: /issm/trunk-jpl/src/m/enum/SurfaceforcingsSmbrefEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/SurfaceforcingsSmbrefEnum.m	(revision 13534)
+++ /issm/trunk-jpl/src/m/enum/SurfaceforcingsSmbrefEnum.m	(revision 13534)
@@ -0,0 +1,11 @@
+function macro=SurfaceforcingsSmbrefEnum()
+%SURFACEFORCINGSSMBREFENUM - Enum of SurfaceforcingsSmbref
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/EnumDefinitions/Synchronize.sh
+%            Please read src/c/EnumDefinitions/README for more information
+%
+%   Usage:
+%      macro=SurfaceforcingsSmbrefEnum()
+
+macro=StringToEnum('SurfaceforcingsSmbref');
