Index: issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp
===================================================================
--- issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 22320)
+++ issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateElementsVerticesAndMaterials.cpp	(revision 22323)
@@ -229,4 +229,5 @@
 	iomodel->FetchData(6,"md.mesh.x","md.mesh.y","md.mesh.z","md.geometry.base","md.geometry.thickness","md.mask.ice_levelset");
 	if (iomodel->domaintype == Domain3DsurfaceEnum) iomodel->FetchData(3,"md.mesh.lat","md.mesh.long","md.mesh.r");
+	else iomodel->FetchDataToInput(elements,"md.mesh.scale_factor",MeshScaleFactorEnum,1.);
 	
 	CreateNumberNodeToElementConnectivity(iomodel,solution_type);
Index: issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22320)
+++ issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22323)
@@ -308,4 +308,5 @@
 	MeshYEnum,
 	MeshZEnum,
+	MeshScaleFactorEnum,
 	MeshElementsEnum,
 	MeshNumberofelementsEnum,
@@ -750,4 +751,5 @@
 	SubelementMigration2Enum,
 	SubelementMigration3Enum,
+	SubelementMigration4Enum,
 	ContactEnum,
 	GroundingOnlyEnum,
Index: issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22320)
+++ issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22323)
@@ -314,4 +314,5 @@
 		case MeshYEnum : return "MeshY";
 		case MeshZEnum : return "MeshZ";
+		case MeshScaleFactorEnum : return "MeshScaleFactor";
 		case MeshElementsEnum : return "MeshElements";
 		case MeshNumberofelementsEnum : return "MeshNumberofelements";
@@ -740,4 +741,5 @@
 		case SubelementMigration2Enum : return "SubelementMigration2";
 		case SubelementMigration3Enum : return "SubelementMigration3";
+		case SubelementMigration4Enum : return "SubelementMigration4";
 		case ContactEnum : return "Contact";
 		case GroundingOnlyEnum : return "GroundingOnly";
Index: issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22320)
+++ issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22323)
@@ -320,4 +320,5 @@
 	      else if (strcmp(name,"MeshY")==0) return MeshYEnum;
 	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
+	      else if (strcmp(name,"MeshScaleFactor")==0) return MeshScaleFactorEnum;
 	      else if (strcmp(name,"MeshElements")==0) return MeshElementsEnum;
 	      else if (strcmp(name,"MeshNumberofelements")==0) return MeshNumberofelementsEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"TimesteppingStartTime")==0) return TimesteppingStartTimeEnum;
 	      else if (strcmp(name,"TimesteppingFinalTime")==0) return TimesteppingFinalTimeEnum;
-	      else if (strcmp(name,"TimesteppingCflCoefficient")==0) return TimesteppingCflCoefficientEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum;
+	      if (strcmp(name,"TimesteppingCflCoefficient")==0) return TimesteppingCflCoefficientEnum;
+	      else if (strcmp(name,"TimesteppingTimeAdapt")==0) return TimesteppingTimeAdaptEnum;
 	      else if (strcmp(name,"TimesteppingTimeStep")==0) return TimesteppingTimeStepEnum;
 	      else if (strcmp(name,"TimesteppingInterpForcings")==0) return TimesteppingInterpForcingsEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"SmbBNeg")==0) return SmbBNegEnum;
 	      else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
-	      else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"SmbAccumulation")==0) return SmbAccumulationEnum;
+	      if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
+	      else if (strcmp(name,"SmbAccumulation")==0) return SmbAccumulationEnum;
 	      else if (strcmp(name,"SmbEvaporation")==0) return SmbEvaporationEnum;
 	      else if (strcmp(name,"SmbRunoff")==0) return SmbRunoffEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"StringExternalResult")==0) return StringExternalResultEnum;
 	      else if (strcmp(name,"Step")==0) return StepEnum;
-	      else if (strcmp(name,"Time")==0) return TimeEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
+	      if (strcmp(name,"Time")==0) return TimeEnum;
+	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
@@ -751,11 +752,12 @@
 	      else if (strcmp(name,"None")==0) return NoneEnum;
 	      else if (strcmp(name,"AggressiveMigration")==0) return AggressiveMigrationEnum;
-	      else if (strcmp(name,"SoftMigration")==0) return SoftMigrationEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"SubelementMigration")==0) return SubelementMigrationEnum;
+	      if (strcmp(name,"SoftMigration")==0) return SoftMigrationEnum;
+	      else if (strcmp(name,"SubelementMigration")==0) return SubelementMigrationEnum;
 	      else if (strcmp(name,"SubelementMigration2")==0) return SubelementMigration2Enum;
 	      else if (strcmp(name,"SubelementMigration3")==0) return SubelementMigration3Enum;
