Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 22731)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 22732)
@@ -278,6 +278,5 @@
 		virtual int        NumberofNodesVelocity(void)=0;
 		virtual void       PicoUpdateBoxid(int* pmax_boxid_basin)=0;
-		virtual void       PicoUpdateFirstBox()=0;
-		virtual void       PicoUpdateNextBox(int loopboxid)=0;
+		virtual void       PicoUpdateBox(int loopboxid)=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 22731)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 22732)
@@ -140,6 +140,5 @@
 		int            NumberofNodesVelocity(void);
 		void				PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};
-		void				PicoUpdateFirstBox(){_error_("not implemented yet");};
-		void				PicoUpdateNextBox(int loopboxid){_error_("not implemented yet");};
+		void				PicoUpdateBox(int loopboxid){_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 22731)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 22732)
@@ -129,6 +129,5 @@
 		int         NumberofNodesVelocity(void){_error_("not implemented yet");};
 		void        PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};
-		void			PicoUpdateFirstBox(){_error_("not implemented yet");};
-		void			PicoUpdateNextBox(int loopboxid){_error_("not implemented yet");};
+		void			PicoUpdateBox(int loopboxid){_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 22731)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tetra.h	(revision 22732)
@@ -137,6 +137,5 @@
 		int         NumberofNodesVelocity(void);
 		void			PicoUpdateBoxid(int* pmax_boxid_basin){_error_("not implemented yet");};	
-		void			PicoUpdateFirstBox(){_error_("not implemented yet");};
-		void			PicoUpdateNextBox(int loopboxid){_error_("not implemented yet");};
+		void			PicoUpdateBox(int loopboxid){_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.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22731)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 22732)
@@ -2817,102 +2817,16 @@
 	this->inputs->AddInput(new IntInput(BasalforcingsPicoBoxIdEnum, boxid));	
 }/*}}}*/
