Index: /issm/trunk-jpl/src/c/analyses/SealevelchangeAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SealevelchangeAnalysis.cpp	(revision 26125)
+++ /issm/trunk-jpl/src/c/analyses/SealevelchangeAnalysis.cpp	(revision 26126)
@@ -69,4 +69,9 @@
 	InputUpdateFromConstantx(inputs,elements,0.,BedNorthEnum);
     iomodel->FetchDataToInput(inputs,elements,"md.initialization.sealevel",SealevelEnum);
+
+	/*Initialize loads:*/
+	iomodel->ConstantToInput(inputs,elements,0.,DeltaTwsEnum,P1Enum);
+	iomodel->ConstantToInput(inputs,elements,0.,DeltaIceThicknessEnum,P1Enum);
+	iomodel->ConstantToInput(inputs,elements,0.,DeltaBottomPressureEnum,P1Enum);
 
 
@@ -140,4 +145,5 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.glfraction",SolidearthSettingsGlfractionEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.cross_section_shape",SolidearthSettingsCrossSectionShapeEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.solidearth.settings.optim",SolidearthSettingsOptimEnum));
 	parameters->AddObject(new DoubleParam(CumBslcEnum,0.0));
 	parameters->AddObject(new DoubleParam(CumBslcIceEnum,0.0));
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 26125)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 26126)
@@ -6538,6 +6538,7 @@
 
 	/*recover some parameters:*/
-	rho_ice=FindParam(MaterialsRhoIceEnum);
-	rho_water=FindParam(MaterialsRhoSeawaterEnum);
+	this->parameters->FindParam(&rho_ice,MaterialsRhoIceEnum);
+	this->parameters->FindParam(&rho_water,MaterialsRhoSeawaterEnum);
+	this->parameters->FindParam(&rho_freshwater,MaterialsRhoFreshwaterEnum);
 	this->parameters->FindParam(&computerigid,SolidearthSettingsRigidEnum);
 	this->parameters->FindParam(&glfraction,SolidearthSettingsGlfractionEnum);
@@ -6688,5 +6689,5 @@
 
 	/*compute ocean average over element:*/
-	OceanAverageOptim(&oceanaverage,&oceanarea,SealevelGRD,masks);
+	OceanAverageOptim(&oceanaverage,&oceanarea,&SealevelGRD[0],masks);
 	
 	/*add ocean average in the global sealevelloads vector:*/
@@ -6870,5 +6871,5 @@
 		total_weight+=gauss->weight;
 	}
-	Sg_avg=Sg_avg/total_weight;
+	if(total_weight) Sg_avg=Sg_avg/total_weight;
 	delete gauss;
 
