Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 22329)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 22330)
@@ -690,5 +690,5 @@
 	/*Intermediaries*/
 	int         domaintype;
-	IssmDouble  phi,base_area;
+	IssmDouble  phi,base_area,scalefactor,floatingarea;
 	IssmDouble  xyz_list[NUMVERTICES][3];
 
@@ -703,6 +703,14 @@
 	base_area= 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]));
 
+	floatingarea=(1-phi)*base_area;
+
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		floatingarea=floatingarea*scalefactor;
+	}
+
 	/*Clean up and return*/
-	return (1-phi)*base_area;
+	return floatingarea;
 }
 /*}}}*/
@@ -1164,5 +1172,5 @@
 	/*Intermediaries*/
 	int         domaintype;
-	IssmDouble  phi,base_area;
+	IssmDouble  phi,base_area,scalefactor,groundedarea;
 	IssmDouble  xyz_list[NUMVERTICES][3];
 
@@ -1177,6 +1185,13 @@
 	base_area= 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]));
 
+	groundedarea=phi*base_area;
+
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		groundedarea=groundedarea*scalefactor;
+	}
 	/*Clean up and return*/
-	return phi*base_area;
+	return groundedarea;
 }
 /*}}}*/
@@ -1184,5 +1199,5 @@
 
 	/*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
-	IssmDouble base,height;
+	IssmDouble base,height,scalefactor;
 	IssmDouble xyz_list[NUMVERTICES][3];
 
@@ -1196,4 +1211,10 @@
 	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]));
 
+	if(scaled==true){ //scale for area projection correction
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		base=base*scalefactor;
+	}
+
 	/*Now get the average height*/
 	height = 1./3.*((xyz_list[3][2]-xyz_list[0][2])+(xyz_list[4][2]-xyz_list[1][2])+(xyz_list[5][2]-xyz_list[2][2]));
@@ -1207,5 +1228,5 @@
 	/*Volume above floatation: H + rho_water/rho_ice*bathymetry for nodes on the bed*/
 	IssmDouble rho_ice,rho_water;
-	IssmDouble base,bed,surface,bathymetry;
+	IssmDouble base,bed,surface,bathymetry,scalefactor;
 	IssmDouble xyz_list[NUMVERTICES][3];
 
@@ -1220,4 +1241,9 @@
 	 * 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]));
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		base=base*scalefactor;
+	}
 
 	/*Now get the average height above floatation*/
@@ -2639,5 +2665,5 @@
 	bool       mainlyfloating;
 	IssmDouble fbmb=0;
-	IssmDouble rho_ice,fraction1,fraction2,floatingmelt,Jdet;
+	IssmDouble rho_ice,fraction1,fraction2,floatingmelt,Jdet,scalefactor;
 	IssmDouble Total_Fbmb=0;
 	IssmDouble xyz_list[NUMVERTICES][3];
@@ -2650,4 +2676,8 @@
 	Input* floatingmelt_input = this->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input); 
 	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input* scalefactor_input = NULL;
+	if(scaled==true){
+		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input); 
+	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
@@ -2660,5 +2690,9 @@
 		this->JacobianDeterminantBase(&Jdet,&xyz_list[0][0],gauss);
 		floatingmelt_input->GetInputValue(&floatingmelt,gauss);
-		fbmb+=floatingmelt*Jdet*gauss->weight;
+		if(scaled==true){
+			scalefactor_input->GetInputValue(&scalefactor,gauss);
+		}
+		else scalefactor=1;
+		fbmb+=floatingmelt*Jdet*gauss->weight*scalefactor;
 	}
 
@@ -2676,5 +2710,5 @@
 	bool       mainlyfloating;
 	IssmDouble gbmb=0;
-	IssmDouble rho_ice,fraction1,fraction2,groundedmelt,Jdet;
+	IssmDouble rho_ice,fraction1,fraction2,groundedmelt,Jdet,scalefactor;
 	IssmDouble Total_Gbmb=0;
 	IssmDouble xyz_list[NUMVERTICES][3];
@@ -2687,4 +2721,8 @@
 	Input* groundedmelt_input = this->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input); 
 	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input* scalefactor_input = NULL;
+	if(scaled==true){
+		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input); 
+	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
@@ -2697,5 +2735,9 @@
 		this->JacobianDeterminantBase(&Jdet,&xyz_list[0][0],gauss);
 		groundedmelt_input->GetInputValue(&groundedmelt,gauss);
