Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 27829)
@@ -4318,5 +4318,5 @@
 		_printf0_("smb core: dt       : " << dt <<"\n");
 	}
-	/* loop over vertices and days */ //FIXME account for leap years (365 -> 366)
+	/* loop over vertices and days */
 	Gauss* gauss=this->NewGauss();
 	/* Retrieve inputs: */
@@ -4347,16 +4347,15 @@
 		enum_qmr        =SmbSemicQmrInitEnum;
 	} 
-	if(isverbose && this->Sid()==0)_printf0_("smb core: assign temp.\n");
+	//if(isverbose && this->Sid()==0)_printf0_("smb core: assign temp.\n");
 	Input* tsurf_input       = this->GetInput(enum_temp); _assert_(tsurf_in);
-	if(isverbose && this->Sid()==0)_printf0_("smb core: assign mask.\n");
+	//if(isverbose && this->Sid()==0)_printf0_("smb core: assign mask.\n");
 	Input* mask_input        = this->GetInput(SmbMaskEnum); _assert_(mask_input);
-	if(isverbose && this->Sid()==0)_printf0_("smb core: assign Tamp.\n");
+	//if(isverbose && this->Sid()==0)_printf0_("smb core: assign Tamp.\n");
 	Input* Tamp_input        = this->GetInput(SmbTampEnum); _assert_(Tamp_input);
-	if(isverbose && this->Sid()==0)_printf0_("smb core: assign albedo.\n");
+	//if(isverbose && this->Sid()==0)_printf0_("smb core: assign albedo.\n");
 	Input* albedo_input      = this->GetInput(enum_albedo); _assert_(albedo_input);
 	Input* albedo_snow_input = this->GetInput(enum_albedo_snow); _assert_(albedo_snow_input);
 	Input* hice_input        = this->GetInput(enum_hice); _assert_(hice_input);
 	Input* hsnow_input       = this->GetInput(enum_hsnow); _assert_(hsnow_input);
-	if(isverbose && this->Sid()==0)_printf0_("smb core: assign qmr.\n");
 	Input* qmr_input         = this->GetInput(enum_qmr); _assert_(qmr_input);
 
@@ -4438,11 +4437,10 @@
 		 */
 		smb_out[iv]  = smb_out[iv]*yts;  // w.e. m/sec -> m/yr
-		smbi_out[iv] = smbi_out[iv]*rho_water/rho_ice;
+		smbi_out[iv] = smbi_out[iv]*rho_water/rho_ice; // w.e. m/sec -> ice m/yr
 		smbs_out[iv] = smbs_out[iv]*yts; // w.e. m/sec -> m/yr
 		saccu_out[iv] = saccu_out[iv]*yts; // w.e. m/sec -> m/yr
-	}
-	/*
-	 * unit conversion is not required for smelt and refr_out.
-	 */
+		smelt_out[iv] = smelt_out[iv]*rho_water/rho_ice; // w.e. m/sec -> ice m/yr
+		refr_out[iv]  = refr_out[iv]*rho_water/rho_ice; // w.e. m/sec -> ice m/yr
+	}
 
 	if(isverbose && this->Sid()==0){
@@ -5406,4 +5404,30 @@
 }
 /*}}}*/
+IssmDouble Element::TotalSmbMelt(IssmDouble* mask, bool scaled){/*{{{*/
+
+	/*Retrieve values of the mask defining the element: */
+	for(int i=0;i<this->GetNumberOfVertices();i++){
+		if(mask[this->vertices[i]->Sid()]<=0.){
+			return 0.;
+		}
+	}
+
+	/*Return: */
+	return this->TotalSmbMelt(scaled);
+}
+/*}}}*/
+IssmDouble Element::TotalSmbRefreeze(IssmDouble* mask, bool scaled){/*{{{*/
+
+	/*Retrieve values of the mask defining the element: */
+	for(int i=0;i<this->GetNumberOfVertices();i++){
+		if(mask[this->vertices[i]->Sid()]<=0.){
+			return 0.;
+		}
+	}
+
+	/*Return: */
+	return this->TotalSmbRefreeze(scaled);
+}
+/*}}}*/
 void       Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 27829)
