Index: /issm/branches/trunk-larour-SLPS2020/src/c/analyses/SealevelriseAnalysis.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25534)
@@ -201,4 +201,7 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.computesealevelchange",SolidearthSettingsComputesealevelchangeEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.planetradius",SolidearthPlanetRadiusEnum));
+	parameters->AddObject(new DoubleParam(CumBslrEnum,0.0));
+	parameters->AddObject(new DoubleParam(CumBslrIceEnum,0.0));
+	parameters->AddObject(new DoubleParam(CumBslrHydroEnum,0.0));
 
 	/*compute planet area and plug into parameters:*/
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Element.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Element.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Element.h	(revision 25534)
@@ -378,5 +378,7 @@
 		virtual IssmDouble    OceanAverage(IssmDouble* Sg, SealevelMasks* masks)=0;
 		virtual void          SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks)=0;
-		virtual void          SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks,IssmDouble oceanarea)=0;
+		virtual IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks,IssmDouble oceanarea)=0;
+		virtual IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks,IssmDouble oceanarea)=0;
+		virtual void          SealevelriseEustaticBottomPressure(IssmDouble* Sgi, SealevelMasks* masks)=0;
 		virtual void          SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx, IssmDouble* yy, IssmDouble* zz)=0;
 		virtual void          SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old,SealevelMasks* mask)=0;
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Penta.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Penta.h	(revision 25534)
@@ -216,5 +216,7 @@
 		void    SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx, IssmDouble* yy, IssmDouble* zz){_error_("not implemented yet!");};
-		void    SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks,IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		void    SealevelriseEustaticBottomPressure(IssmDouble* Sgi,SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old, SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet!");};
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Seg.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Seg.h	(revision 25534)
@@ -173,5 +173,7 @@
 		void    SetSealevelMasks(SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx, IssmDouble* yy, IssmDouble* zz){_error_("not implemented yet!");};
-		void    SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks,IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		void    SealevelriseEustaticBottomPressure(IssmDouble* Sgi,SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old, SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet!");};
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tetra.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tetra.h	(revision 25534)
@@ -179,5 +179,7 @@
 		void    SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius,IssmDouble* xx, IssmDouble* yy, IssmDouble* zz){_error_("not implemented yet!");};
-		void    SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks,IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		void    SealevelriseEustaticBottomPressure(IssmDouble* Sgi,SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseNonEustatic(IssmDouble* Sgo, IssmDouble* Sg_old, SealevelMasks* masks){_error_("not implemented yet!");};
 		void    SealevelriseGeodetic(IssmDouble* Up ,IssmDouble* North, IssmDouble* East, IssmDouble* Sg, SealevelMasks* masks){_error_("not implemented yet!");};
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.cpp	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.cpp	(revision 25534)
@@ -5654,22 +5654,5 @@
 }
 /*}}}*/
-void    Tria::SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
-
-	int bp_compute_fingerprints= 0;
-
-	/*Compute bottom pressure contribution from ocean if requested:*/
-	this->parameters->FindParam(&bp_compute_fingerprints,DslComputeFingerprintsEnum);
-	if(bp_compute_fingerprints)this->SealevelriseBottomPressure(Sgi,masks);
-
-	/*Compute eustatic ice contribution to sea level rise: */
-	this->SealevelriseEustaticIce(Sgi,peustatic,masks, oceanarea);
-
-	/*Compute hydrological contribution to sea level rise: */
-	this->SealevelriseEustaticHydro(Sgi,peustatic,masks, oceanarea);
-
-
-}
-/*}}}*/
-void    Tria::SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
+IssmDouble Tria::SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
 
 	/*diverse:*/
@@ -5681,4 +5664,7 @@
 	bool scaleoceanarea= false;
 
+	/*output: */
+	IssmDouble bslrice=0;
+
 	/*elastic green function:*/
 	IssmDouble* G=NULL;
@@ -5689,7 +5675,4 @@
 	/*constants:*/
 	IssmDouble constant=0;
-
-	/*Initialize eustatic component: do not skip this step :):*/
-	IssmDouble eustatic = 0.;
 
 	/*early return if we are not on an ice cap:*/
@@ -5698,6 +5681,6 @@
 		constant=0; this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum);
 		#endif
-		*peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage!
-		return;
+		bslrice=0;
+		return bslrice;
 	}
 
