Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 22470)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 22471)
@@ -133,4 +133,5 @@
 					./classes/Params/VectorParam.cpp\
 					./classes/Params/TransientParam.cpp\
+					./classes/Params/TransientArrayParam.cpp\
 					./classes/Params/DataSetParam.cpp\
 					./classes/Profiler.cpp\
Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 22471)
@@ -178,4 +178,15 @@
 		iomodel->FetchDataToInput(elements,"md.mesh.vertexonsurface",MeshVertexonsurfaceEnum);
 	}
+
+	int basalforcing_model;
+	iomodel->FindConstant(&basalforcing_model,"md.basalforcings.model");
+	switch(basalforcing_model){
+		case BasalforcingsPicoEnum:
+			iomodel->FetchDataToInput(elements,"md.basalforcings.basin_id",BasalforcingsPicoBasinIdEnum);
+			break;
+		default: // Do nothing
+			break;
+	}
+	
 }/*}}}*/
 void MasstransportAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 22471)
@@ -2128,4 +2128,29 @@
 }
 /*}}}*/
+void       Element::PicoFloatingiceMeltingRate(){/*{{{*/
+
+	int numvertices      = this->GetNumberOfVertices();
+	IssmDouble  deepwaterel,upperwaterel,deepwatermelt;
+	IssmDouble* base     = xNew<IssmDouble>(numvertices);
+	IssmDouble* values   = xNew<IssmDouble>(numvertices);
+	IssmDouble time;
+
+	parameters->FindParam(&time,TimeEnum);
+	parameters->FindParam(&deepwaterel,BasalforcingsDeepwaterElevationEnum,time);
+	parameters->FindParam(&upperwaterel,BasalforcingsUpperwaterElevationEnum,time);
+	parameters->FindParam(&deepwatermelt,BasalforcingsDeepwaterMeltingRateEnum,time);
+
+	this->GetInputListOnVertices(base,BaseEnum);
+	for(int i=0;i<numvertices;i++){
+		if(base[i]>upperwaterel)      values[i]=0;
+		else if (base[i]<deepwaterel) values[i]=deepwatermelt;
+		else values[i]=deepwatermelt*(base[i]-upperwaterel)/(deepwaterel-upperwaterel);
+	}
+
+	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	xDelete<IssmDouble>(base);
+	xDelete<IssmDouble>(values);
+
+}/*}}}*/
 void       Element::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm,bool issetpddfac){/*{{{*/
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 22471)
@@ -140,4 +140,5 @@
 		ElementMatrix*     NewElementMatrixCoupling(int number_nodes,int approximation_enum=NoneApproximationEnum);
 		ElementVector*     NewElementVector(int approximation_enum=NoneApproximationEnum);
+		void					 PicoFloatingiceMeltingRate();
 		void               PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm,bool ismungsm,bool issetpddfac);
 		IssmDouble         PureIceEnthalpy(IssmDouble pressure);
@@ -272,4 +273,5 @@
 		virtual int        NumberofNodesPressure(void)=0;
 		virtual int        NumberofNodesVelocity(void)=0;
+		virtual void       PicoUpdateBoxid(int* pmax_boxid_basin)=0;
 		virtual void       PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding)=0;
 		virtual int        PressureInterpolation()=0;
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 22471)
@@ -139,4 +139,5 @@
 		int            NumberofNodesPressure(void);
 		int            NumberofNodesVelocity(void);
+		void				PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};
 		void           PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
 		int            PressureInterpolation();
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 22471)
@@ -128,4 +128,5 @@
 		int         NumberofNodesPressure(void){_error_("not implemented yet");};
 		int         NumberofNodesVelocity(void){_error_("not implemented yet");};
+		void        PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};
 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
 		int         PressureInterpolation(void){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/Tetra.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 22471)
@@ -136,4 +136,5 @@
 		int         NumberofNodesPressure(void);
 		int         NumberofNodesVelocity(void);
+		void			PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};	
 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding){_error_("not implemented yet");};
 		int         PressureInterpolation(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 22471)
@@ -110,4 +110,5 @@
 		int         NumberofNodesPressure(void);
 		int         NumberofNodesVelocity(void);