@@ -202,4 +202,6 @@
 		IssmDouble         TotalGroundedBmb(IssmDouble* mask, bool scaled);
 		IssmDouble         TotalSmb(IssmDouble* mask, bool scaled);
+		IssmDouble         TotalSmbMelt(IssmDouble* mask, bool scaled);
+		IssmDouble         TotalSmbRefreeze(IssmDouble* mask, bool scaled);
 		void               TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum);
 		void               TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);
@@ -387,4 +389,6 @@
 		virtual IssmDouble TotalGroundedBmb(bool scaled)=0;
 		virtual IssmDouble TotalSmb(bool scaled)=0;
+		virtual IssmDouble TotalSmbMelt(bool scaled)=0;
+		virtual IssmDouble TotalSmbRefreeze(bool scaled)=0;
 		virtual void       Update(Inputs* inputs,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finite_element)=0;
 		virtual void       UpdateConstraintsExtrudeFromBase(void)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 27829)
@@ -4358,4 +4358,140 @@
 	/*Return: */
 	return Total_Smb;
+}
+/*}}}*/
+IssmDouble Penta::TotalSmbMelt(bool scaled){/*{{{*/
+
+	/*The smbmelt[Gt yr-1] of one element is area[m2] * smb [ m ice yr^-1] * rho_ice [kg m-3] / 1e+10^12 */
+	IssmDouble base,smbmelt,rho_ice,scalefactor;
+	IssmDouble Total_SmbMelt=0;
+	IssmDouble lsf[NUMVERTICES];
+	IssmDouble xyz_list[NUMVERTICES][3];
+
+	/*Get material parameters :*/
+	rho_ice=FindParam(MaterialsRhoIceEnum);
+
+	if(!IsIceInElement() || !IsOnSurface()) return 0.;
+
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*First calculate the area of the base (cross section triangle)
+	 * http://en.wikipedia.org/wiki/Triangle
+	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+
+	/*Now get the average SMB over the element*/
+	Element::GetInputListOnVertices(&lsf[0],MaskIceLevelsetEnum);
+   if(lsf[0]*lsf[1]<=0 || lsf[0]*lsf[2]<=0 || lsf[1]*lsf[2]<=0){
+		/*Partially ice-covered element*/
+		bool mainlyice;
+      int point;
+      IssmDouble* smbmelt_vertices = xNew<IssmDouble>(NUMVERTICES);
+		IssmDouble  weights[NUMVERTICES2D];
+		IssmDouble  lsf2d[NUMVERTICES2D];
+      IssmDouble f1,f2,phi;
+      Element::GetInputListOnVertices(&smbmelt_vertices[0],SmbMeltEnum);
+		for(int i=0;i<NUMVERTICES2D;i++) lsf2d[i] = lsf[i];
+		GetFractionGeometry2D(weights,&phi,&point,&f1,&f2,&mainlyice,lsf2d);
+		smbmelt = 0.0;
+		for(int i=0;i<NUMVERTICES2D;i++) smbmelt += weights[i]*smbmelt_vertices[i];
+
+		if(scaled==true){
+         IssmDouble* scalefactor_vertices   = xNew<IssmDouble>(NUMVERTICES);
+         Element::GetInputListOnVertices(&scalefactor_vertices[0],MeshScaleFactorEnum);
+         /*Compute loop only over lower vertices: i<NUMVERTICES2D*/
+         scalefactor = 0.0;
+         for(int i=0;i<NUMVERTICES2D;i++) scalefactor += weights[i]/phi*scalefactor_vertices[i];
+         xDelete<IssmDouble>(scalefactor_vertices);
+		}
+		else scalefactor = 1.0;
+
+		/*Cleanup*/
+      xDelete<IssmDouble>(smbmelt_vertices);
+	}
+
+	else{
+		/*Fully ice-covered element*/
+		Input* smbmelt_input = this->GetInput(SmbMeltEnum); _assert_(smbmelt_input);
+		smbmelt_input->GetInputAverage(&smbmelt);
+
+		if(scaled==true){
+			Input* scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+			scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element
+		}
+		else scalefactor=1.0;
+	}
+
+	Total_SmbMelt=rho_ice*base*smbmelt*scalefactor;// smbmelt on element in kg s-1
+
+	/*Return: */
+	return Total_SmbMelt;
+}
+/*}}}*/
+IssmDouble Penta::TotalSmbRefreeze(bool scaled){/*{{{*/
+
+	/*The smbrefreeze[Gt yr-1] of one element is area[m2] * smb [ m ice yr^-1] * rho_ice [kg m-3] / 1e+10^12 */
+	IssmDouble base,smbrefreeze,rho_ice,scalefactor;
+	IssmDouble Total_SmbRefreeze=0;
+	IssmDouble lsf[NUMVERTICES];
+	IssmDouble xyz_list[NUMVERTICES][3];
+
+	/*Get material parameters :*/
+	rho_ice=FindParam(MaterialsRhoIceEnum);
+
+	if(!IsIceInElement() || !IsOnSurface()) return 0.;
+
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*First calculate the area of the base (cross section triangle)
+	 * http://en.wikipedia.org/wiki/Triangle
+	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));
+
+	/*Now get the average SMB over the element*/
+	Element::GetInputListOnVertices(&lsf[0],MaskIceLevelsetEnum);
+   if(lsf[0]*lsf[1]<=0 || lsf[0]*lsf[2]<=0 || lsf[1]*lsf[2]<=0){
+		/*Partially ice-covered element*/
+		bool mainlyice;
+      int point;
+      IssmDouble* smbrefreeze_vertices = xNew<IssmDouble>(NUMVERTICES);
+		IssmDouble  weights[NUMVERTICES2D];
+		IssmDouble  lsf2d[NUMVERTICES2D];
+      IssmDouble f1,f2,phi;
+      Element::GetInputListOnVertices(&smbrefreeze_vertices[0],SmbRefreezeEnum);
+		for(int i=0;i<NUMVERTICES2D;i++) lsf2d[i] = lsf[i];
+		GetFractionGeometry2D(weights,&phi,&point,&f1,&f2,&mainlyice,lsf2d);
+		smbrefreeze = 0.0;
+		for(int i=0;i<NUMVERTICES2D;i++) smbrefreeze += weights[i]*smbrefreeze_vertices[i];
+
+		if(scaled==true){
+         IssmDouble* scalefactor_vertices   = xNew<IssmDouble>(NUMVERTICES);
+         Element::GetInputListOnVertices(&scalefactor_vertices[0],MeshScaleFactorEnum);
+         /*Compute loop only over lower vertices: i<NUMVERTICES2D*/
+         scalefactor = 0.0;
+         for(int i=0;i<NUMVERTICES2D;i++) scalefactor += weights[i]/phi*scalefactor_vertices[i];
+         xDelete<IssmDouble>(scalefactor_vertices);
+		}
+		else scalefactor = 1.0;
+
+		/*Cleanup*/
+      xDelete<IssmDouble>(smbrefreeze_vertices);
+	}
+
+	else{
+		/*Fully ice-covered element*/
+		Input* smbrefreeze_input = this->GetInput(SmbRefreezeEnum); _assert_(smbrefreeze_input);
+		smbrefreeze_input->GetInputAverage(&smbrefreeze);
+
+		if(scaled==true){
+			Input* scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+			scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element
+		}
+		else scalefactor=1.0;
+	}
+
+	Total_SmbRefreeze=rho_ice*base*smbrefreeze*scalefactor;// smbrefreeze on element in kg s-1
+
+	/*Return: */
+	return Total_SmbRefreeze;
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 27829)
@@ -200,4 +200,6 @@
 		IssmDouble     TotalGroundedBmb(bool scaled);
 		IssmDouble     TotalSmb(bool scaled);
