Index: /issm/branches/trunk-larour-SLPS2020/src/c/analyses/SealevelriseAnalysis.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25742)
@@ -185,4 +185,10 @@
 	int         *transitions_N    = NULL;
 	int          ntransitions;
+	IssmDouble*  partitionice=NULL;
+	IssmDouble*  partitionhydro=NULL;
+	IssmDouble*  bslrice_partition=NULL;
+	IssmDouble*  bslrhydro_partition=NULL;
+	int          npartice,nparthydro,nel;
+
 
 	/*some constant parameters: */
@@ -212,4 +218,27 @@
 	planetarea=4*PI*planetradius*planetradius;
 	parameters->AddObject(new DoubleParam(SolidearthPlanetAreaEnum,planetarea));
+		
+	/*Deal with partition of the barystatic contribution:*/
+	iomodel->FetchData(&npartice,"md.solidearth.npartice");
+	parameters->AddObject(new IntParam(SolidearthNpartIceEnum,npartice));
+	if(npartice){
+		iomodel->FetchData(&partitionice,&nel,NULL,"md.solidearth.partitionice");
+		parameters->AddObject(new DoubleMatParam(SolidearthPartitionIceEnum,partitionice,nel,1));
+		parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.npartice",SolidearthNpartIceEnum));
+		bslrice_partition=xNewZeroInit<IssmDouble>(npartice);
+		parameters->AddObject(new DoubleMatParam(CumBslrIcePartitionEnum,bslrice_partition,npartice,1));
+		xDelete<IssmDouble>(partitionice);
+	}
+	iomodel->FetchData(&nparthydro,"md.solidearth.nparthydro");
+	parameters->AddObject(new IntParam(SolidearthNpartHydroEnum,nparthydro));
+	if(nparthydro){
+		iomodel->FetchData(&partitionhydro,&nel,NULL,"md.solidearth.partitionhydro");
+		parameters->AddObject(new DoubleMatParam(SolidearthPartitionHydroEnum,partitionhydro,nel,1));
+		parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.nparthydro",SolidearthNpartHydroEnum));
+		bslrhydro_partition=xNewZeroInit<IssmDouble>(nparthydro);
+		parameters->AddObject(new DoubleMatParam(CumBslrHydroPartitionEnum,bslrhydro_partition,nparthydro,1));
+		xDelete<IssmDouble>(partitionhydro);
+	}
+
 
 	/*Deal with dsl multi-model ensembles: {{{*/
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Element.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Element.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Element.h	(revision 25742)
@@ -378,6 +378,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/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Penta.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Penta.h	(revision 25742)
@@ -216,6 +216,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/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Seg.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Seg.h	(revision 25742)
@@ -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/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tetra.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tetra.h	(revision 25742)
@@ -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/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.cpp	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.cpp	(revision 25742)
@@ -5655,5 +5655,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:*/
@@ -5726,8 +5726,8 @@
 
 		phi=this->GetGroundedPortion(&xyz_list[0][0]); //watch out, this only works because of the Thales theorem! We are in 3D, but this routine is inherently for 2D trias
+		if(glfraction==0)phi=1;
 		#ifdef _ISSM_DEBUG_
 		this->AddInput2(SealevelEustaticMaskEnum,&phi,P0Enum);
 		#endif
-		if(glfraction==0)phi=1;
 	}
 	else phi=1.0;
@@ -5779,9 +5779,15 @@
 	}
 
+	/*Plug bslrice into barystatic contribution vector:*/
+	if(barystatic_contribution){
+		id=partition[this->Sid()]+1;
+		barystatic_contribution->SetValue(id,bslrice,ADD_VAL);
+	}
+
 	/*return :*/
 	return bslrice;
 }
 /*}}}*/
-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:*/
@@ -5847,4 +5853,10 @@
 		/*convolve:*/
 		for(int i=0;i<gsize;i++) Sgi[i]+=G[i]*W;
+	}
+
+	/*Plug bslrice into barystatic contribution vector:*/
+	if(barystatic_contribution){
+		id=partition[this->Sid()]+1;
+		barystatic_contribution->SetValue(id,bslrhydro,ADD_VAL);
 	}
 
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/Elements/Tria.h	(revision 25742)
@@ -166,6 +166,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/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.cpp	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.cpp	(revision 25742)
@@ -4708,5 +4708,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:*/
@@ -4719,4 +4719,15 @@
 	IssmDouble  oceanarea_cpu  = 0.;
 	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
