Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 18001)
@@ -115,4 +115,15 @@
 		case SMBhenningEnum:
 			iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum,0.);
+			break;
+		case SMBcomponentsEnum:
+			iomodel->FetchDataToInput(elements,SurfaceforcingsAccumulationEnum,0.);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsEvaporationEnum,0.);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsRunoffEnum,0.);
+			break;
+		case SMBmeltcomponentsEnum:
+			iomodel->FetchDataToInput(elements,SurfaceforcingsAccumulationEnum,0.);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsEvaporationEnum,0.);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsMeltEnum,0.);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsRefreezeEnum,0.);
 			break;
 		default:
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 18001)
@@ -228,5 +228,4 @@
 		virtual void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm)=0;
 		virtual void   Delta18oParameterization(void)=0;
-		virtual void   SmbGradients(void)=0;
 	   virtual Element*   SpawnBasalElement(void)=0;
 		virtual Element*   SpawnTopElement(void)=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.cpp	(revision 18001)
@@ -2001,49 +2001,4 @@
 
 	return tria;
-}
-/*}}}*/
-void       Penta::SmbGradients(void){/*{{{*/
-
-	int i;
-
-	// input
-   IssmDouble h[NUMVERTICES];					// ice thickness (m)		
-	IssmDouble s[NUMVERTICES];					// surface elevation (m)
-	IssmDouble b_pos[NUMVERTICES];				// Hs-SMB relation parameter
-	IssmDouble b_neg[NUMVERTICES];				// Hs-SMB relation paremeter
-	IssmDouble Href[NUMVERTICES];					// reference elevation from which deviations are used to calculate the SMB adjustment
-	IssmDouble Smbref[NUMVERTICES];				// reference SMB to which deviations are added
-   IssmDouble rho_water;                   // density of fresh water
-	IssmDouble rho_ice;                     // density of ice
-
-	// output
-	IssmDouble smb[NUMVERTICES];					// surface mass balance (m/yr ice)
-
-	/*Recover SmbGradients*/
-	GetInputListOnVertices(&Href[0],SurfaceforcingsHrefEnum);
-	GetInputListOnVertices(&Smbref[0],SurfaceforcingsSmbrefEnum);
-	GetInputListOnVertices(&b_pos[0],SurfaceforcingsBPosEnum);
-	GetInputListOnVertices(&b_neg[0],SurfaceforcingsBNegEnum);
-
-   /*Recover surface elevatio at vertices: */
-	GetInputListOnVertices(&h[0],ThicknessEnum);
-	GetInputListOnVertices(&s[0],SurfaceEnum);
-
-   /*Get material parameters :*/
-   rho_ice=matpar->GetRhoIce();
-   rho_water=matpar->GetRhoFreshwater();
-
-   // loop over all vertices
- for(i=0;i<NUMVERTICES;i++){
-     if(Smbref[i]>0){
-		  smb[i]=Smbref[i]+b_pos[i]*(s[i]-Href[i]);
-	  }
-	  else{
-		  smb[i]=Smbref[i]+b_neg[i]*(s[i]-Href[i]);
-	  }
-	  smb[i]=smb[i]/rho_ice;      // SMB in m/y ice		
-	}  //end of the loop over the vertices
-	  /*Update inputs*/
-	  this->inputs->AddInput(new PentaInput(SurfaceforcingsMassBalanceEnum,&smb[0],P1Enum));
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 18001)
@@ -95,5 +95,4 @@
 		void   ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
 		void   ResetFSBasalBoundaryCondition(void);
-		void   SmbGradients();
 		void   SetTemporaryElementType(int element_type_in);
 	   Element* SpawnBasalElement(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 18001)
@@ -136,5 +136,4 @@
 		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe){_error_("not implemented yet");};
 		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
-		void	      SmbGradients(){_error_("not implemented yet");};
 		IssmDouble  SurfaceArea(void){_error_("not implemented yet");};
 		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 18001)
@@ -140,5 +140,4 @@
 		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
 		void        SetTemporaryElementType(int element_type_in){_error_("not implemented yet");};
-		void	      SmbGradients(){_error_("not implemented yet");};
 		IssmDouble  SurfaceArea(void){_error_("not implemented yet");};
 		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement);
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 18001)
@@ -1717,49 +1717,4 @@
 
 	_error_("not implemented yet");
