Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 17071)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 17072)
@@ -30,5 +30,5 @@
 void MasstransportAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/
 
-	int    stabilization,finiteelement;
+	int    stabilization,finiteelement,smb_model;
 	bool   dakota_analysis;
 	bool   issmbgradients;
@@ -40,7 +40,5 @@
 	iomodel->Constant(&stabilization,MasstransportStabilizationEnum);
 	iomodel->Constant(&dakota_analysis,QmuIsdakotaEnum);
-	iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
-	iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
-	iomodel->Constant(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
+	iomodel->Constant(&smb_model,SurfaceforcingsEnum);
 	iomodel->Constant(&isgroundingline,TransientIsgroundinglineEnum);
 
@@ -88,25 +86,38 @@
 	}
 
-	if(issmbgradients){
-		iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum);
-		iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum);
-		iomodel->FetchDataToInput(elements,SurfaceforcingsBPosEnum);
-		iomodel->FetchDataToInput(elements,SurfaceforcingsBNegEnum);
-	}
-	if(ispdd){
-		iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum);
-		if(isdelta18o){
-			iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum);
-			iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum);
-			iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum);
-		}
-		else{
-			iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
-			iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum);
-		}
-	}
-	if(~ispdd && ~issmbgradients){
-		iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.);
-	}
+	switch(smb_model){
+		case SMBEnum:
+			iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.);
+			break;
+		case SurfaceforcingsEnum: /*To Be REMOVED*/
+			iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
+			iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+			iomodel->Constant(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
+			if(issmbgradients){
+				iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum);
+				iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum);
+				iomodel->FetchDataToInput(elements,SurfaceforcingsBPosEnum);
+				iomodel->FetchDataToInput(elements,SurfaceforcingsBNegEnum);
+			}
+			if(ispdd){
+				iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum);
+				if(isdelta18o){
+					iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum);
+					iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum);
+					iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum);
+				}
+				else{
+					iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
+					iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum);
+				}
+			}
+			if(~ispdd && ~issmbgradients){
+				iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.);
+			}
+			break;
+		default:
+			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
+	}
+
 }/*}}}*/
 void MasstransportAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/
Index: /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 17071)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 17072)
@@ -23,7 +23,7 @@
 	bool ispdd;
 	bool isefficientlayer;
-	int  hydrology_model;
+	int  hydrology_model,smb_model;
 	iomodel->Constant(&hydrology_model,HydrologyModelEnum);
-	iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
+	iomodel->Constant(&smb_model,SurfaceforcingsEnum);
 
 	this->mid = matpar_mid;
@@ -43,7 +43,17 @@
 	iomodel->Constant(&this->g,ConstantsGEnum);
 
-	if(ispdd){
-		iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum);
-		iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum);
+	switch(smb_model){
+		case SMBEnum:
+			/*Nothing to add*/
+			break;
+		case SurfaceforcingsEnum: /*To Be REMOVED*/
+			iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
+			if(ispdd){
+				iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum);
+				iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum);
+			}
+			break;
+		default:
+			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
 	}
 
Index: /issm/trunk-jpl/src/c/cores/masstransport_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 17071)
+++ /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 17072)
@@ -14,5 +14,5 @@
 	/*parameters: */
 	int    i;
-	int    numoutputs,meshtype;
+	int    numoutputs,meshtype,smb_model;
 	bool   save_results;
 	bool   issmbgradients,ispdd,isdelta18o,isFS,isfreesurface,dakota_analysis;
@@ -25,7 +25,5 @@
 	/*recover parameters: */
 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
-	femmodel->parameters->FindParam(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
-	femmodel->parameters->FindParam(&ispdd,SurfaceforcingsIspddEnum);
-	femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+	femmodel->parameters->FindParam(&smb_model,SurfaceforcingsEnum);
 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
 	femmodel->parameters->FindParam(&isfreesurface,MasstransportIsfreesurfaceEnum);
@@ -43,15 +41,27 @@
 	}
 