+	      else if (strcmp(name,"SubelementMigration4")==0) return SubelementMigration4Enum;
 	      else if (strcmp(name,"Contact")==0) return ContactEnum;
 	      else if (strcmp(name,"GroundingOnly")==0) return GroundingOnlyEnum;
@@ -873,10 +875,10 @@
 	      else if (strcmp(name,"EsaRequestedOutputs")==0) return EsaRequestedOutputsEnum;
 	      else if (strcmp(name,"EsaNumRequestedOutputs")==0) return EsaNumRequestedOutputsEnum;
-	      else if (strcmp(name,"TransientAmrFrequency")==0) return TransientAmrFrequencyEnum;
-	      else if (strcmp(name,"AmrType")==0) return AmrTypeEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"AmrRestart")==0) return AmrRestartEnum;
+	      if (strcmp(name,"TransientAmrFrequency")==0) return TransientAmrFrequencyEnum;
+	      else if (strcmp(name,"AmrType")==0) return AmrTypeEnum;
+	      else if (strcmp(name,"AmrRestart")==0) return AmrRestartEnum;
 	      else if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum;
 	      else if (strcmp(name,"AmrLevelMax")==0) return AmrLevelMaxEnum;
@@ -996,10 +998,10 @@
 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
 	      else if (strcmp(name,"HydrologySommersAnalysis")==0) return HydrologySommersAnalysisEnum;
-	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
-	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
+	      if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
+	      else if (strcmp(name,"MeltingAnalysis")==0) return MeltingAnalysisEnum;
+	      else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
 	      else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
Index: issm/trunk-jpl/src/m/classes/mesh2d.js
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh2d.js	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh2d.js	(revision 22323)
@@ -44,4 +44,5 @@
 			fielddisplay(this,"long","vertices longitude [degrees]");
 			fielddisplay(this,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)");