+		IssmDouble     TotalSmbMelt(bool scaled);
+		IssmDouble     TotalSmbRefreeze(bool scaled);
 		void           Update(Inputs* inputs,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		void           UpdateConstraintsExtrudeFromBase(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 27829)
@@ -158,4 +158,6 @@
 		IssmDouble  TotalGroundedBmb(bool scaled){_error_("not implemented yet");};
 		IssmDouble  TotalSmb(bool scaled){_error_("not implemented yet");};
+		IssmDouble  TotalSmbMelt(bool scaled){_error_("not implemented yet");};
+		IssmDouble  TotalSmbRefreeze(bool scaled){_error_("not implemented yet");};
 		void        Update(Inputs* inputs,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
 		void        UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 27829)
@@ -167,4 +167,6 @@
 		IssmDouble  TotalGroundedBmb(bool scaled){_error_("not implemented yet");};
 		IssmDouble  TotalSmb(bool scaled){_error_("not implemented yet");};
+		IssmDouble  TotalSmbMelt(bool scaled){_error_("not implemented yet");};
+		IssmDouble  TotalSmbRefreeze(bool scaled){_error_("not implemented yet");};
 		void        Update(Inputs* inputs,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		void        UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 27829)
@@ -5866,4 +5866,136 @@
 	/*Return: */
 	return Total_Smb;
+}
+/*}}}*/
+IssmDouble Tria::TotalSmbMelt(bool scaled){/*{{{*/
+
+	/*The smbmelt[kg yr-1] of one element is area[m2] * smbmelt [kg m^-2 yr^-1]*/
+	IssmDouble base,smbmelt,rho_ice,scalefactor;
+	IssmDouble Total_Melt=0;
+	IssmDouble lsf[NUMVERTICES];
+	IssmDouble xyz_list[NUMVERTICES][3];
+
+	/*Get material parameters :*/
+	rho_ice=FindParam(MaterialsRhoIceEnum);
+
+   if(!IsIceInElement())return 0;
+
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*First calculate the area of the base (cross section triangle)
+	 * http://en.wikipedia.org/wiki/Triangle
+	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));	// area of element in m2
+	
+	/*Now get the average SMB over the element*/
+	Element::GetInputListOnVertices(&lsf[0],MaskIceLevelsetEnum);
+	if(lsf[0]*lsf[1]<=0 || lsf[0]*lsf[2]<=0 || lsf[1]*lsf[2]<=0){
+		/*Partially ice-covered element*/
+		bool mainlyice;
+      int point;
+      IssmDouble* weights       = xNew<IssmDouble>(NUMVERTICES);
+      IssmDouble* smbmelt_vertices  = xNew<IssmDouble>(NUMVERTICES);
+      IssmDouble f1,f2,phi;
+		
+		Element::GetInputListOnVertices(&smbmelt_vertices[0],SmbMeltEnum);
+		GetFractionGeometry(weights,&phi,&point,&f1,&f2,&mainlyice,lsf);
+		smbmelt = 0.0;
+		for(int i=0;i<NUMVERTICES;i++) smbmelt += weights[i]*smbmelt_vertices[i];
+	
+		if(scaled==true){
+         IssmDouble* scalefactor_vertices = xNew<IssmDouble>(NUMVERTICES);
+         Element::GetInputListOnVertices(&scalefactor_vertices[0],MeshScaleFactorEnum);
+         scalefactor = 0.0;
+         for(int i=0;i<NUMVERTICES;i++) scalefactor += weights[i]/phi*scalefactor_vertices[i];
+         xDelete<IssmDouble>(scalefactor_vertices);
+      }
+		else scalefactor = 1.0;
+
+		/*Cleanup*/
+      xDelete<IssmDouble>(weights);
+      xDelete<IssmDouble>(smbmelt_vertices);
+	}
+	else{
+		/*Fully ice-covered element*/
+		Input* smbmelt_input = this->GetInput(SmbMeltEnum); _assert_(smbmelt_input);
+		smbmelt_input->GetInputAverage(&smbmelt);   // average smbmelt on element in m ice s-1
+
+		if(scaled==true){
+			Input* scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+			scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element
+		}
+		else scalefactor=1.0;
+	}
+	
+   Total_Melt=rho_ice*base*smbmelt*scalefactor;	// smbmelt on element in kg s-1
+
+	/*Return: */
+	return Total_Melt;
+}
+/*}}}*/
+IssmDouble Tria::TotalSmbRefreeze(bool scaled){/*{{{*/
+
+	/*The smb[kg yr-1] of one element is area[m2] * smb [kg m^-2 yr^-1]*/
+	IssmDouble base,smbrefreeze,rho_ice,scalefactor;
+	IssmDouble Total_Refreeze=0;
+	IssmDouble lsf[NUMVERTICES];
+	IssmDouble xyz_list[NUMVERTICES][3];
+
+	/*Get material parameters :*/
+	rho_ice=FindParam(MaterialsRhoIceEnum);
+
+   if(!IsIceInElement())return 0;
+
+	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*First calculate the area of the base (cross section triangle)
+	 * http://en.wikipedia.org/wiki/Triangle
+	 * base = 1/2 abs((xA-xC)(yB-yA)-(xA-xB)(yC-yA))*/
+	base = 1./2. * fabs((xyz_list[0][0]-xyz_list[2][0])*(xyz_list[1][1]-xyz_list[0][1]) - (xyz_list[0][0]-xyz_list[1][0])*(xyz_list[2][1]-xyz_list[0][1]));	// area of element in m2
+	
+	/*Now get the average SMB over the element*/
+	Element::GetInputListOnVertices(&lsf[0],MaskIceLevelsetEnum);
+	if(lsf[0]*lsf[1]<=0 || lsf[0]*lsf[2]<=0 || lsf[1]*lsf[2]<=0){
+		/*Partially ice-covered element*/
+		bool mainlyice;
+      int point;
+      IssmDouble* weights       = xNew<IssmDouble>(NUMVERTICES);
+      IssmDouble* smbrefreeze_vertices  = xNew<IssmDouble>(NUMVERTICES);
+      IssmDouble f1,f2,phi;
+		
+		Element::GetInputListOnVertices(&smbrefreeze_vertices[0],SmbRefreezeEnum);
+		GetFractionGeometry(weights,&phi,&point,&f1,&f2,&mainlyice,lsf);
+		smbrefreeze = 0.0;
+		for(int i=0;i<NUMVERTICES;i++) smbrefreeze += weights[i]*smbrefreeze_vertices[i];
+	
+		if(scaled==true){
+         IssmDouble* scalefactor_vertices = xNew<IssmDouble>(NUMVERTICES);
+         Element::GetInputListOnVertices(&scalefactor_vertices[0],MeshScaleFactorEnum);
+         scalefactor = 0.0;
+         for(int i=0;i<NUMVERTICES;i++) scalefactor += weights[i]/phi*scalefactor_vertices[i];
+         xDelete<IssmDouble>(scalefactor_vertices);
+      }
+		else scalefactor = 1.0;
+
+		/*Cleanup*/
+      xDelete<IssmDouble>(weights);
+      xDelete<IssmDouble>(smbrefreeze_vertices);
+	}
+	else{
+		/*Fully ice-covered element*/
+		Input* smbrefreeze_input = this->GetInput(SmbRefreezeEnum); _assert_(smbrefreeze_input);
+		smbrefreeze_input->GetInputAverage(&smbrefreeze);   // average smbrefreeze on element in m ice s-1
+
+		if(scaled==true){
+			Input* scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+			scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element
+		}
+		else scalefactor=1.0;
+	}
+	
+   Total_Refreeze=rho_ice*base*smbrefreeze*scalefactor;	// smbrefreeze on element in kg s-1
+
+	/*Return: */
+	return Total_Refreeze;
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 27829)
@@ -158,4 +158,6 @@
 		IssmDouble  TotalGroundedBmb(bool scaled);
 		IssmDouble  TotalSmb(bool scaled);