-	if(issmbgradients){
-	  if(VerboseSolution())_printf_("	call smb gradients module\n\n");
-	  SmbGradientsx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
-	}
-	if(ispdd){
-		if(isdelta18o){
-			if(VerboseSolution()) _printf0_("   call Delta18oParametrization module\n");
-			Delta18oParameterizationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
-		} 
-		if(VerboseSolution()) _printf0_("   call positive degree day module\n");
-		PositiveDegreeDayx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+	switch(smb_model){
+		case SMBEnum:
+			/*Nothing to be done*/
+			break;
+		case SurfaceforcingsEnum: /*To Be REMOVED*/
+			femmodel->parameters->FindParam(&issmbgradients,SurfaceforcingsIssmbgradientsEnum);
+			femmodel->parameters->FindParam(&ispdd,SurfaceforcingsIspddEnum);
+			femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+			if(issmbgradients){
+				if(VerboseSolution())_printf_("	call smb gradients module\n\n");
+				SmbGradientsx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+			}
+			if(ispdd){
+				if(isdelta18o){
+					if(VerboseSolution()) _printf0_("   call Delta18oParametrization module\n");
+					Delta18oParameterizationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+				} 
+				if(VerboseSolution()) _printf0_("   call positive degree day module\n");
+				PositiveDegreeDayx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+			}
+			break;
+		default:
+			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
 	}
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 17071)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 17072)
@@ -19,5 +19,5 @@
 
 	int         i,j,m,k;
-	int         numoutputs,meshtype;
+	int         numoutputs,meshtype,smb_model;
 	char**      requestedoutputs = NULL;
 	IssmDouble  time;
@@ -72,7 +72,4 @@
 	parameters->AddObject(iomodel->CopyConstantObject(InversionIscontrolEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(InversionTaoEnum));
-	parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIspddEnum));
-	parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum));
-	parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIssmbgradientsEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(GiaCrossSectionShapeEnum));
 
@@ -87,28 +84,39 @@
 	 parameters->AddObject(iomodel->CopyConstantObject(MeshNumberoflayersEnum));
 
-	iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
-	if(ispdd){
-
-		parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsDesfacEnum));
-		parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0pEnum));
-
-		iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
-		if(isdelta18o){
-			IssmDouble *temp = NULL;
-			IssmDouble  yts;
-			int         N,M;
-
-			iomodel->Constant(&yts,ConstantsYtsEnum);
-
-			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oEnum); _assert_(N==2);
-			for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
-			parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oEnum,&temp[0],&temp[M],M));
-			iomodel->DeleteData(temp,SurfaceforcingsDelta18oEnum);
-
-			iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oSurfaceEnum); _assert_(N==2);
-			for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
-			parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oSurfaceEnum,&temp[0],&temp[M],M));
-			iomodel->DeleteData(temp,SurfaceforcingsDelta18oSurfaceEnum);
-		}
+	/*Surface mass balance parameters*/
+	parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsEnum));
+	iomodel->Constant(&smb_model,SurfaceforcingsEnum);
+	switch(smb_model){
+		case SMBEnum:
+			/*Nothing to add to parameters*/
+			break;
+		case SurfaceforcingsEnum: /*To Be REMOVED*/
+			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIspddEnum));
+			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum));
+			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIssmbgradientsEnum));
+			iomodel->Constant(&ispdd,SurfaceforcingsIspddEnum);
+			if(ispdd){
+				parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsDesfacEnum));
+				parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0pEnum));
+				iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+				if(isdelta18o){
+					IssmDouble *temp = NULL;
+					IssmDouble  yts;
+					int         N,M;
+					iomodel->Constant(&yts,ConstantsYtsEnum);
+					iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oEnum); _assert_(N==2);
+					for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
+					parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oEnum,&temp[0],&temp[M],M));
+					iomodel->DeleteData(temp,SurfaceforcingsDelta18oEnum);
+
+					iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oSurfaceEnum); _assert_(N==2);
+					for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
+					parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oSurfaceEnum,&temp[0],&temp[M],M));
+					iomodel->DeleteData(temp,SurfaceforcingsDelta18oSurfaceEnum);
+				}
+			}
+			break;
+		default:
+			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
 	}
 
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17071)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17072)
@@ -237,10 +237,5 @@
 	SettingsOutputFrequencyEnum,
 	SettingsWaitonlockEnum,
