Index: /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/analyses/Balancethickness2Analysis.cpp	(revision 22266)
@@ -70,5 +70,6 @@
 
 	/*Intermediaries */
-	IssmDouble  Jdet,ds[2],slope,velobs,omega;
+	IssmDouble  yts = 365*24*3600.;
+	IssmDouble  Jdet,vx,vy,vel;
 	IssmDouble* xyz_list = NULL;
 
@@ -82,8 +83,9 @@
 	/*Retrieve all inputs and parameters*/
 	element->GetVerticesCoordinates(&xyz_list);
-	Input* omega_input         = element->GetInput(BalancethicknessOmegaEnum); _assert_(omega_input);
-	Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input); 
-	Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input); 
-	Input* velobs_input        = element->GetInput(InversionVelObsEnum); _assert_(velobs_input); 
+	Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 
+	Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
+
+	/*Get element characteristic length*/
+	IssmDouble h = element->CharacteristicLength();
 
 	/* Start  looping on the number of gaussian points: */
@@ -93,15 +95,25 @@
 		element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
 		element->JacobianDeterminant(&Jdet,xyz_list,gauss);
-		surfaceslopex_input->GetInputValue(&ds[0],gauss);
-		surfaceslopey_input->GetInputValue(&ds[1],gauss);
-		velobs_input->GetInputValue(&velobs,gauss);
-		omega_input->GetInputValue(&omega,gauss);
+		vx_input->GetInputValue(&vx,gauss);
+		vy_input->GetInputValue(&vy,gauss);
 
-		slope = sqrt(ds[0]*ds[0] + ds[1]*ds[1]);
-		//if(slope<1.e-5) slope = 1.e-5;
+		/*make sure are diffusivisty is large enough*/
+		vel = sqrt(vx*vx+vy*vy);
+		if(sqrt(vx*vx+vy*vy)==0.){
+			vx = 0.1/yts;
+			vy = 0.1/yts;
+			vel = sqrt(vx*vx+vy*vy);
+		}
+		else if(vel<0.1/yts){
+			vx = vx/vel*0.1;
+			vy = vy/vel*0.1;
+			vel = sqrt(vx*vx+vy*vy);
+		}
 
 		for(int i=0;i<numnodes;i++){
 			for(int j=0;j<numnodes;j++){
-				Ke->values[i*numnodes+j] += velobs/slope*omega*gauss->weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]);
+				Ke->values[i*numnodes+j] += gauss->weight*Jdet*(
+							(vx*dbasis[0*numnodes+i] + vy*dbasis[1*numnodes+i])*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j])
+				+ vel/500000.*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j]));
 			}
 		}
@@ -117,5 +129,5 @@
 
 	/*Intermediaries */
-	IssmDouble  dhdt,mb,ms,Jdet;
+	IssmDouble  dhdt[2],mb[2],ms[2],Jdet;
 	IssmDouble* xyz_list = NULL;
 
@@ -141,10 +153,12 @@
 		element->NodalFunctions(basis,gauss);
 
-		ms_input->GetInputValue(&ms,gauss);
-		mb_input->GetInputValue(&mb,gauss);
-		dhdt_input->GetInputValue(&dhdt,gauss);
+		ms_input->GetInputDerivativeValue(&ms[0],xyz_list,gauss);
 
-		for(int i=0;i<numnodes;i++) pe->values[i]+=Jdet*gauss->weight*(
-					(ms-mb-dhdt)*basis[i]
+		ms_input->GetInputDerivativeValue(&ms[0],xyz_list,gauss);
+		mb_input->GetInputDerivativeValue(&mb[0],xyz_list,gauss);
+		dhdt_input->GetInputDerivativeValue(&dhdt[0],xyz_list,gauss);
+
+		for(int i=0;i<numnodes;i++) pe->values[i]+=0*Jdet*gauss->weight*(
+					(ms[0]+ms[1]-mb[0]-mb[1]-dhdt[0]-dhdt[1])*basis[i]
 					);
 	}
@@ -157,5 +171,5 @@
 }/*}}}*/
 void           Balancethickness2Analysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