@@ -6881,5 +6882,5 @@
 void       Tria::SealevelchangeMomentOfInertiaElement(IssmDouble* dI_list, IssmDouble* loads, IssmDouble* sealevelloads){/*{{{*/
 		
-	IssmDouble S;
+	IssmDouble S=0;
 
 	/*Compute area of element:*/
@@ -6934,5 +6935,6 @@
 
 	/*recover total load: */
-	S=sealevelloads[this->Sid()]+loads[this->Sid()];
+	if(loads) S+=loads[this->Sid()];
+	if(sealevelloads) S+=sealevelloads[this->Sid()];
 
 	/* Perturbation terms for moment of inertia (moi_list):
Index: /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 26125)
+++ /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 26126)
@@ -29,7 +29,9 @@
 	/*Parameters, variables:*/
 	bool save_results;
+	int  optim=0; 
 
 	/*Retrieve parameters:*/
 	femmodel->parameters->FindParam(&save_results,SaveResultsEnum);
+	femmodel->parameters->FindParam(&optim,SolidearthSettingsOptimEnum);
 	
 	/*Verbose: */
@@ -49,5 +51,6 @@
 
 	/*Run geodetic:*/
-	grd_core(femmodel);
+	if(!optim) grd_core(femmodel);
+	else grd_core_optim(femmodel);
 
 	/*Run steric core for sure:*/
@@ -413,4 +416,6 @@
 	IssmDouble           eps_rel;
 	IssmDouble           eps_abs;
+	int                  max_nonlinear_iterations;
+	int                  iterations=0;
 	int                  step;
 	IssmDouble           time; 
@@ -421,5 +426,6 @@
 	int  count,frequency,iscoupling;
 	int  grd=0;
-	int computesealevel=0;
+	int  computesealevel=0;
+
 	/*}}}*/
 
@@ -432,4 +438,5 @@
 	femmodel->parameters->FindParam(&count,SealevelchangeRunCountEnum);
 	femmodel->parameters->FindParam(&computesealevel,SolidearthSettingsComputesealevelchangeEnum);
+	femmodel->parameters->FindParam(&max_nonlinear_iterations,SolidearthSettingsMaxiterEnum);
 	/*}}}*/
 
@@ -462,4 +469,5 @@
 	/*call masks core: */
 	masks=sealevel_masks(femmodel);
+	if(VerboseSolution()) _printf0_("	  starting  GRD convolutions\n");
 	
 	/*buildup loads: */
@@ -501,5 +509,6 @@
 	//compute rotation axis motion:
 	RotationAxisMotion(&rotationaxismotionvector[0],femmodel,allloads,allsealevelloads);
-
+	
+	if(VerboseSolution()) _printf0_("	  converging ocean GRD convolutions\n");
 	for(;;){
 			
@@ -525,7 +534,13 @@
 		slcconvergence(&converged,sealevelloads,oldsealevelloads,eps_rel,eps_abs);
 		if (converged)break;
+
+		//early return?
+		if(iterations>max_nonlinear_iterations)break;
+		else iterations++;
 	}
 
 	deformation:
+	
+	if(VerboseSolution()) _printf0_("	  deformation GRD convolutions\n");
 
 	/*convolve loads and sea level loads to get the deformation:*/
@@ -534,4 +549,6 @@
 		element->SealevelchangeDeformationConvolution(allsealevelloads, allloads, rotationaxismotionvector,masks);
 	}
+	
+	if(VerboseSolution()) _printf0_("	  updating GRD fields\n");
 
 	/*Update bedrock motion and geoid:*/
@@ -543,10 +560,10 @@
 		barycontrib->Save(femmodel->results,femmodel->parameters,oceanarea);
 	}
-		
-	femmodel->inputs->AXPY(SealevelEnum,SealevelGRDEnum,1);
-	femmodel->inputs->AXPY(BedEnum,BedGRDEnum,1);
+
+	femmodel->inputs->AXPY(1,SealevelEnum,SealevelGRDEnum);
+	femmodel->inputs->AXPY(1,BedEnum,BedGRDEnum);
 	if(horiz){
-		femmodel->inputs->AXPY(BedEastEnum,BedEastGRDEnum,1);
-		femmodel->inputs->AXPY(BedNorthEnum,BedNorthGRDEnum,1);
+		femmodel->inputs->AXPY(1,BedEastEnum,BedEastGRDEnum);
+		femmodel->inputs->AXPY(1,BedNorthEnum,BedNorthGRDEnum);
 	}
 
@@ -594,5 +611,5 @@
 	int  horiz;
 	bool geometrydone = false;
-	bool optim=false;
+	int  optim;
 	int  grdmodel=0;
 
@@ -602,4 +619,5 @@
 	femmodel->parameters->FindParam(&geometrydone,SealevelchangeGeometryDoneEnum);
 	femmodel->parameters->FindParam(&grdmodel,GrdModelEnum);
+	femmodel->parameters->FindParam(&optim,SolidearthSettingsOptimEnum);
 	
 	/*early return?:*/