-		gbmb+=groundedmelt*Jdet*gauss->weight;
+		if(scaled==true){
+			scalefactor_input->GetInputValue(&scalefactor,gauss);
+		}
+		else scalefactor=1;
+		gbmb+=groundedmelt*Jdet*gauss->weight*scalefactor;
 	}
 
@@ -2710,5 +2752,5 @@
 
 	/*The smb[Gt yr-1] of one element is area[m2] * smb [ m ice yr^-1] * rho_ice [kg m-3] / 1e+10^12 */
-	IssmDouble base,smb,rho_ice;
+	IssmDouble base,smb,rho_ice,scalefactor;
 	IssmDouble Total_Smb=0;
 	IssmDouble xyz_list[NUMVERTICES][3];
@@ -2730,5 +2772,12 @@
 
 	smb_input->GetInputAverage(&smb);
-	Total_Smb=rho_ice*base*smb;// smb on element in kg s-1
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element 
+	}
+	else{
+		scalefactor=1.;
+	}
+	Total_Smb=rho_ice*base*smb*scalefactor;// smb on element in kg s-1
 
 	/*Return: */
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22329)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22330)
@@ -894,5 +894,5 @@
 	/*Intermediaries*/
 	int         domaintype;
-	IssmDouble  phi;
+	IssmDouble  phi,scalefactor,floatingarea;
 	IssmDouble *xyz_list  = NULL;
 
@@ -905,8 +905,14 @@
 	this->GetVerticesCoordinates(&xyz_list);
 	phi=this->GetGroundedPortion(xyz_list);
+	floatingarea=(1-phi)*this->GetArea();
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		floatingarea=floatingarea*scalefactor;
+	}
 
 	/*Clean up and return*/
 	xDelete<IssmDouble>(xyz_list);
-	return (1-phi)*this->GetArea();
+	return floatingarea;
 }
 /*}}}*/
@@ -1614,5 +1620,5 @@
 	/*Intermediaries*/
 	int         domaintype;
-	IssmDouble  phi;
+	IssmDouble  phi,scalefactor,groundedarea;
 	IssmDouble *xyz_list  = NULL;
 
@@ -1625,8 +1631,14 @@
 	this->GetVerticesCoordinates(&xyz_list);
 	phi=this->GetGroundedPortion(xyz_list);
+	groundedarea=phi*this->GetArea();
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		groundedarea=groundedarea*scalefactor;
+	}
 
 	/*Clean up and return*/
 	xDelete<IssmDouble>(xyz_list);
-	return phi*this->GetArea();
+	return groundedarea;
 }
 /*}}}*/
@@ -1679,9 +1691,11 @@
 	/*Intermediaries*/
 	int i, numiceverts;
-	IssmDouble area_base,surface,base,Haverage;
+	IssmDouble area_base,surface,base,Haverage,scalefactor;
 	IssmDouble Haux[NUMVERTICES], surfaces[NUMVERTICES], bases[NUMVERTICES];
+	IssmDouble SFaux[NUMVERTICES], scalefactors[NUMVERTICES];
 	IssmDouble s[2]; // s:fraction of intersected triangle edges, that lies inside ice
 	int* indices=NULL;
 	IssmDouble* H=NULL;
+	IssmDouble* SF=NULL;
 
 	if(!IsIceInElement())return 0.;