-		element->GetSolutionFromInputsOneDof(solution,SurfaceEnum);
+		element->GetSolutionFromInputsOneDof(solution,ThicknessEnum);
 }/*}}}*/
 void           Balancethickness2Analysis::GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index){/*{{{*/
@@ -164,55 +178,6 @@
 void           Balancethickness2Analysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
 
-	/*Intermediaries*/
-	IssmDouble  ds[2],s,b,D;
-	IssmDouble* xyz_list = NULL;
+			element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
 
-	//element->InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
-	element->InputUpdateFromSolutionOneDof(solution,SurfaceEnum);
-
-	/*Fetch number of vertices and allocate velocity vectors*/
-	int numvertices = element->GetNumberOfVertices();
-	IssmDouble* vel_list = xNew<IssmDouble>(numvertices);
-	IssmDouble* vx_list  = xNew<IssmDouble>(numvertices);
-	IssmDouble* vy_list  = xNew<IssmDouble>(numvertices);
-
-	/*Retrieve all inputs and parameters*/
-	element->GetVerticesCoordinates(&xyz_list);
-	Input* D_input   = element->GetInput(BalancethicknessDiffusionCoefficientEnum);
-	Input* H_input   = element->GetInput(ThicknessEnum);                            _assert_(H_input);
-	Input* s_input   = element->GetInput(SurfaceEnum);                              _assert_(s_input);
-	Input* b_input   = element->GetInput(BaseEnum);                                 _assert_(b_input);
-
-	/*Calculate velocities*/
-	Gauss* gauss=element->NewGauss();
-	for(int iv=0;iv<numvertices;iv++){
-		gauss->GaussVertex(iv);
-
-		if(D_input){
-			D_input->GetInputValue(&D,gauss);
-		}
-		else{
-			D = 0.;
-		}
-		b_input->GetInputValue(&b,gauss);
-		s_input->GetInputValue(&s,gauss);
-		s_input->GetInputDerivativeValue(&ds[0],xyz_list,gauss);
-
-		vx_list[iv] = -1./(s-b)*D*ds[0];
-		vy_list[iv] = -1./(s-b)*D*ds[1];
-		vel_list[iv] = sqrt(pow(vx_list[iv],2) + pow(vy_list[iv],2));
-	}
-
-	/*Add vx and vy as inputs to the tria element: */
-	element->AddInput(VxEnum,vx_list,P1Enum);
-	element->AddInput(VyEnum,vy_list,P1Enum);
-	element->AddInput(VelEnum,vel_list,P1Enum);
-
-	/*Free ressources:*/
-	delete gauss;
-	xDelete<IssmDouble>(vy_list);
-	xDelete<IssmDouble>(vx_list);
-	xDelete<IssmDouble>(vel_list);
-	xDelete<IssmDouble>(xyz_list);
 }/*}}}*/
 void           Balancethickness2Analysis::UpdateConstraints(FemModel* femmodel){/*{{{*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 22266)
@@ -1701,4 +1701,5 @@
 				name==BasalforcingsFloatingiceMeltingRateEnum ||
 				name==BasalforcingsGeothermalfluxEnum ||
+				name==BalancethicknessSpcthicknessEnum ||
 				name==SurfaceAreaEnum||
 				name==DamageDEnum ||
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22266)
@@ -1856,4 +1856,12 @@
 						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
 						this->inputs->AddInput(new ControlInput(ThicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
+					}
+					break;
+				case BalancethicknessSpcthicknessEnum:
+					if(iomodel->Data("md.balancethickness.spcthickness")){
+						for(j=0;j<NUMVERTICES;j++) nodeinputs[j]=iomodel->Data("md.balancethickness.spcthickness")[tria_vertex_ids[j]-1];
+						for(j=0;j<NUMVERTICES;j++)cmmininputs[j]=iomodel->Data("md.inversion.min_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+						for(j=0;j<NUMVERTICES;j++)cmmaxinputs[j]=iomodel->Data("md.inversion.max_parameters")[(tria_vertex_ids[j]-1)*num_control_type+i];
+						this->inputs->AddInput(new ControlInput(BalancethicknessSpcthicknessEnum,TriaInputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 					}
 					break;
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 22266)
@@ -1496,4 +1496,120 @@
 
 }/*}}}*/
+void FemModel::OmegaAbsGradientx( IssmDouble* pJ){/*{{{*/
+
+	/*output: */
+	IssmDouble J=0.;
+	IssmDouble J_sum;
+
+	IssmDouble  omega,weight;
+	IssmDouble  Jdet;
+	IssmDouble* xyz_list = NULL;
+	IssmDouble  dp[3];
+
+	/*Compute Misfit: */
+	for(int i=0;i<elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+
+		/*If on water, return 0: */
+		if(!element->IsIceInElement()) continue;
+
+		/* Get node coordinates*/
+		element->GetVerticesCoordinates(&xyz_list);
+
+		/*Retrieve all inputs we will be needing: */
+		Input* weights_input   =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		Input* omega_input =element->GetInput(BalancethicknessOmegaEnum);                   _assert_(omega_input);
+
+		/* Start  looping on the number of gaussian points: */
+		Gauss* gauss=element->NewGauss(2);
+		for(int ig=gauss->begin();ig<gauss->end();ig++){
+
+			gauss->GaussPoint(ig);
+
+			/* Get Jacobian determinant: */
+			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+
+			/*Get all parameters at gaussian point*/
+			weights_input->GetInputValue(&weight,gauss,OmegaAbsGradientEnum);
+			omega_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
+
+			/*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 
+			//J+=weight*1/2*(dp[0]*dp[0]+dp[1]*dp[1])*Jdet*gauss->weight;
+			J+=weight*1/2*pow(dp[0]*dp[0]+dp[1]*dp[1],2)*Jdet*gauss->weight;
+		}
+
+		/*clean up and Return: */
+		xDelete<IssmDouble>(xyz_list);
+		delete gauss;
+	}
+
+	/*Sum all J from all cpus of the cluster:*/
+	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	J=J_sum;
+
+	/*Assign output pointers: */
+	*pJ=J;
+}
+/*}}}*/
+void FemModel::EtaDiffx( IssmDouble* pJ){/*{{{*/
+
+	/*output: */
+	IssmDouble J=0.;
+	IssmDouble J_sum;
+
+	IssmDouble  omega,weight;
+	IssmDouble  Jdet;
+	IssmDouble* xyz_list = NULL;
+	IssmDouble  p,p0;
+
+	/*Compute Misfit: */
+	for(int i=0;i<elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
+
+		/*If on water, return 0: */
+		if(!element->IsIceInElement()) continue;
+
+		/* Get node coordinates*/
+		element->GetVerticesCoordinates(&xyz_list);
+
+		/*Retrieve all inputs we will be needing: */
+		Input* weights_input =element->GetInput(InversionCostFunctionsCoefficientsEnum); _assert_(weights_input);
+		Input* omega_input   =element->GetInput(BalancethicknessOmegaEnum);              _assert_(omega_input);
+		Input* omega0_input  =element->GetInput(BalancethicknessOmega0Enum);             _assert_(omega0_input);
+
+		/* Start  looping on the number of gaussian points: */
+		Gauss* gauss=element->NewGauss(2);
+		for(int ig=gauss->begin();ig<gauss->end();ig++){
+
+			gauss->GaussPoint(ig);
+
+			/* Get Jacobian determinant: */
+			element->JacobianDeterminant(&Jdet,xyz_list,gauss);
+
+			/*Get all parameters at gaussian point*/
+			weights_input->GetInputValue(&weight,gauss,EtaDiffEnum);
+			omega_input->GetInputValue(&p,gauss);
+			omega0_input->GetInputValue(&p0,gauss);
+
+			/*Tikhonov regularization: J = 1/2 ((dp/dx)^2 + (dp/dy)^2) */ 
+			//J+=weight*1/2*(dp[0]*dp[0]+dp[1]*dp[1])*Jdet*gauss->weight;
+			J+=weight*1/2*pow(p - p0,2)*Jdet*gauss->weight;
+		}
+
+		/*clean up and Return: */
+		xDelete<IssmDouble>(xyz_list);
+		delete gauss;
+	}
+
+	/*Sum all J from all cpus of the cluster:*/
+	ISSM_MPI_Reduce (&J,&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
+	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+	J=J_sum;
+
+	/*Assign output pointers: */
+	*pJ=J;
+}
+/*}}}*/
 void FemModel::OutputControlsx(Results **presults){/*{{{*/
 
@@ -1667,4 +1783,6 @@
 				case BalancethicknessMisfitEnum:    BalancethicknessMisfitx(&double_result);                                                        break;
 				case SurfaceAbsMisfitEnum:          SurfaceAbsMisfitx(&double_result); break;
+				case OmegaAbsGradientEnum:          OmegaAbsGradientx(&double_result); break;
+				case EtaDiffEnum:                   EtaDiffx(&double_result); break;
 
 				   /*Vector */
@@ -2018,5 +2136,5 @@
 	IssmDouble J_sum;
 
-	IssmDouble  thickness,thicknessobs,weight;
+	IssmDouble  thickness,weight;
 	IssmDouble  Jdet;
 	IssmDouble* xyz_list = NULL;
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 22265)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 22266)
@@ -126,4 +126,6 @@
 		void Responsex(IssmDouble* presponse,const char* response_descriptor);
 		void SurfaceAbsMisfitx( IssmDouble* pJ);
+		void OmegaAbsGradientx( IssmDouble* pJ);
+		void EtaDiffx( IssmDouble* pJ);
 		void ThicknessAbsGradientx( IssmDouble* pJ);
 		void ThicknessPositivex(IssmDouble* pJ);
Index: /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.cpp	(revision 22266)
@@ -167,5 +167,5 @@
 	/*Get requested input within dataset*/
 	for(int i=0;i<this->numids;i++) if(this->ids[i]==id) offset=i;
-	if(offset<0) _error_("Could not find input of id "<<id );
+	if(offset<0) _error_("Could not find input of id "<<id<<" (Enum: "<<EnumToStringx(id)<<")" );
 
 	Input* input=xDynamicCast<Input*>(this->inputs->GetObjectByOffset(offset));
Index: /issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/cores/balancethickness2_core.cpp	(revision 22266)
@@ -36,5 +36,5 @@
 		if(VerboseSolution()) _printf0_("   saving results\n");
 		const int numoutputs = 1;
-		int outputs[numoutputs] = {SurfaceEnum};
+		int outputs[numoutputs] = {ThicknessEnum};
 		femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],numoutputs);
 	}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 22266)
