Index: /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25059)
+++ /issm/trunk-jpl/src/c/analyses/SealevelriseAnalysis.cpp	(revision 25060)
@@ -24,4 +24,5 @@
 	int geodetic=0;
 	int dslmodel=0;
+	int giamodel=0;
 
 	/*Update elements: */
@@ -265,5 +266,13 @@
 	} /*}}}*/
 	else _error_("Dsl model " << dslmodel << " not implemented yet!");
-			
+		
+	/*gia mme model: */
+	iomodel->FetchData(&giamodel,"md.gia.model");
+	if(giamodel==3){
+		/*deal with Ngia and Ugia: */
+		iomodel->FetchDataToDatasetInput(inputs2,elements,"md.gia.Ngia",GiaMmeNgiaEnum);
+		iomodel->FetchDataToDatasetInput(inputs2,elements,"md.gia.Ugia",GiaMmeUgiaEnum);
+	}
+
 	/*Initialize cumdeltalthickness and sealevel rise rate input*/
 	InputUpdateFromConstantx(inputs2,elements,0.,SealevelriseCumDeltathicknessEnum);
@@ -282,4 +291,5 @@
 	IssmDouble* love_l=NULL;
 	int         dslmodel=0;
+	int         giamodel=0;
 
 	IssmDouble* G_rigid = NULL;
@@ -307,4 +317,5 @@
 	/*some constant parameters: */
 	parameters->AddObject(iomodel->CopyConstantObject("md.dsl.model",DslModelEnum));
+	parameters->AddObject(iomodel->CopyConstantObject("md.gia.model",GiaModelEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.slr.geodetic_run_frequency",SealevelriseGeodeticRunFrequencyEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.slr.reltol",SealevelriseReltolEnum));
@@ -346,4 +357,22 @@
 		if(modelid<=0 || modelid>nummodels)_error_("modelid field in dslmme object of md.dsl field should be between 1 and the number of ensemble runs!");
 	} /*}}}*/
+	/*Deal with gia multi-model ensembles: {{{*/
+	iomodel->FetchData(&giamodel,"md.gia.model");
+	if(giamodel==3){
+		IssmDouble modelid; 
+		int nummodels;
+
+		parameters->AddObject(iomodel->CopyConstantObject("md.gia.nummodels",GiaNummodelsEnum));
+		iomodel->FetchData(&modelid,"md.gia.modelid");
+		/*create double param, not int param, because Dakota will be updating it as 
+		 * a double potentially: */
+		parameters->AddObject(new DoubleParam(GiaModelidEnum,modelid));
+
+		iomodel->FetchData(&nummodels,"md.gia.nummodels");
+
+		/*quick checks: */
+		if(nummodels<=0)_error_("giamme object in  md.gia field should contain at least 1 ensemble model!");
+		if(modelid<=0 || modelid>nummodels)_error_("modelid field in giamme object of md.gia field should be between 1 and the number of ensemble runs!");
+	} /*}}}*/
 	/*Deal with elasticity {{{*/
 	/*love numbers: */
Index: /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 25059)
+++ /issm/trunk-jpl/src/c/cores/sealevelchange_core.cpp	(revision 25060)
@@ -625,4 +625,6 @@
 	/*parameters:*/
 	int					frequency;
+	int                 giamodel;
+	IssmDouble          modelid;
 	IssmDouble          dt;
 	
@@ -632,5 +634,30 @@
 	femmodel->parameters->FindParam(&frequency,SealevelriseGeodeticRunFrequencyEnum);
 	femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
