Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22797)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22798)
@@ -170,10 +170,4 @@
 			if(VerboseSolution()) _printf0_("   ocean coupling: exchanging information\n");
 			int my_rank;
-			int oceangridnxsize,oceangridnysize,ngrids_ocean;
-			IssmDouble *oceanmelt;
-			IssmDouble *icebase;
-			IssmDouble *oceangridx;
-			IssmDouble *oceangridy;
-			IssmDouble oceantime;
 			ISSM_MPI_Comm tomitgcmcomm;
 			ISSM_MPI_Status status;
@@ -184,26 +178,11 @@
 			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");
-
-				/*Recover inputs needed*/
-				femmodel->parameters->FindParam(&oceangridnxsize,OceanGridNxEnum);
-				femmodel->parameters->FindParam(&oceangridnysize,OceanGridNyEnum);
-				femmodel->parameters->FindParam(&oceangridx,&ngrids_ocean,OceanGridXEnum);
-				femmodel->parameters->FindParam(&oceangridy,&ngrids_ocean,OceanGridYEnum);
-
-				/*Exchange information*/
-				oceanmelt = xNew<IssmDouble>(ngrids_ocean);
-				ISSM_MPI_Recv(oceanmelt,ngrids_ocean,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
-				icebase = xNew<IssmDouble>(ngrids_ocean);
-				for(int i=0;i<oceangridnxsize;i++){
-					for(int j=0;j<oceangridnysize;j++){
-						icebase[i*oceangridnysize+j]=9999.;
-					}
-				}
-				ISSM_MPI_Send(icebase,ngrids_ocean,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
-
-				/*Interpolate melt onto mesh*/
+				int ngrids_ocean;
+				IssmDouble oceantime;
+				IssmDouble rho_ice;
+				IssmDouble *oceanmelt;
+				IssmDouble *base_oceangrid;
+				IssmDouble *oceangridx;
+				IssmDouble *oceangridy;
 				IssmDouble* x_ice = NULL;
 				IssmDouble* y_ice = NULL;
@@ -211,4 +190,5 @@
 				IssmDouble* lon_ice = NULL;
 				IssmDouble* z_ice = NULL;
+				IssmDouble* icebase= NULL;
 				IssmDouble* melt_mesh = NULL;
 				int*        index_ice= NULL;
@@ -216,14 +196,43 @@
 				int         nels_ocean;
 				int         ngrids_ice=femmodel->vertices->NumberOfVertices();
+				int         nels_ice=femmodel->elements->NumberOfElements();
 				lat_ice= xNew<IssmDouble>(ngrids_ice);
 				lon_ice= xNew<IssmDouble>(ngrids_ice);
+				icebase= xNew<IssmDouble>(ngrids_ice);
 				melt_mesh= xNew<IssmDouble>(ngrids_ice);
+				
+				/*Recover mesh and inputs needed*/
+				femmodel->parameters->FindParam(&rho_ice,MaterialsRhoIceEnum);
 				femmodel->GetMesh(femmodel->vertices,femmodel->elements,&x_ice,&y_ice,&z_ice,&index_ice);
+				femmodel->parameters->FindParam(&oceangridx,&ngrids_ocean,OceanGridXEnum);
+				femmodel->parameters->FindParam(&oceangridy,&ngrids_ocean,OceanGridYEnum);
 				BamgTriangulatex(&index_ocean,&nels_ocean,oceangridx,oceangridy,ngrids_ocean);
+				base_oceangrid= xNew<IssmDouble>(ngrids_ocean);
+				oceanmelt = xNew<IssmDouble>(ngrids_ocean);
+
 				femmodel->vertices->LatLonList(&lat_ice,&lon_ice);
+
+				/*Interpolate ice base onto ocean grid*/
+//				InputUpdateFromVectorx(femmodel,melt_mesh,BasalforcingsFloatingiceMeltingRateEnum,VertexSIdEnum);
+				InterpFromMeshToMesh2dx(&base_oceangrid,index_ice,lon_ice,lat_ice,ngrids_ice,nels_ice,
+							icebase,ngrids_ice,1,
+							oceangridx,oceangridy,ngrids_ocean,NULL);   
+				
+				/*Send and receive data*/
+				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");
+				ISSM_MPI_Recv(oceanmelt,ngrids_ocean,ISSM_MPI_DOUBLE,0,10001007,tomitgcmcomm,&status);
+				ISSM_MPI_Send(base_oceangrid,ngrids_ocean,ISSM_MPI_DOUBLE,0,10001008,tomitgcmcomm);
+
+				/*Interp melt onto ice grid*/
 				InterpFromMeshToMesh2dx(&melt_mesh,index_ocean,oceangridx,oceangridy,ngrids_ocean,nels_ocean,
 							oceanmelt,ngrids_ocean,1,
 							lon_ice,lat_ice,ngrids_ice,NULL);   
+
+				for(int i=0;i<ngrids_ice;i++) melt_mesh[i]=-melt_mesh[i]/rho_ice; //heat flux provided by ocean is in kg/m^2/s
 				InputUpdateFromVectorx(femmodel,melt_mesh,BasalforcingsFloatingiceMeltingRateEnum,VertexSIdEnum);
+
+				/*Delete*/
 				xDelete<IssmDouble>(lat_ice);
 				xDelete<IssmDouble>(lon_ice);
@@ -237,4 +246,5 @@
 				xDelete<IssmDouble>(oceanmelt);
 				xDelete<IssmDouble>(icebase);
+				xDelete<IssmDouble>(base_oceangrid);
 			}
 			#else
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22797)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22798)
@@ -105,4 +105,5 @@
 		parameters->AddObject(iomodel->CopyConstantObject("md.transient.iscoupler",TransientIscouplerEnum));
 		parameters->AddObject(iomodel->CopyConstantObject("md.transient.isoceancoupling",TransientIsoceancouplingEnum));