@@ -8,5 +8,5 @@
 #include "../ModelProcessorx.h"
 
-void CreateParametersControl(Parameters* parameters,IoModel* iomodel,int solution_type){/*{{{*/
+void CreateParametersControl(Parameters* parameters,IoModel* iomodel,int solution_type){
 
 	bool        control_analysis;
@@ -120,3 +120,3 @@
 		iomodel->DeleteData(optscal,"md.inversion.gradient_scaling");
 	}
-}/*}}}*/
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 22266)
@@ -68,4 +68,5 @@
 			/*List of supported controls*/
 			case BalancethicknessThickeningRateEnum:      iomodel->FetchData(1,"md.balancethickness.thickening_rate"); break;
+			case BalancethicknessSpcthicknessEnum:        iomodel->FetchData(1,"md.balancethickness.spcthickness"); break;
 			case VxEnum:                                  iomodel->FetchData(1,"md.initialization.vx"); break;
 			case VyEnum:                                  iomodel->FetchData(1,"md.initialization.vy"); break;
@@ -99,4 +100,5 @@
 			/*List of supported controls*/
 			case BalancethicknessThickeningRateEnum:      iomodel->DeleteData(1,"md.balancethickness.thickening_rate"); break;
+			case BalancethicknessSpcthicknessEnum:        iomodel->DeleteData(1,"md.balancethickness.spcthickness"); break;
 			case VxEnum:                                  iomodel->DeleteData(1,"md.initialization.vx"); break;
 			case VyEnum:                                  iomodel->DeleteData(1,"md.initialization.vy"); break;
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22265)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22266)
@@ -214,4 +214,5 @@
 	InversionVyObsEnum,
 	InversionVzObsEnum,