-void       Tria::PicoUpdateFirstBox(){/*{{{*/
+void       Tria::PicoUpdateBox(int loopboxid){/*{{{*/
 
 	if(!this->IsIceInElement() || !this->IsFloating()) return;
 
-	int boxid;
-	this->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
-	if(boxid!=0) return;
-
-	int basinid, maxbox, num_basins, numnodes, M;
-	IssmDouble time, gamma_T, overturning_coeff,thickness;
-	IssmDouble pressure, T_star,p_coeff, q_coeff,toc_farocean,soc_farocean;
-	IssmDouble* boxareas   = NULL;
-
-	/*Get variables*/
-	IssmDouble rhoi       = this->GetMaterialParameter(MaterialsRhoIceEnum);
-	IssmDouble rhow       = this->GetMaterialParameter(MaterialsRhoSeawaterEnum);
-	IssmDouble earth_grav = this->GetMaterialParameter(ConstantsGEnum);
-	IssmDouble rho_star   = 1033.;             // kg/m^3
-	IssmDouble nu         = rhoi/rhow;
-	IssmDouble latentheat = this->GetMaterialParameter(MaterialsLatentheatEnum);
-	IssmDouble c_p_ocean  = this->GetMaterialParameter(MaterialsMixedLayerCapacityEnum);
-	IssmDouble lambda     = latentheat/c_p_ocean;
-	IssmDouble a          = -0.0572;           // K/psu
-	IssmDouble b          = 0.0788 + this->GetMaterialParameter(MaterialsMeltingpointEnum);  //K
-	IssmDouble c          = 7.77e-4;
-	IssmDouble alpha      = 7.5e-5;            // 1/K
-	IssmDouble Beta       = 7.7e-4;            // K
-
-	/* Get parameters and inputs */
-	this->parameters->FindParam(&time,TimeEnum);
-	this->parameters->FindParam(&num_basins, BasalforcingsPicoNumBasinsEnum);
-	this->parameters->FindParam(&gamma_T,BasalforcingsPicoGammaTEnum);
-	this->parameters->FindParam(&overturning_coeff,BasalforcingsPicoOverturningCoeffEnum);
-	this->parameters->FindParam(&toc_farocean, basinid, time, BasalforcingsPicoFarOceantemperatureEnum);
-	this->parameters->FindParam(&soc_farocean, basinid, time, BasalforcingsPicoFarOceansalinityEnum);
-	this->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
-	this->parameters->FindParam(&boxareas,&M,BasalforcingsPicoBoxAreaEnum);
-	this->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
-	Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
-	IssmDouble area_box1    = boxareas[basinid*maxbox+boxid];
-	IssmDouble g1           = area_box1*gamma_T;
-	IssmDouble s1           = soc_farocean/(nu*lambda);
-
-	/*Define new inputs*/
-   IssmDouble basalmeltrates_shelf[NUMVERTICES];
-	IssmDouble potential_pressure_melting_point[NUMVERTICES];   
-	IssmDouble Tocs[NUMVERTICES];							
-   IssmDouble Socs[NUMVERTICES];
-   IssmDouble overturnings[NUMVERTICES];
-
-	/* Start looping on the number of nodes and calculate ocean vars */
-	Gauss* gauss=this->NewGauss();
-	for(int i=0;i<NUMVERTICES;i++){
-		gauss->GaussVertex(i);
-		thickness_input->GetInputValue(&thickness,gauss);
-		pressure = (rhoi*earth_grav*1e-4)*thickness;
-		T_star   = a*soc_farocean+b-c*pressure-toc_farocean;
-		p_coeff  = g1/(overturning_coeff*rho_star*(Beta*s1-alpha));
-		q_coeff  = T_star*(g1/(overturning_coeff*rho_star*(Beta*s1-alpha)));
-
-		/* To avoid negatives under the square root */
-		if((0.25*pow(p_coeff,2)-q_coeff)<0){
-			q_coeff = 0.25*p_coeff*p_coeff;
-		}
-
-		Tocs[i] = toc_farocean-(-0.5*p_coeff+sqrt(0.25*pow(p_coeff,2)-q_coeff));
-		Socs[i] = soc_farocean-(soc_farocean/(nu*lambda))*(toc_farocean-Tocs[i]);
-		potential_pressure_melting_point[i] = a*Socs[i]+b-c*pressure;
-		basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);
-		overturnings[i] = overturning_coeff*rho_star*(Beta*(soc_farocean-Socs[i])-alpha*(toc_farocean-Tocs[i]));
-	}
-
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
-	this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
-	this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
-	this->AddInput(BasalforcingsPicoSubShelfOceanOverturningEnum,overturnings,P1Enum);
-
-	/*Cleanup and return */
-	delete gauss;
-	xDelete<IssmDouble>(boxareas);
-}
-/*}}}*/
-void       Tria::PicoUpdateNextBox(int loopboxid){/*{{{*/	
-
-	if(!this->IsIceInElement() || !this->IsFloating()) return;
-	
 	int boxid;
 	this->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum);
 	if(loopboxid!=boxid) return;
 
-	int        basinid, maxbox, num_basins, numnodes,M;
-	IssmDouble gamma_T, overturning_coeff;
-	IssmDouble thickness, toc_farocean, soc_farocean;
+	int        basinid, maxbox, num_basins, numnodes, M;
+	IssmDouble gamma_T, overturning_coeff, thickness;
 	IssmDouble pressure, T_star,p_coeff, q_coeff;
-	IssmDouble* toc_weighted_avg         = NULL;
-	IssmDouble* soc_weighted_avg         = NULL;
-	IssmDouble* overturning_weighted_avg = NULL;
-	IssmDouble* boxareas                 = NULL;
+	IssmDouble* boxareas  = NULL;
 
 	/*Get variables*/
@@ -2931,52 +2845,103 @@
 	IssmDouble Beta       = 7.7e-4;           // K
 
-	/* Get parameters and inputs */
+	/* Get non-box-specific parameters and inputs */
 	this->parameters->FindParam(&num_basins, BasalforcingsPicoNumBasinsEnum);
 	this->parameters->FindParam(&gamma_T,BasalforcingsPicoGammaTEnum);
 	this->parameters->FindParam(&overturning_coeff,BasalforcingsPicoOverturningCoeffEnum);
 	this->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