+		void        PicoUpdateBoxid(int* pmax_boxid_basin);
 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
 		int         PressureInterpolation();
Index: /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/Params/Parameters.cpp	(revision 22471)
@@ -34,4 +34,5 @@
 #include "./DoubleMatArrayParam.h"
 #include "./TransientParam.h"
+#include "./TransientArrayParam.h"
 
 #include "../../shared/shared.h"
@@ -219,4 +220,10 @@
 				transparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
 				this->AddObject(transparam);
+			}
+			else if(obj_enum==TransientArrayParamEnum){
+				TransientArrayParam* transarrayparam=NULL;
+				transarrayparam=new TransientArrayParam();
+				transarrayparam->Marshall(pmarshalled_data,pmarshalled_data_size,marshall_direction);
+				this->AddObject(transarrayparam);
 			}
 			else if(obj_enum==GenericParamEnum){
Index: /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.cpp	(revision 22471)
+++ /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.cpp	(revision 22471)
@@ -0,0 +1,143 @@
+/*!\file TransientArrayParam.c
+ * \brief: implementation of the TransientArrayParam object
+ */
+
+/*header files: */
+/*{{{*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../classes.h"
+#include "../../shared/shared.h"
+/*}}}*/
+
+/*TransientArrayParam constructors and destructor*/
+TransientArrayParam::TransientArrayParam(){/*{{{*/
+	return;
+}
+/*}}}*/
+TransientArrayParam::TransientArrayParam(int in_enum_type,IssmDouble* in_values,IssmDouble* in_time,bool interpolation_on,int in_N,int in_M){/*{{{*/
+
+	_assert_(in_values && in_time);
+
+	enum_type=in_enum_type;
+	N=in_N; //Number of time steps
+	M=in_M; //Number of rows
+	interpolation=interpolation_on;
+
+	values=xNew<IssmDouble>(N*M);
+	xMemCpy<IssmDouble>(values,in_values,N*M);
+
+	timesteps=xNew<IssmDouble>(N);
+	xMemCpy<IssmDouble>(timesteps,in_time,N);
+}
+/*}}}*/
+TransientArrayParam::~TransientArrayParam(){/*{{{*/
+	xDelete<IssmDouble>(values);
+	xDelete<IssmDouble>(timesteps);
+}
+/*}}}*/
+
+/*Object virtual functions definitions:*/
+Param* TransientArrayParam::copy() {/*{{{*/
+
+	return new TransientArrayParam(this->enum_type,this->values,this->timesteps,this->interpolation,this->N,this->M);
+
+}
+/*}}}*/
+void TransientArrayParam::DeepEcho(void){/*{{{*/
+
+	_printf_("TransientArrayParam:\n");
+	_printf_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n");
+	_printf_("   number of time steps: " << this->N << "\n");
+	_printf_("   number of rows: " << this->M << "\n");
+	for(int i=0;i<this->N;i++){
+		_printf_("	time: " << this->timesteps[i] << "\n");
+		for(int k=0;k<this->M;k++){
+			_printf_("		values: " << this->values[k*N+i] << "\n");
+		}
+		_printf_("\n");
+	}
+}
+/*}}}*/
+void TransientArrayParam::Echo(void){/*{{{*/
+
+	_printf_("TransientArrayParam:\n");
+	_printf_("   enum: " << this->enum_type << " (" << EnumToStringx(this->enum_type) << ")\n");
+	_printf_("   size: " << this->N << " by " << this->M << "\n");
+
+}
+/*}}}*/
+int  TransientArrayParam::Id(void){ return -1; }/*{{{*/
+/*}}}*/
+void TransientArrayParam::Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction){ /*{{{*/
+
+	MARSHALLING_ENUM(TransientArrayParamEnum);
+
+	MARSHALLING(enum_type);
+	MARSHALLING(interpolation);
+	MARSHALLING(M);
+	MARSHALLING(N);
+	if(marshall_direction==MARSHALLING_BACKWARD){
+		values=xNew<IssmDouble>(N*M);
+		timesteps=xNew<IssmDouble>(N*M);
+	}
+	MARSHALLING_ARRAY(values,IssmDouble,N*M);
+	MARSHALLING_ARRAY(timesteps,IssmDouble,N*M);
+
+}/*}}}*/
+int  TransientArrayParam::ObjectEnum(void){/*{{{*/
+
+	return TransientArrayParamEnum;
+
+}
+/*}}}*/
+
+/*TransientArrayParam virtual functions definitions: */
+void  TransientArrayParam::GetParameterValue(IssmDouble* pdouble,IssmDouble time, int row){/*{{{*/
+
+	IssmDouble output;
+	bool   found;
+
+	/*Ok, we have the time, go through the timesteps, and figure out which interval we 
+	 *fall within. Then interpolate the values on this interval: */
+	if(time<this->timesteps[0]){
+		/*get values for the first time: */
+		output=this->values[row*this->N];
+		found=true;
+	}
+	else if(time>this->timesteps[this->N-1]){
+		/*get values for the last time: */
+		output=this->values[(row+1)*this->N-1];
+		found=true;
+	}
+	else{
+		/*Find which interval we fall within: */
+		for(int i=0;i<this->N;i++){
+			if(time==this->timesteps[i]){
+				/*We are right on one step time: */
+				output=this->values[row*this->N+i];
+				found=true;
+				break; //we are done with the time interpolation.
+			}
+			else{
+				if(this->timesteps[i]<time && time<this->timesteps[i+1]){
+					/*ok, we have the interval ]i:i+1[. Interpolate linearly for now: */
+					IssmDouble deltat=this->timesteps[i+1]-this->timesteps[i];
+					IssmDouble alpha=(time-this->timesteps[i])/deltat;
+					if(interpolation==true) output=(1.0-alpha)*this->values[row*this->N+i] + alpha*this->values[row*this->N+i+1];
+					else output=this->values[row*this->N+i];
+					found=true;
+					break;
+				}
+				else continue; //keep looking on the next interval
+			}
+		}
+	}
+	if(!found)_error_("did not find time interval on which to interpolate values");
+	*pdouble=output;
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.h	(revision 22471)
+++ /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.h	(revision 22471)
@@ -0,0 +1,79 @@
+/*! \file TransientArrayParam.h 
+ *  \brief: header file for triavertexinput object
+ */
+
+#ifndef _TRANSIENTARRAYPARAM_H_
+#define _TRANSIENTARRAYPARAM_H_
+
+/*Headers:*/
+/*{{{*/
+#ifdef HAVE_CONFIG_H
+	#include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./Param.h"
+#include "../../shared/shared.h"
+/*}}}*/
+
+class TransientArrayParam: public Param{
+
+	protected: 
+		int         enum_type;
+		int         N;
+		int         M;
+		bool        interpolation;
+		IssmDouble *values;
+		IssmDouble *timesteps;
+
+	public:
+		/*TransientArrayParam constructors, destructors: {{{*/
+		TransientArrayParam();
+		TransientArrayParam(int in_enum_type,IssmDouble* in_values,IssmDouble* in_time,bool interpolation_on,int in_N,int in_M);
+		~TransientArrayParam();
+		/*}}}*/
+		/*Object virtual functions definitions:{{{ */
+		Param* copy();
+		void  DeepEcho();
+		void  Echo();
+		int   Id(); 
+		void Marshall(char** pmarshalled_data,int* pmarshalled_data_size, int marshall_direction);
+		int   ObjectEnum();
+		/*}}}*/
+		/*Param vritual function definitions: {{{*/
+		void  GetParameterValue(bool* pbool){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a bool");}
+		void  GetParameterValue(int* pinteger){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return an integer");}
+		void  GetParameterValue(int** pintarray,int* pM){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return an array of integers");}
+		void  GetParameterValue(int** pintarray,int* pM,int* pN){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a array of integers");}
+		void  GetParameterValue(IssmDouble* pIssmDouble){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a IssmDouble");}
+		void  GetParameterValue(IssmDouble* pdouble,IssmDouble time,int row);
+		void  GetParameterValue(IssmDouble* pdouble,IssmDouble time){_error_("Parameter " <<EnumToStringx(enum_type) << " needs row to be specified");}
+		void  GetParameterValue(char** pstring){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a string");}
+		void  GetParameterValue(char*** pstringarray,int* pM){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a string array");}
+		void  GetParameterValue(IssmDouble** pIssmDoublearray,int* pM){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a IssmDouble array");}
+		void  GetParameterValue(IssmDouble** pIssmDoublearray,int* pM,int* pN){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a IssmDouble array");}
+		void  GetParameterValue(IssmDouble*** parray, int* pM,int** pmdims, int** pndims){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a matrix array");}
+		void  GetParameterValue(Vector<IssmDouble>** pvec){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a Vec");}
+		void  GetParameterValue(Matrix<IssmDouble>** pmat){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a Mat");}
+		void  GetParameterValue(FILE** pfid){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot return a FILE");}
+		void  GetParameterValue(DataSet** pdataset){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a DataSet");}
+		int   InstanceEnum(){return enum_type;}
+
+		void  SetEnum(int enum_in){this->enum_type = enum_in;};
+		void  SetValue(bool boolean){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a boolean");}
+		void  SetValue(int integer){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold an integer");}
+		void  SetValue(IssmDouble scalar){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a scalar");}
+		void  SetValue(char* string){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a string");}
+		void  SetValue(char** stringarray,int M){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a string array");}
+		void  SetValue(IssmDouble* IssmDoublearray,int M){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a IssmDouble vec array");}
+		void  SetValue(IssmDouble* IssmDoublearray,int M,int N){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a IssmDouble array");}
+		void  SetValue(int* intarray,int M){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a int vec array");}
+		void  SetValue(int* intarray,int M,int N){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a int mat array");};
+		void  SetValue(Vector<IssmDouble>* vec){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a Vec");}
+		void  SetValue(Matrix<IssmDouble>* mat){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a Mat");}
+		void  SetValue(FILE* fid){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold a FILE");}
+		void  SetValue(IssmDouble** array, int M, int* mdim_array, int* ndim_array){_error_("Parameter " <<EnumToStringx(enum_type) << " cannot hold an array of matrices");}
+		/*}}}*/
+};
+#endif  /* _TRANSIENTARRAYPARAM_H */
Index: /issm/trunk-jpl/src/c/classes/classes.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/classes.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/classes/classes.h	(revision 22471)
@@ -108,4 +108,5 @@
 #include "./Params/StringParam.h"
 #include "./Params/TransientParam.h"
+#include "./Params/TransientArrayParam.h"
 #include "./Params/DataSetParam.h"
 
Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 22471)
@@ -148,8 +148,9 @@
 			}
 		}
-
-		/*Calculate new basal melting on floating ice*/
-		FloatingiceMeltingRatex(femmodel);
-		
+		if(ismasstransport){
+			/*Calculate new basal melting on floating ice*/
+			FloatingiceMeltingRatex(femmodel);
+		}
+
 		if(isgia){
 			if(VerboseSolution()) _printf0_("   computing glacial isostatic adjustment\n");
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 22470)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.h	(revision 22471)
@@ -12,4 +12,5 @@
 void LinearFloatingiceMeltingRatex(FemModel* femmodel);
 void MismipFloatingiceMeltingRatex(FemModel* femmodel);
+void PicoFloatingiceMeltingRatex(FemModel* femmodel);
 
 #endif  /* _FloatingiceMeltingRatex_H*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22471)
@@ -206,4 +206,15 @@
 			parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.lowercrustheat",BasalforcingsLowercrustheatEnum));
 			break;
+		case BasalforcingsPicoEnum:
+				iomodel->FindConstant(&interp,"md.timestepping.interp_forcings");
+				parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.num_basins",BasalforcingsPicoNumBasinsEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.maxboxcount",BasalforcingsPicoMaxboxcountEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.overturning_coeff",BasalforcingsPicoOverturningCoeffEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.gamma_T",BasalforcingsPicoGammaTEnum));
+				iomodel->FetchData(&transparam,&N,&M,"md.basalforcings.farocean_temperature");
+				parameters->AddObject(new TransientArrayParam(BasalforcingsPicoFarOceanTemperatureEnum,&transparam[0],&transparam[M*(N-1)],interp,M,N));
+				iomodel->FetchData(&transparam,&N,&M,"md.basalforcings.farocean_salinity");
+				parameters->AddObject(new TransientArrayParam(BasalforcingsPicoFarOceanSalinityEnum,&transparam[0],&transparam[M*(N-1)],interp,M,N));
+			break;
 		default:
 			_error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet");
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 22471)
@@ -93,8 +93,11 @@
 		case BasalforcingsPicoBasinIdEnum : return "BasalforcingsPicoBasinId";
 		case BasalforcingsPicoMaxboxcountEnum : return "BasalforcingsPicoMaxboxcount";
+		case BasalforcingsPicoBoxIdEnum : return "BasalforcingsPicoBoxId";
 		case BasalforcingsPicoOverturningCoeffEnum : return "BasalforcingsPicoOverturningCoeff";
 		case BasalforcingsPicoGammaTEnum : return "BasalforcingsPicoGammaT";
-		case BasalforcingsPicoBox0temperatureEnum : return "BasalforcingsPicoBox0temperature";
-		case BasalforcingsPicoBox0salinityEnum : return "BasalforcingsPicoBox0salinity";
+		case BasalforcingsPicoFarOceantemperatureEnum : return "BasalforcingsPicoFarOceantemperature";
+		case BasalforcingsPicoFarOceansalinityEnum : return "BasalforcingsPicoFarOceansalinity";
+		case DistanceToGroundinglineEnum : return "DistanceToGroundingline";
+		case DistanceToCalvingfrontEnum : return "DistanceToCalvingfront";
 		case BedEnum : return "Bed";
 		case BaseEnum : return "Base";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 22471)
@@ -93,8 +93,11 @@
 	      else if (strcmp(name,"BasalforcingsPicoBasinId")==0) return BasalforcingsPicoBasinIdEnum;
 	      else if (strcmp(name,"BasalforcingsPicoMaxboxcount")==0) return BasalforcingsPicoMaxboxcountEnum;
+	      else if (strcmp(name,"BasalforcingsPicoBoxId")==0) return BasalforcingsPicoBoxIdEnum;
 	      else if (strcmp(name,"BasalforcingsPicoOverturningCoeff")==0) return BasalforcingsPicoOverturningCoeffEnum;
 	      else if (strcmp(name,"BasalforcingsPicoGammaT")==0) return BasalforcingsPicoGammaTEnum;
-	      else if (strcmp(name,"BasalforcingsPicoBox0temperature")==0) return BasalforcingsPicoBox0temperatureEnum;
-	      else if (strcmp(name,"BasalforcingsPicoBox0salinity")==0) return BasalforcingsPicoBox0salinityEnum;
+	      else if (strcmp(name,"BasalforcingsPicoFarOceantemperature")==0) return BasalforcingsPicoFarOceantemperatureEnum;
+	      else if (strcmp(name,"BasalforcingsPicoFarOceansalinity")==0) return BasalforcingsPicoFarOceansalinityEnum;
+	      else if (strcmp(name,"DistanceToGroundingline")==0) return DistanceToGroundinglineEnum;
+	      else if (strcmp(name,"DistanceToCalvingfront")==0) return DistanceToCalvingfrontEnum;
 	      else if (strcmp(name,"Bed")==0) return BedEnum;
 	      else if (strcmp(name,"Base")==0) return BaseEnum;
@@ -134,11 +137,11 @@
 	      else if (strcmp(name,"FrictionM")==0) return FrictionMEnum;
 	      else if (strcmp(name,"FrictionC")==0) return FrictionCEnum;
-	      else if (strcmp(name,"FrictionLaw")==0) return FrictionLawEnum;
-	      else if (strcmp(name,"FrictionGamma")==0) return FrictionGammaEnum;
-	      else if (strcmp(name,"FrictionF")==0) return FrictionFEnum;
          else stage=2;
    }
    if(stage==2){
-	      if (strcmp(name,"FrictionWaterLayer")==0) return FrictionWaterLayerEnum;
+	      if (strcmp(name,"FrictionLaw")==0) return FrictionLawEnum;
+	      else if (strcmp(name,"FrictionGamma")==0) return FrictionGammaEnum;
+	      else if (strcmp(name,"FrictionF")==0) return FrictionFEnum;
+	      else if (strcmp(name,"FrictionWaterLayer")==0) return FrictionWaterLayerEnum;
 	      else if (strcmp(name,"FrictionEffectivePressure")==0) return FrictionEffectivePressureEnum;
 	      else if (strcmp(name,"FrictionCoupling")==0) return FrictionCouplingEnum;
@@ -257,11 +260,11 @@
 	      else if (strcmp(name,"MaterialsRheologyEc")==0) return MaterialsRheologyEcEnum;
 	      else if (strcmp(name,"MaterialsRheologyEcbar")==0) return MaterialsRheologyEcbarEnum;
-	      else if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum;
-	      else if (strcmp(name,"MaterialsRheologyEsbar")==0) return MaterialsRheologyEsbarEnum;
-	      else if (strcmp(name,"DamageD")==0) return DamageDEnum;
          else stage=3;
    }
    if(stage==3){
-	      if (strcmp(name,"DamageF")==0) return DamageFEnum;
+	      if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum;
+	      else if (strcmp(name,"MaterialsRheologyEsbar")==0) return MaterialsRheologyEsbarEnum;
+	      else if (strcmp(name,"DamageD")==0) return DamageDEnum;
+	      else if (strcmp(name,"DamageF")==0) return DamageFEnum;
 	      else if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum;
 	      else if (strcmp(name,"DamageLaw")==0) return DamageLawEnum;
@@ -380,11 +383,11 @@
 	      else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
 	      else if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum;
-	      else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
-	      else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
-	      else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"ThermalPenaltyThreshold")==0) return ThermalPenaltyThresholdEnum;
+	      if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
+	      else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
+	      else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
+	      else if (strcmp(name,"ThermalPenaltyThreshold")==0) return ThermalPenaltyThresholdEnum;
 	      else if (strcmp(name,"ThermalSpctemperature")==0) return ThermalSpctemperatureEnum;
 	      else if (strcmp(name,"ThermalStabilization")==0) return ThermalStabilizationEnum;
@@ -503,5 +506,8 @@
 	      else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum;
 	      else if (strcmp(name,"SmbPrecipitation")==0) return SmbPrecipitationEnum;
-	      else if (strcmp(name,"SmbPddfacSnow")==0) return SmbPddfacSnowEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"SmbPddfacSnow")==0) return SmbPddfacSnowEnum;
 	      else if (strcmp(name,"SmbPddfacIce")==0) return SmbPddfacIceEnum;
 	      else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum;
@@ -512,13 +518,7 @@
 	      else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum;
 	      else if (strcmp(name,"SmbTdiff")==0) return SmbTdiffEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"SmbSealev")==0) return SmbSealevEnum;
+	      else if (strcmp(name,"SmbSealev")==0) return SmbSealevEnum;
 	      else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum;
+	      else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum;
 	      else if (strcmp(name,"SmbF")==0) return SmbFEnum;
 	      else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
@@ -629,5 +629,8 @@
 	      else if (strcmp(name,"LambdaS")==0) return LambdaSEnum;
 	      else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
-	      else if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"StrainRatexx")==0) return StrainRatexxEnum;
 	      else if (strcmp(name,"StrainRatexy")==0) return StrainRatexyEnum;
 	      else if (strcmp(name,"StrainRatexz")==0) return StrainRatexzEnum;
@@ -638,13 +641,7 @@
 	      else if (strcmp(name,"MaxDivergence")==0) return MaxDivergenceEnum;
 	      else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
+	      else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
 	      else if (strcmp(name,"GiaW")==0) return GiaWEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
+	      else if (strcmp(name,"SaveResults")==0) return SaveResultsEnum;
 	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
 	      else if (strcmp(name,"DoubleExternalResult")==0) return DoubleExternalResultEnum;
@@ -755,5 +752,8 @@
 	      else if (strcmp(name,"Outputdefinition94")==0) return Outputdefinition94Enum;
 	      else if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum;
-	      else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
 	      else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
 	      else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
@@ -764,13 +764,7 @@
 	      else if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
 	      else if (strcmp(name,"Regionaloutput")==0) return RegionaloutputEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"VxObs")==0) return VxObsEnum;
+	      else if (strcmp(name,"VxObs")==0) return VxObsEnum;
 	      else if (strcmp(name,"VyObs")==0) return VyObsEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
+	      else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
 	      else if (strcmp(name,"Absolute")==0) return AbsoluteEnum;
 	      else if (strcmp(name,"Incremental")==0) return IncrementalEnum;
@@ -881,5 +875,8 @@
 	      else if (strcmp(name,"LoveR0")==0) return LoveR0Enum;
 	      else if (strcmp(name,"LoveMu0")==0) return LoveMu0Enum;
-	      else if (strcmp(name,"LoveAllowLayerDeletion")==0) return LoveAllowLayerDeletionEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"LoveAllowLayerDeletion")==0) return LoveAllowLayerDeletionEnum;
 	      else if (strcmp(name,"LoveForcingType")==0) return LoveForcingTypeEnum;
 	      else if (strcmp(name,"LoveHr")==0) return LoveHrEnum;
@@ -890,13 +887,7 @@
 	      else if (strcmp(name,"LoveLi")==0) return LoveLiEnum;
 	      else if (strcmp(name,"LoveKernels")==0) return LoveKernelsEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"LoveKernelsReal")==0) return LoveKernelsRealEnum;
+	      else if (strcmp(name,"LoveKernelsReal")==0) return LoveKernelsRealEnum;
 	      else if (strcmp(name,"LoveKernelsImag")==0) return LoveKernelsImagEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"EsaUmotion")==0) return EsaUmotionEnum;
+	      else if (strcmp(name,"EsaUmotion")==0) return EsaUmotionEnum;
 	      else if (strcmp(name,"EsaNmotion")==0) return EsaNmotionEnum;
 	      else if (strcmp(name,"EsaEmotion")==0) return EsaEmotionEnum;
@@ -1007,5 +998,8 @@
 	      else if (strcmp(name,"VertexPId")==0) return VertexPIdEnum;
 	      else if (strcmp(name,"VertexSId")==0) return VertexSIdEnum;
-	      else if (strcmp(name,"Option")==0) return OptionEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"Option")==0) return OptionEnum;
 	      else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
@@ -1016,14 +1010,8 @@
 	      else if (strcmp(name,"BalancethicknessSolution")==0) return BalancethicknessSolutionEnum;
 	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
+	      else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
 	      else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
 	      else if (strcmp(name,"BalancethicknessSoftSolution")==0) return BalancethicknessSoftSolutionEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;
+	      else if (strcmp(name,"BalancevelocityAnalysis")==0) return BalancevelocityAnalysisEnum;
 	      else if (strcmp(name,"BalancevelocitySolution")==0) return BalancevelocitySolutionEnum;
 	      else if (strcmp(name,"L2ProjectionEPLAnalysis")==0) return L2ProjectionEPLAnalysisEnum;
@@ -1133,5 +1121,8 @@
 	      else if (strcmp(name,"TaylorHood")==0) return TaylorHoodEnum;
 	      else if (strcmp(name,"LATaylorHood")==0) return LATaylorHoodEnum;
-	      else if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"XTaylorHood")==0) return XTaylorHoodEnum;
 	      else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
 	      else if (strcmp(name,"CrouzeixRaviart")==0) return CrouzeixRaviartEnum;
@@ -1142,14 +1133,8 @@
 	      else if (strcmp(name,"Air")==0) return AirEnum;
 	      else if (strcmp(name,"Ice")==0) return IceEnum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"Melange")==0) return MelangeEnum;
+	      else if (strcmp(name,"Melange")==0) return MelangeEnum;
 	      else if (strcmp(name,"Water")==0) return WaterEnum;
 	      else if (strcmp(name,"DataSet")==0) return DataSetEnum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"Constraints")==0) return ConstraintsEnum;
+	      else if (strcmp(name,"Constraints")==0) return ConstraintsEnum;
 	      else if (strcmp(name,"Loads")==0) return LoadsEnum;
 	      else if (strcmp(name,"Materials")==0) return MaterialsEnum;
Index: /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 22470)
+++ /issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp	(revision 22471)
@@ -162,4 +162,5 @@
 		case 3: return MismipFloatingMeltRateEnum;
 		case 4: return MantlePlumeGeothermalFluxEnum;
+		case 5: return BasalforcingsPicoEnum;
 		default: _error_("Marshalled Basal Forcings code \""<<enum_in<<"\" not supported yet");
 	}