+	InversionVelObsEnum,
 	MaskIceLevelsetEnum,
 	MaskOceanLevelsetEnum,
@@ -382,4 +383,5 @@
 	BalancethicknessDiffusionCoefficientEnum,
 	BalancethicknessOmegaEnum,
+	BalancethicknessOmega0Enum,
 	BalancethicknessD0Enum,
 	/*}}}*/
@@ -529,4 +531,7 @@
 	ThicknessAbsMisfitEnum,
 	SurfaceAbsMisfitEnum,
+	OmegaAbsGradientEnum,
+	EtaDiffEnum,
+	EtaAbsGradientEnum,
 	VelEnum,
 	VelocityEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22266)
@@ -220,4 +220,5 @@
 		case InversionVyObsEnum : return "InversionVyObs";
 		case InversionVzObsEnum : return "InversionVzObs";
+		case InversionVelObsEnum : return "InversionVelObs";
 		case MaskIceLevelsetEnum : return "MaskIceLevelset";
 		case MaskOceanLevelsetEnum : return "MaskOceanLevelset";
@@ -388,4 +389,5 @@
 		case BalancethicknessDiffusionCoefficientEnum : return "BalancethicknessDiffusionCoefficient";
 		case BalancethicknessOmegaEnum : return "BalancethicknessOmega";
