Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 25752)
@@ -377,6 +377,6 @@
 		virtual IssmDouble    OceanAverage(IssmDouble* Sg, SealevelMasks* masks)=0;
 		virtual void          SealevelriseMomentOfInertia(IssmDouble* dI_list,IssmDouble* Sg_old, SealevelMasks* masks)=0;
-		virtual IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks,IssmDouble oceanarea)=0;
-		virtual IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks,IssmDouble oceanarea)=0;
+		virtual IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks,Vector<IssmDouble>* barystatic_contribution,IssmDouble* partition,IssmDouble oceanarea)=0;
+		virtual IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks,Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, 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;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 25752)
@@ -217,6 +217,6 @@
 		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!");};
-		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
-		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition,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!");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 25752)
@@ -173,6 +173,6 @@
 		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!");};
-		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
-		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition,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!");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 25752)
@@ -179,6 +179,6 @@
 		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!");};
-		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
-		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, IssmDouble oceanarea){_error_("not implemented yet!");};
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition,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!");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 25752)
@@ -5520,5 +5520,5 @@
 		/*Rigid earth gravitational perturbation: */
 		G[i]+=G_rigid_precomputed[index];
-		if(elastic) G[i]+=G_elastic_precomputed[index];
+		if(computeelastic) G[i]+=G_elastic_precomputed[index];
 		G[i]=G[i]*constant;
 
@@ -5570,5 +5570,5 @@
 	#else
 	xDelete(G);
-	if(elastic){
+	if(computeelastic){
 		xDelete(GU);
 		if(horiz){
@@ -5582,5 +5582,5 @@
 }
 /*}}}*/
-IssmDouble Tria::SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
+IssmDouble Tria::SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, IssmDouble oceanarea){ /*{{{*/
 
 	/*diverse:*/
@@ -5654,5 +5654,5 @@
 		if(glfraction==0)phi=1;
 		#ifdef _ISSM_DEBUG_
-		this->AddInput2(SealevelEustaticMaskEnum,&phi,P0Enum);
+		this->AddInput(SealevelEustaticMaskEnum,&phi,P0Enum);
 		#endif
 	}
@@ -5712,5 +5712,5 @@
 }
 /*}}}*/