+			fielddisplay(self,"scale_factor","Projection correction for volume, area, etc. computation)");
 		} //}}}
 		this.classname = function () { //{{{
@@ -70,4 +71,5 @@
 			checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message',"'mesh.average_vertex_connectivity' should be at least 9 in 2d");
 			checkfield(md,'fieldname','mesh.segments','NaN',1,'Inf',1,'>',0,'size',[NaN, 3]);
+			if(this.scale_factor.length>1) checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1]);
 
 			switch(solution){
@@ -92,4 +94,5 @@
 			WriteData(fid,prefix,'object',this,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',this,'class','mesh','fieldname','segments','format','DoubleMat','mattype',3);
+			WriteData(fid,prefix,'object',this,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1);
 		}//}}}
 		this.fix=function() { //{{{
@@ -104,4 +107,5 @@
 			this.lat=NullFix(this.lat,NaN);
 			this.long=NullFix(this.long,NaN);
+			this.scale_factor=NullFix(this.scale_factor,NaN);
 		}//}}}
 
@@ -118,4 +122,5 @@
 		this.long                        = NaN;
 		this.epsg                        = 0;
+		this.scale_factor                = NaN;
 
 		this.vertexonboundary            = NaN;
Index: issm/trunk-jpl/src/m/classes/mesh2d.m
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh2d.m	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh2d.m	(revision 22323)
@@ -16,4 +16,5 @@
 		long                        = NaN;
 		epsg                        = 0;
+		scale_factor                = NaN;
 
 		vertexonboundary            = NaN;
@@ -94,4 +95,7 @@
 			md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message','''mesh.average_vertex_connectivity'' should be at least 9 in 2d');
 			md = checkfield(md,'fieldname','mesh.segments','NaN',1,'Inf',1,'>',0,'size',[NaN 3]);
+			if numel(md.mesh.scale_factor)>1,
+				md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
+			end
 
 			if strcmp(solution,'ThermalSolution')
@@ -127,4 +131,5 @@
 			fielddisplay(self,'long','vertices longitude [degrees]');
 			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+			fielddisplay(self,'scale_factor','Projection correction for volume, area, etc. computation)');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
@@ -141,4 +146,5 @@
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','segments','format','DoubleMat','mattype',3);
+			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1);
 		end % }}}
 		function t = domaintype(self) % {{{
@@ -162,4 +168,5 @@
 			writejs1Darray(fid,[modelname '.mesh.long'],self.long);
 			writejsdouble(fid,[modelname '.mesh.epsg'],self.epsg);
+			writejsdouble(fid,[modelname '.mesh.scale_factor'],self.scale_factor);
 			writejs1Darray(fid,[modelname '.mesh.vertexonboundary'],self.vertexonboundary);
 			writejs2Darray(fid,[modelname '.mesh.edges'],self.edges);
Index: issm/trunk-jpl/src/m/classes/mesh2d.py
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh2d.py	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh2d.py	(revision 22323)
@@ -24,4 +24,5 @@
 		self.long                        = float('NaN');
 		self.epsg                        = 0;
+		self.scale_factor                = float('NaN');
 
 		self.vertexonboundary            = float('NaN');
@@ -68,4 +69,5 @@
 		string="%s\n%s"%(string,fielddisplay(self,"long","vertices longitude [degrees]"))
 		string="%s\n%s"%(string,fielddisplay(self,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)"))
+		string="%s\n%s"%(string,fielddisplay(self,"scale_factor","Projection correction for volume, area, etc. computation"))
 		return string
 		#}}}
@@ -95,4 +97,7 @@
 		md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message',"'mesh.average_vertex_connectivity' should be at least 9 in 2d")
 		md = checkfield(md,'fieldname','mesh.segments','NaN',1,'Inf',1,'>',0,'size',[np.nan,3]);
+		if(numel(self.scale_factor)>1):
+                        md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices])
+                
 		if solution=='ThermalSolution':
 			md.checkmessage("thermal not supported for 2d mesh")
@@ -122,3 +127,4 @@
 		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','vertexonboundary','format','DoubleMat','mattype',1)
 		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','segments','format','DoubleMat','mattype',3)
+		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1)
 	# }}}
Index: issm/trunk-jpl/src/m/classes/mesh2dvertical.m
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh2dvertical.m	(revision 22323)
@@ -16,4 +16,5 @@
 		long                        = NaN;
 		epsg                        = NaN;
+		scale_factor                = NaN;
 
 		vertexonboundary            = NaN;
@@ -94,4 +95,7 @@
 			md = checkfield(md,'fieldname','mesh.vertexonsurface','size',[md.mesh.numberofvertices 1],'values',[0 1]);
 			md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message','''mesh.average_vertex_connectivity'' should be at least 9 in 2d');
+			if numel(md.mesh.scale_factor)>1,
+				md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
+			end
 
 			if strcmp(solution,'ThermalSolution')
@@ -125,4 +129,5 @@
 			fielddisplay(self,'long','vertices longitude [degrees]');
 			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+			fielddisplay(self,'scale_factor','Projection correction for volume, area, etc. computation)');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
@@ -139,4 +144,5 @@
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
+			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1);
 		end % }}}
 		function t = domaintype(self) % {{{
Index: issm/trunk-jpl/src/m/classes/mesh2dvertical.py
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh2dvertical.py	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh2dvertical.py	(revision 22323)
@@ -24,4 +24,5 @@
 		self.long                        = float('NaN')
 		self.epsg                        = float('NaN')
+		self.scale_factor                = float('NaN');
 
 		self.vertexonboundary            = float('NaN')
@@ -66,4 +67,5 @@
 		string="%s\n%s"%(string,fielddisplay(self,"long","vertices longitude [degrees]"))
 		string="%s\n%s"%(string,fielddisplay(self,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)"))
+		string="%s\n%s"%(string,fielddisplay(self,"scale_factor","Projection correction for volume, area, etc. computation"))
 		return string
 		#}}}
@@ -94,4 +96,6 @@
 		md = checkfield(md,'fieldname','mesh.vertexonsurface','size',[md.mesh.numberofvertices],'values',[0,1])
 		md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',9,'message',"'mesh.average_vertex_connectivity' should be at least 9 in 2d")
+		if(numel(self.scale_factor)>1):
+                        md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices])
 
 		if solution=='ThermalSolution':
@@ -128,3 +132,4 @@
 		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','vertexonsurface','format','BooleanMat','mattype',1)
 		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer')
+		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1)
 	# }}}
Index: issm/trunk-jpl/src/m/classes/mesh3dprisms.js
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh3dprisms.js	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh3dprisms.js	(revision 22323)
@@ -34,4 +34,5 @@
 			checkfield(md,'fieldname','mesh.z','<=',md.geometry.surface+Math.pow(10, -10),'message','\'mesh.z\' higher than surface elevation');
 			checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',24,'message','\'mesh.average_vertex_connectivity\' should be at least 24 in 3d');
