Index: /issm/trunk-jpl/configs/config-macosx64-larour-ad.sh
===================================================================
--- /issm/trunk-jpl/configs/config-macosx64-larour-ad.sh	(revision 13072)
+++ /issm/trunk-jpl/configs/config-macosx64-larour-ad.sh	(revision 13073)
@@ -3,17 +3,5 @@
 ./configure \
 	--prefix=$ISSM_DIR \
-	--without-modules\
-	--without-thermal \
-	--without-control \
-	--without-hydrology \
-	--without-diagnostic \
-	--without-balanced \
-	--without-responses \
-	--without-slope \
-	--without-rifts \
-	--without-steadystate \
-	--without-transient \
-	--without-3d \
-	--without-groundingline \
+	--without-modules \
 	--without-kriging  \
 	--with-gsl-dir=$ISSM_DIR/externalpackages/gsl/install \
Index: /issm/trunk-jpl/src/c/Container/Observations.cpp
===================================================================
--- /issm/trunk-jpl/src/c/Container/Observations.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/Container/Observations.cpp	(revision 13073)
@@ -64,5 +64,5 @@
 		options->Get(&minlength,"boxlength");
 		if(minlength<=0)_error_("boxlength should be a positive number");
-		maxdepth=int(log(max(xmax-xmin,ymax-ymin)/minlength +1)/log(2.0));
+		maxdepth=reCast<int,IssmDouble>(log(max(xmax-xmin,ymax-ymin)/minlength +1)/log(2.0));
 	}
 	else{
Index: /issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp	(revision 13073)
@@ -197,9 +197,9 @@
 /*}}}*/
 /*FUNCTION GaussTria::GaussFromCoords{{{*/
-void GaussTria::GaussFromCoords(IssmPDouble x,IssmPDouble y,IssmPDouble* xyz_list){
+void GaussTria::GaussFromCoords(IssmDouble x,IssmDouble y,IssmDouble* xyz_list){
 
 	/*Intermediaries*/
-	IssmPDouble    area = 0;
-	IssmPDouble    x1,y1,x2,y2,x3,y3;
+	IssmDouble    area = 0;
+	IssmDouble    x1,y1,x2,y2,x3,y3;
 
 	/*in debugging mode: check that the default constructor has been called*/
Index: /issm/trunk-jpl/src/c/classes/gauss/GaussTria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/gauss/GaussTria.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/gauss/GaussTria.h	(revision 13073)
@@ -22,7 +22,7 @@
 	public:
 		IssmPDouble weight;
-		IssmPDouble coord1;
-		IssmPDouble coord2;
-		IssmPDouble coord3;
+		IssmDouble coord1;
+		IssmDouble coord2;
+		IssmDouble coord3;
 		
 	public:
@@ -38,5 +38,5 @@
 		int  end(void);
 		void Echo(void);
-		void GaussFromCoords(IssmPDouble x1,IssmPDouble y1,IssmPDouble* xyz_list);
+		void GaussFromCoords(IssmDouble x1,IssmDouble y1,IssmDouble* xyz_list);
 		void GaussPoint(int ig);
 		void GaussVertex(int iv);
Index: /issm/trunk-jpl/src/c/classes/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Elements/Penta.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/objects/Elements/Penta.cpp	(revision 13073)
@@ -67,12 +67,12 @@
 	/*Build neighbors list*/
 	if (xIsNan<IssmDouble>(iomodel->Data(MeshUpperelementsEnum)[index])) penta_elements_ids[1]=this->id; //upper penta is the same penta
-	else                                    penta_elements_ids[1]=(int)(iomodel->Data(MeshUpperelementsEnum)[index]);
+	else                                    penta_elements_ids[1]=reCast<int,IssmDouble>((iomodel->Data(MeshUpperelementsEnum)[index]));
 	if (xIsNan<IssmDouble>(iomodel->Data(MeshLowerelementsEnum)[index])) penta_elements_ids[0]=this->id; //lower penta is the same penta
-	else                                    penta_elements_ids[0]=(int)(iomodel->Data(MeshLowerelementsEnum)[index]);
+	else                                    penta_elements_ids[0]=reCast<int,IssmDouble>((iomodel->Data(MeshLowerelementsEnum)[index]));
 	this->InitHookNeighbors(penta_elements_ids);
 
 	/*Build horizontalneighborsids list: */
 	_assert_(iomodel->Data(MeshElementconnectivityEnum));
-	for(i=0;i<3;i++) this->horizontalneighborsids[i]=(int)iomodel->Data(MeshElementconnectivityEnum)[3*index+i]-1;
+	for(i=0;i<3;i++) this->horizontalneighborsids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementconnectivityEnum)[3*index+i])-1;
 
 	//this->parameters: we still can't point to it, it may not even exist. Configure will handle this.
@@ -1253,11 +1253,11 @@
 	
 	if ((code==5) || (code==1)){ //boolean
-		this->inputs->AddInput(new BoolInput(name,(bool)scalar));
+		this->inputs->AddInput(new BoolInput(name,reCast<bool,IssmDouble>(scalar)));
 	}
 	else if ((code==6) || (code==2)){ //integer
-		this->inputs->AddInput(new IntInput(name,(int)scalar));
+		this->inputs->AddInput(new IntInput(name,reCast<int,IssmDouble>(scalar)));
 	}
 	else if ((code==7) || (code==3)){ //IssmDouble
-		this->inputs->AddInput(new DoubleInput(name,(IssmDouble)scalar));
+		this->inputs->AddInput(new DoubleInput(name,scalar));
 	}
 	else _error_("could not recognize nature of vector from code " << code);
@@ -1291,5 +1291,5 @@
 		for(i=0;i<6;i++){ 
 			_assert_(iomodel->Data(MeshElementsEnum));
-			penta_vertex_ids[i]=(int)iomodel->Data(MeshElementsEnum)[6*index+i]; //ids for vertices are in the elements array from Matlab
+			penta_vertex_ids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
 		}
 
@@ -1336,11 +1336,11 @@
 
 			if (code==5){ //boolean
-				this->inputs->AddInput(new BoolInput(vector_enum,(bool)vector[index]));
+				this->inputs->AddInput(new BoolInput(vector_enum,reCast<bool,IssmDouble>(vector[index])));
 			}
 			else if (code==6){ //integer
-				this->inputs->AddInput(new IntInput(vector_enum,(int)vector[index]));
+				this->inputs->AddInput(new IntInput(vector_enum,reCast<int,IssmDouble>(vector[index])));
 			}
 			else if (code==7){ //IssmDouble
-				this->inputs->AddInput(new DoubleInput(vector_enum,(IssmDouble)vector[index]));
+				this->inputs->AddInput(new DoubleInput(vector_enum,vector[index]));
 			}
 			else _error_("could not recognize nature of vector from code " << code);
@@ -1626,5 +1626,5 @@
 	/*Recover vertices ids needed to initialize inputs*/
 	for(i=0;i<6;i++){ 
-		penta_vertex_ids[i]=(int)iomodel->Data(MeshElementsEnum)[6*index+i]; //ids for vertices are in the elements array from Matlab
+		penta_vertex_ids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
 	}
 
@@ -1633,5 +1633,5 @@
 	if (control_analysis && iomodel->Data(InversionControlParametersEnum)){
 		for(i=0;i<num_control_type;i++){
-			switch((int)iomodel->Data(InversionControlParametersEnum)[i]){
+			switch(reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i])){
 				case BalancethicknessThickeningRateEnum:
 					if (iomodel->Data(BalancethicknessThickeningRateEnum)){
@@ -1669,5 +1669,5 @@
 					/*Matice will take care of it*/ break;
 				default:
-					_error_("Control " << EnumToStringx((int)iomodel->Data(InversionControlParametersEnum)[i]) << " not implemented yet");
+					_error_("Control " << EnumToStringx(reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i])) << " not implemented yet");
 			}
 		}
@@ -1705,5 +1705,5 @@
 		}
 		else{
-			_error_("Approximation type " << EnumToStringx((int)iomodel->Data(FlowequationElementEquationEnum)[index]) << " not supported yet");
+			_error_("Approximation type " << EnumToStringx(reCast<int,IssmDouble>(iomodel->Data(FlowequationElementEquationEnum)[index])) << " not supported yet");
 		}
 	}
@@ -1951,16 +1951,19 @@
 
 		case VertexEnum:
