Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22702)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22703)
@@ -76,8 +76,8 @@
 	#endif
 
-	if(isoceancoupling){
+	if(isoceancoupling){ {{{
 		if(VerboseSolution()) _printf0_("   ocean coupling: initialization \n");
 		int my_rank;
-		int oceannxsize,oceannysize;
+		int oceangridnxsize,oceangridnysize;
 		IssmDouble *oceangridx;
 		IssmDouble *oceangridy;
@@ -97,19 +97,21 @@
 			ISSM_MPI_Send(&time,1,ISSM_MPI_DOUBLE,0,10001001,tomitgcmcomm);
 			ISSM_MPI_Recv(&oceantime,1,ISSM_MPI_DOUBLE,0,10001002,tomitgcmcomm,&status);
-			ISSM_MPI_Recv(&oceannxsize,1,ISSM_MPI_INT,0,10001003,tomitgcmcomm,&status);
-			ISSM_MPI_Recv(&oceannysize,1,ISSM_MPI_INT,0,10001004,tomitgcmcomm,&status);
-			oceangridx = xNew<IssmDouble>(oceannxsize*oceannysize);
-			ISSM_MPI_Recv(oceangridx,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001005,tomitgcmcomm,&status);
-			oceangridy = xNew<IssmDouble>(oceannxsize*oceannysize);
-			ISSM_MPI_Recv(oceangridy,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001006,tomitgcmcomm,&status);
-			icebase = xNew<IssmDouble>(oceannxsize*oceannysize);
-			for(int i=0;i<oceannxsize;i++){
-				for(int j=0;j<oceannysize;j++){
-					icebase[i*oceannysize+j]=2*oceangridx[i*oceannysize+j];
-				}
-			}
-			ISSM_MPI_Send(icebase,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
-			oceanmelt = xNew<IssmDouble>(oceannxsize*oceannysize);
-			ISSM_MPI_Recv(oceanmelt,oceannxsize*oceannysize,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
+			ISSM_MPI_Recv(&oceangridnxsize,1,ISSM_MPI_INT,0,10001003,tomitgcmcomm,&status);
+			ISSM_MPI_Recv(&oceangridnysize,1,ISSM_MPI_INT,0,10001004,tomitgcmcomm,&status);
+			femmodel->parameters->SetParam(oceangridnxsize,OceanGridNxEnum);
+			femmodel->parameters->SetParam(oceangridnysize,OceanGridNyEnum);
+			oceangridx = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
+			ISSM_MPI_Recv(oceangridx,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001005,tomitgcmcomm,&status);
+			oceangridy = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
+			ISSM_MPI_Recv(oceangridy,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001006,tomitgcmcomm,&status);
+			icebase = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
+			for(int i=0;i<oceangridnxsize;i++){
+				for(int j=0;j<oceangridnysize;j++){
+					icebase[i*oceangridnysize+j]=2*oceangridx[i*oceangridnysize+j];
+				}
+			}
+			ISSM_MPI_Send(icebase,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
+			oceanmelt = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
+			ISSM_MPI_Recv(oceanmelt,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
 			xDelete<IssmDouble>(icebase);
 			xDelete<IssmDouble>(oceangridx);
@@ -118,4 +120,5 @@
 		}
 	}
+	}}}
 
 		IssmDouble  output_value;
@@ -162,4 +165,34 @@
 		femmodel->parameters->SetParam(save_results,SaveResultsEnum);
 
+		if(isoceancoupling){ {{{
+			if(VerboseSolution()) _printf0_("   ocean coupling: sending ice base\n");
+			int my_rank;
+			int oceangridnxsize,oceangridnysize;
+			IssmDouble *icebase;
+			IssmDouble oceantime;
+			ISSM_MPI_Comm tomitgcmcomm;
+			ISSM_MPI_Status status;
+
+			my_rank=IssmComm::GetRank();
+			GenericParam<ISSM_MPI_Comm>* parcom = dynamic_cast<GenericParam<ISSM_MPI_Comm>*>(femmodel->parameters->FindParamObject(ToMITgcmCommEnum));
+			if(!parcom)_error_("TransferForcing error message: could not find ToMITgcmCommEnum communicator");
+			tomitgcmcomm=parcom->GetParameterValue();
+			if(my_rank==0){
+				ISSM_MPI_Send(&time,1,ISSM_MPI_DOUBLE,0,10001001,tomitgcmcomm);
+				ISSM_MPI_Recv(&oceantime,1,ISSM_MPI_DOUBLE,0,10001002,tomitgcmcomm,&status);
+				if((oceantime - time > 0.1*yts) & (oceantime - time < -0.1*yts)) _error_("Ocean and ice time are starting to diverge");
+				femmodel->parameters->FindParam(&oceangridnxsize,OceanGridNxEnum);
+				femmodel->parameters->FindParam(&oceangridnysize,OceanGridNyEnum);
+				for(int i=0;i<oceangridnxsize;i++){
+					for(int j=0;j<oceangridnysize;j++){
+						icebase[i*oceangridnysize+j]=9999.;
+					}
+				}
+				ISSM_MPI_Send(icebase,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
+				xDelete<IssmDouble>(icebase);
+			}
+		}
+		}}}
+
 		if(isthermal && domaintype==Domain3DEnum){ 
 			if(issmb){
@@ -239,4 +272,26 @@
 		}
 
+		if(isoceancoupling){ {{{
+			if(VerboseSolution()) _printf0_("   ocean coupling: receiving melt\n");
+			int my_rank;
+			int oceangridnxsize,oceangridnysize;
+			IssmDouble *oceanmelt;
+			ISSM_MPI_Comm tomitgcmcomm;
+			ISSM_MPI_Status status;
+
+			my_rank=IssmComm::GetRank();
+			GenericParam<ISSM_MPI_Comm>* parcom = dynamic_cast<GenericParam<ISSM_MPI_Comm>*>(femmodel->parameters->FindParamObject(ToMITgcmCommEnum));
+			if(!parcom)_error_("TransferForcing error message: could not find ToMITgcmCommEnum communicator");
+			tomitgcmcomm=parcom->GetParameterValue();
+			if(my_rank==0){
+				femmodel->parameters->FindParam(&oceangridnxsize,OceanGridNxEnum);
+				femmodel->parameters->FindParam(&oceangridnysize,OceanGridNyEnum);
+				oceanmelt = xNew<IssmDouble>(oceangridnxsize*oceangridnysize);
+				ISSM_MPI_Recv(oceanmelt,oceangridnxsize*oceangridnysize,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
+				xDelete<IssmDouble>(oceanmelt);
+			}
+		}
+		}}}
+
 		if(recording_frequency && (step%recording_frequency==0)){
 			if(VerboseSolution()) _printf0_("   checkpointing model \n");
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22702)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22703)
@@ -206,4 +206,8 @@
 	NodesEnum,
 	NumModelsEnum,
+	OceanGridNxEnum,
+	OceanGridNyEnum,
+	OceanGridXEnum,
+	OceanGridYEnum,
 	OutputBufferPointerEnum,
 	OutputBufferSizePointerEnum,
@@ -476,8 +480,4 @@
 	NeumannfluxEnum,
 	NodeEnum,
-	OceanGridNxEnum,
-	OceanGridNyEnum,
-	OceanGridXEnum,
-	OceanGridYEnum,
 	OmegaAbsGradientEnum,
 	P0Enum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22702)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22703)
@@ -214,4 +214,8 @@
 		case NodesEnum : return "Nodes";
 		case NumModelsEnum : return "NumModels";
+		case OceanGridNxEnum : return "OceanGridNx";
+		case OceanGridNyEnum : return "OceanGridNy";
+		case OceanGridXEnum : return "OceanGridX";
+		case OceanGridYEnum : return "OceanGridY";
 		case OutputBufferPointerEnum : return "OutputBufferPointer";
 		case OutputBufferSizePointerEnum : return "OutputBufferSizePointer";
@@ -482,8 +486,4 @@
 		case NeumannfluxEnum : return "Neumannflux";
 		case NodeEnum : return "Node";
-		case OceanGridNxEnum : return "OceanGridNx";
-		case OceanGridNyEnum : return "OceanGridNy";
-		case OceanGridXEnum : return "OceanGridX";
-		case OceanGridYEnum : return "OceanGridY";
 		case OmegaAbsGradientEnum : return "OmegaAbsGradient";
 		case P0Enum : return "P0";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22702)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22703)
@@ -217,4 +217,8 @@
 	      else if (strcmp(name,"Nodes")==0) return NodesEnum;
 	      else if (strcmp(name,"NumModels")==0) return NumModelsEnum;
+	      else if (strcmp(name,"OceanGridNx")==0) return OceanGridNxEnum;
+	      else if (strcmp(name,"OceanGridNy")==0) return OceanGridNyEnum;
+	      else if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
+	      else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
 	      else if (strcmp(name,"OutputBufferPointer")==0) return OutputBufferPointerEnum;
 	      else if (strcmp(name,"OutputBufferSizePointer")==0) return OutputBufferSizePointerEnum;
@@ -256,12 +260,12 @@
 	      else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
 	      else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
-	      else if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
+         else stage=3;
+   }
+   if(stage==3){
+	      if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
 	      else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
 	      else if (strcmp(name,"SettingsSolverResidueThreshold")==0) return SettingsSolverResidueThresholdEnum;
 	      else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
-         else stage=3;
-   }
-   if(stage==3){
-	      if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
+	      else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
 	      else if (strcmp(name,"SmbAIce")==0) return SmbAIceEnum;
 	      else if (strcmp(name,"SmbAIdx")==0) return SmbAIdxEnum;
@@ -379,12 +383,12 @@
 	      else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;
 	      else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum;
-	      else if (strcmp(name,"Base")==0) return BaseEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"Base")==0) return BaseEnum;
 	      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 stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
+	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
 	      else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
 	      else if (strcmp(name,"CalvinglevermannCoeff")==0) return CalvinglevermannCoeffEnum;
@@ -491,8 +495,4 @@
 	      else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
 	      else if (strcmp(name,"Node")==0) return NodeEnum;
-	      else if (strcmp(name,"OceanGridNx")==0) return OceanGridNxEnum;
-	      else if (strcmp(name,"OceanGridNy")==0) return OceanGridNyEnum;
-	      else if (strcmp(name,"OceanGridX")==0) return OceanGridXEnum;
-	      else if (strcmp(name,"OceanGridY")==0) return OceanGridYEnum;
 	      else if (strcmp(name,"OmegaAbsGradient")==0) return OmegaAbsGradientEnum;
 	      else if (strcmp(name,"P0")==0) return P0Enum;