@@ -623,6 +641,6 @@
 	for(Object* & object : femmodel->elements->objects){
 		Element*   element=xDynamicCast<Element*>(object);
-		element->SealevelchangeGeometry(latitude,longitude,radius,xx,yy,zz,xxe,yye,zze);
-		//if(optim) element->SealevelchangeGeometryOptim(latitude,longitude,radius,xx,yy,zz,xxe,yye,zze);
+		if(optim) element->SealevelchangeGeometryOptim(latitude,longitude,radius,xx,yy,zz,xxe,yye,zze);
+		else      element->SealevelchangeGeometry(latitude,longitude,radius,xx,yy,zz,xxe,yye,zze);
 	}
 
@@ -1240,5 +1258,5 @@
 	return sealevelloadsaverage/oceanarea;
 } /*}}}*/
-void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,IssmDouble* loads, IssmDouble* sealeveloads){ /*{{{*/
+void RotationAxisMotion(IssmDouble* m, FemModel* femmodel,IssmDouble* loads, IssmDouble* sealevelloads){ /*{{{*/
 
 	IssmDouble  moi_list[3]={0,0,0};
@@ -1261,5 +1279,5 @@
 	for(Object* & object : femmodel->elements->objects){
 		Element* element = xDynamicCast<Element*>(object);
-		element->SealevelchangeMomentOfInertiaElement(&moi_list[0],loads,sealeveloads);
+		element->SealevelchangeMomentOfInertiaElement(&moi_list[0],loads,sealevelloads);
 		moi_list_cpu[0] += moi_list[0];
 		moi_list_cpu[1] += moi_list[1];
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 26125)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 26126)
@@ -350,10 +350,8 @@
 syn keyword cConstant SolidearthSettingsAbstolEnum
 syn keyword cConstant SolidearthSettingsCrossSectionShapeEnum
+syn keyword cConstant SolidearthSettingsOptimEnum
 syn keyword cConstant RotationalAngularVelocityEnum
 syn keyword cConstant SolidearthSettingsElasticEnum
 syn keyword cConstant SealevelchangeGeometryDoneEnum
-syn keyword cConstant SealevelGrotm1Enum
-syn keyword cConstant SealevelGrotm2Enum
-syn keyword cConstant SealevelGrotm3Enum
 syn keyword cConstant RotationalEquatorialMoiEnum
 syn keyword cConstant TidalLoveHEnum
@@ -758,4 +756,7 @@
 syn keyword cConstant BslcRateEnum
 syn keyword cConstant GmtslcEnum
+syn keyword cConstant SealevelGrotm1Enum
+syn keyword cConstant SealevelGrotm2Enum
+syn keyword cConstant SealevelGrotm3Enum
 syn keyword cConstant SealevelRSLBarystaticEnum
 syn keyword cConstant SealevelRSLRateEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 26125)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 26126)
@@ -344,10 +344,8 @@
 	SolidearthSettingsAbstolEnum,
 	SolidearthSettingsCrossSectionShapeEnum,
+	SolidearthSettingsOptimEnum,
 	RotationalAngularVelocityEnum,
 	SolidearthSettingsElasticEnum,
 	SealevelchangeGeometryDoneEnum,
-	SealevelGrotm1Enum,
-	SealevelGrotm2Enum,
-	SealevelGrotm3Enum,
 	RotationalEquatorialMoiEnum,
 	TidalLoveHEnum,
@@ -754,4 +752,7 @@
 	BslcRateEnum,
 	GmtslcEnum,
+	SealevelGrotm1Enum,
+	SealevelGrotm2Enum,
+	SealevelGrotm3Enum,
 	SealevelRSLBarystaticEnum,
 	SealevelRSLRateEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 26125)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 26126)
@@ -352,10 +352,8 @@
 		case SolidearthSettingsAbstolEnum : return "SolidearthSettingsAbstol";
 		case SolidearthSettingsCrossSectionShapeEnum : return "SolidearthSettingsCrossSectionShape";