-	this->parameters->FindParam(&toc_weighted_avg,&num_basins,BasalforcingsPicoAverageTemperatureEnum);
-	this->parameters->FindParam(&soc_weighted_avg,&num_basins,BasalforcingsPicoAverageSalinityEnum);
-	this->parameters->FindParam(&overturning_weighted_avg,&num_basins,BasalforcingsPicoAverageOverturningEnum);
 	this->parameters->FindParam(&boxareas,&M,BasalforcingsPicoBoxAreaEnum);
 	this->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
-   Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
-
-	_assert_(basinid<=num_basins); 
+	Input* thickness_input=this->GetInput(ThicknessEnum); _assert_(thickness_input);
+	_assert_(basinid<=num_basins);
+
 	IssmDouble area_boxi        = boxareas[basinid*maxbox+boxid];
-	IssmDouble mean_toc         = toc_weighted_avg[basinid];
-	IssmDouble mean_soc         = soc_weighted_avg[basinid];
-	IssmDouble mean_overturning = overturning_weighted_avg[basinid];
 	IssmDouble g1               = area_boxi*gamma_T;
-	IssmDouble g2               = g2/(nu*lambda);
 
 	IssmDouble basalmeltrates_shelf[NUMVERTICES];
-	IssmDouble potential_pressure_melting_point[NUMVERTICES];   
-	IssmDouble Tocs[NUMVERTICES];							
-   IssmDouble Socs[NUMVERTICES];
-
-	/* Start looping on the number of nodes and calculate ocean vars */
-	Gauss* gauss=this->NewGauss();
-	for(int i=0;i<NUMVERTICES;i++){
-		gauss->GaussVertex(i);
-		thickness_input->GetInputValue(&thickness,gauss);
-		pressure = (rhoi*earth_grav*1.e-4)*thickness;
-		T_star   = a*mean_soc+b-c*pressure-mean_toc;
-		Tocs[i]  = mean_toc+T_star*(g1/(mean_overturning+g1-g2*a*mean_soc));
-		Socs[i]  = mean_soc-mean_soc*((mean_toc-Tocs[i])/(nu*lambda));
-		potential_pressure_melting_point[i] = a*Socs[i]+b-c*pressure;
-		basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);
-	}
-
-	this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
-	this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
-	this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
-
-	/*Cleanup and return */
-	delete gauss;
+	IssmDouble potential_pressure_melting_point[NUMVERTICES];
+	IssmDouble Tocs[NUMVERTICES];
+	IssmDouble Socs[NUMVERTICES];
+
+	/* First box calculations */
+	if(boxid==0){
+		/* Get box1 parameters and inputs */
+		IssmDouble time, toc_farocean, soc_farocean;
+		this->parameters->FindParam(&time,TimeEnum);
+		this->parameters->FindParam(&toc_farocean, basinid, time, BasalforcingsPicoFarOceantemperatureEnum);
+		this->parameters->FindParam(&soc_farocean, basinid, time, BasalforcingsPicoFarOceansalinityEnum);
+		IssmDouble s1 = soc_farocean/(nu*lambda);
+		IssmDouble overturnings[NUMVERTICES];
+
+		/* Start looping on the number of verticies and calculate ocean vars */
+		Gauss* gauss=this->NewGauss();
+		for(int i=0;i<NUMVERTICES;i++){
+			gauss->GaussVertex(i);
+			thickness_input->GetInputValue(&thickness,gauss);
+			pressure = (rhoi*earth_grav*1e-4)*thickness;
+			T_star   = a*soc_farocean+b-c*pressure-toc_farocean;
+			p_coeff  = g1/(overturning_coeff*rho_star*(Beta*s1-alpha));
+			q_coeff  = T_star*(g1/(overturning_coeff*rho_star*(Beta*s1-alpha)));
+
+			/* To avoid negatives under the square root */
+			if((0.25*pow(p_coeff,2)-q_coeff)<0){
+				q_coeff = 0.25*p_coeff*p_coeff;
+			}
+
+			Tocs[i] = toc_farocean-(-0.5*p_coeff+sqrt(0.25*pow(p_coeff,2)-q_coeff));
+			Socs[i] = soc_farocean-(soc_farocean/(nu*lambda))*(toc_farocean-Tocs[i]);
+			potential_pressure_melting_point[i] = a*Socs[i]+b-c*pressure;
+			basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);
+			overturnings[i] = overturning_coeff*rho_star*(Beta*(soc_farocean-Socs[i])-alpha*(toc_farocean-Tocs[i]));
+		}
+
+		this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
+		this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
+		this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
+		this->AddInput(BasalforcingsPicoSubShelfOceanOverturningEnum,overturnings,P1Enum);
+
+		/*Cleanup and return*/
+		delete gauss;
+	}
+
+	/* Subsequent box calculations */
+	else {
+		/* Get subsequent box parameters and inputs */
+		IssmDouble* toc_weighted_avg         = NULL;
+		IssmDouble* soc_weighted_avg         = NULL;
+		IssmDouble* overturning_weighted_avg = NULL;
+		this->parameters->FindParam(&toc_weighted_avg,&num_basins,BasalforcingsPicoAverageTemperatureEnum);
+		this->parameters->FindParam(&soc_weighted_avg,&num_basins,BasalforcingsPicoAverageSalinityEnum);
+		this->parameters->FindParam(&overturning_weighted_avg,&num_basins,BasalforcingsPicoAverageOverturningEnum);
+		IssmDouble mean_toc                  = toc_weighted_avg[basinid];
+		IssmDouble mean_soc                  = soc_weighted_avg[basinid];
+		IssmDouble mean_overturning          = overturning_weighted_avg[basinid];
+		IssmDouble g2                        = g1/(nu*lambda);
+
+		/* Start looping on the number of verticies and calculate ocean vars */
+		Gauss* gauss=this->NewGauss();
+		for(int i=0;i<NUMVERTICES;i++){
+			gauss->GaussVertex(i);
+			thickness_input->GetInputValue(&thickness,gauss);
+			pressure = (rhoi*earth_grav*1.e-4)*thickness;
+			T_star   = a*mean_soc+b-c*pressure-mean_toc;
+			Tocs[i]  = mean_toc+T_star*(g1/(mean_overturning+g1-g2*a*mean_soc));
+			Socs[i]  = mean_soc-mean_soc*((mean_toc-Tocs[i])/(nu*lambda));
+			potential_pressure_melting_point[i] = a*Socs[i]+b-c*pressure;
+			basalmeltrates_shelf[i] = (-gamma_T/(nu*lambda))*(potential_pressure_melting_point[i]-Tocs[i]);
+		}
+
+		this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,basalmeltrates_shelf,P1Enum);
+		this->AddInput(BasalforcingsPicoSubShelfOceanTempEnum,Tocs,P1Enum);
+		this->AddInput(BasalforcingsPicoSubShelfOceanSalinityEnum,Socs,P1Enum);
+
+		/*Cleanup and return*/
+		xDelete<IssmDouble>(toc_weighted_avg);
+		xDelete<IssmDouble>(soc_weighted_avg);
+		xDelete<IssmDouble>(overturning_weighted_avg);
+		delete gauss;
+	}
+
+	/*Cleanup and return*/
 	xDelete<IssmDouble>(boxareas);