-
+	femmodel->parameters->FindParam(&giamodel,GiaModelEnum);
+
+	if(giamodel==3){
+		/*need to actively get GIA from the MME ensemble, and plug it into 
+		 * the elements as inputs SealevelUGiaRateEnum and SealevelNGiaRateEnum :*/
+		femmodel->parameters->FindParam(&modelid,GiaModelidEnum); 
+		
+		modelid--; //from matlab
+
+		/*find the GiaMmeNgiaEnum dataset:*/
+		DatasetInput2* dataset_input_ngia=femmodel->inputs2->GetDatasetInput2(GiaMmeNgiaEnum);
+		DatasetInput2* dataset_input_ugia=femmodel->inputs2->GetDatasetInput2(GiaMmeUgiaEnum);
+
+		/*Go find the modelid'th input:*/
+		TriaInput2* tria_input_ngia=dataset_input_ngia->GetTriaInputByOffset(modelid);
+		TriaInput2* tria_input_ugia=dataset_input_ugia->GetTriaInputByOffset(modelid);
+
+		/*Plug into SealevelUGiaRate and SealevelNGiaRate inputs:*/
+		Input2* tria_input_copy_ngia=tria_input_ngia->copy();
+		Input2* tria_input_copy_ugia=tria_input_ugia->copy();
+		tria_input_copy_ngia->ChangeEnum(SealevelNGiaRateEnum);
+		tria_input_copy_ugia->ChangeEnum(SealevelUGiaRateEnum);
+		femmodel->inputs2->AddInput(tria_input_copy_ngia);
+		femmodel->inputs2->AddInput(tria_input_copy_ugia);
+	}
+	
 	/*recover GIA rates:*/
 	GetVectorFromInputsx(&U_gia,femmodel,SealevelUGiaRateEnum,VertexSIdEnum);
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 25059)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 25060)
@@ -159,4 +159,7 @@
 syn keyword cConstant FrontalForcingsNumberofBasinsEnum
 syn keyword cConstant FrontalForcingsParamEnum
+syn keyword cConstant GiaModelEnum
+syn keyword cConstant GiaModelidEnum
+syn keyword cConstant GiaNummodelsEnum
 syn keyword cConstant GiaCrossSectionShapeEnum
 syn keyword cConstant GroundinglineFrictionInterpolationEnum
@@ -539,4 +542,6 @@
 syn keyword cConstant DslStericRateEnum
 syn keyword cConstant DslDynamicRateEnum
+syn keyword cConstant GiaMmeNgiaEnum
+syn keyword cConstant GiaMmeUgiaEnum
 syn keyword cConstant DummyEnum
 syn keyword cConstant EffectivePressureEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 25059)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 25060)
@@ -153,4 +153,7 @@
 	FrontalForcingsNumberofBasinsEnum,
 	FrontalForcingsParamEnum,
+	GiaModelEnum,
+	GiaModelidEnum,
+	GiaNummodelsEnum,
 	GiaCrossSectionShapeEnum,
 	GroundinglineFrictionInterpolationEnum,
@@ -536,4 +539,6 @@
 	DslStericRateEnum,
 	DslDynamicRateEnum,
+	GiaMmeNgiaEnum,
+	GiaMmeUgiaEnum,
 	DummyEnum,
    EffectivePressureEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 25059)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 25060)
@@ -161,4 +161,7 @@
 		case FrontalForcingsNumberofBasinsEnum : return "FrontalForcingsNumberofBasins";
 		case FrontalForcingsParamEnum : return "FrontalForcingsParam";
+		case GiaModelEnum : return "GiaModel";
+		case GiaModelidEnum : return "GiaModelid";
+		case GiaNummodelsEnum : return "GiaNummodels";
 		case GiaCrossSectionShapeEnum : return "GiaCrossSectionShape";
 		case GroundinglineFrictionInterpolationEnum : return "GroundinglineFrictionInterpolation";
@@ -541,4 +544,6 @@
 		case DslStericRateEnum : return "DslStericRate";
 		case DslDynamicRateEnum : return "DslDynamicRate";
+		case GiaMmeNgiaEnum : return "GiaMmeNgia";
+		case GiaMmeUgiaEnum : return "GiaMmeUgia";
 		case DummyEnum : return "Dummy";
 		case EffectivePressureEnum : return "EffectivePressure";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 25059)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 25060)
@@ -164,4 +164,7 @@
 	      else if (strcmp(name,"FrontalForcingsNumberofBasins")==0) return FrontalForcingsNumberofBasinsEnum;
 	      else if (strcmp(name,"FrontalForcingsParam")==0) return FrontalForcingsParamEnum;
+	      else if (strcmp(name,"GiaModel")==0) return GiaModelEnum;
+	      else if (strcmp(name,"GiaModelid")==0) return GiaModelidEnum;
+	      else if (strcmp(name,"GiaNummodels")==0) return GiaNummodelsEnum;
 	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
 	      else if (strcmp(name,"GroundinglineFrictionInterpolation")==0) return GroundinglineFrictionInterpolationEnum;
@@ -257,11 +260,11 @@
 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
 	      else if (strcmp(name,"MaterialsBeta")==0) return MaterialsBetaEnum;