+		case SolidearthSettingsOptimEnum : return "SolidearthSettingsOptim";
 		case RotationalAngularVelocityEnum : return "RotationalAngularVelocity";
 		case SolidearthSettingsElasticEnum : return "SolidearthSettingsElastic";
 		case SealevelchangeGeometryDoneEnum : return "SealevelchangeGeometryDone";
-		case SealevelGrotm1Enum : return "SealevelGrotm1";
-		case SealevelGrotm2Enum : return "SealevelGrotm2";
-		case SealevelGrotm3Enum : return "SealevelGrotm3";
 		case RotationalEquatorialMoiEnum : return "RotationalEquatorialMoi";
 		case TidalLoveHEnum : return "TidalLoveH";
@@ -760,4 +758,7 @@
 		case BslcRateEnum : return "BslcRate";
 		case GmtslcEnum : return "Gmtslc";
+		case SealevelGrotm1Enum : return "SealevelGrotm1";
+		case SealevelGrotm2Enum : return "SealevelGrotm2";
+		case SealevelGrotm3Enum : return "SealevelGrotm3";
 		case SealevelRSLBarystaticEnum : return "SealevelRSLBarystatic";
 		case SealevelRSLRateEnum : return "SealevelRSLRate";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 26125)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 26126)
@@ -358,10 +358,8 @@
 	      else if (strcmp(name,"SolidearthSettingsAbstol")==0) return SolidearthSettingsAbstolEnum;
 	      else if (strcmp(name,"SolidearthSettingsCrossSectionShape")==0) return SolidearthSettingsCrossSectionShapeEnum;
+	      else if (strcmp(name,"SolidearthSettingsOptim")==0) return SolidearthSettingsOptimEnum;
 	      else if (strcmp(name,"RotationalAngularVelocity")==0) return RotationalAngularVelocityEnum;
 	      else if (strcmp(name,"SolidearthSettingsElastic")==0) return SolidearthSettingsElasticEnum;
 	      else if (strcmp(name,"SealevelchangeGeometryDone")==0) return SealevelchangeGeometryDoneEnum;
-	      else if (strcmp(name,"SealevelGrotm1")==0) return SealevelGrotm1Enum;
-	      else if (strcmp(name,"SealevelGrotm2")==0) return SealevelGrotm2Enum;
-	      else if (strcmp(name,"SealevelGrotm3")==0) return SealevelGrotm3Enum;
 	      else if (strcmp(name,"RotationalEquatorialMoi")==0) return RotationalEquatorialMoiEnum;
 	      else if (strcmp(name,"TidalLoveH")==0) return TidalLoveHEnum;
@@ -383,10 +381,10 @@
 	      else if (strcmp(name,"SolidearthSettingsOceanAreaScaling")==0) return SolidearthSettingsOceanAreaScalingEnum;
 	      else if (strcmp(name,"RotationalPolarMoi")==0) return RotationalPolarMoiEnum;
+	      else if (strcmp(name,"SolidearthSettingsReltol")==0) return SolidearthSettingsReltolEnum;
+	      else if (strcmp(name,"SealevelchangeRequestedOutputs")==0) return SealevelchangeRequestedOutputsEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SolidearthSettingsReltol")==0) return SolidearthSettingsReltolEnum;
-	      else if (strcmp(name,"SealevelchangeRequestedOutputs")==0) return SealevelchangeRequestedOutputsEnum;
-	      else if (strcmp(name,"SolidearthSettingsRigid")==0) return SolidearthSettingsRigidEnum;
+	      if (strcmp(name,"SolidearthSettingsRigid")==0) return SolidearthSettingsRigidEnum;
 	      else if (strcmp(name,"SolidearthSettingsRotation")==0) return SolidearthSettingsRotationEnum;
 	      else if (strcmp(name,"SealevelchangeRunCount")==0) return SealevelchangeRunCountEnum;