-	SurfaceforcingsDelta18oEnum,
-	SurfaceforcingsDelta18oSurfaceEnum,
-	SurfaceforcingsIsdelta18oEnum,
-	SurfaceforcingsPrecipitationsPresentdayEnum,
-	SurfaceforcingsTemperaturesPresentdayEnum,
-	SurfaceforcingsTemperaturesLgmEnum,
+
 	DebugProfilingEnum,
 	ProfilingCurrentMemEnum,
@@ -253,15 +248,5 @@
 	SteadystateRequestedOutputsEnum,
 	SurfaceEnum,
-	SurfaceforcingsPrecipitationEnum,
-	SurfaceforcingsMassBalanceEnum,
-	SurfaceforcingsIspddEnum,
-	SurfaceforcingsDesfacEnum,
-	SurfaceforcingsS0pEnum,
-	SurfaceforcingsIssmbgradientsEnum,
-	SurfaceforcingsMonthlytemperaturesEnum,
-	SurfaceforcingsHrefEnum,
-	SurfaceforcingsSmbrefEnum,
-	SurfaceforcingsBPosEnum,
-	SurfaceforcingsBNegEnum,
+
 	ThermalIsenthalpyEnum,
 	ThermalIsdynamicbasalspcEnum,
@@ -290,4 +275,26 @@
 	TransientNumRequestedOutputsEnum,
 	TransientRequestedOutputsEnum,
+	/*}}}*/
+	/*Surfaceforcings{{{*/
+	SurfaceforcingsEnum,
+	SMBEnum,
+	SurfaceforcingsMassBalanceEnum,
+
+	SurfaceforcingsDelta18oEnum,
+	SurfaceforcingsDelta18oSurfaceEnum,
+	SurfaceforcingsIsdelta18oEnum,
+	SurfaceforcingsPrecipitationsPresentdayEnum,
+	SurfaceforcingsTemperaturesPresentdayEnum,
+	SurfaceforcingsTemperaturesLgmEnum,
+	SurfaceforcingsPrecipitationEnum,
+	SurfaceforcingsIspddEnum,
+	SurfaceforcingsDesfacEnum,
+	SurfaceforcingsS0pEnum,
+	SurfaceforcingsIssmbgradientsEnum,
+	SurfaceforcingsMonthlytemperaturesEnum,
+	SurfaceforcingsHrefEnum,
+	SurfaceforcingsSmbrefEnum,
+	SurfaceforcingsBPosEnum,
+	SurfaceforcingsBNegEnum,
 	/*}}}*/
 	/*Solutions and Analyses{{{ */
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17071)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17072)
@@ -245,10 +245,4 @@
 		case SettingsOutputFrequencyEnum : return "SettingsOutputFrequency";
 		case SettingsWaitonlockEnum : return "SettingsWaitonlock";
-		case SurfaceforcingsDelta18oEnum : return "SurfaceforcingsDelta18o";
-		case SurfaceforcingsDelta18oSurfaceEnum : return "SurfaceforcingsDelta18oSurface";
-		case SurfaceforcingsIsdelta18oEnum : return "SurfaceforcingsIsdelta18o";
-		case SurfaceforcingsPrecipitationsPresentdayEnum : return "SurfaceforcingsPrecipitationsPresentday";
-		case SurfaceforcingsTemperaturesPresentdayEnum : return "SurfaceforcingsTemperaturesPresentday";
-		case SurfaceforcingsTemperaturesLgmEnum : return "SurfaceforcingsTemperaturesLgm";
 		case DebugProfilingEnum : return "DebugProfiling";
 		case ProfilingCurrentMemEnum : return "ProfilingCurrentMem";
@@ -261,15 +255,4 @@
 		case SteadystateRequestedOutputsEnum : return "SteadystateRequestedOutputs";
 		case SurfaceEnum : return "Surface";