-	      else if (strcmp(name,"MaterialsEarthDensity")==0) return MaterialsEarthDensityEnum;
-	      else if (strcmp(name,"MaterialsEffectiveconductivityAveraging")==0) return MaterialsEffectiveconductivityAveragingEnum;
-	      else if (strcmp(name,"MaterialsHeatcapacity")==0) return MaterialsHeatcapacityEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"MaterialsLatentheat")==0) return MaterialsLatentheatEnum;
+	      if (strcmp(name,"MaterialsEarthDensity")==0) return MaterialsEarthDensityEnum;
+	      else if (strcmp(name,"MaterialsEffectiveconductivityAveraging")==0) return MaterialsEffectiveconductivityAveragingEnum;
+	      else if (strcmp(name,"MaterialsHeatcapacity")==0) return MaterialsHeatcapacityEnum;
+	      else if (strcmp(name,"MaterialsLatentheat")==0) return MaterialsLatentheatEnum;
 	      else if (strcmp(name,"MaterialsLithosphereDensity")==0) return MaterialsLithosphereDensityEnum;
 	      else if (strcmp(name,"MaterialsLithosphereShearModulus")==0) return MaterialsLithosphereShearModulusEnum;
@@ -380,11 +383,11 @@
 	      else if (strcmp(name,"SmbIssetpddfac")==0) return SmbIssetpddfacEnum;
 	      else if (strcmp(name,"SmbIsshortwave")==0) return SmbIsshortwaveEnum;
-	      else if (strcmp(name,"SmbIstemperaturescaled")==0) return SmbIstemperaturescaledEnum;
-	      else if (strcmp(name,"SmbIsthermal")==0) return SmbIsthermalEnum;
-	      else if (strcmp(name,"SmbIsturbulentflux")==0) return SmbIsturbulentfluxEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"SmbK")==0) return SmbKEnum;
+	      if (strcmp(name,"SmbIstemperaturescaled")==0) return SmbIstemperaturescaledEnum;
+	      else if (strcmp(name,"SmbIsthermal")==0) return SmbIsthermalEnum;
+	      else if (strcmp(name,"SmbIsturbulentflux")==0) return SmbIsturbulentfluxEnum;
+	      else if (strcmp(name,"SmbK")==0) return SmbKEnum;
 	      else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum;
 	      else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum;
@@ -503,11 +506,11 @@
 	      else if (strcmp(name,"Base")==0) return BaseEnum;
 	      else if (strcmp(name,"BaseOld")==0) return BaseOldEnum;
-	      else if (strcmp(name,"BaseSlopeX")==0) return BaseSlopeXEnum;
-	      else if (strcmp(name,"BaseSlopeY")==0) return BaseSlopeYEnum;
-	      else if (strcmp(name,"Bed")==0) return BedEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
+	      if (strcmp(name,"BaseSlopeX")==0) return BaseSlopeXEnum;
+	      else if (strcmp(name,"BaseSlopeY")==0) return BaseSlopeYEnum;
+	      else if (strcmp(name,"Bed")==0) return BedEnum;
+	      else if (strcmp(name,"BedSlopeX")==0) return BedSlopeXEnum;
 	      else if (strcmp(name,"BedSlopeY")==0) return BedSlopeYEnum;
 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
@@ -553,4 +556,6 @@
 	      else if (strcmp(name,"DslStericRate")==0) return DslStericRateEnum;
 	      else if (strcmp(name,"DslDynamicRate")==0) return DslDynamicRateEnum;
+	      else if (strcmp(name,"GiaMmeNgia")==0) return GiaMmeNgiaEnum;
+	      else if (strcmp(name,"GiaMmeUgia")==0) return GiaMmeUgiaEnum;
 	      else if (strcmp(name,"Dummy")==0) return DummyEnum;
 	      else if (strcmp(name,"EffectivePressure")==0) return EffectivePressureEnum;
@@ -624,13 +629,13 @@
 	      else if (strcmp(name,"HydrologyNeumannflux")==0) return HydrologyNeumannfluxEnum;
 	      else if (strcmp(name,"HydrologyReynolds")==0) return HydrologyReynoldsEnum;
-	      else if (strcmp(name,"HydrologySheetConductivity")==0) return HydrologySheetConductivityEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"HydrologySheetConductivity")==0) return HydrologySheetConductivityEnum;
 	      else if (strcmp(name,"HydrologySheetThickness")==0) return HydrologySheetThicknessEnum;
 	      else if (strcmp(name,"HydrologySheetThicknessOld")==0) return HydrologySheetThicknessOldEnum;
 	      else if (strcmp(name,"HydrologyWatercolumnMax")==0) return HydrologyWatercolumnMaxEnum;
 	      else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
