Index: /issm/trunk-jpl/src/c/classes/Misfit.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Misfit.h	(revision 16792)
+++ /issm/trunk-jpl/src/c/classes/Misfit.h	(revision 16793)
@@ -13,4 +13,6 @@
 #include "./Elements/Elements.h"
 #include "./FemModel.h"
+#include "../modules/SurfaceAreax/SurfaceAreax.h"
+#include "../classes/Params/Parameters.h"
 /*}}}*/
 
@@ -25,4 +27,7 @@
 		char*       timeinterpolation;
 		
+		IssmDouble  misfit; //value carried over in time.
+		int         lock; // if lock is on, we just return the value stored in "misfit".  this is used so we don't compute misfit past the final_time
+		
 		/*Misfit constructors, destructors :*/
 		/*FUNCTION Misfit() {{{*/
@@ -34,4 +39,6 @@
 			this->weights_enum = UNDEF;
 			this->timeinterpolation=NULL;
+			this->misfit=0;
+			this->lock=0;
 
 		}
@@ -49,4 +56,7 @@
 			this->observation_enum=in_observation_enum;
 			this->weights_enum=in_weights_enum;
+			
+			this->misfit=0;
+			this->lock=0;
 		}
 		/*}}}*/
@@ -55,4 +65,6 @@
 			if(this->name)xDelete(this->name);
 			if(this->timeinterpolation)xDelete(this->timeinterpolation);
+			this->misfit=0;
+			this->lock=0;
 		}
 		/*}}}*/
@@ -101,14 +113,40 @@
 
 			 int i;
-			 IssmDouble response=0;
-			 IssmDouble all_response=0;
+			 IssmDouble misfit_t=0;
+			 IssmDouble all_misfit_t=0;
+			 IssmDouble dt;
+			 IssmDouble area;
+			 IssmDouble time,starttime,finaltime;
+
+			 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
+			 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
+			 femmodel->parameters->FindParam(&time,TimeEnum);
+
+			 /*If we are locked, return time average: */
+			 if(this->lock)return misfit/(time-starttime);
 
 			 for(i=0;i<femmodel->elements->Size();i++){
 				 Element* element=(Element*)femmodel->elements->GetObjectByOffset(i);
-				 response+=element->Misfit(model_enum,observation_enum,weights_enum);
+				 misfit_t+=element->Misfit(model_enum,observation_enum,weights_enum);
 			 }
+
+			 ISSM_MPI_Allreduce ( (void*)&misfit_t,(void*)&all_misfit_t,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+			 misfit_t=all_misfit_t;
 			 
-			 ISSM_MPI_Allreduce ( (void*)&response,(void*)&all_response,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
-			 return all_response;
+			 /*Divide by surface area: */
+			 SurfaceAreax(&area,femmodel);
+			 misfit_t=misfit_t/area;
+
+			 /*Recover delta_t: */
+			 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+
+			 /*Add this time's contribution to curent misfit: */
+			 misfit+=dt*misfit_t;
+
+			 /*Do we lock? i.e. are we at final_time? :*/
+			 if(time==finaltime)this->lock=1;
+
+			 /*What we return is the value of misfit / time: */
+			 return misfit/(time-starttime);
 		 }
 			/*}}}*/