+		IssmDouble  TotalSmbMelt(bool scaled);
+		IssmDouble  TotalSmbRefreeze(bool scaled);
 		void        Update(Inputs* inputs,int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
 		int         UpdatePotentialUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector<IssmDouble>* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 27829)
@@ -2472,4 +2472,6 @@
 					case TotalGroundedBmbScaledEnum:         this->TotalGroundedBmbx(&double_result,true);          break;
 					case TotalSmbEnum:                       this->TotalSmbx(&double_result,false);                 break;
+					case TotalSmbMeltEnum:                   this->TotalSmbMeltx(&double_result,false);             break;
+					case TotalSmbRefreezeEnum:               this->TotalSmbRefreezex(&double_result,false);         break;
 					case TotalSmbScaledEnum:                 this->TotalSmbx(&double_result,true);                  break;
 
@@ -2737,4 +2739,6 @@
 		case TotalGroundedBmbScaledEnum:			  this->TotalGroundedBmbx(responses, true); break;
 		case TotalSmbEnum:					        this->TotalSmbx(responses, false); break;
+		case TotalSmbMeltEnum:					     this->TotalSmbMeltx(responses, false); break;
+		case TotalSmbRefreezeEnum:					  this->TotalSmbRefreezex(responses, false); break;
 		case TotalSmbScaledEnum:					  this->TotalSmbx(responses, true); break;
 		case MaterialsRheologyBbarEnum:          this->ElementResponsex(responses,MaterialsRheologyBbarEnum); break;