+	      else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
 	      else if (strcmp(name,"Ice")==0) return IceEnum;
 	      else if (strcmp(name,"IceMaskNodeActivation")==0) return IceMaskNodeActivationEnum;
@@ -747,13 +752,13 @@
 	      else if (strcmp(name,"SmbEC")==0) return SmbECEnum;
 	      else if (strcmp(name,"SmbECDt")==0) return SmbECDtEnum;
-	      else if (strcmp(name,"SmbECini")==0) return SmbECiniEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"SmbECini")==0) return SmbECiniEnum;
 	      else if (strcmp(name,"SmbEla")==0) return SmbElaEnum;
 	      else if (strcmp(name,"SmbEvaporation")==0) return SmbEvaporationEnum;
 	      else if (strcmp(name,"SmbFAC")==0) return SmbFACEnum;
 	      else if (strcmp(name,"SmbGdn")==0) return SmbGdnEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"SmbGdnini")==0) return SmbGdniniEnum;
+	      else if (strcmp(name,"SmbGdnini")==0) return SmbGdniniEnum;
 	      else if (strcmp(name,"SmbGsp")==0) return SmbGspEnum;
 	      else if (strcmp(name,"SmbGspini")==0) return SmbGspiniEnum;
@@ -870,13 +875,13 @@
 	      else if (strcmp(name,"VzHO")==0) return VzHOEnum;
 	      else if (strcmp(name,"VzMesh")==0) return VzMeshEnum;
-	      else if (strcmp(name,"VzSSA")==0) return VzSSAEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"VzSSA")==0) return VzSSAEnum;
 	      else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
 	      else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
 	      else if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum;
 	      else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
+	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
 	      else if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
 	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
@@ -993,13 +998,13 @@
 	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
 	      else if (strcmp(name,"AutodiffJacobian")==0) return AutodiffJacobianEnum;
-	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
 	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
 	      else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
+	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
 	      else if (strcmp(name,"BalancethicknessSpcthickness")==0) return BalancethicknessSpcthicknessEnum;
@@ -1116,13 +1121,13 @@
 	      else if (strcmp(name,"Hook")==0) return HookEnum;
 	      else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
-	      else if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"HydrologyDCInefficientAnalysis")==0) return HydrologyDCInefficientAnalysisEnum;
 	      else if (strcmp(name,"HydrologyGlaDSAnalysis")==0) return HydrologyGlaDSAnalysisEnum;
 	      else if (strcmp(name,"HydrologyGlaDS")==0) return HydrologyGlaDSEnum;
 	      else if (strcmp(name,"HydrologyPismAnalysis")==0) return HydrologyPismAnalysisEnum;
 	      else if (strcmp(name,"HydrologyShaktiAnalysis")==0) return HydrologyShaktiAnalysisEnum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
+	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
 	      else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
@@ -1239,13 +1244,13 @@
 	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
 	      else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
-	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
+         else stage=11;
+   }
+   if(stage==11){
+	      if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
 	      else if (strcmp(name,"P1xP2")==0) return P1xP2Enum;
 	      else if (strcmp(name,"P1xP3")==0) return P1xP3Enum;
 	      else if (strcmp(name,"P1xP4")==0) return P1xP4Enum;
 	      else if (strcmp(name,"P2")==0) return P2Enum;
-         else stage=11;
-   }
-   if(stage==11){
-	      if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
+	      else if (strcmp(name,"P2bubble")==0) return P2bubbleEnum;
 	      else if (strcmp(name,"P2bubblecondensed")==0) return P2bubblecondensedEnum;
 	      else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
@@ -1362,13 +1367,13 @@
 	      else if (strcmp(name,"EtaAbsGradient")==0) return EtaAbsGradientEnum;
 	      else if (strcmp(name,"MeshZ")==0) return MeshZEnum;
-	      else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
+         else stage=12;
+   }
+   if(stage==12){
+	      if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
 	      else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
 	      else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum;
 	      else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum;
 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
-         else stage=12;
-   }
-   if(stage==12){
-	      if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
+	      else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
 	      else if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum;
 	      else if (strcmp(name,"SubelementMigration4")==0) return SubelementMigration4Enum;