@@ -506,10 +504,10 @@
 	      else if (strcmp(name,"TransientIsesa")==0) return TransientIsesaEnum;
 	      else if (strcmp(name,"TransientIsgia")==0) return TransientIsgiaEnum;
+	      else if (strcmp(name,"TransientIsgroundingline")==0) return TransientIsgroundinglineEnum;
+	      else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"TransientIsgroundingline")==0) return TransientIsgroundinglineEnum;
-	      else if (strcmp(name,"TransientIshydrology")==0) return TransientIshydrologyEnum;
-	      else if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
+	      if (strcmp(name,"TransientIsmasstransport")==0) return TransientIsmasstransportEnum;
 	      else if (strcmp(name,"TransientIsoceantransport")==0) return TransientIsoceantransportEnum;
 	      else if (strcmp(name,"TransientIsmovingfront")==0) return TransientIsmovingfrontEnum;
@@ -629,10 +627,10 @@
 	      else if (strcmp(name,"Enthalpy")==0) return EnthalpyEnum;
 	      else if (strcmp(name,"EnthalpyPicard")==0) return EnthalpyPicardEnum;
+	      else if (strcmp(name,"EplHead")==0) return EplHeadEnum;
+	      else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"EplHead")==0) return EplHeadEnum;
-	      else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
-	      else if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
+	      if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
 	      else if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
 	      else if (strcmp(name,"EplHeadSubstep")==0) return EplHeadSubstepEnum;
@@ -752,10 +750,10 @@
 	      else if (strcmp(name,"RadarAttenuationMacGregor")==0) return RadarAttenuationMacGregorEnum;
 	      else if (strcmp(name,"RadarAttenuationWolff")==0) return RadarAttenuationWolffEnum;
+	      else if (strcmp(name,"RadarIcePeriod")==0) return RadarIcePeriodEnum;
+	      else if (strcmp(name,"RadarPowerMacGregor")==0) return RadarPowerMacGregorEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"RadarIcePeriod")==0) return RadarIcePeriodEnum;
-	      else if (strcmp(name,"RadarPowerMacGregor")==0) return RadarPowerMacGregorEnum;
-	      else if (strcmp(name,"RadarPowerWolff")==0) return RadarPowerWolffEnum;
+	      if (strcmp(name,"RadarPowerWolff")==0) return RadarPowerWolffEnum;
 	      else if (strcmp(name,"RheologyBAbsGradient")==0) return RheologyBAbsGradientEnum;
 	      else if (strcmp(name,"RheologyBInitialguess")==0) return RheologyBInitialguessEnum;
@@ -778,4 +776,7 @@
 	      else if (strcmp(name,"BslcRate")==0) return BslcRateEnum;
 	      else if (strcmp(name,"Gmtslc")==0) return GmtslcEnum;
+	      else if (strcmp(name,"SealevelGrotm1")==0) return SealevelGrotm1Enum;
+	      else if (strcmp(name,"SealevelGrotm2")==0) return SealevelGrotm2Enum;
+	      else if (strcmp(name,"SealevelGrotm3")==0) return SealevelGrotm3Enum;
 	      else if (strcmp(name,"SealevelRSLBarystatic")==0) return SealevelRSLBarystaticEnum;
 	      else if (strcmp(name,"SealevelRSLRate")==0) return SealevelRSLRateEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"SmbReini")==0) return SmbReiniEnum;
 	      else if (strcmp(name,"SmbRunoff")==0) return SmbRunoffEnum;
-	      else if (strcmp(name,"SmbRunoffSubstep")==0) return SmbRunoffSubstepEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"SmbRunoffTransient")==0) return SmbRunoffTransientEnum;
+	      if (strcmp(name,"SmbRunoffSubstep")==0) return SmbRunoffSubstepEnum;
+	      else if (strcmp(name,"SmbRunoffTransient")==0) return SmbRunoffTransientEnum;
 	      else if (strcmp(name,"SmbS0gcm")==0) return SmbS0gcmEnum;
 	      else if (strcmp(name,"SmbS0p")==0) return SmbS0pEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
 	      else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