@@ -3127,4 +3131,36 @@
 	/*Assign output pointers: */
 	*pSmb=total_smb;
+
+}/*}}}*/
+void FemModel::TotalSmbMeltx(IssmDouble* pSmbMelt, bool scaled){/*{{{*/
+
+	IssmDouble local_smbmelt = 0;
+	IssmDouble total_smbmelt;
+
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
+		local_smbmelt+=element->TotalSmbMelt(scaled);
+	}
+	ISSM_MPI_Reduce(&local_smbmelt,&total_smbmelt,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&total_smbmelt,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+
+	/*Assign output pointers: */
+	*pSmbMelt=total_smbmelt;
+
+}/*}}}*/
+void FemModel::TotalSmbRefreezex(IssmDouble* pSmbRefreeze, bool scaled){/*{{{*/
+
+	IssmDouble local_smbrefreeze = 0;
+	IssmDouble total_smbrefreeze;
+
+	for(Object* & object : this->elements->objects){
+		Element* element = xDynamicCast<Element*>(object);
+		local_smbrefreeze+=element->TotalSmbRefreeze(scaled);
+	}
+	ISSM_MPI_Reduce(&local_smbrefreeze,&total_smbrefreeze,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&total_smbrefreeze,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+
+	/*Assign output pointers: */
+	*pSmbRefreeze=total_smbrefreeze;
 
 }/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 27829)