-}
-/*}}}*/
-void       Tria::SmbGradients(void){/*{{{*/
-
-	int i;
-
-	// input
-   IssmDouble h[NUMVERTICES];					// ice thickness (m)		
-	IssmDouble s[NUMVERTICES];					// surface elevation (m)
-	IssmDouble b_pos[NUMVERTICES];				// Hs-SMB relation parameter
-	IssmDouble b_neg[NUMVERTICES];				// Hs-SMB relation paremeter
-	IssmDouble Href[NUMVERTICES];					// reference elevation from which deviations are used to calculate the SMB adjustment
-	IssmDouble Smbref[NUMVERTICES];				// reference SMB to which deviations are added
-   IssmDouble rho_water;                   // density of fresh water
-	IssmDouble rho_ice;                     // density of ice
-
-	// output
-	IssmDouble smb[NUMVERTICES];					// surface mass balance (m/yr ice)
-
-	/*Recover SmbGradients*/
-	GetInputListOnVertices(&Href[0],SurfaceforcingsHrefEnum);
-	GetInputListOnVertices(&Smbref[0],SurfaceforcingsSmbrefEnum);
-	GetInputListOnVertices(&b_pos[0],SurfaceforcingsBPosEnum);
-	GetInputListOnVertices(&b_neg[0],SurfaceforcingsBNegEnum);
-
-   /*Recover surface elevatio at vertices: */
-	GetInputListOnVertices(&h[0],ThicknessEnum);
-	GetInputListOnVertices(&s[0],SurfaceEnum);
-
-   /*Get material parameters :*/
-   rho_ice=matpar->GetRhoIce();
-   rho_water=matpar->GetRhoFreshwater();
-
-   // loop over all vertices
-   for(i=0;i<NUMVERTICES;i++){
-     if(Smbref[i]>0){
-		  smb[i]=Smbref[i]+b_pos[i]*(s[i]-Href[i]);
-	  }
-	  else{
-		  smb[i]=Smbref[i]+b_neg[i]*(s[i]-Href[i]);
-	  }
-	  smb[i]=smb[i]/rho_ice;      // SMB in m/y ice		
-		}  //end of the loop over the vertices
-	  /*Update inputs*/
-	  this->inputs->AddInput(new TriaInput(SurfaceforcingsMassBalanceEnum,&smb[0],P1Enum));
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 18001)
@@ -93,5 +93,4 @@
 		void        ReduceMatrices(ElementMatrix* Ke,ElementVector* pe);
 		void        ResetFSBasalBoundaryCondition(void);
-		void	      SmbGradients();
 	   Element*    SpawnBasalElement(void);
 		Element*    SpawnTopElement(void);
Index: /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp	(revision 18001)
@@ -520,4 +520,8 @@
 	int        found;
 	int        offset;
+	bool       interp;
+
+	/*First, recover interp bool: */
+	this->parameters->FindParam(&interp,TimesteppingInterpForcingsEnum);
 
 	Input *input  = NULL;
@@ -535,10 +539,10 @@
 		input=(Input*)((Input*)this->inputs->GetObjectByOffset(0))->copy();
 	}