+		case BalancethicknessOmega0Enum : return "BalancethicknessOmega0";
 		case BalancethicknessD0Enum : return "BalancethicknessD0";
 		case SmbEnum : return "Smb";
@@ -527,4 +529,7 @@
 		case ThicknessAbsMisfitEnum : return "ThicknessAbsMisfit";
 		case SurfaceAbsMisfitEnum : return "SurfaceAbsMisfit";
+		case OmegaAbsGradientEnum : return "OmegaAbsGradient";
+		case EtaDiffEnum : return "EtaDiff";
+		case EtaAbsGradientEnum : return "EtaAbsGradient";
 		case VelEnum : return "Vel";
 		case VelocityEnum : return "Velocity";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22265)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22266)
@@ -223,4 +223,5 @@
 	      else if (strcmp(name,"InversionVyObs")==0) return InversionVyObsEnum;
 	      else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
+	      else if (strcmp(name,"InversionVelObs")==0) return InversionVelObsEnum;
 	      else if (strcmp(name,"MaskIceLevelset")==0) return MaskIceLevelsetEnum;
 	      else if (strcmp(name,"MaskOceanLevelset")==0) return MaskOceanLevelsetEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"DamageEvolutionNumRequestedOutputs")==0) return DamageEvolutionNumRequestedOutputsEnum;
 	      else if (strcmp(name,"DamageEvolutionRequestedOutputs")==0) return DamageEvolutionRequestedOutputsEnum;
-	      else if (strcmp(name,"Damage")==0) return DamageEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
+	      if (strcmp(name,"Damage")==0) return DamageEnum;
+	      else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
 	      else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
 	      else if (strcmp(name,"CalvingLaw")==0) return CalvingLawEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
 	      else if (strcmp(name,"TransientIsthermal")==0) return TransientIsthermalEnum;
-	      else if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"TransientIsesa")==0) return TransientIsesaEnum;
+	      if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
+	      else if (strcmp(name,"TransientIsesa")==0) return TransientIsesaEnum;
 	      else if (strcmp(name,"TransientIsdamageevolution")==0) return TransientIsdamageevolutionEnum;
 	      else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
@@ -397,4 +398,5 @@
 	      else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
 	      else if (strcmp(name,"BalancethicknessOmega")==0) return BalancethicknessOmegaEnum;
+	      else if (strcmp(name,"BalancethicknessOmega0")==0) return BalancethicknessOmega0Enum;
 	      else if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum;
 	      else if (strcmp(name,"Smb")==0) return SmbEnum;
@@ -504,10 +506,10 @@
 	      else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
 	      else if (strcmp(name,"SmbEla")==0) return SmbElaEnum;
-	      else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum;
-	      else if (strcmp(name,"SmbBMin")==0) return SmbBMinEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
+	      if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum;
+	      else if (strcmp(name,"SmbBMin")==0) return SmbBMinEnum;
+	      else if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
 	      else if (strcmp(name,"Adjointx")==0) return AdjointxEnum;
 	      else if (strcmp(name,"Adjointy")==0) return AdjointyEnum;
@@ -539,4 +541,7 @@
 	      else if (strcmp(name,"ThicknessAbsMisfit")==0) return ThicknessAbsMisfitEnum;
 	      else if (strcmp(name,"SurfaceAbsMisfit")==0) return SurfaceAbsMisfitEnum;