@@ -5708,6 +5691,6 @@
 		this->AddInput2(SealevelEustaticMaskEnum,&constant,P0Enum);
 		#endif
-		*peustatic=0; //do not forget to assign this pointer, otherwise, global eustatic will be garbage!
-		return;
+		bslrice=0;
+		return bslrice;
 	}
 
@@ -5774,8 +5757,9 @@
 	/*}}}*/
 
-	/*Compute eustatic component:*/
+	/*Compute barystatic contribution:*/
 	_assert_(oceanarea>0.);
 	if(scaleoceanarea) oceanarea=3.619e+14; // use true ocean area, m^2
-	eustatic += rho_ice*area*phi*I/(oceanarea*rho_water);
+	bslrice = rho_ice*area*phi*I/(oceanarea*rho_water);
+	_assert_(!xIsNan<IssmDouble>(bslrice));
 
 	/*convert from m to kg/m^2:*/
@@ -5785,16 +5769,14 @@
 	for(int i=0;i<gsize;i++) Sgi[i]+=G[i]*I;
 
-	/*Assign output pointer:*/
-	_assert_(!xIsNan<IssmDouble>(eustatic));
-	*peustatic=eustatic;
-	return;
-}
-/*}}}*/
-void    Tria::SealevelriseEustaticHydro(IssmDouble* Sgi, IssmDouble* peustatic, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
+	/*return :*/
+	return bslrice;
+}
+/*}}}*/
+IssmDouble Tria::SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
 
 	/*diverse:*/
 	int gsize;
 	IssmDouble area;
-	IssmDouble phi=1.0; //WARNING: do not touch this, default is entire elemnt contributes eustatic
+	IssmDouble phi=1.0; //WARNING: do not touch this, default is entire elemnt contributes barystatic
 	IssmDouble W;  //change in water height thickness (Farrel and Clarke, Equ. 4)
 	bool notfullygrounded=false;
@@ -5808,13 +5790,18 @@
 	IssmDouble rho_freshwater;
 
-
-	/*Initialize eustatic component: grab from the previous eustatic core!:*/
-	IssmDouble eustatic = *peustatic;
+	/*output:*/
+	IssmDouble bslrhydro = 0;
 
 	/*early return if we are on an ice cap:*/
-	if(masks->isiceonly[this->lid]){ return; }
+	if(masks->isiceonly[this->lid]){ 
+		bslrhydro=0;
+		return bslrhydro; 
+	}
 
 	/*early return if we are fully floating:*/
-	if (masks->isfullyfloating[this->lid]){ return; }
+	if (masks->isfullyfloating[this->lid]){ 
+		bslrhydro=0;
+		return bslrhydro; 
+	}
 
 	/*If we are here, we are on earth, not on ice: */
@@ -5838,8 +5825,9 @@
 	deltathickness_input->GetInputAverage(&W);
 
-	/*Compute eustatic component:*/
+	/*Compute barystatic component:*/
 	_assert_(oceanarea>0.);
 	if(scaleoceanarea) oceanarea=3.619e+14; // use true ocean area, m^2
-	eustatic += rho_freshwater*area*phi*W/(oceanarea*rho_water);
+	bslrhydro = rho_freshwater*area*phi*W/(oceanarea*rho_water);
+	_assert_(!xIsNan<IssmDouble>(bslrhydro));
 
 	/*convert from m to kg/m^2:*/
@@ -5849,11 +5837,9 @@
 	for(int i=0;i<gsize;i++) Sgi[i]+=G[i]*W;
 
-	/*Assign output pointer:*/
-	_assert_(!xIsNan<IssmDouble>(eustatic));
-	*peustatic=eustatic; //do not forget the +, otherwise, you'll wipe out previous eustatic contributions!
-	return;
-}
-/*}}}*/
-void    Tria::SealevelriseBottomPressure(IssmDouble* Sgi,SealevelMasks* masks){ /*{{{*/
+	/*output:*/
+	return bslrhydro;
+}
+/*}}}*/
+void    Tria::SealevelriseEustaticBottomPressure(IssmDouble* Sgi,SealevelMasks* masks){ /*{{{*/
 
 	/*diverse:*/
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.h	(revision 25534)
@@ -166,8 +166,7 @@
 		void    SetSealevelMasks(SealevelMasks* masks);
 		void    SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz);