@@ -4737,16 +4748,31 @@
 	_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(int i=0;i<elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
-		bslrice_cpu+=element->SealevelriseEustaticIce(RSLgi,masks, oceanarea);
-	}
-
+		bslrice_cpu+=element->SealevelriseEustaticIce(RSLgi,masks, bslrice_partition,partitionice,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);
+		bslrhydro_cpu+=element->SealevelriseEustaticHydro(RSLgi,masks, bslrhydro_partition,partitionhydro,oceanarea);
 	}
 
@@ -4773,7 +4799,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:*/
@@ -4782,4 +4823,6 @@
 	*pbslrhydro  = bslrhydro;
 	*pbslr=bslrhydro+bslrice;
+	*pbslrice_partition=bslrice_partition_serial;
+	*pbslrhydro_partition=bslrhydro_partition_serial;
 
 }
Index: /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/classes/FemModel.h	(revision 25742)
@@ -164,5 +164,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/branches/trunk-larour-SLPS2020/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/cores/sealevelchange_core.cpp	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/cores/sealevelchange_core.cpp	(revision 25742)
@@ -435,8 +435,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");
@@ -451,4 +457,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:*/
@@ -456,5 +466,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: */
@@ -470,7 +480,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);
@@ -480,4 +492,17 @@
 	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));
+
+	//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));
+	}
 	/*}}}*/
 	
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/Enum.vim	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/Enum.vim	(revision 25742)
@@ -115,4 +115,6 @@
 syn keyword cConstant CumBslrIceEnum
 syn keyword cConstant CumBslrHydroEnum
+syn keyword cConstant CumBslrIcePartitionEnum
+syn keyword cConstant CumBslrHydroPartitionEnum
 syn keyword cConstant CumGmtslrEnum
 syn keyword cConstant CumGmslrEnum
@@ -325,4 +327,8 @@
 syn keyword cConstant ModelnameEnum
 syn keyword cConstant SaveResultsEnum
+syn keyword cConstant SolidearthPartitionIceEnum
+syn keyword cConstant SolidearthPartitionHydroEnum
+syn keyword cConstant SolidearthNpartIceEnum
+syn keyword cConstant SolidearthNpartHydroEnum
 syn keyword cConstant SolidearthPlanetRadiusEnum
 syn keyword cConstant SolidearthPlanetAreaEnum
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumDefinitions.h	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumDefinitions.h	(revision 25742)
@@ -109,4 +109,6 @@
 	CumBslrIceEnum,
 	CumBslrHydroEnum,
+	CumBslrIcePartitionEnum,
+	CumBslrHydroPartitionEnum,
 	CumGmtslrEnum,
 	CumGmslrEnum,
@@ -319,4 +321,8 @@
 	ModelnameEnum,
 	SaveResultsEnum,
+	SolidearthPartitionIceEnum,
+	SolidearthPartitionHydroEnum,
+	SolidearthNpartIceEnum,
+	SolidearthNpartHydroEnum,
 	SolidearthPlanetRadiusEnum,
 	SolidearthPlanetAreaEnum,
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumToStringx.cpp	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/EnumToStringx.cpp	(revision 25742)
@@ -117,4 +117,6 @@
 		case CumBslrIceEnum : return "CumBslrIce";
 		case CumBslrHydroEnum : return "CumBslrHydro";
+		case CumBslrIcePartitionEnum : return "CumBslrIcePartition";
+		case CumBslrHydroPartitionEnum : return "CumBslrHydroPartition";
 		case CumGmtslrEnum : return "CumGmtslr";
 		case CumGmslrEnum : return "CumGmslr";
@@ -327,4 +329,8 @@
 		case ModelnameEnum : return "Modelname";
 		case SaveResultsEnum : return "SaveResults";
+		case SolidearthPartitionIceEnum : return "SolidearthPartitionIce";
+		case SolidearthPartitionHydroEnum : return "SolidearthPartitionHydro";
+		case SolidearthNpartIceEnum : return "SolidearthNpartIce";
+		case SolidearthNpartHydroEnum : return "SolidearthNpartHydro";
 		case SolidearthPlanetRadiusEnum : return "SolidearthPlanetRadius";
 		case SolidearthPlanetAreaEnum : return "SolidearthPlanetArea";
Index: /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/StringToEnumx.cpp	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/c/shared/Enum/StringToEnumx.cpp	(revision 25742)
@@ -117,4 +117,6 @@
 	      else if (strcmp(name,"CumBslrIce")==0) return CumBslrIceEnum;
 	      else if (strcmp(name,"CumBslrHydro")==0) return CumBslrHydroEnum;
