Index: issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
===================================================================
--- issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp	(revision 23657)
@@ -84,16 +84,16 @@
 	/*Get frontal melt parameters*/
 	int melt_parameterization;
-	iomodel->FindConstant(&melt_parameterization,"md.frontalforcings.melt_parameterization");
+	iomodel->FindConstant(&melt_parameterization,"md.frontalforcings.parameterization");
 	switch(melt_parameterization){
-		case 0:
+		case FrontalForcingsDefaultEnum:
 			iomodel->FetchDataToInput(elements,"md.frontalforcings.meltingrate",CalvingMeltingrateEnum);
 			break;
-		case 1:
+		case FrontalForcingsRignotEnum:
 			iomodel->FetchDataToInput(elements,"md.frontalforcings.basin",FrontalForcingsBasinIdEnum);
 			iomodel->FetchDataToInput(elements,"md.frontalforcings.subglacial_discharge",FrontalForcingsSubglacialDischargeEnum);
 			iomodel->FetchDataToInput(elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum);
-		break;
+			break;
 		default:
-			_error_("Frontal forcing model not supported yet");
+			_error_("Frontal forcings"<<EnumToStringx(melt_parameterization)<<" not supported yet");
 	}
 }
@@ -103,5 +103,4 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.levelset.reinit_frequency",LevelsetReinitFrequencyEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.levelset.calving_max",CalvingMaxEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.melt_parameterization",FrontalForcingsParamEnum));
 	
 	int  calvinglaw;
@@ -129,9 +128,14 @@
 	/*Get frontal melt parameters*/
 	int melt_parameterization;
-	iomodel->FindConstant(&melt_parameterization,"md.frontalforcings.melt_parameterization");
-	if(melt_parameterization==1){
-		parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.numberofbasins",FrontalForcingsNumberofBasinsEnum));
-	}
-	return;
+	iomodel->FindConstant(&melt_parameterization,"md.frontalforcings.parameterization");
+	switch(melt_parameterization){
+		case FrontalForcingsDefaultEnum:
+			break;
+		case FrontalForcingsRignotEnum:
+			parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.numberofbasins",FrontalForcingsNumberofBasinsEnum));
+			break;
+		default:
+			_error_("Frontal forcings "<<EnumToStringx(melt_parameterization)<<" not supported yet");
+	}
 }
 /*}}}*/
Index: issm/trunk-jpl/src/c/classes/IoModel.cpp
===================================================================
--- issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/classes/IoModel.cpp	(revision 23657)
@@ -637,4 +637,5 @@
 					if(strcmp(record_name,"md.basalforcings.model")==0) integer = IoCodeToEnumBasal(integer);
 					if(strcmp(record_name,"md.calving.law")==0) integer = IoCodeToEnumCalving(integer);
+					if(strcmp(record_name,"md.frontalforcings.parameterization")==0) integer = IoCodeToEnumFrontalforcings(integer);
 					if(strcmp(record_name,"md.hydrology.model")==0) integer = IoCodeToEnumHydrology(integer);
 					if(strcmp(record_name,"md.materials.type")==0) integer = IoCodeToEnumMaterials(integer);
Index: issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp
===================================================================
--- issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/modules/FrontalForcingsx/FrontalForcingsx.cpp	(revision 23657)
@@ -15,12 +15,12 @@
 	/*Calculate melting rate*/
 	switch(melt_parameterization){
-		case 0:
+		case FrontalForcingsDefaultEnum:
 			break;
-		case 1:
+		case FrontalForcingsRignotEnum:
 			femmodel->IcefrontAreax();
 			femmodel->RignotMeltParameterizationx();
 			break;
 		default:
-			_error_("Frontal forcings parameterization not supported yet");
+			_error_("Frontal forcings "<<EnumToStringx(melt_parameterization)<<" not supported yet");
 	}
 }
Index: issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 23657)
@@ -62,4 +62,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.inversion.type",InversionTypeEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.calving.law",CalvingLawEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.frontalforcings.parameterization",FrontalForcingsParamEnum));
 	parameters->AddObject(new IntParam(SealevelriseRunCountEnum,1));  
 
Index: issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 23655)
+++ issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 23657)
@@ -830,4 +830,6 @@
 	FreeSurfaceBaseAnalysisEnum,
 	FreeSurfaceTopAnalysisEnum,
+	FrontalForcingsDefaultEnum,
+	FrontalForcingsRignotEnum,
 	FSApproximationEnum,
 	FsetEnum,
Index: issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 23657)
@@ -834,4 +834,6 @@
 		case FreeSurfaceBaseAnalysisEnum : return "FreeSurfaceBaseAnalysis";
 		case FreeSurfaceTopAnalysisEnum : return "FreeSurfaceTopAnalysis";