@@ -143,4 +143,6 @@
 		void TotalGroundedBmbx(IssmDouble* pGbmb, bool scaled);
 		void TotalSmbx(IssmDouble* pSmb, bool scaled);
+		void TotalSmbMeltx(IssmDouble* pSmbMelt, bool scaled);
+		void TotalSmbRefreezex(IssmDouble* pSmbRefreeze, bool scaled);
 		#ifdef  _HAVE_DAKOTA_
 		void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses);
Index: /issm/trunk-jpl/src/c/classes/Regionaloutput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Regionaloutput.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/classes/Regionaloutput.cpp	(revision 27829)
@@ -143,4 +143,10 @@
 				val_t+=element->TotalSmb(this->mask,true);
 				break;
+			case TotalSmbMeltEnum:
+				val_t+=element->TotalSmbMelt(this->mask,true);
+				break;
+			case TotalSmbRefreezeEnum:
+				val_t+=element->TotalSmbRefreeze(this->mask,true);
+				break;
 			default:
 				_error_("Regional output type " << this->outputname << " not supported yet!");
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27828)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27829)
@@ -1392,4 +1392,5 @@
 syn keyword cConstant CalvingTestEnum
 syn keyword cConstant CalvingParameterizationEnum
+syn keyword cConstant CalvingCalvingMIPEnum
 syn keyword cConstant CalvingVonmisesEnum
 syn keyword cConstant CalvingVonmisesADEnum
@@ -1725,4 +1726,6 @@
 syn keyword cConstant TotalSmbEnum
 syn keyword cConstant TotalSmbScaledEnum
+syn keyword cConstant TotalSmbRefreezeEnum
+syn keyword cConstant TotalSmbMeltEnum
 syn keyword cConstant TransientArrayParamEnum
 syn keyword cConstant TransientInputEnum
@@ -1777,5 +1780,4 @@
 syn keyword cType Cfsurfacesquaretransient
 syn keyword cType Channel
-syn keyword cType classes
 syn keyword cType Constraint
 syn keyword cType Constraints
@@ -1785,6 +1787,6 @@
 syn keyword cType ControlParam
 syn keyword cType Covertree
+syn keyword cType DataSetParam
 syn keyword cType DatasetInput
-syn keyword cType DataSetParam
 syn keyword cType Definition
 syn keyword cType DependentObject
@@ -1799,6 +1801,6 @@
 syn keyword cType ElementInput
 syn keyword cType ElementMatrix