-	else if(offset==(this->numtimesteps-1)){
+	else if(offset==(this->numtimesteps-1) || !interp){
 		/*get values for the last time: */
 		_assert_(intime>=this->timesteps[offset]);
 		input=(Input*)((Input*)this->inputs->GetObjectByOffset(offset))->copy();
 	}
-	else{
+	else {
 		/*get values between two times [offset:offset+1[, Interpolate linearly*/
 		_assert_(intime>=this->timesteps[offset] && intime<this->timesteps[offset+1]);
Index: /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 18001)
@@ -54,4 +54,10 @@
 			break;
 		case SMBhenningEnum:
+			/*Nothing to add*/
+			break;
+		case SMBcomponentsEnum:
+			/*Nothing to add*/
+			break;
+		case SMBmeltcomponentsEnum:
 			/*Nothing to add*/
 			break;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 18001)
@@ -53,4 +53,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject(TimesteppingTimeStepEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(TimesteppingCflCoefficientEnum));
+	parameters->AddObject(iomodel->CopyConstantObject(TimesteppingInterpForcingsEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(SettingsLowmemEnum));
 	parameters->AddObject(iomodel->CopyConstantObject(DebugProfilingEnum));
@@ -123,4 +124,10 @@
 			/*Nothing to add to parameters*/
 			break;
+		case SMBcomponentsEnum:
+			/*Nothing to add to parameters*/
+			break;
+		case SMBmeltcomponentsEnum:
+			/*Nothing to add to parameters*/
+			break;
 		default:
 			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 18001)
@@ -38,4 +38,12 @@
 			SmbHenningx(femmodel);
 			break;
+		case SMBcomponentsEnum:
+			if(VerboseSolution())_printf_("  call smb Components module\n");
+			SmbComponentsx(femmodel);
+			break;
+		case SMBmeltcomponentsEnum:
+			if(VerboseSolution())_printf_("  call smb Melt Components module\n");
+			SmbMeltComponentsx(femmodel);
+			break;
 		default:
 			_error_("Surface mass balance model "<<EnumToStringx(smb_model)<<" not supported yet");
@@ -50,8 +58,56 @@
 	//    INPUT: surface elevation (m): hd(NA)
 	//    OUTPUT: mass-balance (m/yr ice): agd(NA)
-
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
-		element->SmbGradients();
+	int v;
+	IssmDouble rho_water;                   // density of fresh water
+	IssmDouble rho_ice;                     // density of ice
+
+	/*Loop over all the elements of this partition*/
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+		/*Allocate all arrays*/
+		int         numvertices = element->GetNumberOfVertices();
+		IssmDouble* Href        = xNew<IssmDouble>(numvertices); // reference elevation from which deviations are used to calculate the SMB adjustment
+		IssmDouble* Smbref      = xNew<IssmDouble>(numvertices); // reference SMB to which deviations are added
+		IssmDouble* b_pos       = xNew<IssmDouble>(numvertices); // Hs-SMB relation parameter
+		IssmDouble* b_neg       = xNew<IssmDouble>(numvertices); // Hs-SMB relation paremeter
+		IssmDouble* h           = xNew<IssmDouble>(numvertices); // ice thickness (m)
+		IssmDouble* s           = xNew<IssmDouble>(numvertices); // surface elevation (m)
+		IssmDouble* smb         = xNew<IssmDouble>(numvertices);
+
+		/*Recover SmbGradients*/
+		element->GetInputListOnVertices(Href,SurfaceforcingsHrefEnum);
+		element->GetInputListOnVertices(Smbref,SurfaceforcingsSmbrefEnum);
+		element->GetInputListOnVertices(b_pos,SurfaceforcingsBPosEnum);
+		element->GetInputListOnVertices(b_neg,SurfaceforcingsBNegEnum);
+
+		/*Recover surface elevatio at vertices: */
+		element->GetInputListOnVertices(h,ThicknessEnum);
+		element->GetInputListOnVertices(s,SurfaceEnum);
+
+		/*Get material parameters :*/
+		rho_ice=element->matpar->GetRhoIce();
+		rho_water=element->matpar->GetRhoFreshwater();
+
+		// loop over all vertices
+		for(v=0;v<numvertices;v++){
+			if(Smbref[v]>0){
+				smb[v]=Smbref[v]+b_pos[v]*(s[v]-Href[v]);
+			}
+			else{
+				smb[v]=Smbref[v]+b_neg[v]*(s[v]-Href[v]);
+			}
+			smb[v]=smb[v]/rho_ice;      // SMB in m/y ice
+		}  //end of the loop over the vertices
+
+		/*Add input to element and Free memory*/
+		element->AddInput(SurfaceforcingsMassBalanceEnum,smb,P1Enum);
+		xDelete<IssmDouble>(Href);
+		xDelete<IssmDouble>(Smbref);
+		xDelete<IssmDouble>(b_pos);
+		xDelete<IssmDouble>(b_neg);
+		xDelete<IssmDouble>(h);
+		xDelete<IssmDouble>(s);
+		xDelete<IssmDouble>(smb);
 	}
 
@@ -227,2 +283,86 @@
 
 }/*}}}*/