+		case FrontalForcingsDefaultEnum : return "FrontalForcingsDefault";
+		case FrontalForcingsRignotEnum : return "FrontalForcingsRignot";
 		case FSApproximationEnum : return "FSApproximation";
 		case FsetEnum : return "Fset";
Index: issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 23657)
@@ -852,4 +852,6 @@
 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+	      else if (strcmp(name,"FrontalForcingsDefault")==0) return FrontalForcingsDefaultEnum;
+	      else if (strcmp(name,"FrontalForcingsRignot")==0) return FrontalForcingsRignotEnum;
 	      else if (strcmp(name,"FSApproximation")==0) return FSApproximationEnum;
 	      else if (strcmp(name,"Fset")==0) return FsetEnum;
@@ -873,10 +875,10 @@
 	      else if (strcmp(name,"GroundedAreaScaled")==0) return GroundedAreaScaledEnum;
 	      else if (strcmp(name,"GroundingOnly")==0) return GroundingOnlyEnum;
-	      else if (strcmp(name,"Gset")==0) return GsetEnum;
-	      else if (strcmp(name,"Gsl")==0) return GslEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum;
+	      if (strcmp(name,"Gset")==0) return GsetEnum;
+	      else if (strcmp(name,"Gsl")==0) return GslEnum;
+	      else if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum;
 	      else if (strcmp(name,"HOFSApproximation")==0) return HOFSApproximationEnum;
 	      else if (strcmp(name,"Hook")==0) return HookEnum;
@@ -996,10 +998,10 @@
 	      else if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
 	      else if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
-	      else if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum;
-	      else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Outputdefinition18")==0) return Outputdefinition18Enum;
+	      if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum;
+	      else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum;
+	      else if (strcmp(name,"Outputdefinition18")==0) return Outputdefinition18Enum;
 	      else if (strcmp(name,"Outputdefinition19")==0) return Outputdefinition19Enum;
 	      else if (strcmp(name,"Outputdefinition20")==0) return Outputdefinition20Enum;
@@ -1119,10 +1121,10 @@
 	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
 	      else if (strcmp(name,"Scaled")==0) return ScaledEnum;
-	      else if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum;
-	      else if (strcmp(name,"SealevelEmotion")==0) return SealevelEmotionEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"SealevelInertiaTensorXZ")==0) return SealevelInertiaTensorXZEnum;
+	      if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum;
+	      else if (strcmp(name,"SealevelEmotion")==0) return SealevelEmotionEnum;
+	      else if (strcmp(name,"SealevelInertiaTensorXZ")==0) return SealevelInertiaTensorXZEnum;
 	      else if (strcmp(name,"SealevelInertiaTensorYZ")==0) return SealevelInertiaTensorYZEnum;
 	      else if (strcmp(name,"SealevelInertiaTensorZZ")==0) return SealevelInertiaTensorZZEnum;
Index: issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
===================================================================
--- issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 23655)
+++ issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 23657)
@@ -212,4 +212,11 @@
 	}
 }/*}}}*/