+syn keyword cType ElementVector
 syn keyword cType Elements
-syn keyword cType ElementVector
 syn keyword cType ExponentialVariogram
 syn keyword cType ExternalResult
@@ -1807,10 +1809,9 @@
 syn keyword cType Friction
 syn keyword cType Gauss
-syn keyword cType GaussianVariogram
-syn keyword cType gaussobjects
 syn keyword cType GaussPenta
 syn keyword cType GaussSeg
 syn keyword cType GaussTetra
 syn keyword cType GaussTria
+syn keyword cType GaussianVariogram
 syn keyword cType GenericExternalResult
 syn keyword cType GenericOption
@@ -1829,5 +1830,4 @@
 syn keyword cType IssmDirectApplicInterface
 syn keyword cType IssmParallelDirectApplicInterface
-syn keyword cType krigingobjects
 syn keyword cType Load
 syn keyword cType Loads
@@ -1840,5 +1840,4 @@
 syn keyword cType Matice
 syn keyword cType Matlitho
-syn keyword cType matrixobjects
 syn keyword cType MatrixParam
 syn keyword cType Misfit
@@ -1853,6 +1852,6 @@
 syn keyword cType Observations
 syn keyword cType Option
+syn keyword cType OptionUtilities
 syn keyword cType Options
-syn keyword cType OptionUtilities
 syn keyword cType Param
 syn keyword cType Parameters
@@ -1868,11 +1867,11 @@
 syn keyword cType Regionaloutput
 syn keyword cType Results
+syn keyword cType RiftStruct
 syn keyword cType Riftfront
-syn keyword cType RiftStruct
 syn keyword cType SealevelGeometry
 syn keyword cType Seg
 syn keyword cType SegInput
+syn keyword cType SegRef
 syn keyword cType Segment
-syn keyword cType SegRef
 syn keyword cType SpcDynamic
 syn keyword cType SpcStatic
@@ -1893,4 +1892,8 @@
 syn keyword cType Vertex
 syn keyword cType Vertices
+syn keyword cType classes
+syn keyword cType gaussobjects
+syn keyword cType krigingobjects
+syn keyword cType matrixobjects
 syn keyword cType AdjointBalancethickness2Analysis
 syn keyword cType AdjointBalancethicknessAnalysis
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27828)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27829)
@@ -1725,4 +1725,6 @@
 	TotalSmbEnum,
 	TotalSmbScaledEnum,
+	TotalSmbRefreezeEnum,
+	TotalSmbMeltEnum,
 	TransientArrayParamEnum,
 	TransientInputEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27829)
@@ -1394,4 +1394,5 @@
 		case CalvingTestEnum : return "CalvingTest";
 		case CalvingParameterizationEnum : return "CalvingParameterization";
+		case CalvingCalvingMIPEnum : return "CalvingCalvingMIP";
 		case CalvingVonmisesEnum : return "CalvingVonmises";
 		case CalvingVonmisesADEnum : return "CalvingVonmisesAD";
@@ -1727,4 +1728,6 @@
 		case TotalSmbEnum : return "TotalSmb";
 		case TotalSmbScaledEnum : return "TotalSmbScaled";
+		case TotalSmbRefreezeEnum : return "TotalSmbRefreeze";
+		case TotalSmbMeltEnum : return "TotalSmbMelt";
 		case TransientArrayParamEnum : return "TransientArrayParam";
 		case TransientInputEnum : return "TransientInput";
Index: /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27828)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27829)
@@ -1385,4 +1385,5 @@
 syn keyword juliaConstC CalvingTestEnum
 syn keyword juliaConstC CalvingParameterizationEnum
+syn keyword juliaConstC CalvingCalvingMIPEnum
 syn keyword juliaConstC CalvingVonmisesEnum
 syn keyword juliaConstC CalvingVonmisesADEnum
@@ -1718,4 +1719,6 @@
 syn keyword juliaConstC TotalSmbEnum
 syn keyword juliaConstC TotalSmbScaledEnum
+syn keyword juliaConstC TotalSmbRefreezeEnum
+syn keyword juliaConstC TotalSmbMeltEnum
 syn keyword juliaConstC TransientArrayParamEnum
 syn keyword juliaConstC TransientInputEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27828)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27829)