-		case SurfaceforcingsPrecipitationEnum : return "SurfaceforcingsPrecipitation";
-		case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance";
-		case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd";
-		case SurfaceforcingsDesfacEnum : return "SurfaceforcingsDesfac";
-		case SurfaceforcingsS0pEnum : return "SurfaceforcingsS0p";
-		case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients";
-		case SurfaceforcingsMonthlytemperaturesEnum : return "SurfaceforcingsMonthlytemperatures";
-		case SurfaceforcingsHrefEnum : return "SurfaceforcingsHref";
-		case SurfaceforcingsSmbrefEnum : return "SurfaceforcingsSmbref";
-		case SurfaceforcingsBPosEnum : return "SurfaceforcingsBPos";
-		case SurfaceforcingsBNegEnum : return "SurfaceforcingsBNeg";
 		case ThermalIsenthalpyEnum : return "ThermalIsenthalpy";
 		case ThermalIsdynamicbasalspcEnum : return "ThermalIsdynamicbasalspc";
@@ -298,4 +281,23 @@
 		case TransientNumRequestedOutputsEnum : return "TransientNumRequestedOutputs";
 		case TransientRequestedOutputsEnum : return "TransientRequestedOutputs";
+		case SurfaceforcingsEnum : return "Surfaceforcings";
+		case SMBEnum : return "SMB";
+		case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance";
+		case SurfaceforcingsDelta18oEnum : return "SurfaceforcingsDelta18o";
+		case SurfaceforcingsDelta18oSurfaceEnum : return "SurfaceforcingsDelta18oSurface";
+		case SurfaceforcingsIsdelta18oEnum : return "SurfaceforcingsIsdelta18o";
+		case SurfaceforcingsPrecipitationsPresentdayEnum : return "SurfaceforcingsPrecipitationsPresentday";
+		case SurfaceforcingsTemperaturesPresentdayEnum : return "SurfaceforcingsTemperaturesPresentday";
+		case SurfaceforcingsTemperaturesLgmEnum : return "SurfaceforcingsTemperaturesLgm";
+		case SurfaceforcingsPrecipitationEnum : return "SurfaceforcingsPrecipitation";
+		case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd";
+		case SurfaceforcingsDesfacEnum : return "SurfaceforcingsDesfac";
+		case SurfaceforcingsS0pEnum : return "SurfaceforcingsS0p";
+		case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients";
+		case SurfaceforcingsMonthlytemperaturesEnum : return "SurfaceforcingsMonthlytemperatures";
+		case SurfaceforcingsHrefEnum : return "SurfaceforcingsHref";
+		case SurfaceforcingsSmbrefEnum : return "SurfaceforcingsSmbref";
+		case SurfaceforcingsBPosEnum : return "SurfaceforcingsBPos";
+		case SurfaceforcingsBNegEnum : return "SurfaceforcingsBNeg";
 		case SolutionTypeEnum : return "SolutionType";
 		case AnalysisTypeEnum : return "AnalysisType";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17071)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17072)
@@ -248,10 +248,4 @@
 	      else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
 	      else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
-	      else if (strcmp(name,"SurfaceforcingsDelta18o")==0) return SurfaceforcingsDelta18oEnum;
-	      else if (strcmp(name,"SurfaceforcingsDelta18oSurface")==0) return SurfaceforcingsDelta18oSurfaceEnum;
-	      else if (strcmp(name,"SurfaceforcingsIsdelta18o")==0) return SurfaceforcingsIsdelta18oEnum;
-	      else if (strcmp(name,"SurfaceforcingsPrecipitationsPresentday")==0) return SurfaceforcingsPrecipitationsPresentdayEnum;
-	      else if (strcmp(name,"SurfaceforcingsTemperaturesPresentday")==0) return SurfaceforcingsTemperaturesPresentdayEnum;
-	      else if (strcmp(name,"SurfaceforcingsTemperaturesLgm")==0) return SurfaceforcingsTemperaturesLgmEnum;
 	      else if (strcmp(name,"DebugProfiling")==0) return DebugProfilingEnum;
 	      else if (strcmp(name,"ProfilingCurrentMem")==0) return ProfilingCurrentMemEnum;
@@ -260,25 +254,14 @@
 	      else if (strcmp(name,"MaxIterationConvergenceFlag")==0) return MaxIterationConvergenceFlagEnum;
 	      else if (strcmp(name,"SteadystateMaxiter")==0) return SteadystateMaxiterEnum;