-		void    SealevelriseEustatic(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks, IssmDouble oceanarea);
-		void    SealevelriseEustaticIce(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks, IssmDouble oceanarea);
-		void    SealevelriseEustaticHydro(IssmDouble* Sgi, IssmDouble* peustatic,SealevelMasks* masks, IssmDouble oceanarea);
-		void    SealevelriseBottomPressure(IssmDouble* Sgi,SealevelMasks* masks);
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea);
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea);
+		void    SealevelriseEustaticBottomPressure(IssmDouble* Sgi,SealevelMasks* masks);
 		void    SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,SealevelMasks* masks);
 		void    SealevelriseGeodetic(IssmDouble* Up, IssmDouble* North, IssmDouble* East, IssmDouble* Sg,SealevelMasks* masks);
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.cpp	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.cpp	(revision 25534)
@@ -4706,13 +4706,15 @@
 #endif
 #ifdef _HAVE_SEALEVELRISE_
-void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* peustatic, SealevelMasks* masks) { /*{{{*/
+void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* pbslr,IssmDouble* pbslrice, IssmDouble* pbslrhydro, SealevelMasks* masks) { /*{{{*/
 
 	/*serialized vectors:*/
-	IssmDouble  eustatic       = 0.;
-	IssmDouble  eustatic_cpu   = 0.;
-	IssmDouble  eustatic_cpu_e = 0.;
+	IssmDouble  bslrice       = 0.;
+	IssmDouble  bslrice_cpu   = 0.;
+	IssmDouble  bslrhydro       = 0.;
+	IssmDouble  bslrhydro_cpu   = 0.;
 	IssmDouble  area      = 0.;
 	IssmDouble  oceanarea      = 0.;
 	IssmDouble  oceanarea_cpu  = 0.;
+	int bp_compute_fingerprints= 0;
 
    /*Initialize temporary vector that will be used to sum eustatic components
@@ -4733,9 +4735,25 @@
 	_assert_(oceanarea>0.);
 
-	/*Call the sea level rise core: */
+	/*Call the sea level rise core for ice : */
+	bslrice_cpu=0;
 	for(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		element->SealevelriseEustatic(RSLgi,&eustatic_cpu_e,masks, oceanarea);
-		eustatic_cpu+=eustatic_cpu_e;
+		bslrice_cpu+=element->SealevelriseEustaticIce(RSLgi,masks, oceanarea);
+	}
+
+	/*Call the sea level rise core for hydro: */
+	bslrhydro_cpu=0;
+	for(int i=0;i<elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+		bslrhydro_cpu+=element->SealevelriseEustaticHydro(RSLgi,masks, oceanarea);
+	}
+
+	/*Call the sea level rise core for bottom pressures: */
+	this->parameters->FindParam(&bp_compute_fingerprints,DslComputeFingerprintsEnum);
+	if(bp_compute_fingerprints){
+		for(int i=0;i<elements->Size();i++){
+			Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+			element->SealevelriseEustaticBottomPressure(RSLgi,masks);
+		}
 	}
 
@@ -4745,7 +4763,11 @@
 
 	/*Sum all eustatic components from all cpus:*/
-	ISSM_MPI_Reduce (&eustatic_cpu,&eustatic,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
-	ISSM_MPI_Bcast(&eustatic,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-	_assert_(!xIsNan<IssmDouble>(eustatic));
+	ISSM_MPI_Reduce (&bslrice_cpu,&bslrice,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&bslrice,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	_assert_(!xIsNan<IssmDouble>(bslrice));
+
+	ISSM_MPI_Reduce (&bslrhydro_cpu,&bslrhydro,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&bslrhydro,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	_assert_(!xIsNan<IssmDouble>(bslrhydro));
 
 	/*Free ressources:*/
@@ -4755,5 +4777,7 @@
 	/*Assign output pointers:*/
 	*poceanarea = oceanarea;
-	*peustatic  = eustatic;
+	*pbslrice  = bslrice;
+	*pbslrhydro  = bslrhydro;
+	*pbslr=bslrhydro+bslrice;
 
 }
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.h	(revision 25534)
@@ -164,5 +164,5 @@
 		#endif
 		#ifdef _HAVE_SEALEVELRISE_
-		void SealevelriseEustatic(Vector<IssmDouble>* pSgi, IssmDouble* poceanarea, IssmDouble* peustatic, SealevelMasks* masks);
+		void SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* pbslr,IssmDouble* pbslrice, IssmDouble* pbslrhydro, SealevelMasks* masks); 
 		void SealevelriseNonEustatic(Vector<IssmDouble>* pSgo, Vector<IssmDouble>* pSg_old,  SealevelMasks* masks,bool verboseconvolution);
 		void SealevelriseRotationalFeedback(Vector<IssmDouble>* pRSLgo_rot, Vector<IssmDouble>* pRSLg_old, IssmDouble* pIxz, IssmDouble* pIyz, IssmDouble* pIzz, SealevelMasks* masks);
Index: /issm/branches/trunk-larour-SLPS2020/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/cores/sealevelchange_core.cpp	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/cores/sealevelchange_core.cpp	(revision 25534)
@@ -413,10 +413,14 @@
 	IssmDouble time;
 
-	/*outputs:*/
-	IssmDouble eustatic;
+	/*barystatic contribution:*/
+	IssmDouble bslr;
+	IssmDouble bslrice;
+	IssmDouble bslrhydro;
+	IssmDouble cumbslr;
+	IssmDouble cumbslrice;
+	IssmDouble cumbslrhydro;
 	
-	if(VerboseSolution()) _printf0_("	  computing eustatic components on ice\n");
-
-	
+	if(VerboseSolution()) _printf0_("	  computing bslr components on ice\n");
+
 	/*Figure out size of g-set deflection vector and allocate solution vector: */
 	gsize = femmodel->nodes->NumberOfDofs(GsetEnum);
@@ -425,21 +429,38 @@
 	femmodel->parameters->FindParam(&step,StepEnum);
 	femmodel->parameters->FindParam(&time,TimeEnum);
+	femmodel->parameters->FindParam(&cumbslr,CumBslrEnum);
+	femmodel->parameters->FindParam(&cumbslrice,CumBslrIceEnum);
+	femmodel->parameters->FindParam(&cumbslrhydro,CumBslrHydroEnum);
 
 	/*Initialize:*/
 	RSLgi = new Vector<IssmDouble>(gsize);
 
-	/*call the eustatic main module: */
-	femmodel->SealevelriseEustatic(RSLgi,&oceanarea,&eustatic, masks); //this computes 
+	/*call the bslr main module: */
+	femmodel->SealevelriseEustatic(RSLgi,&oceanarea,&bslr, &bslrice, &bslrhydro, masks); //this computes 
 
 	/*we need to average RSLgi over the ocean: RHS term  4 in Eq.4 of Farrel and clarke. Only the elements can do that: */
 	RSLgi_oceanaverage=femmodel->SealevelriseOceanAverage(RSLgi,masks, oceanarea);
 
-	/*RSLg is the sum of the pure eustatic component (term 3) and the contribution from the perturbation to the graviation potential due to the 
+	/*RSLg is the sum of the pure bslr component (term 3) and the contribution from the perturbation to the graviation potential due to the 
 	 * presence of ice (terms 1 and 4 in Eq.4 of Farrel and Clarke):*/
-	RSLgi->Shift(-eustatic-RSLgi_oceanaverage);
-
-	/*save eustatic value for results: */
-	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,SealevelRSLEustaticEnum,-eustatic,step,time));
-
+	RSLgi->Shift(-bslr-RSLgi_oceanaverage);
+
+	/*save bslr and cumulated bslr value for results:{{{ */
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,BslrEnum,-bslr,step,time));
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,BslrIceEnum,-bslrice,step,time));
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,BslrHydroEnum,-bslrhydro,step,time));
+
+	cumbslr=cumbslr-bslr;
+	cumbslrice=cumbslrice-bslrice;
+	cumbslrhydro=cumbslrhydro-bslrhydro;
+	femmodel->parameters->SetParam(cumbslr,CumBslrEnum);
+	femmodel->parameters->SetParam(cumbslrice,CumBslrIceEnum);
+	femmodel->parameters->SetParam(cumbslrhydro,CumBslrHydroEnum);
+
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,CumBslrEnum,cumbslr,step,time));
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,CumBslrIceEnum,cumbslrice,step,time));
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,CumBslrHydroEnum,cumbslrhydro,step,time));
+	/*}}}*/
+	
 	/*Assign output pointers and return: */
 	*poceanarea=oceanarea;