-IssmDouble Tria::SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea){ /*{{{*/
+IssmDouble Tria::SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, IssmDouble oceanarea){ /*{{{*/
 
 	/*diverse:*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 25752)
@@ -165,6 +165,6 @@
 		void    SetSealevelMasks(SealevelMasks* masks);
 		void    SealevelriseGeometry(IssmDouble* latitude,IssmDouble* longitude,IssmDouble* radius, IssmDouble* xx, IssmDouble* yy, IssmDouble* zz);
-		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea);
-		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, IssmDouble oceanarea);
+		IssmDouble    SealevelriseEustaticIce(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition, IssmDouble oceanarea);
+		IssmDouble    SealevelriseEustaticHydro(IssmDouble* Sgi, SealevelMasks* masks, Vector<IssmDouble>* barystatic_contribution, IssmDouble* partition,IssmDouble oceanarea);
 		void    SealevelriseEustaticBottomPressure(IssmDouble* Sgi,SealevelMasks* masks);
 		void    SealevelriseNonEustatic(IssmDouble* Sgo,IssmDouble* Sg_old,SealevelMasks* masks);
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 25752)
@@ -4748,5 +4748,5 @@
 #endif
 #ifdef _HAVE_SEALEVELRISE_
-void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* pbslr,IssmDouble* pbslrice, IssmDouble* pbslrhydro, SealevelMasks* masks) { /*{{{*/
+void FemModel::SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* pbslr,IssmDouble* pbslrice, IssmDouble* pbslrhydro, IssmDouble** pbslrice_partition,IssmDouble** pbslrhydro_partition,SealevelMasks* masks) { /*{{{*/
 
 	/*serialized vectors:*/
@@ -4760,4 +4760,15 @@
 	int bp_compute_fingerprints= 0;
 
+	Vector<IssmDouble>* bslrice_partition=NULL;
+	IssmDouble* bslrice_partition_serial=NULL;
+	IssmDouble* partitionice=NULL;
+	int npartice,nel; 
+
+	Vector<IssmDouble>* bslrhydro_partition=NULL;
+	IssmDouble* bslrhydro_partition_serial=NULL;
+	IssmDouble* partitionhydro=NULL;
+	int nparthydro; 
+		
+
    /*Initialize temporary vector that will be used to sum eustatic components
     * on all local elements, prior to assembly:*/
@@ -4779,9 +4790,23 @@
 	_assert_(oceanarea>0.);
 
+	/*Initialize partition vectors to retrieve barystatic contributions: */
+	this->parameters->FindParam(&npartice,SolidearthNpartIceEnum);
+	if(npartice){
+		this->parameters->FindParam(&partitionice,&nel,NULL,SolidearthPartitionIceEnum);
+		bslrice_partition= new Vector<IssmDouble>(npartice);
+	}
+
+	this->parameters->FindParam(&nparthydro,SolidearthNpartHydroEnum);
+	if(nparthydro){
+		this->parameters->FindParam(&partitionhydro,&nel,NULL,SolidearthPartitionHydroEnum);
+		bslrhydro_partition= new Vector<IssmDouble>(nparthydro);
+	}
+
+
 	/*Call the sea level rise core for ice : */
 	bslrice_cpu=0;
 	for(Object* & object : this->elements->objects){
 		Element* element = xDynamicCast<Element*>(object);
-		bslrice_cpu+=element->SealevelriseEustaticIce(RSLgi,masks, oceanarea);
+		bslrice_cpu+=element->SealevelriseEustaticIce(RSLgi,masks, bslrice_partition,partitionice,oceanarea);
 	}
 
@@ -4790,5 +4815,5 @@
 	for(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		bslrhydro_cpu+=element->SealevelriseEustaticHydro(RSLgi,masks, oceanarea);
+		bslrhydro_cpu+=element->SealevelriseEustaticHydro(RSLgi,masks, bslrhydro_partition,partitionhydro,oceanarea);
 	}
 
@@ -4815,7 +4840,22 @@
 	_assert_(!xIsNan<IssmDouble>(bslrhydro));
 
+	/*Take care of partition vectors:*/
+	if(bslrice_partition){
+		bslrice_partition->Assemble();
+		bslrice_partition_serial=bslrice_partition->ToMPISerial();
+	}
+	if(bslrhydro_partition){
+		bslrhydro_partition->Assemble();
+		bslrhydro_partition_serial=bslrhydro_partition->ToMPISerial();
+	}
+
+
 	/*Free ressources:*/
 	xDelete<int>(indices);
 	xDelete<IssmDouble>(RSLgi);
+	if(bslrhydro_partition)delete bslrhydro_partition;
+	if(bslrice_partition)delete bslrice_partition;
+	if(partitionhydro)xDelete<IssmDouble>(partitionhydro);
+	if(partitionice)xDelete<IssmDouble>(partitionice);
 
 	/*Assign output pointers:*/
@@ -4824,4 +4864,6 @@
 	*pbslrhydro  = bslrhydro;
 	*pbslr=bslrhydro+bslrice;
+	*pbslrice_partition=bslrice_partition_serial;
+	*pbslrhydro_partition=bslrhydro_partition_serial;
 
 }
@@ -4837,4 +4879,5 @@
 
 	bool computerigid = true;
+	bool computeelastic= true;
 
 	/*recover computational flags: */
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 25751)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 25752)
@@ -166,5 +166,5 @@
 		#endif
 		#ifdef _HAVE_SEALEVELRISE_
-		void SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* pbslr,IssmDouble* pbslrice, IssmDouble* pbslrhydro, SealevelMasks* masks); 
+		void SealevelriseEustatic(Vector<IssmDouble>* pRSLgi, IssmDouble* poceanarea, IssmDouble* pbslr,IssmDouble* pbslrice, IssmDouble* pbslrhydro, IssmDouble** pbslrice_partition,IssmDouble** pbslrhydro_partition, 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/trunk-jpl/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 25751)
+++ /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 25752)
@@ -40,4 +40,7 @@
 	if(!isslr)return;
 