@@ -1691,13 +1705,38 @@
 
 	if(false && IsIcefront()){
-		area_base=this->GetAreaIce();
 		//Assumption: linear ice thickness profile on element. 
 		//Hence ice thickness at intersection of levelset function with triangle edge is linear interpolation of ice thickness at vertices.
 		this->GetLevelsetIntersection(&indices, &numiceverts, s, MaskIceLevelsetEnum, 0.);
+		int numthk=numiceverts+2;
+		H=xNew<IssmDouble>(numthk);
+		//Correct area distortion caused by projection if requestion
+		area_base=this->GetAreaIce();
+		if(scaled==true){
+			GetInputListOnVertices(&scalefactors[0],MeshScaleFactorEnum);
+			for(i=0;i<NUMVERTICES;i++) SFaux[i]= scalefactors[indices[i]]; //sort thicknesses in ice/noice
+			switch(numiceverts){
+				case 1: // average over triangle 
+					SF[0]=SFaux[0];
+					SF[1]=SFaux[0]+s[0]*(SFaux[1]-SFaux[0]);
+					SF[2]=SFaux[0]+s[1]*(SFaux[2]-SFaux[0]);
+					break;
+				case 2: // average over quadrangle
+					SF[0]=SFaux[0];
+					SF[1]=SFaux[1];
+					SF[2]=SFaux[0]+s[0]*(SFaux[2]-SFaux[0]);
+					SF[3]=SFaux[1]+s[1]*(SFaux[2]-SFaux[1]);
+					break;
+				default:
+					_error_("Number of ice covered vertices wrong in Tria::IceVolume()");
+					break;
+			}
+			scalefactor=0.;
+			for(i=0;i<numthk;i++)	scalefactor+=SF[i];
+			scalefactor/=IssmDouble(numthk);
+			area_base=area_base*scalefactor;
+		}
 		GetInputListOnVertices(&surfaces[0],SurfaceEnum);
 		GetInputListOnVertices(&bases[0],BaseEnum);
 		for(i=0;i<NUMVERTICES;i++) Haux[i]= surfaces[indices[i]]-bases[indices[i]]; //sort thicknesses in ice/noice
-		int numthk=numiceverts+2;
-		H=xNew<IssmDouble>(numthk);
 		switch(numiceverts){
 			case 1: // average over triangle 
@@ -1723,4 +1762,9 @@
 		/*First get back the area of the base*/
 		area_base=this->GetArea();
+		if(scaled==true){
+			Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+			scalefactor_input->GetInputAverage(&scalefactor);
+			area_base=area_base*scalefactor;
+		}
 
 		/*Now get the average height*/
@@ -1735,4 +1779,5 @@
 	xDelete<int>(indices);
 	xDelete<IssmDouble>(H);
+	xDelete<IssmDouble>(SF);
 
 	if(domaintype==Domain2DverticalEnum){
@@ -1748,5 +1793,5 @@
 	/*The volume above floatation: H + rho_water/rho_ice * bathymetry */
 	IssmDouble rho_ice,rho_water;
-	IssmDouble base,surface,bed,bathymetry;
+	IssmDouble base,surface,bed,bathymetry,scalefactor;
 	IssmDouble xyz_list[NUMVERTICES][3];
 
@@ -1761,4 +1806,9 @@
 	 * 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]));
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);
+		base=base*scalefactor;
+	}
 
 	/*Now get the average height and bathymetry*/
@@ -3121,5 +3171,5 @@
 	bool       mainlyfloating;
 	IssmDouble fbmb=0;
-	IssmDouble rho_ice,fraction1,fraction2,floatingmelt,Jdet;
+	IssmDouble rho_ice,fraction1,fraction2,floatingmelt,Jdet,scalefactor;
 	IssmDouble Total_Fbmb=0;
 	IssmDouble xyz_list[NUMVERTICES][3];
@@ -3132,4 +3182,8 @@
 	Input* floatingmelt_input = this->GetInput(BasalforcingsFloatingiceMeltingRateEnum); _assert_(floatingmelt_input); 
 	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input* scalefactor_input = NULL;
+	if(scaled==true){
+		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input); 
+	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
@@ -3142,5 +3196,9 @@
 		this->JacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
 		floatingmelt_input->GetInputValue(&floatingmelt,gauss);
-		fbmb+=floatingmelt*Jdet*gauss->weight;
+		if(scaled==true){
+			scalefactor_input->GetInputValue(&scalefactor,gauss);
+		}
+		else scalefactor=1;
+		fbmb+=floatingmelt*Jdet*gauss->weight*scalefactor;
 	}
 
@@ -3158,5 +3216,5 @@
 	bool       mainlyfloating;
 	IssmDouble gbmb=0;
-	IssmDouble rho_ice,fraction1,fraction2,groundedmelt,Jdet;
+	IssmDouble rho_ice,fraction1,fraction2,groundedmelt,Jdet,scalefactor;
 	IssmDouble Total_Gbmb=0;
 	IssmDouble xyz_list[NUMVERTICES][3];
@@ -3169,4 +3227,8 @@
 	Input* groundedmelt_input = this->GetInput(BasalforcingsGroundediceMeltingRateEnum); _assert_(groundedmelt_input); 
 	Input* gllevelset_input = this->GetInput(MaskGroundediceLevelsetEnum); _assert_(gllevelset_input);
+	Input* scalefactor_input = NULL;
+	if(scaled==true){
+		scalefactor_input = this->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input); 
+	}
 	::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
 