+		parameters->AddObject(iomodel->CopyConstantObject("md.materials.rho_ice",MaterialsRhoIceEnum));
 		parameters->AddObject(iomodel->CopyConstantObject("md.transient.amr_frequency",TransientAmrFrequencyEnum));
 		parameters->AddObject(iomodel->CopyConstantObject("md.gia.cross_section_shape",GiaCrossSectionShapeEnum));
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22797)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 22798)
@@ -200,4 +200,5 @@
 	MasstransportRequestedOutputsEnum,
 	MasstransportStabilizationEnum,
+	MaterialsRhoIceEnum,
 	MeltingOffsetEnum,
 	MeshAverageVertexConnectivityEnum,
@@ -834,5 +835,4 @@
 	MaterialsRheologyLawEnum,
 	MaterialsRhoFreshwaterEnum,
-	MaterialsRhoIceEnum,
 	MaterialsRhoSeawaterEnum,
 	MaterialsTemperateiceconductivityEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22797)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22798)
@@ -208,4 +208,5 @@
 		case MasstransportRequestedOutputsEnum : return "MasstransportRequestedOutputs";
 		case MasstransportStabilizationEnum : return "MasstransportStabilization";
+		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
 		case MeltingOffsetEnum : return "MeltingOffset";
 		case MeshAverageVertexConnectivityEnum : return "MeshAverageVertexConnectivity";
@@ -838,5 +839,4 @@
 		case MaterialsRheologyLawEnum : return "MaterialsRheologyLaw";
 		case MaterialsRhoFreshwaterEnum : return "MaterialsRhoFreshwater";
-		case MaterialsRhoIceEnum : return "MaterialsRhoIce";
 		case MaterialsRhoSeawaterEnum : return "MaterialsRhoSeawater";
 		case MaterialsTemperateiceconductivityEnum : return "MaterialsTemperateiceconductivity";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22797)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22798)
@@ -211,4 +211,5 @@
 	      else if (strcmp(name,"MasstransportRequestedOutputs")==0) return MasstransportRequestedOutputsEnum;
 	      else if (strcmp(name,"MasstransportStabilization")==0) return MasstransportStabilizationEnum;
+	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
 	      else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
 	      else if (strcmp(name,"MeshAverageVertexConnectivity")==0) return MeshAverageVertexConnectivityEnum;
@@ -259,9 +260,9 @@
 	      else if (strcmp(name,"SealevelriseTidalLoveK")==0) return SealevelriseTidalLoveKEnum;
 	      else if (strcmp(name,"SealevelriseTransitions")==0) return SealevelriseTransitionsEnum;
-	      else if (strcmp(name,"SealevelriseUElastic")==0) return SealevelriseUElasticEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
+	      if (strcmp(name,"SealevelriseUElastic")==0) return SealevelriseUElasticEnum;
+	      else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
 	      else if (strcmp(name,"SettingsOutputFrequency")==0) return SettingsOutputFrequencyEnum;
 	      else if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"BasalforcingsPicoBasinId")==0) return BasalforcingsPicoBasinIdEnum;
 	      else if (strcmp(name,"BasalforcingsPicoBoxId")==0) return BasalforcingsPicoBoxIdEnum;
-	      else if (strcmp(name,"BasalforcingsPicoSubShelfOceanOverturning")==0) return BasalforcingsPicoSubShelfOceanOverturningEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;
+	      if (strcmp(name,"BasalforcingsPicoSubShelfOceanOverturning")==0) return BasalforcingsPicoSubShelfOceanOverturningEnum;
+	      else if (strcmp(name,"BasalforcingsPicoSubShelfOceanSalinity")==0) return BasalforcingsPicoSubShelfOceanSalinityEnum;
 	      else if (strcmp(name,"BasalforcingsPicoSubShelfOceanTemp")==0) return BasalforcingsPicoSubShelfOceanTempEnum;
 	      else if (strcmp(name,"Base")==0) return BaseEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"Sealevel")==0) return SealevelEnum;
 	      else if (strcmp(name,"SealevelriseDeltathickness")==0) return SealevelriseDeltathicknessEnum;
-	      else if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum;
+	      if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum;
+	      else if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum;
 	      else if (strcmp(name,"SedimentHeadResidual")==0) return SedimentHeadResidualEnum;
 	      else if (strcmp(name,"SigmaNN")==0) return SigmaNNEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
 	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
-	      else if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
+	      if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
+	      else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
 	      else if (strcmp(name,"InputsEND")==0) return InputsENDEnum;
 	      else if (strcmp(name,"Absolute")==0) return AbsoluteEnum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum;
 	      else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
-	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"GenericParam")==0) return GenericParamEnum;
+	      if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
+	      else if (strcmp(name,"GenericParam")==0) return GenericParamEnum;
 	      else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
 	      else if (strcmp(name,"GiaIvinsAnalysis")==0) return GiaIvinsAnalysisEnum;
@@ -856,5 +857,4 @@
 	      else if (strcmp(name,"MaterialsRheologyLaw")==0) return MaterialsRheologyLawEnum;
 	      else if (strcmp(name,"MaterialsRhoFreshwater")==0) return MaterialsRhoFreshwaterEnum;
-	      else if (strcmp(name,"MaterialsRhoIce")==0) return MaterialsRhoIceEnum;
 	      else if (strcmp(name,"MaterialsRhoSeawater")==0) return MaterialsRhoSeawaterEnum;
 	      else if (strcmp(name,"MaterialsTemperateiceconductivity")==0) return MaterialsTemperateiceconductivityEnum;
