Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23220)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23221)
@@ -254,8 +254,14 @@
 	/*Before we delete the profiler, report statistics for this run: */
 	profiler->Stop(TOTAL);  //final tagging
+
 	_printf0_("\n");
-	_printf0_("   "<<setw(40)<<left<<"FemModel initialization elapsed time:"<<profiler->TotalTime(MPROCESSOR) << "\n");
-	_printf0_("   "<<setw(40)<<left<<"Core solution elapsed time:"<<profiler->TotalTime(CORE) << "\n");
-	_printf0_("   "<<setw(40)<<left<<"Solver elapsed time:"<<profiler->TotalTime(SOLVER) << "\n");
+	_printf0_("   "<<setw(40)<<left<<"FemModel initialization elapsed time:"<<setw(7)<<profiler->TotalTime(MPROCESSOR) << "\n");
+	/*Total times*/
+	_printf0_("   "<<setw(40)<<left<<"Total Core solution elapsed time:"<<setw(7)<<profiler->TotalTime(CORE) << "\n");
+	/*Individual cores*/
+	if(profiler->Used(STRESSBALANCECORE)) _printf0_("   "<<setw(40)<<left<<"Stress balance core elapsed time:"<<setw(7)<<profiler->TotalTime(STRESSBALANCECORE) << "\n");
+	if(profiler->Used(MASSTRANSPORTCORE)) _printf0_("   "<<setw(40)<<left<<"Mass transport core elapsed time:"<<setw(7)<<profiler->TotalTime(MASSTRANSPORTCORE) << "\n");
+	/*Linear solver only*/
+	_printf0_("   "<<setw(40)<<left<<"Linear solver elapsed time:"<<setw(7)<<profiler->TotalTime(SOLVER) << " ("<<setprecision(2)<<profiler->TotalTime(SOLVER)/profiler->TotalTime(CORE)*100.<<"%)\n");
 	_printf0_("\n");
 	_printf0_("   Total elapsed time: "
Index: /issm/trunk-jpl/src/c/classes/Profiler.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Profiler.cpp	(revision 23220)
+++ /issm/trunk-jpl/src/c/classes/Profiler.cpp	(revision 23221)
@@ -15,5 +15,5 @@
 /*Profiler constructors and destructors:*/
 Profiler::Profiler(){/*{{{*/
-	for(int i=0;i<MAXIMUMSIZE;i++){
+	for(int i=0;i<MAXPROFSIZE;i++){
 		this->time[i]          = 0.;
 		this->time_start[i]    = 0.;
@@ -23,4 +23,5 @@
 		this->memory_start[i]  = 0.;
 		this->running[i]       = false;
+		this->used[i]          = false;
 	}
 } /*}}}*/
@@ -32,5 +33,5 @@
 	Profiler* output=new Profiler();
 
-	for(int i=0;i<MAXIMUMSIZE;i++){
+	for(int i=0;i<MAXPROFSIZE;i++){
 		output->time[i]  =this->time[i];
 		output->flops[i] =this->flops[i];
@@ -49,5 +50,5 @@
 
 	_printf_("Profiler:\n");
-	for(int i=0;i<MAXIMUMSIZE;i++){
+	for(int i=0;i<MAXPROFSIZE;i++){
 		_printf_("    Tag "<<i<<":\n");
 		_printf_("       flops:   "<<this->flops[i]<<"\n");
@@ -70,11 +71,11 @@
 	MARSHALLING_ENUM(ProfilerEnum);
 	pointer = &this->time[0];
-	MARSHALLING_DYNAMIC(pointer,IssmPDouble,MAXIMUMSIZE);
+	MARSHALLING_DYNAMIC(pointer,IssmPDouble,MAXPROFSIZE);
 	pointer = &this->flops[0];
-	MARSHALLING_DYNAMIC(pointer,IssmPDouble,MAXIMUMSIZE);
+	MARSHALLING_DYNAMIC(pointer,IssmPDouble,MAXPROFSIZE);
 	pointer = &this->memory[0];
-	MARSHALLING_DYNAMIC(pointer,IssmPDouble,MAXIMUMSIZE);
+	MARSHALLING_DYNAMIC(pointer,IssmPDouble,MAXPROFSIZE);
 	bpointer = &this->running[0];
-	MARSHALLING_DYNAMIC(bpointer,bool,MAXIMUMSIZE);
+	MARSHALLING_DYNAMIC(bpointer,bool,MAXPROFSIZE);
 
 } /*}}}*/
@@ -88,5 +89,5 @@
 	/*Get tag*/
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	if(this->running[tag]) _error_("Tag "<<tag<<" has not been stopped");
 
@@ -97,5 +98,5 @@
 	/*Get tag*/
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	if(this->running[tag]) _error_("Tag "<<tag<<" has not been stopped");
 
@@ -130,5 +131,5 @@
 	/*Get initial flops*/
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	if(this->running[tag]) _error_("Tag "<<tag<<" has not been stopped");
 
@@ -140,5 +141,5 @@
 	/*Check tag*/
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	if(this->running[tag]) _error_("Tag "<<tag<<" is already running");
 
@@ -167,5 +168,5 @@
 	/*Plug into this->time: */
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	this->time_start[tag]   = t;
 	this->flops_start[tag]  = f;
@@ -174,4 +175,5 @@
 	/*turn on running*/
 	this->running[tag] = true;
+	this->used[tag]    = true;
 }/*}}}*/
 void  Profiler::Stop(int tag,bool dontmpisync){/*{{{*/
@@ -179,5 +181,5 @@
 	/*Check tag*/
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	if(!this->running[tag]) _error_("Tag "<<tag<<" is not running");
 
@@ -206,5 +208,5 @@
 	/*Plug into this->time: */
 	_assert_(tag>=0); 
-	_assert_(tag<MAXIMUMSIZE); 
+	_assert_(tag<MAXPROFSIZE); 
 	this->time[tag]   += t - this->time_start[tag];
 	this->flops[tag]  += f - this->flops_start[tag];
@@ -214,2 +216,9 @@
 	this->running[tag] = false;
 }/*}}}*/
+bool  Profiler::Used(int tag){/*{{{*/
+
+	/*Check tag*/
+	_assert_(tag>=0); 
+	_assert_(tag<MAXPROFSIZE); 
+	return this->used[tag];
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Profiler.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Profiler.h	(revision 23220)
+++ /issm/trunk-jpl/src/c/classes/Profiler.h	(revision 23221)
@@ -11,21 +11,24 @@
 
 /*Macros*/
-#define TOTAL 0      /*Profiling Total time */ 
-#define MPROCESSOR 1 /*Profiling Model processor*/ 
-#define CORE 2       /*Profiling solution */ 
-#define SOLVER 3     /*Profiling solution */ 
-#define ADCORE 4     /*Profiling AD */ 
-#define MAXIMUMSIZE 5
+#define TOTAL              0 /*Profiling Total time */
+#define MPROCESSOR         1 /*Profiling Model processor*/
+#define CORE               2 /*Profiling solution */
+#define SOLVER             3 /*Profiling solution */
+#define ADCORE             4 /*Profiling AD */
+#define STRESSBALANCECORE  5 /*Profiling AD */
+#define MASSTRANSPORTCORE  6 /*Profiling AD */
+#define MAXPROFSIZE        7 /*Used to initialize static arrays*/
 
 class Profiler: public Object{
 
 	public: 
-		IssmPDouble flops[MAXIMUMSIZE];
-		IssmPDouble flops_start[MAXIMUMSIZE];
-		IssmPDouble memory[MAXIMUMSIZE];
-		IssmPDouble memory_start[MAXIMUMSIZE];
-		IssmPDouble time[MAXIMUMSIZE];
-		IssmPDouble time_start[MAXIMUMSIZE];
-		bool        running[MAXIMUMSIZE];
+		IssmPDouble flops[MAXPROFSIZE];
+		IssmPDouble flops_start[MAXPROFSIZE];
+		IssmPDouble memory[MAXPROFSIZE];
+		IssmPDouble memory_start[MAXPROFSIZE];
+		IssmPDouble time[MAXPROFSIZE];
+		IssmPDouble time_start[MAXPROFSIZE];
+		bool        running[MAXPROFSIZE];
+		bool        used[MAXPROFSIZE];
 
 		/*Profiler constructors, destructors */
@@ -50,4 +53,5 @@
 		void         Start(int tagenum,bool dontmpisync=false);
 		void         Stop(int tagenum,bool dontmpisync=false);
+		bool         Used(int tagenum);
 };
 
Index: /issm/trunk-jpl/src/c/cores/masstransport_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 23220)
+++ /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 23221)
@@ -11,4 +11,7 @@
 
 void masstransport_core(FemModel* femmodel){
+
+	/*Start profiler*/
+	femmodel->profiler->Start(MASSTRANSPORTCORE);
 
 	/*parameters: */
@@ -81,3 +84,6 @@
 	/*Free ressources:*/
 	if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);}
+
+	/*profiler*/
+	femmodel->profiler->Stop(MASSTRANSPORTCORE);
 }
Index: /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp	(revision 23220)
+++ /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp	(revision 23221)
@@ -12,4 +12,7 @@
 
 void stressbalance_core(FemModel* femmodel){
+
+	/*Start profiler*/
+	femmodel->profiler->Start(STRESSBALANCECORE);
 
 	/*parameters: */
@@ -86,3 +89,6 @@
 	/*Free ressources:*/	
 	if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);}
+
+	/*End profiler*/
+	femmodel->profiler->Stop(STRESSBALANCECORE);
 }