-	xDelete<IssmDouble>(toc_weighted_avg);
-	xDelete<IssmDouble>(soc_weighted_avg);
-	xDelete<IssmDouble>(overturning_weighted_avg);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 22731)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 22732)
@@ -111,6 +111,5 @@
 		int         NumberofNodesVelocity(void);
 		void        PicoUpdateBoxid(int* pmax_boxid_basin);
-		void        PicoUpdateFirstBox();
-		void        PicoUpdateNextBox(int loopboxid);
+		void        PicoUpdateBox(int loopboxid);
 		void        PotentialUngrounding(Vector<IssmDouble>* potential_sheet_ungrounding);
 		int         PressureInterpolation();
Index: /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.cpp	(revision 22731)
+++ /issm/trunk-jpl/src/c/classes/Params/TransientArrayParam.cpp	(revision 22732)
@@ -24,14 +24,14 @@
 	_assert_(in_values && in_time);
 
-	enum_type=in_enum_type;
-	M=in_M; //Number of time steps
-	N=in_N; //Number of rows
-	interpolation=interpolation_on;
+	this->enum_type=in_enum_type;
+	this->M=in_M; //Number of rows
+	this->N=in_N; //Number of timesteps
+	this->interpolation=interpolation_on;
 
-	values=xNew<IssmDouble>(M*N);
+	this->values=xNew<IssmDouble>(M*N);
 	xMemCpy<IssmDouble>(values,in_values,M*N);
 