@@ -1427,4 +1427,5 @@
 	      else if (strcmp(name,"CalvingTest")==0) return CalvingTestEnum;
 	      else if (strcmp(name,"CalvingParameterization")==0) return CalvingParameterizationEnum;
+	      else if (strcmp(name,"CalvingCalvingMIP")==0) return CalvingCalvingMIPEnum;
 	      else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
 	      else if (strcmp(name,"CalvingVonmisesAD")==0) return CalvingVonmisesADEnum;
@@ -1489,9 +1490,9 @@
 	      else if (strcmp(name,"ExtrapolationAnalysis")==0) return ExtrapolationAnalysisEnum;
 	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
-	      else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
          else stage=13;
    }
    if(stage==13){
-	      if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;
+	      if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
+	      else if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;
 	      else if (strcmp(name,"FSSolver")==0) return FSSolverEnum;
 	      else if (strcmp(name,"FSpressure")==0) return FSpressureEnum;
@@ -1612,9 +1613,9 @@
 	      else if (strcmp(name,"Materials")==0) return MaterialsEnum;
 	      else if (strcmp(name,"Matestar")==0) return MatestarEnum;
-	      else if (strcmp(name,"Matice")==0) return MaticeEnum;
          else stage=14;
    }
    if(stage==14){
-	      if (strcmp(name,"Matlitho")==0) return MatlithoEnum;
+	      if (strcmp(name,"Matice")==0) return MaticeEnum;
+	      else if (strcmp(name,"Matlitho")==0) return MatlithoEnum;
 	      else if (strcmp(name,"Mathydro")==0) return MathydroEnum;
 	      else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum;
@@ -1735,9 +1736,9 @@
 	      else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
 	      else if (strcmp(name,"Sset")==0) return SsetEnum;
-	      else if (strcmp(name,"StatisticsSolution")==0) return StatisticsSolutionEnum;
          else stage=15;
    }
    if(stage==15){
-	      if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
+	      if (strcmp(name,"StatisticsSolution")==0) return StatisticsSolutionEnum;
+	      else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
 	      else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
@@ -1769,4 +1770,6 @@
 	      else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
 	      else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
+	      else if (strcmp(name,"TotalSmbRefreeze")==0) return TotalSmbRefreezeEnum;
+	      else if (strcmp(name,"TotalSmbMelt")==0) return TotalSmbMeltEnum;
 	      else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
 	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
Index: /issm/trunk-jpl/src/m/classes/SMBsemic.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBsemic.m	(revision 27828)
+++ /issm/trunk-jpl/src/m/classes/SMBsemic.m	(revision 27829)
@@ -91,5 +91,5 @@
 					'SmbMassBalanceSemic','SmbMelt','SmbRefreeze','SmbAccumulation',...
 					'SmbHIce','SmbHSnow','SmbAlbedo','SmbAlbedoSnow','TemperatureSEMIC',...
-					'SmbSemicQmr'};
+					'SmbSemicQmr','TotalSmb','TotalSmbMelt','TotalSmbRefreeze'};
 			else
 				list = {'default','SmbMassBalance'};
Index: /issm/trunk-jpl/src/m/solve/outbinread.m
===================================================================
--- /issm/trunk-jpl/src/m/solve/outbinread.m	(revision 27828)
+++ /issm/trunk-jpl/src/m/solve/outbinread.m	(revision 27829)
@@ -133,4 +133,8 @@
 	elseif strcmp(fieldname,'TotalSmb'),
 		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalMelt'),
+		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalRefreeze'),
+		field = field/10.^12*yts; %(GigaTon/year)
 	elseif strcmp(fieldname,'SmbMassBalance'),
 		field = field*yts;
Index: /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m
===================================================================
--- /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m	(revision 27828)
+++ /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m	(revision 27829)
@@ -260,4 +260,8 @@
 		field = field/10.^12*yts; %(GigaTon/year)
 	elseif strcmp(fieldname,'TotalSmbScaled'),
+		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalSmbMelt'),
+		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalSmbRefreeze'),
 		field = field/10.^12*yts; %(GigaTon/year)
 	elseif strcmp(fieldname,'GroundinglineMassFlux'),