@@ -468,5 +489,4 @@
 	IssmDouble           eps_rel;
 	IssmDouble           eps_abs;
-	IssmDouble           eustatic;
 	IssmDouble			Ixz, Iyz, Izz; 
 	
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/Enum.vim	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/Enum.vim	(revision 25534)
@@ -112,4 +112,7 @@
 syn keyword cConstant ControlInputSizeNEnum
 syn keyword cConstant ControlInputInterpolationEnum
+syn keyword cConstant CumBslrEnum
+syn keyword cConstant CumBslrIceEnum
+syn keyword cConstant CumBslrHydroEnum
 syn keyword cConstant DamageC1Enum
 syn keyword cConstant DamageC2Enum
@@ -315,5 +318,4 @@
 syn keyword cConstant SolidearthPlanetRadiusEnum
 syn keyword cConstant SolidearthPlanetAreaEnum
-syn keyword cConstant SealevelEustaticEnum
 syn keyword cConstant SolidearthSettingsAbstolEnum
 syn keyword cConstant RotationalAngularVelocityEnum
@@ -690,6 +692,9 @@
 syn keyword cConstant SealevelNEsaRateEnum
 syn keyword cConstant SealevelRSLEnum
+syn keyword cConstant BslrEnum
+syn keyword cConstant BslrIceEnum
+syn keyword cConstant BslrHydroEnum
+syn keyword cConstant BslrRateEnum
 syn keyword cConstant SealevelRSLEustaticEnum