+	      else if (strcmp(name,"OmegaAbsGradient")==0) return OmegaAbsGradientEnum;
+	      else if (strcmp(name,"EtaDiff")==0) return EtaDiffEnum;
+	      else if (strcmp(name,"EtaAbsGradient")==0) return EtaAbsGradientEnum;
 	      else if (strcmp(name,"Vel")==0) return VelEnum;
 	      else if (strcmp(name,"Velocity")==0) return VelocityEnum;
@@ -624,13 +629,13 @@
 	      else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum;
 	      else if (strcmp(name,"Outputdefinition5")==0) return Outputdefinition5Enum;
-	      else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum;
 	      else if (strcmp(name,"Outputdefinition7")==0) return Outputdefinition7Enum;
 	      else if (strcmp(name,"Outputdefinition8")==0) return Outputdefinition8Enum;
 	      else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
 	      else if (strcmp(name,"Outputdefinition10")==0) return Outputdefinition10Enum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"Outputdefinition11")==0) return Outputdefinition11Enum;
+	      else if (strcmp(name,"Outputdefinition11")==0) return Outputdefinition11Enum;
 	      else if (strcmp(name,"Outputdefinition12")==0) return Outputdefinition12Enum;
 	      else if (strcmp(name,"Outputdefinition13")==0) return Outputdefinition13Enum;
@@ -747,13 +752,13 @@
 	      else if (strcmp(name,"Colinear")==0) return ColinearEnum;
 	      else if (strcmp(name,"ControlSteady")==0) return ControlSteadyEnum;
-	      else if (strcmp(name,"Fset")==0) return FsetEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"Fset")==0) return FsetEnum;
 	      else if (strcmp(name,"Gradient1")==0) return Gradient1Enum;
 	      else if (strcmp(name,"Gradient2")==0) return Gradient2Enum;
 	      else if (strcmp(name,"Gradient3")==0) return Gradient3Enum;
 	      else if (strcmp(name,"Gradient")==0) return GradientEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
+	      else if (strcmp(name,"GroundinglineMigration")==0) return GroundinglineMigrationEnum;
 	      else if (strcmp(name,"Gset")==0) return GsetEnum;
 	      else if (strcmp(name,"Index")==0) return IndexEnum;
@@ -870,13 +875,13 @@
 	      else if (strcmp(name,"AmrField")==0) return AmrFieldEnum;
 	      else if (strcmp(name,"AmrErr")==0) return AmrErrEnum;
-	      else if (strcmp(name,"AmrKeepMetric")==0) return AmrKeepMetricEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"AmrKeepMetric")==0) return AmrKeepMetricEnum;
 	      else if (strcmp(name,"AmrGradation")==0) return AmrGradationEnum;
 	      else if (strcmp(name,"AmrGroundingLineResolution")==0) return AmrGroundingLineResolutionEnum;
 	      else if (strcmp(name,"AmrGroundingLineDistance")==0) return AmrGroundingLineDistanceEnum;
 	      else if (strcmp(name,"AmrIceFrontResolution")==0) return AmrIceFrontResolutionEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"AmrIceFrontDistance")==0) return AmrIceFrontDistanceEnum;
+	      else if (strcmp(name,"AmrIceFrontDistance")==0) return AmrIceFrontDistanceEnum;
 	      else if (strcmp(name,"AmrThicknessErrorResolution")==0) return AmrThicknessErrorResolutionEnum;
 	      else if (strcmp(name,"AmrThicknessErrorThreshold")==0) return AmrThicknessErrorThresholdEnum;
@@ -993,13 +998,13 @@
 	      else if (strcmp(name,"SmoothAnalysis")==0) return SmoothAnalysisEnum;
 	      else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
-	      else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
 	      else if (strcmp(name,"UzawaPressureAnalysis")==0) return UzawaPressureAnalysisEnum;
 	      else if (strcmp(name,"GiaSolution")==0) return GiaSolutionEnum;
 	      else if (strcmp(name,"GiaIvinsAnalysis")==0) return GiaIvinsAnalysisEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"EsaSolution")==0) return EsaSolutionEnum;
+	      else if (strcmp(name,"EsaSolution")==0) return EsaSolutionEnum;
 	      else if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum;
 	      else if (strcmp(name,"LoveSolution")==0) return LoveSolutionEnum;