+			if(this.scale_factor.length>1) checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1]);
 		} // }}}
 		this.disp = function()  { // {{{
@@ -75,4 +76,5 @@
 			fielddisplay(this,'long','vertices longitude [degrees]');
 			fielddisplay(this,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+			fielddisplay(self,"scale_factor","Projection correction for volume, area, etc. computation)");
 		} // }}}
 		this.marshall = function(md,prefix,fid) { // {{{
@@ -95,4 +97,5 @@
 			WriteData(fid,prefix,'object',this,'class','mesh','fieldname','numberofvertices2d','format','Integer');
 			WriteData(fid,prefix,'object',this,'class','mesh','fieldname','numberofelements2d','format','Integer');
+			WriteData(fid,prefix,'object',this,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1);
 		} // }}}
         this.fix=function() { //{{{
@@ -109,4 +112,5 @@
             this.lat=NaNFix(this.lat,NaN);
             this.long=NaNFix(this.long,NaN);
+				this.scale_factor=NullFix(this.scale_factor,NaN);
         }//}}}
 		this.domaintype = function() { // {{{)
@@ -135,4 +139,5 @@
         this.long                        = NaN;
         this.epsg                        = 0;
+		  this.scale_factor                = NaN;
 
         this.vertexonbase                = NaN;
Index: issm/trunk-jpl/src/m/classes/mesh3dprisms.m
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh3dprisms.m	(revision 22323)
@@ -17,4 +17,5 @@
 		long                        = NaN;
 		epsg                        = 0;
+		scale_factor                = NaN;
 
 		vertexonbase                = NaN;
@@ -120,4 +121,7 @@
 				md = checkmessage(md,'md.mesh.z is not consistent with md.geometry.thickness, you changed the geometry after extrusion !!');
 			end
+			if numel(md.mesh.scale_factor)>1,
+				md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
+			end
 		end % }}}
 		function disp(self) % {{{
@@ -161,4 +165,5 @@
 			fielddisplay(self,'long','vertices longitude [degrees]');
 			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+			fielddisplay(self,'scale_factor','Projection correction for volume, area, etc. computation)');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
@@ -181,4 +186,5 @@
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','numberofvertices2d','format','Integer');
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','numberofelements2d','format','Integer');
+			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1);
 		end % }}}
 		function type = domaintype(self) % {{{
Index: issm/trunk-jpl/src/m/classes/mesh3dprisms.py
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh3dprisms.py	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh3dprisms.py	(revision 22323)
@@ -25,4 +25,5 @@
 		self.long                        = float('NaN');
 		self.epsg                        = 0;
+		self.scale_factor                = float('NaN');
 
 		self.vertexonbase                = float('NaN');
@@ -90,4 +91,5 @@
 		string="%s\n%s"%(string,fielddisplay(self,"long","vertices longitude [degrees]"))
 		string="%s\n%s"%(string,fielddisplay(self,"epsg","EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)"))
+		string="%s\n%s"%(string,fielddisplay(self,"scale_factor","Projection correction for volume, area, etc. computation"))
 		return string
 		#}}}
@@ -118,4 +120,6 @@
 		md = checkfield(md,'fieldname','mesh.vertexonsurface','size',[md.mesh.numberofvertices],'values',[0,1])
 		md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',24,'message',"'mesh.average_vertex_connectivity' should be at least 24 in 3d")
+		if(numel(self.scale_factor)>1):
+                        md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices])
 
 		return md
@@ -149,3 +153,4 @@
 		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','numberofvertices2d','format','Integer')
 		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','numberofelements2d','format','Integer')
+		WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1)
 	# }}}
Index: issm/trunk-jpl/src/m/classes/mesh3dtetras.m
===================================================================
--- issm/trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 22320)
+++ issm/trunk-jpl/src/m/classes/mesh3dtetras.m	(revision 22323)
@@ -17,4 +17,5 @@
 		long                        = NaN;
 		epsg                        = 0;
+		scale_factor                = NaN;
 
 		vertexonbase                = NaN;
@@ -109,4 +110,8 @@
 			md = checkfield(md,'fieldname','mesh.z','<=',md.geometry.surface+10^-10,'message','''mesh.z'' higher than surface elevation');
 			md = checkfield(md,'fieldname','mesh.average_vertex_connectivity','>=',24,'message','''mesh.average_vertex_connectivity'' should be at least 24 in 3d');
+			if numel(md.mesh.scale_factor)>1,
+				md = checkfield(md,'fieldname','mesh.scale_factor','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
+			end
+
 		end % }}}
 		function disp(self) % {{{
@@ -150,4 +155,5 @@
 			fielddisplay(self,'long','vertices longitude [degrees]');
 			fielddisplay(self,'epsg','EPSG code (ex: 3413 for UPS Greenland, 3031 for UPS Antarctica)');
+			fielddisplay(self,'scale_factor','Projection correction for volume, area, etc. computation)');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
@@ -166,4 +172,5 @@
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','lowerelements','format','DoubleMat','mattype',2);
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','upperelements','format','DoubleMat','mattype',2);
+			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','scale_factor','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','average_vertex_connectivity','format','Integer');
 			WriteData(fid,prefix,'object',self,'class','mesh','fieldname','elements2d','format','DoubleMat','mattype',3);