-syn keyword cConstant SealevelRSLEustaticRateEnum
 syn keyword cConstant SealevelRSLRateEnum
 syn keyword cConstant SealevelUEastEsaEnum
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumDefinitions.h	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumDefinitions.h	(revision 25534)
@@ -106,4 +106,7 @@
 	ControlInputSizeNEnum,
 	ControlInputInterpolationEnum,
+	CumBslrEnum,
+	CumBslrIceEnum,
+	CumBslrHydroEnum,
 	DamageC1Enum,
 	DamageC2Enum,
@@ -309,5 +312,4 @@
 	SolidearthPlanetRadiusEnum,
 	SolidearthPlanetAreaEnum,
-	SealevelEustaticEnum,
 	SolidearthSettingsAbstolEnum,
 	RotationalAngularVelocityEnum,
@@ -686,6 +688,9 @@
 	SealevelNEsaRateEnum,
 	SealevelRSLEnum,
+	BslrEnum,
+	BslrIceEnum,
+	BslrHydroEnum,
+	BslrRateEnum,
 	SealevelRSLEustaticEnum,
-	SealevelRSLEustaticRateEnum,
 	SealevelRSLRateEnum,
 	SealevelUEastEsaEnum,
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumToStringx.cpp	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumToStringx.cpp	(revision 25534)
@@ -114,4 +114,7 @@
 		case ControlInputSizeNEnum : return "ControlInputSizeN";
 		case ControlInputInterpolationEnum : return "ControlInputInterpolation";
+		case CumBslrEnum : return "CumBslr";
+		case CumBslrIceEnum : return "CumBslrIce";
+		case CumBslrHydroEnum : return "CumBslrHydro";
 		case DamageC1Enum : return "DamageC1";
 		case DamageC2Enum : return "DamageC2";
@@ -317,5 +320,4 @@
 		case SolidearthPlanetRadiusEnum : return "SolidearthPlanetRadius";
 		case SolidearthPlanetAreaEnum : return "SolidearthPlanetArea";
-		case SealevelEustaticEnum : return "SealevelEustatic";
 		case SolidearthSettingsAbstolEnum : return "SolidearthSettingsAbstol";
 		case RotationalAngularVelocityEnum : return "RotationalAngularVelocity";
@@ -692,6 +694,9 @@
 		case SealevelNEsaRateEnum : return "SealevelNEsaRate";
 		case SealevelRSLEnum : return "SealevelRSL";
+		case BslrEnum : return "Bslr";
+		case BslrIceEnum : return "BslrIce";
+		case BslrHydroEnum : return "BslrHydro";
+		case BslrRateEnum : return "BslrRate";
 		case SealevelRSLEustaticEnum : return "SealevelRSLEustatic";