+void SmbComponentsx(FemModel* femmodel){/*{{{*/
+
+	// void SmbComponentsx(acc,evap,runoff,ni){
+	//    INPUT parameters: ni: working size of arrays
+	//    INPUT: surface accumulation (m/yr water equivalent): acc
+	//    surface evaporation (m/yr water equivalent): evap
+	//    surface runoff (m/yr water equivalent): runoff
+	//    OUTPUT: mass-balance (m/yr ice): agd(NA)
+	int v;
+
+	/*Loop over all the elements of this partition*/
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+		/*Allocate all arrays*/
+		int         numvertices = element->GetNumberOfVertices();
+		IssmDouble* acc         = xNew<IssmDouble>(numvertices); 
+		IssmDouble* evap        = xNew<IssmDouble>(numvertices);
+		IssmDouble* runoff      = xNew<IssmDouble>(numvertices); 
+		IssmDouble* smb         = xNew<IssmDouble>(numvertices);
+
+		/*Recover Smb Components*/
+		element->GetInputListOnVertices(acc,SurfaceforcingsAccumulationEnum);
+		element->GetInputListOnVertices(evap,SurfaceforcingsEvaporationEnum);
+		element->GetInputListOnVertices(runoff,SurfaceforcingsRunoffEnum);
+
+		// loop over all vertices
+		for(v=0;v<numvertices;v++){
+			smb[v]=acc[v]-evap[v]-runoff[v];
+		}  //end of the loop over the vertices
+
+		/*Add input to element and Free memory*/
+		element->AddInput(SurfaceforcingsMassBalanceEnum,smb,P1Enum);
+		xDelete<IssmDouble>(acc);
+		xDelete<IssmDouble>(evap);
+		xDelete<IssmDouble>(runoff);
+		xDelete<IssmDouble>(smb);
+	}
+
+}/*}}}*/
+void SmbMeltComponentsx(FemModel* femmodel){/*{{{*/
+
+	// void SmbMeltComponentsx(acc,evap,melt,refreeze,ni){
+	//    INPUT parameters: ni: working size of arrays
+	//    INPUT: surface accumulation (m/yr water equivalent): acc
+	//    surface evaporation (m/yr water equivalent): evap
+	//    surface melt (m/yr water equivalent): melt
+	//    refreeze of surface melt (m/yr water equivalent): refreeze
+	//    OUTPUT: mass-balance (m/yr ice): agd(NA)
+	int v;
+
+	/*Loop over all the elements of this partition*/
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
+
+		/*Allocate all arrays*/
+		int         numvertices = element->GetNumberOfVertices();
+		IssmDouble* acc         = xNew<IssmDouble>(numvertices);
+		IssmDouble* evap        = xNew<IssmDouble>(numvertices); 
+		IssmDouble* melt        = xNew<IssmDouble>(numvertices);
+		IssmDouble* refreeze    = xNew<IssmDouble>(numvertices);
+		IssmDouble* smb         = xNew<IssmDouble>(numvertices);
+
+		/*Recover Smb Components*/
+		element->GetInputListOnVertices(acc,SurfaceforcingsAccumulationEnum);
+		element->GetInputListOnVertices(evap,SurfaceforcingsEvaporationEnum);
+		element->GetInputListOnVertices(melt,SurfaceforcingsMeltEnum);
+		element->GetInputListOnVertices(refreeze,SurfaceforcingsRefreezeEnum);
+
+		// loop over all vertices
+		for(v=0;v<numvertices;v++){
+			smb[v]=acc[v]-evap[v]-melt[v]+refreeze[v];
+		}  //end of the loop over the vertices
+
+		/*Add input to element and Free memory*/
+		element->AddInput(SurfaceforcingsMassBalanceEnum,smb,P1Enum);
+		xDelete<IssmDouble>(acc);
+		xDelete<IssmDouble>(evap);
+		xDelete<IssmDouble>(melt);
+		xDelete<IssmDouble>(refreeze);
+		xDelete<IssmDouble>(smb);
+	}
+
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h	(revision 18001)
@@ -14,4 +14,6 @@
 void PositiveDegreeDayx(FemModel* femmodel);
 void SmbHenningx(FemModel* femmodel);
+void SmbComponentsx(FemModel* femmodel);
+void SmbMeltComponentsx(FemModel* femmodel);
 
 #endif  /* _SurfaceMassBalancex_H*/
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18000)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 18001)
@@ -324,4 +324,11 @@
 	SurfaceforcingsBNegEnum,
 	SMBhenningEnum,