+	/*Verbose: */
+	if(VerboseSolution()) _printf0_("   computing sea level rise\n");
+
 	/*Run gia core: */
 	if(isgia){
@@ -65,4 +68,5 @@
 		int     numoutputs;
 		char **requested_outputs = NULL;
+		if(VerboseSolution()) _printf0_("   saving results\n");
 		femmodel->parameters->FindParam(&requested_outputs,&numoutputs,SealevelriseRequestedOutputsEnum);
 		femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs);
@@ -430,8 +434,14 @@
 	IssmDouble bslr;
 	IssmDouble bslrice;
+	IssmDouble* bslrice_partition=NULL;
 	IssmDouble bslrhydro;
+	IssmDouble* bslrhydro_partition=NULL;
 	IssmDouble cumbslr;
 	IssmDouble cumbslrice;
 	IssmDouble cumbslrhydro;
+	IssmDouble* cumbslrice_partition=NULL;
+	int npartice;
+	IssmDouble* cumbslrhydro_partition=NULL;
+	int nparthydro;
 	
 	if(VerboseSolution()) _printf0_("	  computing bslr components on ice\n");
@@ -446,4 +456,8 @@
 	femmodel->parameters->FindParam(&cumbslrice,CumBslrIceEnum);
 	femmodel->parameters->FindParam(&cumbslrhydro,CumBslrHydroEnum);
+	femmodel->parameters->FindParam(&npartice,SolidearthNpartIceEnum);
+	femmodel->parameters->FindParam(&nparthydro,SolidearthNpartHydroEnum);
+	if(npartice) femmodel->parameters->FindParam(&cumbslrice_partition,&npartice,NULL,CumBslrIcePartitionEnum);
+	if(nparthydro) femmodel->parameters->FindParam(&cumbslrhydro_partition,&nparthydro,NULL,CumBslrHydroPartitionEnum);
 
 	/*Initialize:*/
@@ -451,5 +465,5 @@
 
 	/*call the bslr main module: */
-	femmodel->SealevelriseEustatic(RSLgi,&oceanarea,&bslr, &bslrice, &bslrhydro, masks); //this computes 
+	femmodel->SealevelriseEustatic(RSLgi,&oceanarea,&bslr, &bslrice, &bslrhydro, &bslrice_partition, &bslrhydro_partition,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: */
@@ -465,7 +479,9 @@
 	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,BslrHydroEnum,-bslrhydro,step,time));
 
+	//cumulative barystatic contribution: 
 	cumbslr=cumbslr-bslr;
 	cumbslrice=cumbslrice-bslrice;
 	cumbslrhydro=cumbslrhydro-bslrhydro;
+
 	femmodel->parameters->SetParam(cumbslr,CumBslrEnum);
 	femmodel->parameters->SetParam(cumbslrice,CumBslrIceEnum);
@@ -474,5 +490,18 @@
 	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));
+	femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,CumBslrHydroEnum,cumbslrhydro,step,time))
+
+	//cumulative barystatic contributions by partition:
+	if(npartice){
+		for(int i=0;i<npartice;i++) cumbslrice_partition[i] -= bslrice_partition[i];
+		femmodel->parameters->SetParam(cumbslrice_partition,npartice,1,CumBslrIcePartitionEnum);
+		femmodel->results->AddResult(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,CumBslrIcePartitionEnum,cumbslrice_partition,npartice,1,step,time));
+	}
+
+	if(nparthydro){
+		for(int i=0;i<nparthydro;i++) cumbslrhydro_partition[i] -= bslrhydro_partition[i];
+		femmodel->parameters->SetParam(cumbslrhydro_partition,nparthydro,1,CumBslrHydroPartitionEnum);
+		femmodel->results->AddResult(new GenericExternalResult<IssmPDouble*>(femmodel->results->Size()+1,CumBslrHydroPartitionEnum,cumbslrhydro_partition,nparthydro,1,step,time));
+	}
 	/*}}}*/
 	