-
-			/*New PentaVertexInpu*/
-			IssmDouble values[6];
-
-			/*Get values on the 6 vertices*/
-			for (int i=0;i<6;i++){
-				values[i]=vector[this->nodes[i]->GetVertexDof()];
+			{
+
+				/*New PentaVertexInpu*/
+				IssmDouble values[6];
+
+				/*Get values on the 6 vertices*/
+				for (int i=0;i<6;i++){
+					values[i]=vector[this->nodes[i]->GetVertexDof()];
+				}
+
+				/*update input*/
+				this->inputs->AddInput(new PentaP1Input(name,values));
+				return;
+				break;
 			}
-
-			/*update input*/
-			this->inputs->AddInput(new PentaP1Input(name,values));
-			return;
 
 		default:
@@ -2063,5 +2066,5 @@
 
 	for(i=0;i<NUMVERTICES;i++){
-		if (flags[nodes[i]->Sid()]){
+		if (reCast<bool,IssmDouble>(flags[nodes[i]->Sid()])){
 			shelf=true;
 			break;
@@ -2164,5 +2167,5 @@
 	for(i=0;i<NUMVERTICES;i++){
 		/*Ice shelf: if bed below bathymetry, impose it at the bathymetry and update surface, elso do nothing */
-		if(old_floating_ice[nodes[i]->Sid()]){
+		if(reCast<bool,IssmDouble>(old_floating_ice[nodes[i]->Sid()])){
 			if(b[i]<=ba[i]){ 
 				b[i]=ba[i];
@@ -2184,5 +2187,5 @@
 					nodes[i]->inputs->AddInput(new BoolInput(MaskVertexongroundediceEnum,false));
 				}
-				else if(migration_style==SoftMigrationEnum && sheet_ungrounding[nodes[i]->Sid()]){
+				else if(migration_style==SoftMigrationEnum && reCast<int,IssmDouble>(sheet_ungrounding[nodes[i]->Sid()])){
 					s[i]=(1-density)*h[i];
 					b[i]=-density*h[i];
@@ -2843,5 +2846,5 @@
 
 	/*Recover vertices ids needed to initialize inputs*/
-	for(i=0;i<6;i++) penta_vertex_ids[i]=(int)iomodel->Data(MeshElementsEnum)[6*index+i]; //ids for vertices are in the elements array from Matlab
+	for(i=0;i<6;i++) penta_vertex_ids[i]=reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
 
 	/*Recover nodes ids needed to initialize the node hook.*/
@@ -2849,5 +2852,5 @@
 		//go recover node ids, needed to initialize the node hook.
 		//WARNING: We assume P1 elements here!!!!!
-		penta_node_ids[i]=iomodel->nodecounter+(int)iomodel->Data(MeshElementsEnum)[6*index+i]; //ids for vertices are in the elements array from Matlab
+		penta_node_ids[i]=iomodel->nodecounter+reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[6*index+i]); //ids for vertices are in the elements array from Matlab
 	}
 
@@ -2962,5 +2965,5 @@
 	/*Go through nodes, and whoever is on the potential_sheet_ungrounding, ends up in nodes_on_iceshelf: */
 	for(i=0;i<NUMVERTICES;i++){
-		if (vertices_potentially_ungrounding[nodes[i]->Sid()]){
+		if (reCast<bool,IssmDouble>(vertices_potentially_ungrounding[nodes[i]->Sid()])){
 			vec_nodes_on_iceshelf->SetValue(nodes[i]->Sid(),1,INS_VAL);
 		
@@ -3228,17 +3231,20 @@
 			break;
 		case VelEnum:
-
-			/*Get input:*/
-			IssmDouble vel;
-			Input* vel_input;
-
-			vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
-			vel_input->GetInputAverage(&vel);
-
-			/*process units if requested: */
-			if(process_units) vel=UnitConversion(vel,IuToExtEnum,VelEnum);
-
-			/*Assign output pointers:*/
-			*presponse=vel;
+			{
+
+				/*Get input:*/
+				IssmDouble vel;
+				Input* vel_input;
+
+				vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
+				vel_input->GetInputAverage(&vel);
+
+				/*process units if requested: */
+				if(process_units) vel=UnitConversion(vel,IuToExtEnum,VelEnum);
+
+				/*Assign output pointers:*/
+				*presponse=vel;
+			}
+			break;
 		default:  
 			_error_("Response type " << EnumToStringx(response_enum) << " not supported yet!");
@@ -3365,5 +3371,5 @@
 		kappa=matpar->GetEnthalpyDiffusionParameter(enthalpy,pressure);
 		D_scalar_conduct=gauss->weight*Jdet*kappa;
-		if(dt) D_scalar_conduct=D_scalar_conduct*dt;
+		if(reCast<bool,IssmDouble>(dt)) D_scalar_conduct=D_scalar_conduct*dt;
 
 		D[0][0]=D_scalar_conduct; D[0][1]=0; D[0][2]=0;
@@ -3385,5 +3391,5 @@
 
 		D_scalar_advec=gauss->weight*Jdet;
-		if(dt) D_scalar_advec=D_scalar_advec*dt;
+		if(reCast<bool,IssmDouble>(dt)) D_scalar_advec=D_scalar_advec*dt;
 
 		D[0][0]=D_scalar_advec*vx;D[0][1]=0;                D[0][2]=0;
@@ -3397,5 +3403,5 @@
 
 		/*Transient: */
-		if(dt){
+		if(reCast<bool,IssmDouble>(dt)){
 			GetNodalFunctionsP1(&L[0], gauss);
 			D_scalar_trans=gauss->weight*Jdet;
@@ -3418,5 +3424,5 @@
 			K[2][0]=h/(2*vel)*vz*vx;  K[2][1]=h/(2*vel)*vz*vy; K[2][2]=h/(2*vel)*vz*vz;
 			D_scalar_stab=gauss->weight*Jdet;
-			if(dt) D_scalar_stab=D_scalar_stab*dt;
+			if(reCast<bool,IssmDouble>(dt)) D_scalar_stab=D_scalar_stab*dt;
 			for(i=0;i<3;i++) for(j=0;j<3;j++) K[i][j] = D_scalar_stab*K[i][j];
 
@@ -3438,5 +3444,5 @@
 				}
 			}
-			if(dt){
+			if(reCast<bool,IssmDouble>(dt)){
 				for(i=0;i<numdof;i++){
 					for(j=0;j<numdof;j++){
@@ -3494,5 +3500,5 @@
 				
 		D_scalar=gauss->weight*Jdet2d*rho_water*mixed_layer_capacity*thermal_exchange_velocity/(rho_ice*heatcapacity);
-		if(dt) D_scalar=dt*D_scalar;
+		if(reCast<bool,IssmDouble>(dt)) D_scalar=dt*D_scalar;
 
 		TripleMultiply(&basis[0],numdof,1,0,
@@ -3594,5 +3600,5 @@
 
 		D_scalar_conduct=gauss->weight*Jdet*kappa;
-		if(dt) D_scalar_conduct=D_scalar_conduct*dt;
+		if(reCast<bool,IssmDouble>(dt)) D_scalar_conduct=D_scalar_conduct*dt;
 
 		D[0][0]=D_scalar_conduct; D[0][1]=0; D[0][2]=0;
@@ -3615,5 +3621,5 @@
 
 		D_scalar_advec=gauss->weight*Jdet;
-		if(dt) D_scalar_advec=D_scalar_advec*dt;
+		if(reCast<bool,IssmDouble>(dt)) D_scalar_advec=D_scalar_advec*dt;
 
 		D[0][0]=D_scalar_advec*vx;    D[0][1]=0;                    D[0][2]=0;
@@ -3627,5 +3633,5 @@
 
 		/*Transient: */
-		if(dt){
+		if(reCast<bool,IssmDouble>(dt)){
 			GetNodalFunctionsP1(&L[0], gauss);
 			D_scalar_trans=gauss->weight*Jdet;
@@ -3650,5 +3656,5 @@
 
 			D_scalar_stab=gauss->weight*Jdet;
-			if(dt) D_scalar_stab=D_scalar_stab*dt;
+			if(reCast<bool,IssmDouble>(dt)) D_scalar_stab=D_scalar_stab*dt;
 			for(i=0;i<3;i++) for(j=0;j<3;j++) K[i][j] = D_scalar_stab*K[i][j];
 
@@ -3670,5 +3676,5 @@
 				}
 			}
-			if(dt){
+			if(reCast<bool,IssmDouble>(dt)){
 				for(i=0;i<numdof;i++){
 					for(j=0;j<numdof;j++){
@@ -3727,5 +3733,5 @@
 				
 		D_scalar=gauss->weight*Jdet2d*rho_water*mixed_layer_capacity*thermal_exchange_velocity/(heatcapacity*rho_ice);
-		if(dt) D_scalar=dt*D_scalar;
+		if(reCast<bool,IssmDouble>(dt)) D_scalar=dt*D_scalar;
 
 		TripleMultiply(&basis[0],numdof,1,0,
@@ -3796,5 +3802,5 @@
 	Input* enthalpy_input=NULL; 
 	Input* enthalpypicard_input=NULL; 
-	if(dt){
+	if(reCast<bool,IssmDouble>(dt)){
 		enthalpy_input=inputs->GetInput(EnthalpyEnum); _assert_(enthalpy_input);
 	}
@@ -3818,10 +3824,10 @@
 
 		scalar_def=phi/rho_ice*Jdet*gauss->weight;
-		if(dt) scalar_def=scalar_def*dt;
+		if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
 
 		for(i=0;i<NUMVERTICES;i++)  pe->values[i]+=scalar_def*L[i];
 
 		/* Build transient now */
-		if(dt){
+		if(reCast<bool,IssmDouble>(dt)){
 			enthalpy_input->GetInputValue(&enthalpy, gauss);
 			scalar_transient=enthalpy*Jdet*gauss->weight;
@@ -3841,5 +3847,5 @@
 
 			for(i=0;i<NUMVERTICES;i++)  pe->values[i]+=tau_parameter*scalar_def*(u*dbasis[0][i]+v*dbasis[1][i]+w*dbasis[2][i]);
-			if(dt){
+			if(reCast<bool,IssmDouble>(dt)){
 				for(i=0;i<NUMVERTICES;i++)  pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0][i]+v*dbasis[1][i]+w*dbasis[2][i]);
 			}
@@ -3899,5 +3905,5 @@
 
 		scalar_ocean=gauss->weight*Jdet2d*rho_water*mixed_layer_capacity*thermal_exchange_velocity*(h_pmp)/(rho_ice*heatcapacity);
-		if(dt) scalar_ocean=dt*scalar_ocean;
+		if(reCast<bool,IssmDouble>(dt)) scalar_ocean=dt*scalar_ocean;
 
 		for(i=0;i<numdof;i++) pe->values[i]+=scalar_ocean*basis[i];
@@ -3985,5 +3991,5 @@
 
 			scalar=gauss->weight*Jdet2d*(basalfriction+geothermalflux_value)/(rho_ice);
-			if(dt) scalar=dt*scalar;
+			if(reCast<bool,IssmDouble>(dt)) scalar=dt*scalar;
 
 			for(i=0;i<numdof;i++) pe->values[i]+=scalar*basis[i];
@@ -4057,5 +4063,5 @@
 	Input* vz_input=inputs->GetInput(VzEnum); _assert_(vz_input);
 	Input* temperature_input=NULL;
-	if (dt) temperature_input=inputs->GetInput(TemperatureEnum); _assert_(inputs);
+	if (reCast<bool,IssmDouble>(dt)) temperature_input=inputs->GetInput(TemperatureEnum); _assert_(inputs);
 	if (stabilization==2) diameter=MinEdgeLength(xyz_list);
 
@@ -4074,10 +4080,10 @@
 
 		scalar_def=phi/(rho_ice*heatcapacity)*Jdet*gauss->weight;
-		if(dt) scalar_def=scalar_def*dt;
+		if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
 
 		for(i=0;i<NUMVERTICES;i++)  pe->values[i]+=scalar_def*L[i];
 
 		/* Build transient now */
-		if(dt){
+		if(reCast<bool,IssmDouble>(dt)){
 			temperature_input->GetInputValue(&temperature, gauss);
 			scalar_transient=temperature*Jdet*gauss->weight;
@@ -4095,5 +4101,5 @@
 
 			for(i=0;i<NUMVERTICES;i++)  pe->values[i]+=tau_parameter*scalar_def*(u*dbasis[0][i]+v*dbasis[1][i]+w*dbasis[2][i]);
-			if(dt){
+			if(reCast<bool,IssmDouble>(dt)){
 				for(i=0;i<NUMVERTICES;i++)  pe->values[i]+=tau_parameter*scalar_transient*(u*dbasis[0][i]+v*dbasis[1][i]+w*dbasis[2][i]);
 			}
@@ -4153,5 +4159,5 @@
 
 		scalar_ocean=gauss->weight*Jdet2d*rho_water*mixed_layer_capacity*thermal_exchange_velocity*(t_pmp)/(heatcapacity*rho_ice);
-		if(dt) scalar_ocean=dt*scalar_ocean;
+		if(reCast<bool,IssmDouble>(dt)) scalar_ocean=dt*scalar_ocean;
 
 		for(i=0;i<numdof;i++) pe->values[i]+=scalar_ocean*basis[i];
@@ -4219,5 +4225,5 @@
 
 			scalar=gauss->weight*Jdet2d*(basalfriction+geothermalflux_value)/(heatcapacity*rho_ice);
-			if(dt) scalar=dt*scalar;
+			if(reCast<bool,IssmDouble>(dt)) scalar=dt*scalar;
 
 			for(i=0;i<numdof;i++) pe->values[i]+=scalar*basis[i];
Index: /issm/trunk-jpl/src/c/classes/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Elements/Tria.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/objects/Elements/Tria.cpp	(revision 13073)
@@ -1469,5 +1469,5 @@
 	if (control_analysis && iomodel->Data(InversionControlParametersEnum)){
 		for(i=0;i<num_control_type;i++){
-			switch((int)iomodel->Data(InversionControlParametersEnum)[i]){
+			switch(reCast<int>(iomodel->Data(InversionControlParametersEnum)[i])){
 				case BalancethicknessThickeningRateEnum:
 					if (iomodel->Data(BalancethicknessThickeningRateEnum)){
@@ -1505,5 +1505,5 @@
 					/*Matice will take care of it*/ break;
 				default:
-					_error_("Control " << EnumToStringx((int)iomodel->Data(InversionControlParametersEnum)[i]) << " not implemented yet");
+					_error_("Control " << EnumToStringx(reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i])) << " not implemented yet");
 			}
 		}
@@ -2591,5 +2591,5 @@
 
 	/*First off, check that this segment belongs to this element: */
-	if ((int)*(segment+4)!=this->id)_error_("error message: segment with id " << (int)*(segment+4) << " does not belong to element with id:" << this->id);
+	if (reCast<int>(*(segment+4))!=this->id)_error_("error message: segment with id " << reCast<int>(*(segment+4)) << " does not belong to element with id:" << this->id);
 
 	/*Recover segment node locations: */
@@ -2795,5 +2795,5 @@
 			*presponse=this->matice->GetBbar();
 			break;
-		case VelEnum:
+		case VelEnum:{
 
 			/*Get input:*/
@@ -2808,5 +2808,6 @@
 
 			/*Assign output pointers:*/
-			*presponse=vel;
+			*presponse=vel;}
+			break;
 		default:  
 			_error_("Response type " << EnumToStringx(response_enum) << " not supported yet!");
@@ -5364,5 +5365,5 @@
 		old_watercolumn_input->GetInputValue(&old_watercolumn_g,gauss);
 
-		if(dt)for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*(old_watercolumn_g+dt*basal_melting_g)*basis[i];
+		if(reCast<int,IssmDouble>(dt))for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*(old_watercolumn_g+dt*basal_melting_g)*basis[i];
 		else  for(i=0;i<numdof;i++) pe->values[i]+=Jdettria*gauss->weight*basal_melting_g*basis[i];
 	}
Index: /issm/trunk-jpl/src/c/classes/objects/Loads/Pengrid.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Loads/Pengrid.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/objects/Loads/Pengrid.cpp	(revision 13073)
@@ -572,5 +572,5 @@
 	}
 	else{
-		if (dt) pe->values[0]=melting_offset*pow((IssmDouble)10,penalty_factor)*(temperature-t_pmp)/dt;
+		if (reCast<bool>(dt)) pe->values[0]=melting_offset*pow((IssmDouble)10,penalty_factor)*(temperature-t_pmp)/dt;
 		else    pe->values[0]=melting_offset*pow((IssmDouble)10,penalty_factor)*(temperature-t_pmp);
 	}
Index: /issm/trunk-jpl/src/c/classes/objects/Loads/Riftfront.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Loads/Riftfront.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/objects/Loads/Riftfront.cpp	(revision 13073)
@@ -60,9 +60,9 @@
 
 	/*Ok, retrieve all the data needed to add a penalty between the two nodes: */
-	el1=(int)*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+2);
-	el2=(int)*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+3); 
-
-	node1=(int)*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+0); 
-	node2=(int)*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+1);
+	el1=reCast<int,IssmDouble>(*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+2));
+	el2=reCast<int,IssmDouble>(*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+3)) ;
+
+	node1=reCast<int,IssmDouble>(*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+0));
+	node2=reCast<int,IssmDouble>(*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+1));
 
 	/*id: */
@@ -93,5 +93,5 @@
 	this->length=*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+6);
 	this->fraction=*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+9);
-	this->state=(int)*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+11);
+	this->state=reCast<int,IssmDouble>(*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+11));
 
 	//intialize inputs, and add as many inputs per element as requested: 
@@ -99,8 +99,8 @@
 		
 	riftfront_type=SegmentRiftfrontEnum;
-	riftfront_fill = (int)*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+7);
+	riftfront_fill = reCast<int,IssmDouble>(*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+7));
 	riftfront_friction=*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+8);
 	riftfront_fractionincrement=*(iomodel->Data(RiftsRiftstructEnum)+RIFTINFOSIZE*i+10);
-	riftfront_shelf=(bool)iomodel->Data(MaskVertexonfloatingiceEnum)[node1-1];
+	riftfront_shelf=reCast<bool,IssmDouble>(iomodel->Data(MaskVertexonfloatingiceEnum)[node1-1]);
 
 	this->inputs->AddInput(new IntInput(TypeEnum,riftfront_type));
@@ -679,5 +679,5 @@
 	this->inputs->GetInputValue(&converged,ConvergedEnum);
 
-	if(converged){
+	if(reCast<int,IssmDouble>(converged)){
 		/*ok, material non-linearity has converged. If that was already the case, we keep 
 		 * constraining the rift front. If it was not, and this is the first time the material 
Index: /issm/trunk-jpl/src/c/classes/objects/Materials/Matice.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Materials/Matice.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/objects/Materials/Matice.cpp	(revision 13073)
@@ -705,11 +705,11 @@
 		if (control_analysis && iomodel->Data(InversionControlParametersEnum)){
 			for(i=0;i<num_control_type;i++){
-				switch((int)iomodel->Data(InversionControlParametersEnum)[i]){
+				switch(reCast<int>(iomodel->Data(InversionControlParametersEnum)[i])){
 					case MaterialsRheologyBbarEnum:
 						if (iomodel->Data(MaterialsRheologyBEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyBEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyBbarEnum,TriaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
@@ -733,5 +733,5 @@
 		/*Get B*/
 		if (iomodel->Data(MaterialsRheologyBEnum)) {
-			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
+			for(i=0;i<num_vertices;i++) nodeinputs[i]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+i]-1)];
 			this->inputs->AddInput(new PentaP1Input(MaterialsRheologyBEnum,nodeinputs));
 		}
@@ -747,11 +747,11 @@
 		if (control_analysis && iomodel->Data(InversionControlParametersEnum)){
 			for(i=0;i<num_control_type;i++){
-				switch((int)iomodel->Data(InversionControlParametersEnum)[i]){
+				switch(reCast<int>(iomodel->Data(InversionControlParametersEnum)[i])){
 					case MaterialsRheologyBbarEnum:
 						if (iomodel->Data(MaterialsRheologyBEnum)){
 							_assert_(iomodel->Data(MaterialsRheologyBEnum));_assert_(iomodel->Data(InversionMinParametersEnum)); _assert_(iomodel->Data(InversionMaxParametersEnum)); 
-							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
-							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
-							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[int(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)nodeinputs[j]=iomodel->Data(MaterialsRheologyBEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)];
+							for(j=0;j<num_vertices;j++)cmmininputs[j]=iomodel->Data(InversionMinParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
+							for(j=0;j<num_vertices;j++)cmmaxinputs[j]=iomodel->Data(InversionMaxParametersEnum)[reCast<int,IssmDouble>(iomodel->Data(MeshElementsEnum)[num_vertices*index+j]-1)*num_control_type+i];
 							this->inputs->AddInput(new ControlInput(MaterialsRheologyBEnum,PentaP1InputEnum,nodeinputs,cmmininputs,cmmaxinputs,i+1));
 						}
Index: /issm/trunk-jpl/src/c/classes/objects/Node.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/objects/Node.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/classes/objects/Node.cpp	(revision 13073)
@@ -89,17 +89,17 @@
 			_assert_(iomodel->Data(MeshVertexonbedEnum)); 
 			_assert_(iomodel->Data(FlowequationVertexEquationEnum));
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealApproximationEnum && !iomodel->Data(MeshVertexonbedEnum)[io_index]){
+			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 				for(k=1;k<=gsize;k++) this->FreezeDof(k);
 			}
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==L1L2ApproximationEnum && !iomodel->Data(MeshVertexonbedEnum)[io_index]){
+			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==L1L2ApproximationEnum && !reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 				for(k=1;k<=gsize;k++) this->FreezeDof(k);
 			}
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealPattynApproximationEnum && iomodel->Data(FlowequationBordermacayealEnum)[io_index]){
-				if(!iomodel->Data(MeshVertexonbedEnum)[io_index]){
+			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealPattynApproximationEnum && reCast<int>(iomodel->Data(FlowequationBordermacayealEnum)[io_index])){
+				if(!reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 					for(k=1;k<=gsize;k++) this->FreezeDof(k);
 				}
 			}
-			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealStokesApproximationEnum && iomodel->Data(FlowequationBordermacayealEnum)[io_index]){
-				if(!iomodel->Data(MeshVertexonbedEnum)[io_index]){
+			if (iomodel->Data(FlowequationVertexEquationEnum)[io_index]==MacAyealStokesApproximationEnum && reCast<int>(iomodel->Data(FlowequationBordermacayealEnum)[io_index])){
+				if(!reCast<int>(iomodel->Data(MeshVertexonbedEnum)[io_index])){
 					for(k=1;k<=2;k++) this->FreezeDof(k);
 				}
Index: /issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.cpp	(revision 13073)
@@ -9,11 +9,11 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* norm_list,int step){
+void ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,IssmDouble* norm_list,int step){
 
 	/*Intermediaries*/
 	int     i,j,num_controls;
 	int    *control_type = NULL;
-	double *scalar_list = NULL;
-	double  scalar;
+	IssmDouble *scalar_list = NULL;
+	IssmDouble  scalar;
 
 
@@ -38,4 +38,4 @@
 	/*Clean up and return*/
 	xDelete<int>(control_type);
-	xDelete<double>(scalar_list);
+	xDelete<IssmDouble>(scalar_list);
 }
Index: /issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ControlInputScaleGradientx/ControlInputScaleGradientx.h	(revision 13073)
@@ -8,5 +8,5 @@
 #include "../../Container/Container.h"
 
-void	ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,double* norm_list,int step);
+void	ControlInputScaleGradientx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,IssmDouble* norm_list,int step);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp	(revision 13073)
@@ -9,5 +9,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* gradient){
+void ControlInputSetGradientx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,IssmDouble* gradient){
 
 	/*Intermediaries*/
@@ -33,5 +33,5 @@
 
 	/*Serialize gradient*/
-	double* serial_gradient=NULL;
+	IssmDouble* serial_gradient=NULL;
 	serial_gradient=gradient->ToMPISerial();
 
@@ -39,4 +39,4 @@
 
 	/*Clean up and return*/
-	xDelete<double>(serial_gradient);
+	xDelete<IssmDouble>(serial_gradient);
 }
Index: /issm/trunk-jpl/src/c/modules/CostFunctionx/CostFunctionx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/CostFunctionx/CostFunctionx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/CostFunctionx/CostFunctionx.cpp	(revision 13073)
@@ -11,15 +11,14 @@
 #include "../Responsex/Responsex.h"
 
-void CostFunctionx(double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
+void CostFunctionx(IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters){
 
 	/*Intermediary*/
 	int      i;
 	int      num_responses;
-	double   S;
 	Element *element       = NULL;
 	int     *responses     = NULL;
 
 	/*output: */
-	double J,Jplus;
+	IssmDouble J,Jplus;
 	
 	/*Recover parameters*/
Index: /issm/trunk-jpl/src/c/modules/CostFunctionx/CostFunctionx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/CostFunctionx/CostFunctionx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/CostFunctionx/CostFunctionx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void CostFunctionx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters);
+void CostFunctionx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void DragCoefficientAbsGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
+void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/DragCoefficientAbsGradientx/DragCoefficientAbsGradientx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void DragCoefficientAbsGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void DragCoefficientAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/ElementResponsex/ElementResponsex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ElementResponsex/ElementResponsex.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ElementResponsex/ElementResponsex.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ElementResponsex( double* presponse, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,int response_enum,bool process_units){
+void ElementResponsex( IssmDouble* presponse, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,int response_enum,bool process_units){
 	
 
@@ -20,5 +20,5 @@
 	int cpu_found=-1;
 	int index;
-	double response;
+	IssmDouble response;
 	Element* element=NULL;
 
Index: /issm/trunk-jpl/src/c/modules/ElementResponsex/ElementResponsex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ElementResponsex/ElementResponsex.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ElementResponsex/ElementResponsex.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void ElementResponsex( double* presponse, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,int response_enum,bool process_units);
+void ElementResponsex( IssmDouble* presponse, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,int response_enum,bool process_units);
 
 #endif  /* _ELEMENTRESPONSEX_H */
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp	(revision 13073)
@@ -36,8 +36,8 @@
 }
 
-void GetVectorFromControlInputsx( double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){
+void GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters, const char* data){
 	
 	/*output: */
-	double* vector=NULL;
+	IssmDouble* vector=NULL;
 	
 	/*intermediary: */
Index: /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.h	(revision 13073)
@@ -10,5 +10,5 @@
 /* local prototypes: */
 void	GetVectorFromControlInputsx( Vector** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
-void	GetVectorFromControlInputsx( double** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
+void	GetVectorFromControlInputsx( IssmDouble** pvector, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,const char* data="value");
 
 #endif  /* _GETVECTORFROMCONTROLINPUTSXX_H */
Index: /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.cpp	(revision 13073)
@@ -10,10 +10,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void Gradjx(Vector** pgradient,double** pnorm_list, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){
+void Gradjx(Vector** pgradient,IssmDouble** pnorm_list, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters){
 
 	int     i,j,numberofvertices;
 	int     num_controls;
-	double   norm_inf;
-	double  *norm_list     = NULL;
+	IssmDouble   norm_inf;
+	IssmDouble  *norm_list     = NULL;
 	int     *control_type  = NULL;
 	Vector  *gradient      = NULL;
@@ -27,5 +27,5 @@
 	/*Allocate gradient_list */
 	gradient_list = xNew<Vector*>(num_controls);
-	norm_list = xNew<double>(num_controls);
+	norm_list = xNew<IssmDouble>(num_controls);
 	for(i=0;i<num_controls;i++){
 		gradient_list[i]=new Vector(num_controls*numberofvertices);
@@ -62,5 +62,5 @@
 	}
 	else{
-		xDelete<double>(norm_list);
+		xDelete<IssmDouble>(norm_list);
 	}
 	if(pgradient)  *pgradient=gradient;
Index: /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/Gradjx/Gradjx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void Gradjx(Vector** pgrad_g,double** pgrad_norm,Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters);
+void Gradjx(Vector** pgrad_g,IssmDouble** pgrad_norm,Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters);
 
 #endif  /* _GRADJX_H */
Index: /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.cpp	(revision 13073)
@@ -14,7 +14,7 @@
 
 	int      i, migration_style,analysis_type;
-	double*  vertices_potentially_ungrounding = NULL;
-	double*  vertices_ungrounding             = NULL;
-	double*  old_floatingice                  = NULL;
+	IssmDouble*  vertices_potentially_ungrounding = NULL;
+	IssmDouble*  vertices_ungrounding             = NULL;
+	IssmDouble*  old_floatingice                  = NULL;
 	Vector*      vec_old_floatingice              = NULL;
 	Element* element                          = NULL;
@@ -49,7 +49,7 @@
 	/*free ressouces: */
 	xdelete(&vec_old_floatingice);
-	xDelete<double>(vertices_potentially_ungrounding);
-	xDelete<double>(vertices_ungrounding);
-	xDelete<double>(old_floatingice);
+	xDelete<IssmDouble>(vertices_potentially_ungrounding);
+	xDelete<IssmDouble>(vertices_ungrounding);
+	xDelete<IssmDouble>(old_floatingice);
 }
 
@@ -82,8 +82,8 @@
 /*%}}}*/
 /*FUNCTION PotentialSheetUngrounding {{{*/
-double*    PotentialSheetUngrounding(Elements* elements,Vertices* vertices,Parameters* parameters){ 
+IssmDouble*    PotentialSheetUngrounding(Elements* elements,Vertices* vertices,Parameters* parameters){ 
 
 	int      i,numberofvertices;
-	double*  vertices_potentially_ungrounding      = NULL;
+	IssmDouble*  vertices_potentially_ungrounding      = NULL;
 	Vector*      vec_vertices_potentially_ungrounding  = NULL;
 	Element* element                               = NULL;
@@ -109,11 +109,11 @@
 /*}}}*/
 /*FUNCTION PropagateFloatingiceToGroundedNeighbors {{{*/
-double*    PropagateFloatingiceToGroundedNeighbors(Elements* elements,Nodes* nodes,Vertices* vertices,Parameters* parameters,double* vertices_potentially_ungrounding){ 
+IssmDouble*    PropagateFloatingiceToGroundedNeighbors(Elements* elements,Nodes* nodes,Vertices* vertices,Parameters* parameters,IssmDouble* vertices_potentially_ungrounding){ 
 
 	int      i,analysis_type;
 	int      numberofvertices;
 	int      nflipped,local_nflipped;
-	double*  nodes_on_floatingice                  = NULL;
-	double*  elements_neighboring_floatingce      = NULL;
+	IssmDouble*  nodes_on_floatingice                  = NULL;
+	IssmDouble*  elements_neighboring_floatingce      = NULL;
 	Vector*      vec_elements_neighboring_floatingice = NULL;
 	Vector*      vec_nodes_on_floatingice              = NULL;
@@ -150,5 +150,5 @@
 		for(i=0;i<elements->Size();i++){
 			element=(Element*)elements->GetObjectByOffset(i);
-			if(elements_neighboring_floatingce[element->Sid()]){
+			if(reCast<int,IssmDouble>(elements_neighboring_floatingce[element->Sid()])){
 				local_nflipped+=element->UpdatePotentialSheetUngrounding(vertices_potentially_ungrounding,vec_nodes_on_floatingice,nodes_on_floatingice);
 			}
@@ -164,6 +164,6 @@
 
 		/*Avoid leaks: */
-		xDelete<double>(elements_neighboring_floatingce);
-		xDelete<double>(nodes_on_floatingice);
+		xDelete<IssmDouble>(elements_neighboring_floatingce);
+		xDelete<IssmDouble>(nodes_on_floatingice);
 
 		/*Assemble and serialize:*/
@@ -174,5 +174,5 @@
 	/*Free ressources:*/
 	xdelete(&vec_nodes_on_floatingice);
-	xDelete<double>(elements_neighboring_floatingce);
+	xDelete<IssmDouble>(elements_neighboring_floatingce);
 
 	return nodes_on_floatingice;
Index: /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/GroundinglineMigrationx/GroundinglineMigrationx.h	(revision 13073)
@@ -15,5 +15,5 @@
 
 Vector*        CreateNodesOnFloatingIce(Nodes* nodes,int configuration_type);
-double*    PotentialSheetUngrounding(Elements* elements,Vertices* vertices,Parameters* parameters);
-double*    PropagateFloatingiceToGroundedNeighbors(Elements* elements,Nodes* nodes,Vertices* vertices,Parameters* parameters,double* vertices_potentially_ungrounding);
+IssmDouble*    PotentialSheetUngrounding(Elements* elements,Vertices* vertices,Parameters* parameters);
+IssmDouble*    PropagateFloatingiceToGroundedNeighbors(Elements* elements,Nodes* nodes,Vertices* vertices,Parameters* parameters,IssmDouble* vertices_potentially_ungrounding);
 #endif  /* _GROUNDINGLINEMIGRATIONX_H */
Index: /issm/trunk-jpl/src/c/modules/IceVolumex/IceVolumex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/IceVolumex/IceVolumex.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/IceVolumex/IceVolumex.cpp	(revision 13073)
@@ -10,8 +10,8 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void IceVolumex(double* pV, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void IceVolumex(IssmDouble* pV, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 
-	double local_ice_volume = 0;
-	double total_ice_volume;
+	IssmDouble local_ice_volume = 0;
+	IssmDouble total_ice_volume;
 
 	for(int i=0;i<elements->Size();i++){
Index: /issm/trunk-jpl/src/c/modules/IceVolumex/IceVolumex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/IceVolumex/IceVolumex.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/IceVolumex/IceVolumex.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void IceVolumex(double* pV, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void IceVolumex(IssmDouble* pV, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.cpp	(revision 13073)
@@ -9,5 +9,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void InputControlUpdatex(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters,double scalar,bool save_parameter){
+void InputControlUpdatex(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters,IssmDouble scalar,bool save_parameter){
 
 	/*Go through elemnets, and ask to carry out the operation on inputs: */
Index: /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/InputControlUpdatex/InputControlUpdatex.h	(revision 13073)
@@ -9,5 +9,5 @@
 
 /* local prototypes: */
-void InputControlUpdatex(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters, double scalar,bool save_parameter);
+void InputControlUpdatex(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* materials,Parameters* parameters, IssmDouble scalar,bool save_parameter);
 
 #endif 
Index: /issm/trunk-jpl/src/c/modules/MassFluxx/MassFluxx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MassFluxx/MassFluxx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MassFluxx/MassFluxx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MassFluxx(double* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,bool process_units){
+void MassFluxx(IssmDouble* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,bool process_units){
 
 	int i,j;
@@ -20,11 +20,11 @@
 	
 	/*output: */
-	double mass_flux=0;
-	double all_mass_flux=0;
+	IssmDouble mass_flux=0;
+	IssmDouble all_mass_flux=0;
 
 	int  counter;
 
 	/*all segments: */
-	double** array=NULL;
+	IssmDouble** array=NULL;
 	int      M;
 	int*     mdims_array=NULL;
@@ -32,5 +32,5 @@
 
 	/*our segments of interest: */
-	double*  segments=NULL;
+	IssmDouble*  segments=NULL;
 	int      num_segments;
 
@@ -48,5 +48,5 @@
 	 * When we find one, use the element to compute the mass flux on the segment: */
 	for(i=0;i<num_segments;i++){
-		element_id=(int)*(segments+5*i+4);
+		element_id=reCast<int,IssmDouble>(*(segments+5*i+4));
 		for(j=0;j<elements->Size();j++){
 			element=(Element*)elements->GetObjectByOffset(j);
@@ -66,10 +66,10 @@
 	/*Free ressources:*/
 	for(j=0;j<M;j++){
-		double* matrix=array[j];
-		xDelete<double>(matrix);
+		IssmDouble* matrix=array[j];
+		xDelete<IssmDouble>(matrix);
 	}
 	xDelete<int>(mdims_array);
 	xDelete<int>(ndims_array);
-	xDelete<double*>(array);
+	xDelete<IssmDouble*>(array);
 	
 	/*Assign output pointers: */
Index: /issm/trunk-jpl/src/c/modules/MassFluxx/MassFluxx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MassFluxx/MassFluxx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MassFluxx/MassFluxx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MassFluxx(double* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,bool process_units);
+void MassFluxx(IssmDouble* pmass_flux, Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads,Materials* materials, Parameters* parameters,bool process_units);
 
 
Index: /issm/trunk-jpl/src/c/modules/MaxAbsVxx/MaxAbsVxx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxAbsVxx/MaxAbsVxx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxAbsVxx/MaxAbsVxx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxAbsVxx( double* pmaxabsvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxAbsVxx( IssmDouble* pmaxabsvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double maxabsvx;
-	double node_maxabsvx;
-	double element_maxabsvx;
+	IssmDouble maxabsvx;
+	IssmDouble node_maxabsvx;
+	IssmDouble element_maxabsvx;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MaxAbsVxx/MaxAbsVxx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxAbsVxx/MaxAbsVxx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxAbsVxx/MaxAbsVxx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MaxAbsVxx( double* pmaxabsvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxAbsVxx( IssmDouble* pmaxabsvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXABSVXX_H */
Index: /issm/trunk-jpl/src/c/modules/MaxAbsVyx/MaxAbsVyx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxAbsVyx/MaxAbsVyx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxAbsVyx/MaxAbsVyx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxAbsVyx( double* pmaxabsvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxAbsVyx( IssmDouble* pmaxabsvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double maxabsvy;
-	double node_maxabsvy;
-	double element_maxabsvy;
+	IssmDouble maxabsvy;
+	IssmDouble node_maxabsvy;
+	IssmDouble element_maxabsvy;
 
 
Index: /issm/trunk-jpl/src/c/modules/MaxAbsVyx/MaxAbsVyx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxAbsVyx/MaxAbsVyx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxAbsVyx/MaxAbsVyx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MaxAbsVyx( double* pmaxabsvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxAbsVyx( IssmDouble* pmaxabsvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXABSVYX_H */
Index: /issm/trunk-jpl/src/c/modules/MaxAbsVzx/MaxAbsVzx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxAbsVzx/MaxAbsVzx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxAbsVzx/MaxAbsVzx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxAbsVzx( double* pmaxabsvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxAbsVzx( IssmDouble* pmaxabsvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double maxabsvz;
-	double node_maxabsvz;
-	double element_maxabsvz;
+	IssmDouble maxabsvz;
+	IssmDouble node_maxabsvz;
+	IssmDouble element_maxabsvz;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MaxAbsVzx/MaxAbsVzx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxAbsVzx/MaxAbsVzx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxAbsVzx/MaxAbsVzx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MaxAbsVzx( double* pmaxabsvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxAbsVzx( IssmDouble* pmaxabsvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXABSVZX_H */
Index: /issm/trunk-jpl/src/c/modules/MaxVelx/MaxVelx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVelx/MaxVelx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVelx/MaxVelx.cpp	(revision 13073)
@@ -10,10 +10,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxVelx( double* pmaxvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxVelx( IssmDouble* pmaxvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double maxvel;
-	double node_maxvel;
-	double element_maxvel;
+	IssmDouble maxvel;
+	IssmDouble node_maxvel;
+	IssmDouble element_maxvel;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MaxVelx/MaxVelx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVelx/MaxVelx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVelx/MaxVelx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MaxVelx( double* pmaxvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxVelx( IssmDouble* pmaxvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXVELX_H */
Index: /issm/trunk-jpl/src/c/modules/MaxVxx/MaxVxx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVxx/MaxVxx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVxx/MaxVxx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxVxx( double* pmaxvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxVxx( IssmDouble* pmaxvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double maxvx;
-	double node_maxvx;
-	double element_maxvx;
+	IssmDouble maxvx;
+	IssmDouble node_maxvx;
+	IssmDouble element_maxvx;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MaxVxx/MaxVxx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVxx/MaxVxx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVxx/MaxVxx.h	(revision 13073)
@@ -9,5 +9,5 @@
 
 /* local prototypes: */
-void MaxVxx( double* pmaxvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxVxx( IssmDouble* pmaxvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXVXX_H */
Index: /issm/trunk-jpl/src/c/modules/MaxVyx/MaxVyx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVyx/MaxVyx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVyx/MaxVyx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxVyx( double* pmaxvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxVyx( IssmDouble* pmaxvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 
 	int i;
-	double maxvy;
-	double node_maxvy;
-	double element_maxvy;
+	IssmDouble maxvy;
+	IssmDouble node_maxvy;
+	IssmDouble element_maxvy;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MaxVyx/MaxVyx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVyx/MaxVyx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVyx/MaxVyx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MaxVyx( double* pmaxvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxVyx( IssmDouble* pmaxvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXVYX_H */
Index: /issm/trunk-jpl/src/c/modules/MaxVzx/MaxVzx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVzx/MaxVzx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVzx/MaxVzx.cpp	(revision 13073)
@@ -10,10 +10,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MaxVzx( double* pmaxvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MaxVzx( IssmDouble* pmaxvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double maxvz;
-	double node_maxvz;
-	double element_maxvz;
+	IssmDouble maxvz;
+	IssmDouble node_maxvz;
+	IssmDouble element_maxvz;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MaxVzx/MaxVzx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MaxVzx/MaxVzx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MaxVzx/MaxVzx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MaxVzx( double* pmaxvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MaxVzx( IssmDouble* pmaxvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MAXVZX_H */
Index: /issm/trunk-jpl/src/c/modules/MinVelx/MinVelx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVelx/MinVelx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVelx/MinVelx.cpp	(revision 13073)
@@ -10,10 +10,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MinVelx( double* pminvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MinVelx( IssmDouble* pminvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double minvel;
-	double node_minvel;
-	double element_minvel;
+	IssmDouble minvel;
+	IssmDouble node_minvel;
+	IssmDouble element_minvel;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MinVelx/MinVelx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVelx/MinVelx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVelx/MinVelx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MinVelx( double* pminvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MinVelx( IssmDouble* pminvel, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MINVELX_H */
Index: /issm/trunk-jpl/src/c/modules/MinVxx/MinVxx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVxx/MinVxx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVxx/MinVxx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MinVxx( double* pminvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MinVxx( IssmDouble* pminvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double minvx;
-	double node_minvx;
-	double element_minvx;
+	IssmDouble minvx;
+	IssmDouble node_minvx;
+	IssmDouble element_minvx;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MinVxx/MinVxx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVxx/MinVxx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVxx/MinVxx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MinVxx( double* pminvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MinVxx( IssmDouble* pminvx, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MINVX_H */
Index: /issm/trunk-jpl/src/c/modules/MinVyx/MinVyx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVyx/MinVyx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVyx/MinVyx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MinVyx( double* pminvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MinVyx( IssmDouble* pminvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double minvy;
-	double node_minvy;
-	double element_minvy;
+	IssmDouble minvy;
+	IssmDouble node_minvy;
+	IssmDouble element_minvy;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MinVyx/MinVyx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVyx/MinVyx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVyx/MinVyx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MinVyx( double* pminvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MinVyx( IssmDouble* pminvy, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MINVYX_H */
Index: /issm/trunk-jpl/src/c/modules/MinVzx/MinVzx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVzx/MinVzx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVzx/MinVzx.cpp	(revision 13073)
@@ -9,10 +9,10 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void MinVzx( double* pminvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void MinVzx( IssmDouble* pminvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 	
 	int i;
-	double minvz;
-	double node_minvz;
-	double element_minvz;
+	IssmDouble minvz;
+	IssmDouble node_minvz;
+	IssmDouble element_minvz;
 
 	/*Go through elements, and request velocity: */
Index: /issm/trunk-jpl/src/c/modules/MinVzx/MinVzx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/MinVzx/MinVzx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/MinVzx/MinVzx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void MinVzx( double* pminvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void MinVzx( IssmDouble* pminvz, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif  /* _MINVZX_H */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateLoadsBalancethickness.cpp	(revision 13073)
@@ -42,5 +42,5 @@
 
 			/*Get left and right elements*/
-			element=(int)iomodel->Data(MeshEdgesEnum)[4*i+2]-1; //edges are [node1 node2 elem1 elem2]
+			element=reCast<int,IssmDouble>(iomodel->Data(MeshEdgesEnum)[4*i+2])-1; //edges are [node1 node2 elem1 elem2]
 
 			/*Now, if this element is not in the partition, pass: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Balancethickness/CreateNodesBalancethickness.cpp	(revision 13073)
@@ -72,5 +72,5 @@
 
 					//Get index of the vertex on which the current node is located
-					vertex_id=(int)*(iomodel->Data(MeshElementsEnum)+3*i+j); //(Matlab indexing)
+					vertex_id=reCast<int,IssmDouble>(*(iomodel->Data(MeshElementsEnum)+3*i+j)); //(Matlab indexing)
 					io_index=vertex_id-1;                      //(C indexing)
 					_assert_(vertex_id>0 && vertex_id<=numberofvertices);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/CreateParametersControl.cpp	(revision 13073)
@@ -21,8 +21,8 @@
 	int         num_cm_responses;
 	int        *control_type     = NULL;
-	double     *cm_responses     = NULL;
-	double     *cm_jump          = NULL;
-	double     *optscal          = NULL;
-	double     *maxiter          = NULL;
+	IssmDouble     *cm_responses     = NULL;
+	IssmDouble     *cm_jump          = NULL;
+	IssmDouble     *optscal          = NULL;
+	IssmDouble     *maxiter          = NULL;
 
 	/*Get parameters: */
@@ -64,8 +64,8 @@
 
 		xDelete<int>(control_type);
-		xDelete<double>(cm_responses);
-		xDelete<double>(cm_jump);
-		xDelete<double>(optscal);
-		xDelete<double>(maxiter);
+		xDelete<IssmDouble>(cm_responses);
+		xDelete<IssmDouble>(cm_jump);
+		xDelete<IssmDouble>(optscal);
+		xDelete<IssmDouble>(maxiter);
 	}
 
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp	(revision 13073)
@@ -42,5 +42,5 @@
 	iomodel->FetchData(4,InversionControlParametersEnum,InversionCostFunctionsCoefficientsEnum,InversionMinParametersEnum,InversionMaxParametersEnum);
 	for(i=0;i<num_control_type;i++){
-		switch((int)iomodel->Data(InversionControlParametersEnum)[i]){
+		switch(reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i])){
 			case BalancethicknessThickeningRateEnum: iomodel->FetchData(1,BalancethicknessThickeningRateEnum); break;
 			case VxEnum:   iomodel->FetchData(1,VxEnum); break;
@@ -48,5 +48,5 @@
 			case FrictionCoefficientEnum: iomodel->FetchData(1,FrictionCoefficientEnum); break;
 			case MaterialsRheologyBbarEnum:    iomodel->FetchData(1,MaterialsRheologyBEnum); break;
-			default: _error_("Control " << EnumToStringx((int)iomodel->Data(InversionControlParametersEnum)[i]) << " not implemented yet");
+			default: _error_("Control " << EnumToStringx(reCast<int,IssmDouble>(iomodel->Data(InversionControlParametersEnum)[i])) << " not implemented yet");
 		}
 	}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp	(revision 13073)
@@ -16,8 +16,8 @@
 	int     i,j;
 	int     count;
-	double  yts;
-	double  g;
-	double  rho_ice;
-	double  stokesreconditioning;
+	IssmDouble  yts;
+	IssmDouble  g;
+	IssmDouble  rho_ice;
+	IssmDouble  stokesreconditioning;
 	bool    isstokes,isl1l2,ismacayealpattyn;
    bool    spcpresent=false;
@@ -25,19 +25,19 @@
 	int My,Ny;
 	int Mz,Nz;
-	double *spcvx          = NULL;
-	double *spcvy          = NULL;
-	double *spcvz          = NULL;
-	double *nodeonmacayeal = NULL;
-	double *nodeonpattyn   = NULL;
-	double *nodeonstokes   = NULL;
-	double *nodeonbed      = NULL;
-	double *nodeonicesheet = NULL;
-	double *vertices_type  = NULL;
-	double *surface        = NULL;
-	double *z              = NULL;
-	double *timesx=NULL;
-	double *timesy=NULL;
-	double *timesz=NULL;
-   double* values=NULL;
+	IssmDouble *spcvx          = NULL;
+	IssmDouble *spcvy          = NULL;
+	IssmDouble *spcvz          = NULL;
+	IssmDouble *nodeonmacayeal = NULL;
+	IssmDouble *nodeonpattyn   = NULL;
+	IssmDouble *nodeonstokes   = NULL;
+	IssmDouble *nodeonbed      = NULL;
+	IssmDouble *nodeonicesheet = NULL;
+	IssmDouble *vertices_type  = NULL;
+	IssmDouble *surface        = NULL;
+	IssmDouble *z              = NULL;
+	IssmDouble *timesx=NULL;
+	IssmDouble *timesy=NULL;
+	IssmDouble *timesz=NULL;
+   IssmDouble* values=NULL;
 
 	/*Output*/
@@ -88,5 +88,5 @@
 
 	/*figure out times: */
-	timesx=xNew<double>(Nx);
+	timesx=xNew<IssmDouble>(Nx);
 	for(j=0;j<Nx;j++){
 		timesx[j]=spcvx[(Mx-1)*Nx+j];
@@ -95,5 +95,5 @@
 	UnitConversion(timesx,Nx,ExtToIuEnum,TimeEnum);
 	/*figure out times: */
-	timesy=xNew<double>(Ny);
+	timesy=xNew<IssmDouble>(Ny);
 	for(j=0;j<Ny;j++){
 		timesy[j]=spcvy[(My-1)*Ny+j];
@@ -102,5 +102,5 @@
 	UnitConversion(timesy,Ny,ExtToIuEnum,TimeEnum);
 	/*figure out times: */
-	timesz=xNew<double>(Nz);
+	timesz=xNew<IssmDouble>(Nz);
 	for(j=0;j<Nz;j++){
 		timesz[j]=spcvz[(Mz-1)*Nz+j];
@@ -114,7 +114,7 @@
 
 			/*Start with adding spcs of coupling: zero at the border macayeal/pattyn for the appropriate dofs*/
-			if ((int)vertices_type[i]==MacAyealPattynApproximationEnum){
+			if (reCast<int,IssmDouble>(vertices_type[i]==MacAyealPattynApproximationEnum)){
 				/*If grionmacayeal, spc pattyn dofs: 3 & 4*/
-					if ((int)nodeonpattyn[i]){
+					if (reCast<int,IssmDouble>(nodeonpattyn[i])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 						count++;
@@ -131,5 +131,5 @@
 
 					}
-					else if ((int)nodeonmacayeal[i]){
+					else if (reCast<int,IssmDouble>(nodeonmacayeal[i])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 						count++;
@@ -149,7 +149,7 @@
 			}
 			/*Also add spcs of coupling: zero at the border pattyn/stokes for the appropriate dofs*/
-			else if ((int)vertices_type[i]==PattynStokesApproximationEnum){
+			else if (reCast<int,IssmDouble>(vertices_type[i])==PattynStokesApproximationEnum){
 				/*If grion,pattyn spc stokes dofs: 3 4 & 5*/
-					if ((int)nodeonpattyn[i]){
+					if (reCast<int,IssmDouble>(nodeonpattyn[i])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 						count++;
@@ -168,5 +168,5 @@
 
 					}
-					else if ((int)nodeonstokes[i]){ //spc pattyn nodes: 1 & 2
+					else if (reCast<int,IssmDouble>(nodeonstokes[i])){ //spc pattyn nodes: 1 & 2
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 						count++;
@@ -189,7 +189,7 @@
 			}
 			/*Also add spcs of coupling: zero at the border pattyn/stokes for the appropriate dofs*/
-			else if ((int)vertices_type[i]==MacAyealStokesApproximationEnum){
+			else if (reCast<int,IssmDouble>(vertices_type[i])==MacAyealStokesApproximationEnum){
 				/*If grion,pattyn spc stokes dofs: 3 4 & 5*/
-					if ((int)nodeonmacayeal[i]){
+					if (reCast<int,IssmDouble>(nodeonmacayeal[i])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 						count++;
@@ -208,5 +208,5 @@
 
 					}
-					else if ((int)nodeonstokes[i]){ //spc macayeal nodes: 1 & 2
+					else if (reCast<int,IssmDouble>(nodeonstokes[i])){ //spc macayeal nodes: 1 & 2
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 1 to vx.
 						count++;
@@ -236,5 +236,5 @@
 				else if (Mx==numberofvertices+1) {
 					/*figure out times and values: */
-					values=xNew<double>(Nx);
+					values=xNew<IssmDouble>(Nx);
 					spcpresent=false;
 					for(j=0;j<Nx;j++){
@@ -247,5 +247,5 @@
 						count++;
 					}
-					xDelete<double>(values);
+					xDelete<IssmDouble>(values);
 				}
 				else if (vertices_type[i]==HutterApproximationEnum){
@@ -260,5 +260,5 @@
 				else if (My==numberofvertices+1){
 					/*figure out times and values: */
-					values=xNew<double>(Ny);
+					values=xNew<IssmDouble>(Ny);
 					spcpresent=false;
 					for(j=0;j<Ny;j++){
@@ -270,5 +270,5 @@
 						count++;
 					}
-					xDelete<double>(values);
+					xDelete<IssmDouble>(values);
 				}
 				else if (vertices_type[i]==HutterApproximationEnum){
@@ -277,5 +277,5 @@
 				}
 
-				if ((int)vertices_type[i]==StokesApproximationEnum ||  ((int)vertices_type[i]==NoneApproximationEnum)){
+				if (reCast<int,IssmDouble>(vertices_type[i])==StokesApproximationEnum ||  (reCast<int,IssmDouble>(vertices_type[i])==NoneApproximationEnum)){
 					if (Mz==numberofvertices && !xIsNan<IssmDouble>(spcvz[i])){
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,3,spcvz[i]/yts,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
@@ -284,5 +284,5 @@
 					else if (Mz==numberofvertices+1){
 						/*figure out times and values: */
-						values=xNew<double>(Nz);
+						values=xNew<IssmDouble>(Nz);
 						spcpresent=false;
 						for(j=0;j<Nz;j++){
@@ -294,9 +294,9 @@
 							count++;
 						}
-						xDelete<double>(values);
-					}
-
-				}
-				if ((int)vertices_type[i]==NoneApproximationEnum){
+						xDelete<IssmDouble>(values);
+					}
+
+				}
+				if (reCast<int,IssmDouble>(vertices_type[i])==NoneApproximationEnum){
 					constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,4,g*rho_ice*(surface[i]-z[i])/stokesreconditioning,DiagnosticHorizAnalysisEnum)); //add count'th spc, on node i+1, setting dof 2 to vy
 					count++;
@@ -305,6 +305,6 @@
 
 			/*Constraint at the bedrock interface (v.n = vz = 0) (Coordinates will be updated according to the bed slope)*/
-			if (dim==3) if(nodeonbed[i] && nodeonicesheet[i] && nodeonstokes[i]){
-				 switch((int)vertices_type[i]){
+			if (dim==3) if(reCast<int,IssmDouble>(nodeonbed[i]) && reCast<int,IssmDouble>(nodeonicesheet[i]) && reCast<int,IssmDouble>(nodeonstokes[i])){
+				 switch(reCast<int,IssmDouble>(vertices_type[i])){
 					case MacAyealStokesApproximationEnum:
 						constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,5,0.,DiagnosticHorizAnalysisEnum));
@@ -319,5 +319,5 @@
 						count++;
 						break;
-					default: _error_("Vertex approximation " << EnumToStringx((int)vertices_type[i]) << " not supported");
+					default: _error_("Vertex approximation " << EnumToStringx(reCast<int,IssmDouble>(vertices_type[i])) << " not supported");
 				}
 			}
@@ -326,21 +326,21 @@
 	  
 	/*Free data: */
-	xDelete<double>(spcvx);
-	xDelete<double>(spcvy);
-	xDelete<double>(spcvz);
-	xDelete<double>(nodeonmacayeal);
-	xDelete<double>(nodeonpattyn);
-	xDelete<double>(nodeonstokes);
-	xDelete<double>(nodeonicesheet);
-	xDelete<double>(nodeonbed);
-	xDelete<double>(vertices_type);
-	xDelete<double>(surface);
-	xDelete<double>(z);
+	xDelete<IssmDouble>(spcvx);
+	xDelete<IssmDouble>(spcvy);
+	xDelete<IssmDouble>(spcvz);
+	xDelete<IssmDouble>(nodeonmacayeal);
+	xDelete<IssmDouble>(nodeonpattyn);
+	xDelete<IssmDouble>(nodeonstokes);
+	xDelete<IssmDouble>(nodeonicesheet);
+	xDelete<IssmDouble>(nodeonbed);
+	xDelete<IssmDouble>(vertices_type);
+	xDelete<IssmDouble>(surface);
+	xDelete<IssmDouble>(z);
 
 	/*Free resources:*/
-	xDelete<double>(timesx);
-	xDelete<double>(timesy);
-	xDelete<double>(timesz);
-	xDelete<double>(values);
+	xDelete<IssmDouble>(timesx);
+	xDelete<IssmDouble>(timesy);
+	xDelete<IssmDouble>(timesz);
+	xDelete<IssmDouble>(values);
 
 	/*Assign output pointer: */
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateLoadsDiagnosticHoriz.cpp	(revision 13073)
@@ -29,13 +29,13 @@
 	bool ismacayealpattyn,isstokes,isl1l2;
 	int  numpenalties,numberofpressureloads,numrifts,numriftsegments;
-	double *pressureload   = NULL;
-	double *elements_type  = NULL;
-	double *nodeoniceshelf = NULL;
-	double *riftinfo       = NULL;
-	double *nodeonbed      = NULL;
-	double *nodeonstokes   = NULL;
-	double *nodeonicesheet = NULL;
-	double *vertices_type  = NULL;
-	double *penalties      = NULL;
+	IssmDouble *pressureload   = NULL;
+	IssmDouble *elements_type  = NULL;
+	IssmDouble *nodeoniceshelf = NULL;
+	IssmDouble *riftinfo       = NULL;
+	IssmDouble *nodeonbed      = NULL;
+	IssmDouble *nodeonstokes   = NULL;
+	IssmDouble *nodeonicesheet = NULL;
+	IssmDouble *vertices_type  = NULL;
+	IssmDouble *penalties      = NULL;
 
 	/*Fetch parameters: */
@@ -74,5 +74,5 @@
 		if (dim==2) segment_width=4; 
 		else segment_width=6;
-		element=(int)(*(pressureload+segment_width*i+segment_width-2)-1); //element is in the penultimate column (node1 node2 ... elem fill)
+		element=reCast<int,IssmDouble>(*(pressureload+segment_width*i+segment_width-2)-1); //element is in the penultimate column (node1 node2 ... elem fill)
 
 		/*Now, if this element is not in the partition, pass: */
@@ -80,32 +80,32 @@
 		
 		/*Do not create ice front if Hutter or Stokes elements*/
-		if ((int)*(elements_type+element)==HutterApproximationEnum) continue;
+		if (reCast<int,IssmDouble>(*(elements_type+element))==HutterApproximationEnum) continue;
 
 		/*Create and  add load: */
-		if ((int)*(elements_type+element)==(MacAyealApproximationEnum) && dim==2){
+		if (reCast<int,IssmDouble>(*(elements_type+element))==(MacAyealApproximationEnum) && dim==2){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,MacAyeal2dIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(MacAyealApproximationEnum) && dim==3){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(MacAyealApproximationEnum) && dim==3){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,MacAyeal3dIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(L1L2ApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(L1L2ApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,MacAyeal3dIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(PattynApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(PattynApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,PattynIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(L1L2ApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(L1L2ApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,L1L2IceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(StokesApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(StokesApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,StokesIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(MacAyealPattynApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(MacAyealPattynApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,MacAyeal3dIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
@@ -113,5 +113,5 @@
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(PattynStokesApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(PattynStokesApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,PattynIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
@@ -119,5 +119,5 @@
 			count++;
 		}
-		else if ((int)*(elements_type+element)==(MacAyealStokesApproximationEnum)){
+		else if (reCast<int,IssmDouble>(*(elements_type+element))==(MacAyealStokesApproximationEnum)){
 			loads->AddObject(new Icefront(iomodel->loadcounter+count+1,i,iomodel,MacAyeal3dIceFrontEnum,DiagnosticHorizAnalysisEnum));
 			count++;
@@ -129,6 +129,6 @@
 	/*Free data: */
 	iomodel->DeleteData(3,DiagnosticIcefrontEnum,ThicknessEnum,BedEnum);
-	xDelete<double>(elements_type);
-	xDelete<double>(pressureload);
+	xDelete<IssmDouble>(elements_type);
+	xDelete<IssmDouble>(pressureload);
 
 	/*Create Penpair for penalties: */
@@ -137,5 +137,5 @@
 	for(i=0;i<numpenalties;i++){
 
-		if(iomodel->my_vertices[(int)penalties[2*i+0]-1]){
+		if(iomodel->my_vertices[reCast<int,IssmDouble>(penalties[2*i+0]-1)]){
 
 			/*In debugging mode, check that the second node is in the same cpu*/
@@ -143,6 +143,6 @@
 
 			/*Get node ids*/
-			penpair_ids[0]=iomodel->nodecounter+(int)penalties[2*i+0];
-			penpair_ids[1]=iomodel->nodecounter+(int)penalties[2*i+1];
+			penpair_ids[0]=iomodel->nodecounter+reCast<int,IssmDouble>(penalties[2*i+0]);
+			penpair_ids[1]=iomodel->nodecounter+reCast<int,IssmDouble>(penalties[2*i+1]);
 
 			/*Create Load*/
@@ -153,5 +153,5 @@
 
 	/*free ressources: */
-	xDelete<double>(penalties);
+	xDelete<IssmDouble>(penalties);
 
 	/*Create Riffront loads for rifts: */
@@ -160,5 +160,5 @@
 		iomodel->FetchData(5,RiftsRiftstructEnum,ThicknessEnum,BedEnum,SurfaceEnum,MaskVertexonfloatingiceEnum);
 		for(i=0;i<numriftsegments;i++){
-			if(iomodel->my_elements[(int)*(riftinfo+RIFTINFOSIZE*i+2)-1]){
+			if(iomodel->my_elements[reCast<int,IssmDouble>(*(riftinfo+RIFTINFOSIZE*i+2))-1]){
 				loads->AddObject(new Riftfront(iomodel->loadcounter+count+1,i,iomodel,DiagnosticHorizAnalysisEnum));
 				count++;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHutter/CreateConstraintsDiagnosticHutter.cpp	(revision 13073)
@@ -16,5 +16,5 @@
 	int i;
 	int count;
-	double yts;
+	IssmDouble yts;
 	int    numberofvertices;
 	bool   ishutter;
@@ -51,5 +51,5 @@
 		/*keep only this partition's nodes:*/
 		if((iomodel->my_vertices[i])){
-			if (!(int)iomodel->Data(FlowequationVertexEquationEnum)[i]==HutterApproximationEnum){
+			if (!reCast<int,IssmDouble>(iomodel->Data(FlowequationVertexEquationEnum)[i])==HutterApproximationEnum){
 
 				constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,DiagnosticHutterAnalysisEnum));
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticVert/CreateConstraintsDiagnosticVert.cpp	(revision 13073)
@@ -17,5 +17,5 @@
 	int dim;
 	int count;
-	double yts;
+	IssmDouble yts;
 	int    numberofvertices;
 
@@ -52,5 +52,5 @@
 		if(iomodel->my_vertices[i]){
 
-			if ((int)iomodel->Data(FlowequationBorderstokesEnum)[i]){
+			if (reCast<int,IssmDouble>(iomodel->Data(FlowequationBorderstokesEnum)[i])){
 				constraints->AddObject(new SpcStatic(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,0,DiagnosticVertAnalysisEnum)); //spc to zero as vertical velocity is done in Horiz for Stokes
 				count++;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Enthalpy/CreateConstraintsEnthalpy.cpp	(revision 13073)
@@ -21,6 +21,6 @@
 	int    numberofvertices;
 	bool   spcpresent=false;
-	double heatcapacity;
-	double referencetemperature;
+	IssmDouble heatcapacity;
+	IssmDouble referencetemperature;
 	
 	/*Output*/
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Melting/CreateLoadsMelting.cpp	(revision 13073)
@@ -40,5 +40,5 @@
 	for (i=0;i<numberofvertices;i++){
 		if((iomodel->my_vertices[i]==1)){
-			if (iomodel->Data(MeshVertexonbedEnum)[i]){ 
+			if (reCast<int>(iomodel->Data(MeshVertexonbedEnum)[i])){
 				loads->AddObject(new Pengrid(iomodel->loadcounter+i+1,i,iomodel,MeltingAnalysisEnum));
 			}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/Prognostic/UpdateElementsPrognostic.cpp	(revision 13073)
@@ -23,5 +23,4 @@
 	bool   ispdd;
 	bool   isdelta18o;
-	IssmDouble *size, Delta18oTimeSerie,Delta18oSurfaceTimeSerie ;
 
 	/*Fetch data needed: */
Index: /issm/trunk-jpl/src/c/modules/Orthx/Orthx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/Orthx/Orthx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/Orthx/Orthx.cpp	(revision 13073)
@@ -11,5 +11,5 @@
 
 	/*intermediary:*/
-	double norm_new,norm_old,dot_product;;
+	IssmDouble norm_new,norm_old,dot_product;;
 
 	/*Initialize output*/
Index: /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void RheologyBbarAbsGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
+void RheologyBbarAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/RheologyBbarAbsGradientx/RheologyBbarAbsGradientx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void RheologyBbarAbsGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void RheologyBbarAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp	(revision 13073)
@@ -9,5 +9,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void SetControlInputsFromVectorx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,double* vector){
+void SetControlInputsFromVectorx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,IssmDouble* vector){
 
 	int  num_controls;
@@ -30,5 +30,5 @@
 void SetControlInputsFromVectorx(Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Vector* vector){
 	
-	double* serial_vector=NULL;
+	IssmDouble* serial_vector=NULL;
 
 	serial_vector=vector->ToMPISerial();
@@ -37,4 +37,4 @@
 
 	/*Free ressources:*/
-	xDelete<double>(serial_vector);
+	xDelete<IssmDouble>(serial_vector);
 }
Index: /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.h	(revision 13073)
@@ -10,5 +10,5 @@
 /* local prototypes: */
 void SetControlInputsFromVectorx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,Vector* vector);
-void SetControlInputsFromVectorx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,double* vector);
+void SetControlInputsFromVectorx(Elements* elements,Nodes* nodes, Vertices* vertices,Loads* loads, Materials* materials,  Parameters* parameters,IssmDouble* vector);
 
 #endif 
Index: /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void SurfaceAbsVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
+void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAbsVelMisfitx/SurfaceAbsVelMisfitx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void SurfaceAbsVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void SurfaceAbsVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.cpp	(revision 13073)
@@ -11,5 +11,5 @@
 #include "../SurfaceAreax/SurfaceAreax.h"
 
-void SurfaceAverageVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
+void SurfaceAverageVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
 
 	/*Intermediary*/
@@ -18,6 +18,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute surface area and add to elements inputs */
Index: /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceAverageVelMisfitx/SurfaceAverageVelMisfitx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void SurfaceAverageVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void SurfaceAverageVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void SurfaceLogVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
+void SurfaceLogVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVelMisfitx/SurfaceLogVelMisfitx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void SurfaceLogVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void SurfaceLogVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void SurfaceLogVxVyMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
+void SurfaceLogVxVyMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceLogVxVyMisfitx/SurfaceLogVxVyMisfitx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void SurfaceLogVxVyMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void SurfaceLogVxVyMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void SurfaceRelVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
+void SurfaceRelVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units,int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/SurfaceRelVelMisfitx/SurfaceRelVelMisfitx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void SurfaceRelVelMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void SurfaceRelVelMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/ThicknessAbsGradientx/ThicknessAbsGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAbsGradientx/ThicknessAbsGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAbsGradientx/ThicknessAbsGradientx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ThicknessAbsGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
+void ThicknessAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/ThicknessAbsGradientx/ThicknessAbsGradientx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAbsGradientx/ThicknessAbsGradientx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAbsGradientx/ThicknessAbsGradientx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void ThicknessAbsGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void ThicknessAbsGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ThicknessAbsMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
+void ThicknessAbsMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAbsMisfitx/ThicknessAbsMisfitx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void ThicknessAbsMisfitx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void ThicknessAbsMisfitx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ThicknessAcrossGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
+void ThicknessAcrossGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAcrossGradientx/ThicknessAcrossGradientx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void ThicknessAcrossGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void ThicknessAcrossGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.cpp	(revision 13073)
@@ -10,5 +10,5 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void ThicknessAlongGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
+void ThicknessAlongGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units, int weight_index){
 
 	/*Intermediary*/
@@ -17,6 +17,6 @@
 
 	/*output: */
-	double J=0;
-	double J_sum;
+	IssmDouble J=0;
+	IssmDouble J_sum;
 
 	/*Compute Misfit: */
Index: /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/ThicknessAlongGradientx/ThicknessAlongGradientx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void ThicknessAlongGradientx( double* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
+void ThicknessAlongGradientx( IssmDouble* pJ, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units,int weight_index);
 
 #endif
Index: /issm/trunk-jpl/src/c/modules/TotalSmbx/TotalSmbx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/TotalSmbx/TotalSmbx.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/TotalSmbx/TotalSmbx.cpp	(revision 13073)
@@ -10,8 +10,8 @@
 #include "../../EnumDefinitions/EnumDefinitions.h"
 
-void TotalSmbx(double* pSmb, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
+void TotalSmbx(IssmDouble* pSmb, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials,Parameters* parameters,bool process_units){
 
-	double local_smb = 0;
-	double total_smb;
+	IssmDouble local_smb = 0;
+	IssmDouble total_smb;
 
 	for(int i=0;i<elements->Size();i++){
Index: /issm/trunk-jpl/src/c/modules/TotalSmbx/TotalSmbx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/TotalSmbx/TotalSmbx.h	(revision 13072)
+++ /issm/trunk-jpl/src/c/modules/TotalSmbx/TotalSmbx.h	(revision 13073)
@@ -10,5 +10,5 @@
 
 /* local prototypes: */
-void TotalSmbx(double* pSmb, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
+void TotalSmbx(IssmDouble* pSmb, Elements* elements,Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,bool process_units);
 
 #endif
Index: /issm/trunk-jpl/src/c/solutions/control_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/control_core.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/solutions/control_core.cpp	(revision 13073)
@@ -82,5 +82,5 @@
 		/*Display info*/
 		if(VerboseControl()) _pprintLine_("\n" << "   control method step " << n+1 << "/" << nsteps);
-		for(i=0;i<num_responses;i++) step_responses[i]=(int)responses[n*num_responses+i];
+		for(i=0;i<num_responses;i++) step_responses[i]=reCast<int,IssmDouble>(responses[n*num_responses+i]);
 		femmodel->parameters->SetParam(step_responses,1,num_responses,StepResponsesEnum);
 		
@@ -99,5 +99,5 @@
 
 		if(VerboseControl()) _pprintLine_("   optimizing along gradient direction");
-		optpars.maxiter=(int)maxiter[n]; optpars.cm_jump=cm_jump[n];
+		optpars.maxiter=reCast<int,IssmDouble>(maxiter[n]); optpars.cm_jump=cm_jump[n];
 		BrentSearch(&search_scalar,J+n,&optpars,&objectivefunction,&optargs);
 
Index: /issm/trunk-jpl/src/c/solutions/hydrology_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/hydrology_core.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/solutions/hydrology_core.cpp	(revision 13073)
@@ -39,5 +39,5 @@
 		nsteps=1;
 	}
-	else nsteps=(int)((final_time-starttime)/dt);
+	else nsteps=reCast<int,IssmDouble>((final_time-starttime)/dt);
 	time=starttime;
 
Index: /issm/trunk-jpl/src/c/solutions/issm.cpp
===================================================================
--- /issm/trunk-jpl/src/c/solutions/issm.cpp	(revision 13072)
+++ /issm/trunk-jpl/src/c/solutions/issm.cpp	(revision 13073)
@@ -15,5 +15,5 @@
 
 	/*AD: */
-	size_t   tape_stats[11];
+	int   tape_stats[11];
 
 	/*FemModel: */