-		case SealevelRSLEustaticRateEnum : return "SealevelRSLEustaticRate";
 		case SealevelRSLRateEnum : return "SealevelRSLRate";
 		case SealevelUEastEsaEnum : return "SealevelUEastEsa";
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/StringToEnumx.cpp	(revision 25533)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/StringToEnumx.cpp	(revision 25534)
@@ -114,4 +114,7 @@
 	      else if (strcmp(name,"ControlInputSizeN")==0) return ControlInputSizeNEnum;
 	      else if (strcmp(name,"ControlInputInterpolation")==0) return ControlInputInterpolationEnum;
+	      else if (strcmp(name,"CumBslr")==0) return CumBslrEnum;
+	      else if (strcmp(name,"CumBslrIce")==0) return CumBslrIceEnum;
+	      else if (strcmp(name,"CumBslrHydro")==0) return CumBslrHydroEnum;
 	      else if (strcmp(name,"DamageC1")==0) return DamageC1Enum;
 	      else if (strcmp(name,"DamageC2")==0) return DamageC2Enum;
@@ -134,11 +137,11 @@
 	      else if (strcmp(name,"DslModel")==0) return DslModelEnum;
 	      else if (strcmp(name,"DslModelid")==0) return DslModelidEnum;
-	      else if (strcmp(name,"DslNummodels")==0) return DslNummodelsEnum;
-	      else if (strcmp(name,"DslComputeFingerprints")==0) return DslComputeFingerprintsEnum;
-	      else if (strcmp(name,"EarthId")==0) return EarthIdEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum;
+	      if (strcmp(name,"DslNummodels")==0) return DslNummodelsEnum;
+	      else if (strcmp(name,"DslComputeFingerprints")==0) return DslComputeFingerprintsEnum;
+	      else if (strcmp(name,"EarthId")==0) return EarthIdEnum;
+	      else if (strcmp(name,"EplZigZagCounter")==0) return EplZigZagCounterEnum;
 	      else if (strcmp(name,"EsaHElastic")==0) return EsaHElasticEnum;
 	      else if (strcmp(name,"EsaHemisphere")==0) return EsaHemisphereEnum;
@@ -257,11 +260,11 @@
 	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
 	      else if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
-	      else if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum;
-	      else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum;
-	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum;
+	      if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum;
+	      else if (strcmp(name,"MasstransportMinThickness")==0) return MasstransportMinThicknessEnum;
+	      else if (strcmp(name,"MasstransportNumRequestedOutputs")==0) return MasstransportNumRequestedOutputsEnum;
+	      else if (strcmp(name,"MasstransportPenaltyFactor")==0) return MasstransportPenaltyFactorEnum;
 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
@@ -323,5 +326,4 @@
 	      else if (strcmp(name,"SolidearthPlanetRadius")==0) return SolidearthPlanetRadiusEnum;
 	      else if (strcmp(name,"SolidearthPlanetArea")==0) return SolidearthPlanetAreaEnum;
-	      else if (strcmp(name,"SealevelEustatic")==0) return SealevelEustaticEnum;
 	      else if (strcmp(name,"SolidearthSettingsAbstol")==0) return SolidearthSettingsAbstolEnum;
 	      else if (strcmp(name,"RotationalAngularVelocity")==0) return RotationalAngularVelocityEnum;
@@ -381,10 +383,10 @@
 	      else if (strcmp(name,"SmbIsaccumulation")==0) return SmbIsaccumulationEnum;
 	      else if (strcmp(name,"SmbIsalbedo")==0) return SmbIsalbedoEnum;
-	      else if (strcmp(name,"SmbIsclimatology")==0) return SmbIsclimatologyEnum;
-	      else if (strcmp(name,"SmbIsconstrainsurfaceT")==0) return SmbIsconstrainsurfaceTEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SmbIsd18opd")==0) return SmbIsd18opdEnum;
+	      if (strcmp(name,"SmbIsclimatology")==0) return SmbIsclimatologyEnum;
+	      else if (strcmp(name,"SmbIsconstrainsurfaceT")==0) return SmbIsconstrainsurfaceTEnum;
+	      else if (strcmp(name,"SmbIsd18opd")==0) return SmbIsd18opdEnum;
 	      else if (strcmp(name,"SmbIsdelta18o")==0) return SmbIsdelta18oEnum;
 	      else if (strcmp(name,"SmbIsdensification")==0) return SmbIsdensificationEnum;