@@ -3179,5 +3241,9 @@
 		this->JacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
 		groundedmelt_input->GetInputValue(&groundedmelt,gauss);
-		gbmb+=groundedmelt*Jdet*gauss->weight;
+		if(scaled==true){
+			scalefactor_input->GetInputValue(&scalefactor,gauss);
+		}
+		else scalefactor=1;
+		gbmb+=groundedmelt*Jdet*gauss->weight*scalefactor;
 	}
 
@@ -3192,5 +3258,5 @@
 
 	/*The smb[kg yr-1] of one element is area[m2] * smb [kg m^-2 yr^-1]*/
-	IssmDouble base,smb,rho_ice;
+	IssmDouble base,smb,rho_ice,scalefactor;
 	IssmDouble Total_Smb=0;
 	IssmDouble xyz_list[NUMVERTICES][3];
@@ -3210,6 +3276,13 @@
 	/*Now get the average SMB over the element*/
 	Input* smb_input = inputs->GetInput(SmbMassBalanceEnum); _assert_(smb_input);
-	smb_input->GetInputAverage(&smb);																								// average smb on element in m ice s-1
-   Total_Smb=rho_ice*base*smb;																											// smb on element in kg s-1
+	smb_input->GetInputAverage(&smb);	// average smb on element in m ice s-1
+	if(scaled==true){
+		Input* scalefactor_input = inputs->GetInput(MeshScaleFactorEnum); _assert_(scalefactor_input);
+		scalefactor_input->GetInputAverage(&scalefactor);// average scalefactor on element 
+	}
+	else{
+		scalefactor=1.;
+	}
+   Total_Smb=rho_ice*base*smb*scalefactor;	// smb on element in kg s-1
 
 	/*Return: */
Index: /issm/trunk-jpl/src/m/solve/parseresultsfrombuffer.js
===================================================================
--- /issm/trunk-jpl/src/m/solve/parseresultsfrombuffer.js	(revision 22329)
+++ /issm/trunk-jpl/src/m/solve/parseresultsfrombuffer.js	(revision 22330)
@@ -99,4 +99,5 @@
 		else if (fieldname == 'BasalforcingsFloatingiceMeltingRate') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
 		else if (fieldname == 'TotalSmb') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
+		else if (fieldname == 'TotalSmbScaled') for (var i=0;i<field.length;i++)field[i]= field[i]/Math.pow(10,12)*yts; //(GigaTon/year)
 		else if (fieldname == 'SmbMassBalance') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
 		else if (fieldname == 'SmbPrecipitation') for (var i=0;i<field.length;i++)field[i]= field[i]*yts;
Index: /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m
===================================================================
--- /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m	(revision 22329)
+++ /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.m	(revision 22330)
@@ -183,7 +183,13 @@
 	elseif strcmp(fieldname,'TotalFloatingBmb'),
 		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalFloatingBmbScaled'),
+		field = field/10.^12*yts; %(GigaTon/year)
 	elseif strcmp(fieldname,'TotalGroundedBmb'),
 		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalGroundedBmbScaled'),
+		field = field/10.^12*yts; %(GigaTon/year)
 	elseif strcmp(fieldname,'TotalSmb'),
+		field = field/10.^12*yts; %(GigaTon/year)
+	elseif strcmp(fieldname,'TotalSmbScaled'),
 		field = field/10.^12*yts; %(GigaTon/year)
 	elseif strcmp(fieldname,'SmbMassBalance'),
Index: /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py
===================================================================
--- /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 22329)
+++ /issm/trunk-jpl/src/m/solve/parseresultsfromdisk.py	(revision 22330)
@@ -193,7 +193,13 @@
 		elif fieldname=='TotalFloatingBmb':
 			field = field/10.**12*yts #(GigaTon/year)
+		elif fieldname=='TotalFloatingBmbScaled':
+			field = field/10.**12*yts #(GigaTon/year)
 		elif fieldname=='TotalGroundedBmb':
 			field = field/10.**12*yts #(GigaTon/year)
+		elif fieldname=='TotalGroundedBmbScaled':
+			field = field/10.**12*yts #(GigaTon/year)
 		elif fieldname=='TotalSmb':
+			field = field/10.**12*yts #(GigaTon/year)
+		elif fieldname=='TotalSmbScaled':
 			field = field/10.**12*yts #(GigaTon/year)
 		elif fieldname=='SmbMassBalance':