-	      else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
+	      if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
+	      else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
 	      else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
 	      else if (strcmp(name,"Outputdefinition29")==0) return Outputdefinition29Enum;
@@ -1120,9 +1121,9 @@
 	      else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
 	      else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
-	      else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
+	      if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
+	      else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
 	      else if (strcmp(name,"Channel")==0) return ChannelEnum;
 	      else if (strcmp(name,"ChannelArea")==0) return ChannelAreaEnum;
@@ -1243,9 +1244,9 @@
 	      else if (strcmp(name,"Inputs")==0) return InputsEnum;
 	      else if (strcmp(name,"Internal")==0) return InternalEnum;
-	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
          else stage=11;
    }
    if(stage==11){
-	      if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
+	      if (strcmp(name,"Intersect")==0) return IntersectEnum;
+	      else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
 	      else if (strcmp(name,"J")==0) return JEnum;
 	      else if (strcmp(name,"L1L2Approximation")==0) return L1L2ApproximationEnum;
@@ -1366,9 +1367,9 @@
 	      else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum;
 	      else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum;
-	      else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
          else stage=12;
    }
    if(stage==12){
-	      if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
+	      if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
+	      else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
 	      else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
 	      else if (strcmp(name,"SMBhenning")==0) return SMBhenningEnum;
Index: /issm/trunk-jpl/src/m/classes/solidearthsettings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/solidearthsettings.m	(revision 26125)
+++ /issm/trunk-jpl/src/m/classes/solidearthsettings.m	(revision 26126)
@@ -22,4 +22,5 @@
 		grdmodel               = 0; %grd model (0 by default, 1 for elastic, 2 for Ivins)
 		cross_section_shape    = 0; %cross section only used when grd model is Ivins
+		optim                  = 0; %new optimized version of the GRD code.
 	end
 	methods
@@ -65,4 +66,7 @@
 		self.cross_section_shape=1; %square as default (see iedge in GiaDeflectionCorex)
 
+		%optim? 
+		self.optim=0;
+
 		%no grd model by default: 
 		self.grdmodel=0; 
@@ -83,4 +87,5 @@
 			md = checkfield(md,'fieldname','solidearth.settings.grdmodel','values',[1 2]);
 			md = checkfield(md,'fieldname','solidearth.settings.cross_section_shape','numel',[1],'values',[1,2]);
+			md = checkfield(md,'fieldname','solidearth.settings.optim','values',[0,1]);
 
 			%checks on computational flags
@@ -126,4 +131,5 @@
 			fielddisplay(self,'grdmodel','type of deformation model, 1 for elastic, 2 for visco-elastic from Ivins');
 			fielddisplay(self,'cross_section_shape','1: square-edged (default). 2: elliptical. See iedge in GiaDeflectionCore');
+			fielddisplay(self,'optim','use optimized version of the GRD code? (default 0)');
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
@@ -144,4 +150,5 @@
 			WriteData(fid,prefix,'object',self,'fieldname','grdmodel','name','md.solidearth.settings.grdmodel','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','cross_section_shape','name','md.solidearth.settings.cross_section_shape','format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','optim','name','md.solidearth.settings.optim','format','Integer');
 		end % }}}
 		function savemodeljs(self,fid,modelname) % {{{
@@ -158,4 +165,5 @@
 			writejsdouble(fid,[modelname '.solidearth.settings.glfraction'],self.glfraction);
 			writejsdouble(fid,[modelname '.solidearth.settings.cross_section_shape'],self.cross_section_shape);
+			writejsdouble(fid,[modelname '.solidearth.settings.optim'],self.optim);
 		end % }}}
 		function self = extrude(self,md) % {{{