+	      else if (strcmp(name,"CumBslrIcePartition")==0) return CumBslrIcePartitionEnum;
+	      else if (strcmp(name,"CumBslrHydroPartition")==0) return CumBslrHydroPartitionEnum;
 	      else if (strcmp(name,"CumGmtslr")==0) return CumGmtslrEnum;
 	      else if (strcmp(name,"CumGmslr")==0) return CumGmslrEnum;
@@ -135,10 +137,10 @@
 	      else if (strcmp(name,"DamageStressUBound")==0) return DamageStressUBoundEnum;
 	      else if (strcmp(name,"DebugProfiling")==0) return DebugProfilingEnum;
-	      else if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
-	      else if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"DslModel")==0) return DslModelEnum;
+	      if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
+	      else if (strcmp(name,"DomainType")==0) return DomainTypeEnum;
+	      else if (strcmp(name,"DslModel")==0) return DslModelEnum;
 	      else if (strcmp(name,"DslModelid")==0) return DslModelidEnum;
 	      else if (strcmp(name,"DslNummodels")==0) return DslNummodelsEnum;
@@ -258,10 +260,10 @@
 	      else if (strcmp(name,"LoveR0")==0) return LoveR0Enum;
 	      else if (strcmp(name,"LoveShNmax")==0) return LoveShNmaxEnum;
-	      else if (strcmp(name,"LoveShNmin")==0) return LoveShNminEnum;
-	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
+	      if (strcmp(name,"LoveShNmin")==0) return LoveShNminEnum;
+	      else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
+	      else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
 	      else if (strcmp(name,"MasstransportHydrostaticAdjustment")==0) return MasstransportHydrostaticAdjustmentEnum;
 	      else if (strcmp(name,"MasstransportIsfreesurface")==0) return MasstransportIsfreesurfaceEnum;
@@ -333,4 +335,8 @@
 	      else if (strcmp(name,"Modelname")==0) return ModelnameEnum;
 	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+	      else if (strcmp(name,"SolidearthPartitionIce")==0) return SolidearthPartitionIceEnum;
+	      else if (strcmp(name,"SolidearthPartitionHydro")==0) return SolidearthPartitionHydroEnum;
+	      else if (strcmp(name,"SolidearthNpartIce")==0) return SolidearthNpartIceEnum;
+	      else if (strcmp(name,"SolidearthNpartHydro")==0) return SolidearthNpartHydroEnum;
 	      else if (strcmp(name,"SolidearthPlanetRadius")==0) return SolidearthPlanetRadiusEnum;
 	      else if (strcmp(name,"SolidearthPlanetArea")==0) return SolidearthPlanetAreaEnum;
@@ -377,5 +383,8 @@
 	      else if (strcmp(name,"SmbAccualti")==0) return SmbAccualtiEnum;
 	      else if (strcmp(name,"SmbAccugrad")==0) return SmbAccugradEnum;
-	      else if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum;
 	      else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
 	      else if (strcmp(name,"SmbAveraging")==0) return SmbAveragingEnum;
@@ -383,8 +392,5 @@
 	      else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum;
 	      else if (strcmp(name,"SmbDsnowIdx")==0) return SmbDsnowIdxEnum;
-         else stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"SmbCldFrac")==0) return SmbCldFracEnum;
+	      else if (strcmp(name,"SmbCldFrac")==0) return SmbCldFracEnum;
 	      else if (strcmp(name,"SmbDelta18o")==0) return SmbDelta18oEnum;
 	      else if (strcmp(name,"SmbDelta18oSurface")==0) return SmbDelta18oSurfaceEnum;
@@ -500,5 +506,8 @@
 	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
 	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
-	      else if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"Adjointz")==0) return AdjointzEnum;
 	      else if (strcmp(name,"Air")==0) return AirEnum;
 	      else if (strcmp(name,"Approximation")==0) return ApproximationEnum;
@@ -506,8 +515,5 @@
 	      else if (strcmp(name,"BalancethicknessOmega0")==0) return BalancethicknessOmega0Enum;
 	      else if (strcmp(name,"BalancethicknessOmega")==0) return BalancethicknessOmegaEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"BalancethicknessThickeningRate")==0) return BalancethicknessThickeningRateEnum;
+	      else if (strcmp(name,"BalancethicknessThickeningRate")==0) return BalancethicknessThickeningRateEnum;
 	      else if (strcmp(name,"BasalCrevasse")==0) return BasalCrevasseEnum;
 	      else if (strcmp(name,"BasalforcingsFloatingiceMeltingRate")==0) return BasalforcingsFloatingiceMeltingRateEnum;
@@ -623,5 +629,8 @@
 	      else if (strcmp(name,"FrontalForcingsSubglacialDischarge")==0) return FrontalForcingsSubglacialDischargeEnum;
 	      else if (strcmp(name,"FrontalForcingsThermalForcing")==0) return FrontalForcingsThermalForcingEnum;