@@ -504,10 +506,10 @@
 	      else if (strcmp(name,"BasalforcingsIsmip6TfShelf")==0) return BasalforcingsIsmip6TfShelfEnum;
 	      else if (strcmp(name,"BasalforcingsIsmip6MeltAnomaly")==0) return BasalforcingsIsmip6MeltAnomalyEnum;
-	      else if (strcmp(name,"BasalforcingsOceanSalinity")==0) return BasalforcingsOceanSalinityEnum;
-	      else if (strcmp(name,"BasalforcingsOceanTemp")==0) return BasalforcingsOceanTempEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"BasalforcingsPicoBasinId")==0) return BasalforcingsPicoBasinIdEnum;
+	      if (strcmp(name,"BasalforcingsOceanSalinity")==0) return BasalforcingsOceanSalinityEnum;
+	      else if (strcmp(name,"BasalforcingsOceanTemp")==0) return BasalforcingsOceanTempEnum;
+	      else if (strcmp(name,"BasalforcingsPicoBasinId")==0) return BasalforcingsPicoBasinIdEnum;
 	      else if (strcmp(name,"BasalforcingsPicoBoxId")==0) return BasalforcingsPicoBoxIdEnum;
 	      else if (strcmp(name,"BasalforcingsPicoOverturningCoeff")==0) return BasalforcingsPicoOverturningCoeffEnum;
@@ -627,10 +629,10 @@
 	      else if (strcmp(name,"HydrologydcBasalMoulinInput")==0) return HydrologydcBasalMoulinInputEnum;
 	      else if (strcmp(name,"HydrologydcEplThickness")==0) return HydrologydcEplThicknessEnum;
-	      else if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
-	      else if (strcmp(name,"HydrologydcEplThicknessSubstep")==0) return HydrologydcEplThicknessSubstepEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"HydrologydcEplThicknessTransient")==0) return HydrologydcEplThicknessTransientEnum;
+	      if (strcmp(name,"HydrologydcEplThicknessOld")==0) return HydrologydcEplThicknessOldEnum;
+	      else if (strcmp(name,"HydrologydcEplThicknessSubstep")==0) return HydrologydcEplThicknessSubstepEnum;
+	      else if (strcmp(name,"HydrologydcEplThicknessTransient")==0) return HydrologydcEplThicknessTransientEnum;
 	      else if (strcmp(name,"HydrologydcMaskEplactiveElt")==0) return HydrologydcMaskEplactiveEltEnum;
 	      else if (strcmp(name,"HydrologydcMaskEplactiveNode")==0) return HydrologydcMaskEplactiveNodeEnum;
@@ -707,6 +709,9 @@
 	      else if (strcmp(name,"SealevelNEsaRate")==0) return SealevelNEsaRateEnum;
 	      else if (strcmp(name,"SealevelRSL")==0) return SealevelRSLEnum;
+	      else if (strcmp(name,"Bslr")==0) return BslrEnum;
+	      else if (strcmp(name,"BslrIce")==0) return BslrIceEnum;
+	      else if (strcmp(name,"BslrHydro")==0) return BslrHydroEnum;
+	      else if (strcmp(name,"BslrRate")==0) return BslrRateEnum;
 	      else if (strcmp(name,"SealevelRSLEustatic")==0) return SealevelRSLEustaticEnum;
-	      else if (strcmp(name,"SealevelRSLEustaticRate")==0) return SealevelRSLEustaticRateEnum;
 	      else if (strcmp(name,"SealevelRSLRate")==0) return SealevelRSLRateEnum;
 	      else if (strcmp(name,"SealevelUEastEsa")==0) return SealevelUEastEsaEnum;
@@ -747,13 +752,13 @@
 	      else if (strcmp(name,"SmbDailydsradiation")==0) return SmbDailydsradiationEnum;
 	      else if (strcmp(name,"SmbDailypressure")==0) return SmbDailypressureEnum;
-	      else if (strcmp(name,"SmbDailyrainfall")==0) return SmbDailyrainfallEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"SmbDailyrainfall")==0) return SmbDailyrainfallEnum;
 	      else if (strcmp(name,"SmbDailysnowfall")==0) return SmbDailysnowfallEnum;
 	      else if (strcmp(name,"SmbDailytemperature")==0) return SmbDailytemperatureEnum;
 	      else if (strcmp(name,"SmbDailywindspeed")==0) return SmbDailywindspeedEnum;
 	      else if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"SmbDlwrf")==0) return SmbDlwrfEnum;