+	SMBcomponentsEnum,
+	SurfaceforcingsAccumulationEnum,
+	SurfaceforcingsEvaporationEnum,
+	SurfaceforcingsRunoffEnum,
+	SMBmeltcomponentsEnum,
+	SurfaceforcingsMeltEnum,
+	SurfaceforcingsRefreezeEnum,
 	/*TO BE REMOVED*/
 	SurfaceforcingsIspddEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 18001)
@@ -330,4 +330,11 @@
 		case SurfaceforcingsBNegEnum : return "SurfaceforcingsBNeg";
 		case SMBhenningEnum : return "SMBhenning";
+		case SMBcomponentsEnum : return "SMBcomponents";
+		case SurfaceforcingsAccumulationEnum : return "SurfaceforcingsAccumulation";
+		case SurfaceforcingsEvaporationEnum : return "SurfaceforcingsEvaporation";
+		case SurfaceforcingsRunoffEnum : return "SurfaceforcingsRunoff";
+		case SMBmeltcomponentsEnum : return "SMBmeltcomponents";
+		case SurfaceforcingsMeltEnum : return "SurfaceforcingsMelt";
+		case SurfaceforcingsRefreezeEnum : return "SurfaceforcingsRefreeze";
 		case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd";
 		case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18000)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 18001)
@@ -336,4 +336,11 @@
 	      else if (strcmp(name,"SurfaceforcingsBNeg")==0) return SurfaceforcingsBNegEnum;
 	      else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
+	      else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum;
+	      else if (strcmp(name,"SurfaceforcingsAccumulation")==0) return SurfaceforcingsAccumulationEnum;
+	      else if (strcmp(name,"SurfaceforcingsEvaporation")==0) return SurfaceforcingsEvaporationEnum;
+	      else if (strcmp(name,"SurfaceforcingsRunoff")==0) return SurfaceforcingsRunoffEnum;
+	      else if (strcmp(name,"SMBmeltcomponents")==0) return SMBmeltcomponentsEnum;
+	      else if (strcmp(name,"SurfaceforcingsMelt")==0) return SurfaceforcingsMeltEnum;
+	      else if (strcmp(name,"SurfaceforcingsRefreeze")==0) return SurfaceforcingsRefreezeEnum;
 	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
 	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
@@ -376,5 +383,8 @@
 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
 	      else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
-	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
 	      else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
 	      else if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
@@ -383,8 +393,5 @@
 	      else if (strcmp(name,"SmoothedSurfaceSlopeXAnalysis")==0) return SmoothedSurfaceSlopeXAnalysisEnum;
 	      else if (strcmp(name,"SmoothedSurfaceSlopeYAnalysis")==0) return SmoothedSurfaceSlopeYAnalysisEnum;
-         else stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
+	      else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
 	      else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
@@ -499,5 +506,8 @@
 	      else if (strcmp(name,"Pressure")==0) return PressureEnum;
 	      else if (strcmp(name,"PressurePicard")==0) return PressurePicardEnum;
-	      else if (strcmp(name,"QmuPressure")==0) return QmuPressureEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"QmuPressure")==0) return QmuPressureEnum;
 	      else if (strcmp(name,"QmuVx")==0) return QmuVxEnum;
 	      else if (strcmp(name,"QmuVy")==0) return QmuVyEnum;
@@ -506,8 +516,5 @@
 	      else if (strcmp(name,"QmuBase")==0) return QmuBaseEnum;
 	      else if (strcmp(name,"QmuSurface")==0) return QmuSurfaceEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"QmuMelting")==0) return QmuMeltingEnum;
+	      else if (strcmp(name,"QmuMelting")==0) return QmuMeltingEnum;
 	      else if (strcmp(name,"QmuVxMesh")==0) return QmuVxMeshEnum;
 	      else if (strcmp(name,"QmuVyMesh")==0) return QmuVyMeshEnum;
@@ -622,5 +629,8 @@
 	      else if (strcmp(name,"MisfitObservationEnum")==0) return MisfitObservationEnumEnum;
 	      else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
-	      else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
 	      else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
 	      else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
@@ -629,8 +639,5 @@
 	      else if (strcmp(name,"MaxVel")==0) return MaxVelEnum;
 	      else if (strcmp(name,"MinVx")==0) return MinVxEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
+	      else if (strcmp(name,"MaxVx")==0) return MaxVxEnum;
 	      else if (strcmp(name,"MaxAbsVx")==0) return MaxAbsVxEnum;
 	      else if (strcmp(name,"MinVy")==0) return MinVyEnum;