-	      else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
 	      else if (strcmp(name,"GiaLithosphereThickness")==0) return GiaLithosphereThicknessEnum;
 	      else if (strcmp(name,"GiaMantleViscosity")==0) return GiaMantleViscosityEnum;
@@ -629,8 +638,5 @@
 	      else if (strcmp(name,"NGiaRate")==0) return NGiaRateEnum;
 	      else if (strcmp(name,"UGia")==0) return UGiaEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"UGiaRate")==0) return UGiaRateEnum;
+	      else if (strcmp(name,"UGiaRate")==0) return UGiaRateEnum;
 	      else if (strcmp(name,"Gradient")==0) return GradientEnum;
 	      else if (strcmp(name,"GroundinglineHeight")==0) return GroundinglineHeightEnum;
@@ -746,5 +752,8 @@
 	      else if (strcmp(name,"SedimentHeadResidual")==0) return SedimentHeadResidualEnum;
 	      else if (strcmp(name,"SedimentHeadStacked")==0) return SedimentHeadStackedEnum;
-	      else if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
 	      else if (strcmp(name,"SigmaVM")==0) return SigmaVMEnum;
 	      else if (strcmp(name,"SmbA")==0) return SmbAEnum;
@@ -752,8 +761,5 @@
 	      else if (strcmp(name,"SmbAccumulation")==0) return SmbAccumulationEnum;
 	      else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum;
+	      else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum;
 	      else if (strcmp(name,"SmbBMin")==0) return SmbBMinEnum;
 	      else if (strcmp(name,"SmbBNeg")==0) return SmbBNegEnum;
@@ -869,5 +875,8 @@
 	      else if (strcmp(name,"SurfaceCrevasse")==0) return SurfaceCrevasseEnum;
 	      else if (strcmp(name,"Surface")==0) return SurfaceEnum;
-	      else if (strcmp(name,"SurfaceOld")==0) return SurfaceOldEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"SurfaceOld")==0) return SurfaceOldEnum;
 	      else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
@@ -875,8 +884,5 @@
 	      else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
 	      else if (strcmp(name,"SurfaceSlopeX")==0) return SurfaceSlopeXEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"SurfaceSlopeY")==0) return SurfaceSlopeYEnum;
+	      else if (strcmp(name,"SurfaceSlopeY")==0) return SurfaceSlopeYEnum;
 	      else if (strcmp(name,"Temperature")==0) return TemperatureEnum;
 	      else if (strcmp(name,"TemperaturePDD")==0) return TemperaturePDDEnum;
@@ -992,5 +998,8 @@
 	      else if (strcmp(name,"Outputdefinition80")==0) return Outputdefinition80Enum;
 	      else if (strcmp(name,"Outputdefinition81")==0) return Outputdefinition81Enum;
-	      else if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"Outputdefinition82")==0) return Outputdefinition82Enum;
 	      else if (strcmp(name,"Outputdefinition83")==0) return Outputdefinition83Enum;
 	      else if (strcmp(name,"Outputdefinition84")==0) return Outputdefinition84Enum;
@@ -998,8 +1007,5 @@
 	      else if (strcmp(name,"Outputdefinition86")==0) return Outputdefinition86Enum;
 	      else if (strcmp(name,"Outputdefinition87")==0) return Outputdefinition87Enum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"Outputdefinition88")==0) return Outputdefinition88Enum;
+	      else if (strcmp(name,"Outputdefinition88")==0) return Outputdefinition88Enum;
 	      else if (strcmp(name,"Outputdefinition89")==0) return Outputdefinition89Enum;
 	      else if (strcmp(name,"Outputdefinition8")==0) return Outputdefinition8Enum;
@@ -1115,5 +1121,8 @@
 	      else if (strcmp(name,"FemModel")==0) return FemModelEnum;
 	      else if (strcmp(name,"FileParam")==0) return FileParamEnum;
-	      else if (strcmp(name,"FixedTimestepping")==0) return FixedTimesteppingEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"FixedTimestepping")==0) return FixedTimesteppingEnum;
 	      else if (strcmp(name,"FloatingArea")==0) return FloatingAreaEnum;
 	      else if (strcmp(name,"FloatingAreaScaled")==0) return FloatingAreaScaledEnum;
@@ -1121,8 +1130,5 @@
 	      else if (strcmp(name,"Free")==0) return FreeEnum;
 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
 	      else if (strcmp(name,"FrontalForcingsDefault")==0) return FrontalForcingsDefaultEnum;
 	      else if (strcmp(name,"FrontalForcingsRignot")==0) return FrontalForcingsRignotEnum;