+int IoCodeToEnumFrontalforcings(int enum_in){/*{{{*/
+	switch(enum_in){
+		case 1: return FrontalForcingsDefaultEnum;
+		case 2: return FrontalForcingsRignotEnum;
+		default: _error_("Marshalled Frontalforcings code \""<<enum_in<<"\" not supported yet");
+	}
+}/*}}}*/
 int IoCodeToEnumHydrology(int enum_in){/*{{{*/
 	switch(enum_in){
Index: issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.h
===================================================================
--- issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.h	(revision 23655)
+++ issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.h	(revision 23657)
@@ -7,4 +7,5 @@
 int IoCodeToEnumBasal(int enum_in);
 int IoCodeToEnumCalving(int enum_in);
+int IoCodeToEnumFrontalforcings(int enum_in);
 int IoCodeToEnumHydrology(int enum_in);
 int IoCodeToEnumMaterials(int enum_in);
Index: issm/trunk-jpl/src/m/classes/frontalforcings.m
===================================================================
--- issm/trunk-jpl/src/m/classes/frontalforcings.m	(revision 23655)
+++ issm/trunk-jpl/src/m/classes/frontalforcings.m	(revision 23657)
@@ -7,9 +7,4 @@
 	properties (SetAccess=public) 
 		meltingrate   = NaN;
-		melt_parameterization =0;
-		basin= NaN;
-		numberofbasins=0;
-		subglacial_discharge= NaN;
-		thermalforcing=NaN;
 	end
 	methods
@@ -38,49 +33,20 @@
 
 			meltingrate   = NaN;
-			melt_parameterization =0;
-			basin=NaN;
-			numberofbasins=0;
-			subglacial_discharge=NaN;
-			thermalforcing=NaN;
 		end % }}}
 		function md = checkconsistency(self,md,solution,analyses) % {{{
 			%Early return
 			if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
-			
-			md = checkfield(md,'fieldname','frontalforcings.melt_parameterization','numel',[1],'values',[0,1]);
-			if self.melt_parameterization==0,
-				md = checkfield(md,'fieldname','frontalforcings.meltingrate','NaN',1,'Inf',1,'timeseries',1,'>=',0);
-			elseif self.melt_parameterization==1,
-				md = checkfield(md,'fieldname','frontalforcings.basin','>',0,'nan',1,'Inf',1);
-				md = checkfield(md,'fieldname','frontalforcings.numberofbasins','numel',[1]);
-				md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'nan',1,'Inf',1,'timeseries',1);
-				md = checkfield(md,'fieldname','frontalforcings.thermalforcing','nan',1,'Inf',1,'timeseries',1);
-			end
+
+			md = checkfield(md,'fieldname','frontalforcings.meltingrate','NaN',1,'Inf',1,'timeseries',1,'>=',0);
 
 		end % }}}
 		function disp(self) % {{{
 			disp(sprintf('   Frontalforcings parameters:'));
-			fielddisplay(self,'melt_parameterization','0: no, 1: Rignot melt parameterization (Rignot et al.,2016)');
-			if self.melt_parameterization==0,
-				fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
-			elseif self.melt_parameterization==1,
-				fielddisplay(self,'basin','basin ID for vertices');
-				fielddisplay(self,'numberofbasins', 'number of basins');
-				fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m/d]');
-				fielddisplay(self,'thermalforcing','thermal forcing [∘C]');
-			end
+			fielddisplay(self,'meltingrate','melting rate at given location [m/a]');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
 			yts=md.constants.yts;
-			WriteData(fid,prefix,'object',self,'fieldname','melt_parameterization','format','Integer');
-			switch self.melt_parameterization
-				case 0
-					WriteData(fid,prefix,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts,'scale',1./yts);
-				case 1
-					WriteData(fid,prefix,'object',self,'fieldname','basin','format','DoubleMat','mattype',1);
-					WriteData(fid,prefix,'object',self,'fieldname','numberofbasins','format','Integer');
-					WriteData(fid,prefix,'object',self,'fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
-					WriteData(fid,prefix,'object',self,'fieldname','thermalforcing','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
-			end
+			WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',1,'format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','meltingrate','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts,'scale',1./yts);
 		end % }}}
 	end
Index: issm/trunk-jpl/src/m/classes/frontalforcingsrignot.m
===================================================================
--- issm/trunk-jpl/src/m/classes/frontalforcingsrignot.m	(revision 23657)
+++ issm/trunk-jpl/src/m/classes/frontalforcingsrignot.m	(revision 23657)
@@ -0,0 +1,67 @@
+%FRONTAL FORCINGS rignot class definition
+%
+%   Usage:
+%      frontalforcingsrignot=frontalforcingsrignot();
+
+classdef frontalforcingsrignot
+	properties (SetAccess=public) 
+		basin= NaN;
+		numberofbasins=0;
+		subglacial_discharge= NaN;
+		thermalforcing=NaN;
+	end
+	methods
+		function self = frontalforcingsrignot(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				case 1
+					inputstruct=varargin{1};
+					list1 = properties('frontalforcingsrignot');
+					list2 = fieldnames(inputstruct);
+					for i=1:length(list1)
+						fieldname = list1{i};
+						if ismember(fieldname,list2),
+							self.(fieldname) = inputstruct.(fieldname);
+						end
+					end
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = extrude(self,md) % {{{
+		    % nothing for now
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+
+			basin=NaN;
+			numberofbasins=0;
+			subglacial_discharge=NaN;
+			thermalforcing=NaN;
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+			%Early return
+			if (~strcmp(solution,'TransientSolution') | md.transient.ismovingfront==0), return; end
+
+			md = checkfield(md,'fieldname','frontalforcings.basin','>',0,'nan',1,'Inf',1);
+			md = checkfield(md,'fieldname','frontalforcings.numberofbasins','numel',[1]);
+			md = checkfield(md,'fieldname','frontalforcings.subglacial_discharge','>=',0,'nan',1,'Inf',1,'timeseries',1);
+			md = checkfield(md,'fieldname','frontalforcings.thermalforcing','nan',1,'Inf',1,'timeseries',1);
+
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   Frontalforcings parameters:'));
+			fielddisplay(self,'basin','basin ID for vertices');
+			fielddisplay(self,'numberofbasins', 'number of basins');
+			fielddisplay(self,'subglacial_discharge','sum of subglacial discharge for each basin [m/d]');
+			fielddisplay(self,'thermalforcing','thermal forcing [∘C]');
+		end % }}}
+		function marshall(self,prefix,md,fid) % {{{
+			WriteData(fid,prefix,'name','md.frontalforcings.parameterization','data',2,'format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','basin','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','numberofbasins','format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','subglacial_discharge','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,prefix,'object',self,'fieldname','thermalforcing','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
+		end % }}}
+	end
+end