+	      else if (strcmp(name,"SteadystateNumRequestedOutputs")==0) return SteadystateNumRequestedOutputsEnum;
+	      else if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum;
+	      else if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum;
+	      else if (strcmp(name,"Surface")==0) return SurfaceEnum;
+	      else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum;
+	      else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"SteadystateNumRequestedOutputs")==0) return SteadystateNumRequestedOutputsEnum;
-	      else if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum;
-	      else if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum;
-	      else if (strcmp(name,"Surface")==0) return SurfaceEnum;
-	      else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum;
-	      else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum;
-	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
-	      else if (strcmp(name,"SurfaceforcingsDesfac")==0) return SurfaceforcingsDesfacEnum;
-	      else if (strcmp(name,"SurfaceforcingsS0p")==0) return SurfaceforcingsS0pEnum;
-	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
-	      else if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum;
-	      else if (strcmp(name,"SurfaceforcingsHref")==0) return SurfaceforcingsHrefEnum;
-	      else if (strcmp(name,"SurfaceforcingsSmbref")==0) return SurfaceforcingsSmbrefEnum;
-	      else if (strcmp(name,"SurfaceforcingsBPos")==0) return SurfaceforcingsBPosEnum;
-	      else if (strcmp(name,"SurfaceforcingsBNeg")==0) return SurfaceforcingsBNegEnum;
-	      else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum;
-	      else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
-	      else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
+	      if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
 	      else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
 	      else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
@@ -304,4 +287,23 @@
 	      else if (strcmp(name,"TransientNumRequestedOutputs")==0) return TransientNumRequestedOutputsEnum;
 	      else if (strcmp(name,"TransientRequestedOutputs")==0) return TransientRequestedOutputsEnum;
+	      else if (strcmp(name,"Surfaceforcings")==0) return SurfaceforcingsEnum;
+	      else if (strcmp(name,"SMB")==0) return SMBEnum;
+	      else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum;
+	      else if (strcmp(name,"SurfaceforcingsDelta18o")==0) return SurfaceforcingsDelta18oEnum;
+	      else if (strcmp(name,"SurfaceforcingsDelta18oSurface")==0) return SurfaceforcingsDelta18oSurfaceEnum;
+	      else if (strcmp(name,"SurfaceforcingsIsdelta18o")==0) return SurfaceforcingsIsdelta18oEnum;
+	      else if (strcmp(name,"SurfaceforcingsPrecipitationsPresentday")==0) return SurfaceforcingsPrecipitationsPresentdayEnum;
+	      else if (strcmp(name,"SurfaceforcingsTemperaturesPresentday")==0) return SurfaceforcingsTemperaturesPresentdayEnum;
+	      else if (strcmp(name,"SurfaceforcingsTemperaturesLgm")==0) return SurfaceforcingsTemperaturesLgmEnum;
+	      else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum;
+	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+	      else if (strcmp(name,"SurfaceforcingsDesfac")==0) return SurfaceforcingsDesfacEnum;
+	      else if (strcmp(name,"SurfaceforcingsS0p")==0) return SurfaceforcingsS0pEnum;
+	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+	      else if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum;
+	      else if (strcmp(name,"SurfaceforcingsHref")==0) return SurfaceforcingsHrefEnum;
+	      else if (strcmp(name,"SurfaceforcingsSmbref")==0) return SurfaceforcingsSmbrefEnum;
+	      else if (strcmp(name,"SurfaceforcingsBPos")==0) return SurfaceforcingsBPosEnum;
+	      else if (strcmp(name,"SurfaceforcingsBNeg")==0) return SurfaceforcingsBNegEnum;
 	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
 	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
@@ -381,10 +383,10 @@
 	      else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
 	      else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum;
-	      else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
-	      else if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum;
+	      if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
+	      else if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum;
+	      else if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum;
 	      else if (strcmp(name,"DoubleParam")==0) return DoubleParamEnum;
 	      else if (strcmp(name,"DoubleVecParam")==0) return DoubleVecParamEnum;
@@ -504,10 +506,10 @@
 	      else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum;
 	      else if (strcmp(name,"DragCoefficientAbsGradient")==0) return DragCoefficientAbsGradientEnum;
-	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
-	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
+	      if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
+	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
+	      else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
 	      else if (strcmp(name,"BasalFriction")==0) return BasalFrictionEnum;
 	      else if (strcmp(name,"ViscousHeating")==0) return ViscousHeatingEnum;