@@ -1238,5 +1244,8 @@
 	      else if (strcmp(name,"MeshX")==0) return MeshXEnum;
 	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
-	      else if (strcmp(name,"MinVel")==0) return MinVelEnum;
+         else stage=11;
+   }
+   if(stage==11){
+	      if (strcmp(name,"MinVel")==0) return MinVelEnum;
 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
 	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
@@ -1244,8 +1253,5 @@
 	      else if (strcmp(name,"MismipFloatingMeltRate")==0) return MismipFloatingMeltRateEnum;
 	      else if (strcmp(name,"Moulin")==0) return MoulinEnum;
-         else stage=11;
-   }
-   if(stage==11){
-	      if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
+	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
 	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
@@ -1361,5 +1367,8 @@
 	      else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
 	      else if (strcmp(name,"ThicknessErrorEstimator")==0) return ThicknessErrorEstimatorEnum;
-	      else if (strcmp(name,"TotalCalvingFluxLevelset")==0) return TotalCalvingFluxLevelsetEnum;
+         else stage=12;
+   }
+   if(stage==12){
+	      if (strcmp(name,"TotalCalvingFluxLevelset")==0) return TotalCalvingFluxLevelsetEnum;
 	      else if (strcmp(name,"TotalCalvingMeltingFluxLevelset")==0) return TotalCalvingMeltingFluxLevelsetEnum;
 	      else if (strcmp(name,"TotalFloatingBmb")==0) return TotalFloatingBmbEnum;
@@ -1367,8 +1376,5 @@
 	      else if (strcmp(name,"TotalGroundedBmb")==0) return TotalGroundedBmbEnum;
 	      else if (strcmp(name,"TotalGroundedBmbScaled")==0) return TotalGroundedBmbScaledEnum;
-         else stage=12;
-   }
-   if(stage==12){
-	      if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
+	      else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
 	      else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
 	      else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
Index: /issm/branches/trunk-larour-SLPS2020/src/m/classes/solidearth.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2020/src/m/classes/solidearth.m	(revision 25741)
+++ /issm/branches/trunk-larour-SLPS2020/src/m/classes/solidearth.m	(revision 25742)
@@ -14,4 +14,6 @@
 		requested_outputs      = {};
 		transitions            = {};
+		partitionice              = [];
+		partitionhydro             = [];
 	end
 	methods
@@ -31,4 +33,8 @@
 		%transitions should be a cell array of vectors: 
 		self.transitions={};
+		
+		%no partitions requested for barystatic contribution: 
+		self.partitionice=[];
+		self.partitionhydro=[];
 
 		%earth radius
@@ -62,4 +68,6 @@
 			fielddisplay(self,'transitions','indices into parts of the mesh that will be icecaps');
 			fielddisplay(self,'requested_outputs','additional outputs requested');
+			fielddisplay(self,'partitionice','ice partition vector for barystatic contribution');
+			fielddisplay(self,'partitionhydro','hydro partition vector for barystatic contribution');
 			self.settings.disp();
 			self.surfaceload.disp();
@@ -73,5 +81,22 @@
 			WriteData(fid,prefix,'object',self,'fieldname','planetradius','format','Double');
 			WriteData(fid,prefix,'object',self,'fieldname','transitions','format','MatArray');
+		
+			if ~isempty(self.partitionice),
+				npartice=max(self.partitionice)+2;
+			else
+				npartice=0;
+			end
+			if ~isempty(self.partitionhydro),
+				nparthydro=max(self.partitionhydro)+2;
+			else
+				nparthydro=0;
+			end
 
+			
+			WriteData(fid,prefix,'object',self,'fieldname','partitionice','mattype',1,'format','DoubleMat');
+			WriteData(fid,prefix,'data',npartice,'format','Integer','name','md.solidearth.npartice');
+			WriteData(fid,prefix,'object',self,'fieldname','partitionhydro','mattype',1,'format','DoubleMat');
+			WriteData(fid,prefix,'data',nparthydro,'format','Integer','name','md.solidearth.nparthydro');
+			
 			self.settings.marshall(prefix,md,fid);
 			self.surfaceload.marshall(prefix,md,fid);
@@ -98,4 +123,5 @@
 			writejscellstring(fid,[modelname '.solidearth.requested_outputs'],self.requested_outputs);
 			writejscellarray(fid,[modelname '.solidearth.transitions'],self.transitions);
+			writejscellarray(fid,[modelname '.solidearth.partition'],self.partition);
 		end % }}}
 		function self = extrude(self,md) % {{{