+	      else if (strcmp(name,"SmbDlwrf")==0) return SmbDlwrfEnum;
 	      else if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum;
 	      else if (strcmp(name,"SmbDzAdd")==0) return SmbDzAddEnum;
@@ -870,13 +875,13 @@
 	      else if (strcmp(name,"ThicknessAlongGradient")==0) return ThicknessAlongGradientEnum;
 	      else if (strcmp(name,"Thickness")==0) return ThicknessEnum;
-	      else if (strcmp(name,"ThicknessOld")==0) return ThicknessOldEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"ThicknessOld")==0) return ThicknessOldEnum;
 	      else if (strcmp(name,"ThicknessPositive")==0) return ThicknessPositiveEnum;
 	      else if (strcmp(name,"ThicknessResidual")==0) return ThicknessResidualEnum;
 	      else if (strcmp(name,"Vel")==0) return VelEnum;
 	      else if (strcmp(name,"VxAverage")==0) return VxAverageEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"Vx")==0) return VxEnum;
+	      else if (strcmp(name,"Vx")==0) return VxEnum;
 	      else if (strcmp(name,"VxMesh")==0) return VxMeshEnum;
 	      else if (strcmp(name,"VxObs")==0) return VxObsEnum;
@@ -993,13 +998,13 @@
 	      else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
 	      else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
-	      else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
 	      else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
 	      else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
 	      else if (strcmp(name,"Outputdefinition100")==0) return Outputdefinition100Enum;
 	      else if (strcmp(name,"InputsEND")==0) return InputsENDEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"Absolute")==0) return AbsoluteEnum;
+	      else if (strcmp(name,"Absolute")==0) return AbsoluteEnum;
 	      else if (strcmp(name,"AdaptiveTimestepping")==0) return AdaptiveTimesteppingEnum;
 	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
@@ -1116,13 +1121,13 @@
 	      else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
-	      else if (strcmp(name,"GenericParam")==0) return GenericParamEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"GenericParam")==0) return GenericParamEnum;
 	      else if (strcmp(name,"GiaAnalysis")==0) return GiaAnalysisEnum;
 	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
 	      else if (strcmp(name,"Gradient1")==0) return Gradient1Enum;
 	      else if (strcmp(name,"Gradient2")==0) return Gradient2Enum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"Gradient3")==0) return Gradient3Enum;
+	      else if (strcmp(name,"Gradient3")==0) return Gradient3Enum;
 	      else if (strcmp(name,"GroundedArea")==0) return GroundedAreaEnum;
 	      else if (strcmp(name,"GroundedAreaScaled")==0) return GroundedAreaScaledEnum;
@@ -1239,13 +1244,13 @@
 	      else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
 	      else if (strcmp(name,"None")==0) return NoneEnum;
-	      else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
+         else stage=11;
+   }
+   if(stage==11){
+	      if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
 	      else if (strcmp(name,"NyeCO2")==0) return NyeCO2Enum;
 	      else if (strcmp(name,"NyeH2O")==0) return NyeH2OEnum;
 	      else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
 	      else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
-         else stage=11;
-   }
-   if(stage==11){
-	      if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
+	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
 	      else if (strcmp(name,"Open")==0) return OpenEnum;
 	      else if (strcmp(name,"Option")==0) return OptionEnum;
@@ -1362,13 +1367,13 @@
 	      else if (strcmp(name,"UzawaPressureAnalysis")==0) return UzawaPressureAnalysisEnum;
 	      else if (strcmp(name,"VectorParam")==0) return VectorParamEnum;
-	      else if (strcmp(name,"Vertex")==0) return VertexEnum;
+         else stage=12;
+   }
+   if(stage==12){
+	      if (strcmp(name,"Vertex")==0) return VertexEnum;
 	      else if (strcmp(name,"VertexLId")==0) return VertexLIdEnum;
 	      else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum;
 	      else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
 	      else if (strcmp(name,"Vertices")==0) return VerticesEnum;
-         else stage=12;
-   }
-   if(stage==12){
-	      if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum;
+	      else if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum;
 	      else if (strcmp(name,"Water")==0) return WaterEnum;
 	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