@@ -627,10 +629,10 @@
 	      else if (strcmp(name,"Dense")==0) return DenseEnum;
 	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
-	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
-	      else if (strcmp(name,"Seq")==0) return SeqEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"Mpi")==0) return MpiEnum;
+	      if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+	      else if (strcmp(name,"Seq")==0) return SeqEnum;
+	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
 	      else if (strcmp(name,"Mumps")==0) return MumpsEnum;
 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
Index: /issm/trunk-jpl/src/m/classes/SMB.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMB.m	(revision 17072)
+++ /issm/trunk-jpl/src/m/classes/SMB.m	(revision 17072)
@@ -0,0 +1,47 @@
+%SURFACEFORCING Class definition
+%
+%   Usage:
+%      SMB=SMB();
+
+classdef SMB
+	properties (SetAccess=public) 
+		mass_balance = NaN;
+	end
+	methods
+		function obj = SMB(varargin) % {{{
+			switch nargin
+				case 0
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+			if isnan(self.mass_balance)
+				self.mass_balance=zeros(md.mesh.numberofvertices,1);
+				disp('      no surfaceforcings.mass_balance specified: values set as zero');
+			end
+
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+
+			if ismember(MasstransportAnalysisEnum(),analyses),
+				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','forcing',1,'NaN',1);
+			end
+			if ismember(BalancethicknessAnalysisEnum(),analyses),
+				md = checkfield(md,'fieldname','surfaceforcings.mass_balance','size',[md.mesh.numberofvertices 1],'NaN',1);
+			end
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('   surface forcings parameters:'));
+			fielddisplay(obj,'mass_balance','surface mass balance [m/yr ice eq]');
+		end % }}}
+		function marshall(obj,md,fid) % {{{
+
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBEnum(),'format','Integer');
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/surfaceforcings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/surfaceforcings.m	(revision 17071)
+++ /issm/trunk-jpl/src/m/classes/surfaceforcings.m	(revision 17072)
@@ -116,4 +116,6 @@
 			yts=365.0*24.0*3600.0;
 
+			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SurfaceforcingsEnum(),'format','Integer');
+
 			WriteData(fid,'object',obj,'fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
 			WriteData(fid,'object',obj,'fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
Index: /issm/trunk-jpl/src/m/classes/surfaceforcings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/surfaceforcings.py	(revision 17071)
+++ /issm/trunk-jpl/src/m/classes/surfaceforcings.py	(revision 17072)
@@ -115,4 +115,6 @@
 		yts=365.0*24.0*3600.0
 
+		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SurfaceforcingsEnum(),'format','Integer');
+
 		WriteData(fid,'object',self,'fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
 		WriteData(fid,'object',self,'fieldname','mass_balance','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17071)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17072)
@@ -237,10 +237,4 @@
 def SettingsOutputFrequencyEnum(): return StringToEnum("SettingsOutputFrequency")[0]
 def SettingsWaitonlockEnum(): return StringToEnum("SettingsWaitonlock")[0]
-def SurfaceforcingsDelta18oEnum(): return StringToEnum("SurfaceforcingsDelta18o")[0]
-def SurfaceforcingsDelta18oSurfaceEnum(): return StringToEnum("SurfaceforcingsDelta18oSurface")[0]
-def SurfaceforcingsIsdelta18oEnum(): return StringToEnum("SurfaceforcingsIsdelta18o")[0]
-def SurfaceforcingsPrecipitationsPresentdayEnum(): return StringToEnum("SurfaceforcingsPrecipitationsPresentday")[0]
-def SurfaceforcingsTemperaturesPresentdayEnum(): return StringToEnum("SurfaceforcingsTemperaturesPresentday")[0]
-def SurfaceforcingsTemperaturesLgmEnum(): return StringToEnum("SurfaceforcingsTemperaturesLgm")[0]
 def DebugProfilingEnum(): return StringToEnum("DebugProfiling")[0]
 def ProfilingCurrentMemEnum(): return StringToEnum("ProfilingCurrentMem")[0]
@@ -253,15 +247,4 @@
 def SteadystateRequestedOutputsEnum(): return StringToEnum("SteadystateRequestedOutputs")[0]
 def SurfaceEnum(): return StringToEnum("Surface")[0]
-def SurfaceforcingsPrecipitationEnum(): return StringToEnum("SurfaceforcingsPrecipitation")[0]
-def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0]
-def SurfaceforcingsIspddEnum(): return StringToEnum("SurfaceforcingsIspdd")[0]
-def SurfaceforcingsDesfacEnum(): return StringToEnum("SurfaceforcingsDesfac")[0]
-def SurfaceforcingsS0pEnum(): return StringToEnum("SurfaceforcingsS0p")[0]
-def SurfaceforcingsIssmbgradientsEnum(): return StringToEnum("SurfaceforcingsIssmbgradients")[0]
-def SurfaceforcingsMonthlytemperaturesEnum(): return StringToEnum("SurfaceforcingsMonthlytemperatures")[0]
-def SurfaceforcingsHrefEnum(): return StringToEnum("SurfaceforcingsHref")[0]
-def SurfaceforcingsSmbrefEnum(): return StringToEnum("SurfaceforcingsSmbref")[0]
-def SurfaceforcingsBPosEnum(): return StringToEnum("SurfaceforcingsBPos")[0]
-def SurfaceforcingsBNegEnum(): return StringToEnum("SurfaceforcingsBNeg")[0]
 def ThermalIsenthalpyEnum(): return StringToEnum("ThermalIsenthalpy")[0]
 def ThermalIsdynamicbasalspcEnum(): return StringToEnum("ThermalIsdynamicbasalspc")[0]
@@ -290,4 +273,23 @@
 def TransientNumRequestedOutputsEnum(): return StringToEnum("TransientNumRequestedOutputs")[0]
 def TransientRequestedOutputsEnum(): return StringToEnum("TransientRequestedOutputs")[0]
+def SurfaceforcingsEnum(): return StringToEnum("Surfaceforcings")[0]
+def SMBEnum(): return StringToEnum("SMB")[0]
+def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0]
+def SurfaceforcingsDelta18oEnum(): return StringToEnum("SurfaceforcingsDelta18o")[0]
+def SurfaceforcingsDelta18oSurfaceEnum(): return StringToEnum("SurfaceforcingsDelta18oSurface")[0]
+def SurfaceforcingsIsdelta18oEnum(): return StringToEnum("SurfaceforcingsIsdelta18o")[0]
+def SurfaceforcingsPrecipitationsPresentdayEnum(): return StringToEnum("SurfaceforcingsPrecipitationsPresentday")[0]
+def SurfaceforcingsTemperaturesPresentdayEnum(): return StringToEnum("SurfaceforcingsTemperaturesPresentday")[0]
+def SurfaceforcingsTemperaturesLgmEnum(): return StringToEnum("SurfaceforcingsTemperaturesLgm")[0]
+def SurfaceforcingsPrecipitationEnum(): return StringToEnum("SurfaceforcingsPrecipitation")[0]
+def SurfaceforcingsIspddEnum(): return StringToEnum("SurfaceforcingsIspdd")[0]
+def SurfaceforcingsDesfacEnum(): return StringToEnum("SurfaceforcingsDesfac")[0]
+def SurfaceforcingsS0pEnum(): return StringToEnum("SurfaceforcingsS0p")[0]
+def SurfaceforcingsIssmbgradientsEnum(): return StringToEnum("SurfaceforcingsIssmbgradients")[0]
+def SurfaceforcingsMonthlytemperaturesEnum(): return StringToEnum("SurfaceforcingsMonthlytemperatures")[0]
+def SurfaceforcingsHrefEnum(): return StringToEnum("SurfaceforcingsHref")[0]
+def SurfaceforcingsSmbrefEnum(): return StringToEnum("SurfaceforcingsSmbref")[0]
+def SurfaceforcingsBPosEnum(): return StringToEnum("SurfaceforcingsBPos")[0]
+def SurfaceforcingsBNegEnum(): return StringToEnum("SurfaceforcingsBNeg")[0]
 def SolutionTypeEnum(): return StringToEnum("SolutionType")[0]
 def AnalysisTypeEnum(): return StringToEnum("AnalysisType")[0]