-	timesteps=xNew<IssmDouble>(M);
-	xMemCpy<IssmDouble>(timesteps,in_time,M);
+	this->timesteps=xNew<IssmDouble>(N);
+	xMemCpy<IssmDouble>(timesteps,in_time,N);
 }
 /*}}}*/
@@ -100,6 +100,7 @@
 	IssmDouble output;
 	bool       found;
+	_assert_(row>=0 && row<this->M); 
 
-	/*Ok, we have the time, go through the timesteps, and figure out which interval we 
+	/*Ok, we have the time and row, go through the timesteps, and figure out which interval we 
 	 *fall within. Then interpolate the values on this interval: */
 	if(time<this->timesteps[0]){
@@ -118,5 +119,5 @@
 			if(time==this->timesteps[i]){
 				/*We are right on one step time: */
-				output=this->values[row*this->N+i];
+				output = this->values[row*this->N+i];
 				found=true;
 				break; //we are done with the time interpolation.
@@ -124,7 +125,7 @@
 			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;
+					/*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];
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp	(revision 22731)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp	(revision 22732)
@@ -11,20 +11,19 @@
 	int maxbox;
 
-	/*First, reset all melt to 0 */
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-		int numvertices = element->GetNumberOfVertices();
-		IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
-		element->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
-		xDelete<IssmDouble>(values);
-	}
-
-	femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
-	UpdateBoxIdsPico(femmodel);
-	ComputeBoxAreasPico(femmodel);
-	UpdateFirstBoxPico(femmodel);
-	for(int i=1;i<maxbox;i++){
-		ComputeAverageOceanvarsPico(femmodel, i-1);
-		UpdateNextBoxPico(femmodel, i);
+   /*First, reset all melt to 0 */
+   for(int i=0;i<femmodel->elements->Size();i++){
+	      Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	      int numvertices = element->GetNumberOfVertices();
+	      IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
+	      element->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
+	      xDelete<IssmDouble>(values);
+	   }
+
+   femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
+   UpdateBoxIdsPico(femmodel);
+   ComputeBoxAreasPico(femmodel);
+   for(int i=0;i<maxbox;i++){
+	      UpdateBoxPico(femmodel,i);
+	      ComputeAverageOceanvarsPico(femmodel,i);
 	}
 }/*}}}*/
@@ -32,7 +31,5 @@
 void UpdateBoxIdsPico(FemModel* femmodel){/*{{{*/
 
-	int i,k,numvertices,num_basins,maxbox,basinid;
-	IssmDouble dist_max,val;
-	int* nd=NULL;
+	int         numvertices,num_basins,maxbox,basinid;
 	IssmDouble* dmax_basin=NULL;
 	IssmDouble* distances=NULL;
@@ -49,7 +46,7 @@
 
 	/*find maximum distance to grounding line per domain and per basin*/
-	dist_max=-1.;
-	for(i=0;i<num_basins;i++){dmax_basin[i]=-1;}
-	for(i=0;i<femmodel->elements->Size();i++){
+	IssmDouble dist_max=-1.;
+	for(int i=0;i<num_basins;i++){dmax_basin[i]=-1;}
+	for(int i=0;i<femmodel->elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
 		if(!element->IsIceInElement() || !element->IsFloating()) continue;
@@ -58,5 +55,5 @@
 		element->GetInputListOnVertices(&distances[0],DistanceToGroundinglineEnum);
 		element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
-		for(k=0; k<numvertices; k++){
+		for(int k=0; k<numvertices; k++){
 			if(fabs(distances[k])>dist_max){dist_max=fabs(distances[k]);}
 			if(fabs(distances[k])>dmax_basin[basinid]){dmax_basin[basinid]=fabs(distances[k]);}
@@ -66,14 +63,20 @@
 
 	/*Define maximum number of boxes per basin*/
-	nd=xNew<int>(num_basins);
-	for(i=0; i<num_basins;i++){
-		val=sqrt(dmax_basin[i]/dist_max)*(maxbox-1);
-		k=0;
-		while(k<val+.5){k++;}
+	int* nd=xNew<int>(num_basins);
+	for(int i=0; i<num_basins;i++){
+		IssmDouble val=sqrt(dmax_basin[i]/dist_max)*(maxbox-1);
+
+		#ifdef _HAVE_ADOLC_
+		/*Do not use floor when AD is on*/
+		int k=0; while(k<val+.5){k++;}
 		nd[i]=k;
+
+		#else
+		nd[i]= reCast<int>(floor(val));
+		#endif
 	} 
 
 	/*Assign box numbers*/
-	for(i=0;i<femmodel->elements->Size();i++){
+	for(int i=0;i<femmodel->elements->Size();i++){
 		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
 		element->PicoUpdateBoxid(nd);
@@ -114,34 +117,29 @@
 
 }/*}}}*/
-void UpdateFirstBoxPico(FemModel* femmodel){/*{{{*/
-
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-		element->PicoUpdateFirstBox();
-	}
-
+void UpdateBoxPico(FemModel* femmodel, int loopboxid){/*{{{*/
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		element->PicoUpdateBox(loopboxid);
+	}
 }/*}}}*/
 void ComputeAverageOceanvarsPico(FemModel* femmodel, int boxid){/*{{{*/
 
-	int i,k,p, num_basins, basinid, maxbox, M;
+	int num_basins, basinid, maxbox, M;
 	IssmDouble area, toc, soc, overturning;
 	IssmDouble* boxareas=NULL;
 	IssmDouble* overturning_weighted_avg=NULL;
-	Element* element;
-   Gauss* gauss;
 
 	femmodel->parameters->FindParam(&num_basins,BasalforcingsPicoNumBasinsEnum);
 	femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum);
-	M=maxbox*num_basins;
 	femmodel->parameters->FindParam(&boxareas,&M, BasalforcingsPicoBoxAreaEnum);
-	IssmDouble* toc_weighted_avg=xNewZeroInit<IssmDouble>(num_basins);
-	IssmDouble* soc_weighted_avg=xNewZeroInit<IssmDouble>(num_basins);
-	IssmDouble* toc_sumweightedavg =xNewZeroInit<IssmDouble>(num_basins);
-	IssmDouble* soc_sumweightedavg =xNewZeroInit<IssmDouble>(num_basins);
-	IssmDouble* overturning_sumweightedavg =xNewZeroInit<IssmDouble>(num_basins);
+	IssmDouble* toc_weighted_avg           = xNewZeroInit<IssmDouble>(num_basins);
+	IssmDouble* soc_weighted_avg           = xNewZeroInit<IssmDouble>(num_basins);
+	IssmDouble* toc_sumweightedavg         = xNewZeroInit<IssmDouble>(num_basins);
+	IssmDouble* soc_sumweightedavg         = xNewZeroInit<IssmDouble>(num_basins);
+	IssmDouble* overturning_sumweightedavg = xNewZeroInit<IssmDouble>(num_basins);
 
 	/* Compute Toc and Soc weighted avg (boxes 0 to n-1) */
-	for(i=0;i<femmodel->elements->Size();i++){
-		element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+	for(int i=0;i<femmodel->elements->Size();i++){
+		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
 		if(!element->IsIceInElement() || !element->IsFloating()) continue;
 		int el_boxid;
@@ -153,5 +151,5 @@
 
 		element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
-		gauss=element->NewGauss(1); gauss->GaussPoint(0);
+		Gauss* gauss=element->NewGauss(1); gauss->GaussPoint(0);
 		tocs_input->GetInputValue(&toc,gauss);
 		socs_input->GetInputValue(&soc,gauss);
@@ -166,6 +164,6 @@
 	ISSM_MPI_Allreduce(soc_weighted_avg,soc_sumweightedavg,num_basins,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
 
-	for(k=0;k<num_basins;k++){
-		p=k*maxbox+boxid; 
+	for(int k=0;k<num_basins;k++){
+		int p=k*maxbox+boxid; 
 		if(boxareas[p]==0) continue;	
 		toc_sumweightedavg[k] = toc_sumweightedavg[k]/boxareas[p];
@@ -179,6 +177,6 @@
 	if(boxid==0){ 
 		overturning_weighted_avg=xNewZeroInit<IssmDouble>(num_basins);
-		for(i=0;i<femmodel->elements->Size();i++){
-			element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
+		for(int i=0;i<femmodel->elements->Size();i++){
+			Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
 			if(!element->IsIceInElement() || !element->IsFloating()) continue;
 			int el_boxid;
@@ -189,5 +187,5 @@
 
 			element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
-			gauss=element->NewGauss(1); gauss->GaussPoint(0);
+			Gauss* gauss=element->NewGauss(1); gauss->GaussPoint(0);
 			overturnings_input->GetInputValue(&overturning,gauss);
 			delete gauss;
@@ -199,8 +197,7 @@
 		ISSM_MPI_Allreduce(overturning_weighted_avg,overturning_sumweightedavg,num_basins,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
 
-		for(k=0;k<num_basins;k++){
-			element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);
-			p=k*maxbox+boxid;
-			if(boxareas[p]==0) continue;
+		for(int k=0;k<num_basins;k++){
+			int p=k*maxbox+boxid;
+			if(boxareas[p]==0.) continue;
 			overturning_sumweightedavg[k] = overturning_sumweightedavg[k]/boxareas[p];
 		}
@@ -216,11 +213,3 @@
 	xDelete<IssmDouble>(soc_weighted_avg);
 	xDelete<IssmDouble>(boxareas);
-
-}/*}}}*/
-void UpdateNextBoxPico(FemModel* femmodel, int loopboxid){/*{{{*/
-	for(int i=0;i<femmodel->elements->Size();i++){
-		Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
-		element->PicoUpdateNextBox(loopboxid);	
-	}
-
-}/*}}}*/
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.h	(revision 22731)
+++ /issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.h	(revision 22732)
@@ -13,7 +13,6 @@
 void UpdateBoxIdsPico(FemModel* femmodel);
 void ComputeBoxAreasPico(FemModel* femmodel);
-void UpdateFirstBoxPico(FemModel* femmodel);
+void UpdateBoxPico(FemModel* femmodel, int loopboxid);
 void ComputeAverageOceanvarsPico(FemModel* femmodel, int boxid);
-void UpdateNextBoxPico(FemModel* femmodel, int loopboxid);
 
 #endif  /* _FloatingiceMeltingRatePicox_H*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22731)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 22732)
@@ -235,9 +235,9 @@
 				iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.farocean_temperature");
 				_assert_(M>1 && N>1); 
-				parameters->AddObject(new TransientArrayParam(BasalforcingsPicoFarOceantemperatureEnum,transparam,&transparam[N*(M-1)],interp,M,N));
+				parameters->AddObject(new TransientArrayParam(BasalforcingsPicoFarOceantemperatureEnum,transparam,&transparam[N*(M-1)],interp,N,M));
 				xDelete<IssmDouble>(transparam);
 				iomodel->FetchData(&transparam,&M,&N,"md.basalforcings.farocean_salinity");
 				_assert_(M>1 && N>1); 
-				parameters->AddObject(new TransientArrayParam(BasalforcingsPicoFarOceansalinityEnum,transparam,&transparam[N*(M-1)],interp,M,N));
+				parameters->AddObject(new TransientArrayParam(BasalforcingsPicoFarOceansalinityEnum,transparam,&transparam[N*(M-1)],interp,N,M));
 				xDelete<IssmDouble>(transparam);
 			break;
