Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Container/Observations.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Container/Observations.cpp	(revision 13260)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/Container/Observations.cpp	(revision 13261)
@@ -35,14 +35,14 @@
 	return;
 }
 /*}}}*/
-/*FUNCTION Observations::Observations(IssmDouble* observations_list,IssmDouble* x,IssmDouble* y,int n,Options* options){{{*/
-Observations::Observations(IssmDouble* observations_list,IssmDouble* x,IssmDouble* y,int n,Options* options){
+/*FUNCTION Observations::Observations(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){{{*/
+Observations::Observations(IssmPDouble* observations_list,IssmPDouble* x,IssmPDouble* y,int n,Options* options){
 
 	/*Intermediaries*/
 	int          i,j,maxdepth,level,counter,index;
 	int          xi,yi;
-	IssmDouble       xmin,xmax,ymin,ymax;
-	IssmDouble       offset,minlength,minspacing,mintrimming,maxtrimming;
+	IssmPDouble       xmin,xmax,ymin,ymax;
+	IssmPDouble       offset,minlength,minspacing,mintrimming,maxtrimming;
 	Observation *observation = NULL;
 
 	/*Get extrema*/
@@ -65,11 +65,11 @@
 	if(options->GetOption("boxlength")){
 		options->Get(&minlength,"boxlength");
 		if(minlength<=0)_error_("boxlength should be a positive number");
-		maxdepth=reCast<int,IssmDouble>(log(max(xmax-xmin,ymax-ymin)/minlength +1)/log(2.0));
+		maxdepth=reCast<int,IssmPDouble>(log(max(xmax-xmin,ymax-ymin)/minlength +1)/log(2.0));
 	}
 	else{
 		maxdepth = 30;
-		minlength=max(xmax-xmin,ymax-ymin)/IssmDouble((1L<<maxdepth)-1);
+		minlength=max(xmax-xmin,ymax-ymin)/IssmPDouble((1L<<maxdepth)-1);
 	}
 
 	/*Initialize Quadtree*/
@@ -117,12 +117,12 @@
 
 /*Methods*/
 /*FUNCTION Observations::ClosestObservation{{{*/
-void Observations::ClosestObservation(IssmDouble *px,IssmDouble *py,IssmDouble *pobs,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius){
+void Observations::ClosestObservation(IssmPDouble *px,IssmPDouble *py,IssmPDouble *pobs,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius){
 
 	/*Output and Intermediaries*/
 	bool         stop;
 	int          nobs,i,index;
-	IssmDouble       h2,hmin2,radius2;
+	IssmPDouble  h2,hmin2,radius2;
 	int         *indices      = NULL;
 	Observation *observation  = NULL;
 
@@ -165,19 +165,19 @@
 	xDelete<int>(indices);
 
 }/*}}}*/
-/*FUNCTION Observations::ObservationList(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius,int maxdata){{{*/
-void Observations::ObservationList(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius,int maxdata){
+/*FUNCTION Observations::ObservationList(IssmPDouble **px,IssmPDouble **py,IssmPDouble **pobs,int* pnobs,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius,int maxdata){{{*/
+void Observations::ObservationList(IssmPDouble **px,IssmPDouble **py,IssmPDouble **pobs,int* pnobs,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius,int maxdata){
 
 	/*Output and Intermediaries*/
 	bool         stop;
 	int          nobs,tempnobs,i,j,k,n,counter;
-	IssmDouble       h2,radius2;
+	IssmPDouble  h2,radius2;
 	int         *indices      = NULL;
 	int         *tempindices  = NULL;
-	IssmDouble      *dists        = NULL;
-	IssmDouble      *x            = NULL;
-	IssmDouble      *y            = NULL;
-	IssmDouble      *obs          = NULL;
+	IssmPDouble *dists        = NULL;
+	IssmPDouble *x            = NULL;
+	IssmPDouble *y            = NULL;
+	IssmPDouble *obs          = NULL;
 	Observation *observation  = NULL;
 
 	/*If radius is not provided or is 0, return all observations*/
@@ -190,7 +190,7 @@
 	this->quadtree->RangeSearch(&tempindices,&tempnobs,x_interp,y_interp,radius);
 	if(tempnobs){
 		indices = xNew<int>(tempnobs);
-		dists   = xNew<IssmDouble>(tempnobs);
+		dists   = xNew<IssmPDouble>(tempnobs);
 	}
 	nobs = 0;
 	for (i=0;i<tempnobs;i++){
@@ -225,14 +225,14 @@
 			if(stop) break;
 		}
 	}  
-	xDelete<IssmDouble>(dists);
+	xDelete<IssmPDouble>(dists);
 	xDelete<int>(tempindices);
 
 	if(nobs){
 		/*Allocate vectors*/
-		x   = xNew<IssmDouble>(nobs);
-		y   = xNew<IssmDouble>(nobs);
-		obs = xNew<IssmDouble>(nobs);
+		x   = xNew<IssmPDouble>(nobs);
+		y   = xNew<IssmPDouble>(nobs);
+		obs = xNew<IssmPDouble>(nobs);
 
 		/*Loop over all observations and fill in x, y and obs*/
 		for (i=0;i<nobs;i++){
@@ -248,22 +248,22 @@
 	*pobs=obs;
 	*pnobs=nobs;
 }/*}}}*/
-/*FUNCTION Observations::ObservationList(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs){{{*/
-void Observations::ObservationList(IssmDouble **px,IssmDouble **py,IssmDouble **pobs,int* pnobs){
+/*FUNCTION Observations::ObservationList(IssmPDouble **px,IssmPDouble **py,IssmPDouble **pobs,int* pnobs){{{*/
+void Observations::ObservationList(IssmPDouble **px,IssmPDouble **py,IssmPDouble **pobs,int* pnobs){
 
 	/*Output and Intermediaries*/
 	int          nobs;
-	IssmDouble      *x            = NULL;
-	IssmDouble      *y            = NULL;
-	IssmDouble      *obs          = NULL;
+	IssmPDouble *x            = NULL;
+	IssmPDouble *y            = NULL;
+	IssmPDouble *obs          = NULL;
 	Observation *observation  = NULL;
 
 	nobs = this->Size();
 
 	if(nobs){
-		x   = xNew<IssmDouble>(nobs);
-		y   = xNew<IssmDouble>(nobs);
-		obs = xNew<IssmDouble>(nobs);
+		x   = xNew<IssmPDouble>(nobs);
+		y   = xNew<IssmPDouble>(nobs);
+		obs = xNew<IssmPDouble>(nobs);
 		for(int i=0;i<this->Size();i++){
 			observation=(Observation*)this->GetObjectByOffset(i);
 			observation->WriteXYObs(&x[i],&y[i],&obs[i]);
@@ -277,15 +277,15 @@
 	*pnobs=nobs;
 }/*}}}*/
 /*FUNCTION Observations::InterpolationIDW{{{*/
-void Observations::InterpolationIDW(IssmDouble *pprediction,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius,int mindata,int maxdata,IssmDouble power){
+void Observations::InterpolationIDW(IssmPDouble *pprediction,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius,int mindata,int maxdata,IssmPDouble power){
 
 	/*Intermediaries*/
-	int    i,n_obs;
-	IssmDouble prediction;
-	IssmDouble numerator,denominator,h,weight;
-	IssmDouble *x   = NULL;
-	IssmDouble *y   = NULL;
-	IssmDouble *obs = NULL;
+	int         i,n_obs;
+	IssmPDouble prediction;
+	IssmPDouble numerator,denominator,h,weight;
+	IssmPDouble *x   = NULL;
+	IssmPDouble *y   = NULL;
+	IssmPDouble *obs = NULL;
 
 	/*Some checks*/
 	_assert_(maxdata>0);
@@ -321,26 +321,26 @@
 
 	/*clean-up*/
 	*pprediction = prediction;
-	xDelete<IssmDouble>(x);
-	xDelete<IssmDouble>(y);
-	xDelete<IssmDouble>(obs);
+	xDelete<IssmPDouble>(x);
+	xDelete<IssmPDouble>(y);
+	xDelete<IssmPDouble>(obs);
 }/*}}}*/
 /*FUNCTION Observations::InterpolationKriging{{{*/
-void Observations::InterpolationKriging(IssmDouble *pprediction,IssmDouble *perror,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius,int mindata,int maxdata,Variogram* variogram){
+void Observations::InterpolationKriging(IssmPDouble *pprediction,IssmPDouble *perror,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius,int mindata,int maxdata,Variogram* variogram){
 
 	/*Intermediaries*/
 	int           i,j,n_obs;
-	IssmDouble        prediction,error;
-	IssmDouble        numerator,denominator,ratio;
-	IssmDouble       *x            = NULL;
-	IssmDouble       *y            = NULL;
-	IssmDouble       *obs          = NULL;
-	IssmDouble       *Gamma        = NULL;
-	IssmDouble       *GinvG0       = NULL;
-	IssmDouble       *Ginv1        = NULL;
-	IssmDouble       *GinvZ        = NULL;
-	IssmDouble       *gamma0       = NULL;
-	IssmDouble       *ones         = NULL;
+	IssmPDouble   prediction,error;
+	IssmPDouble   numerator,denominator,ratio;
+	IssmPDouble  *x            = NULL;
+	IssmPDouble  *y            = NULL;
+	IssmPDouble  *obs          = NULL;
+	IssmPDouble  *Gamma        = NULL;
+	IssmPDouble  *GinvG0       = NULL;
+	IssmPDouble  *Ginv1        = NULL;
+	IssmPDouble  *GinvZ        = NULL;
+	IssmPDouble  *gamma0       = NULL;
+	IssmPDouble  *ones         = NULL;
 
 	/*Some checks*/
 	_assert_(mindata>0 && maxdata>0);
@@ -360,9 +360,9 @@
 	}
 
 	/*Allocate intermediary matrix and vectors*/
-	Gamma  = xNew<IssmDouble>(n_obs*n_obs);
-	gamma0 = xNew<IssmDouble>(n_obs);
-	ones   = xNew<IssmDouble>(n_obs);
+	Gamma  = xNew<IssmPDouble>(n_obs*n_obs);
+	gamma0 = xNew<IssmPDouble>(n_obs);
+	ones   = xNew<IssmPDouble>(n_obs);
 
 	/*First: Create semivariogram matrix for observations*/
 	for(i=0;i<n_obs;i++){
@@ -401,22 +401,22 @@
 	/*clean-up*/
 	*pprediction = prediction;
 	*perror = error;
-	xDelete<IssmDouble>(x);
-	xDelete<IssmDouble>(y);
-	xDelete<IssmDouble>(obs);
-	xDelete<IssmDouble>(Gamma);
-	xDelete<IssmDouble>(gamma0);
-	xDelete<IssmDouble>(ones);
-	xDelete<IssmDouble>(GinvG0);
-	xDelete<IssmDouble>(Ginv1);
-	xDelete<IssmDouble>(GinvZ);
+	xDelete<IssmPDouble>(x);
+	xDelete<IssmPDouble>(y);
+	xDelete<IssmPDouble>(obs);
+	xDelete<IssmPDouble>(Gamma);
+	xDelete<IssmPDouble>(gamma0);
+	xDelete<IssmPDouble>(ones);
+	xDelete<IssmPDouble>(GinvG0);
+	xDelete<IssmPDouble>(Ginv1);
+	xDelete<IssmPDouble>(GinvZ);
 
 }/*}}}*/
 /*FUNCTION Observations::InterpolationNearestNeighbor{{{*/
-void Observations::InterpolationNearestNeighbor(IssmDouble *pprediction,IssmDouble x_interp,IssmDouble y_interp,IssmDouble radius){
+void Observations::InterpolationNearestNeighbor(IssmPDouble *pprediction,IssmPDouble x_interp,IssmPDouble y_interp,IssmPDouble radius){
 
 	/*Intermediaries*/
-	IssmDouble        x,y,obs;
+	IssmPDouble x,y,obs;
 
 	/*Get clostest observation*/
 	this->ClosestObservation(&x,&y,&obs,x_interp,y_interp,radius);
@@ -425,27 +425,27 @@
 	*pprediction = obs;
 }/*}}}*/
 /*FUNCTION Observations::QuadtreeColoring{{{*/
-void Observations::QuadtreeColoring(IssmDouble* A,IssmDouble *x,IssmDouble *y,int n){
+void Observations::QuadtreeColoring(IssmPDouble* A,IssmPDouble *x,IssmPDouble *y,int n){
 
 	int xi,yi,level;
 
 	for(int i=0;i<n;i++){
 		this->quadtree->IntergerCoordinates(&xi,&yi,x[i],y[i]);
 		this->quadtree->QuadtreeDepth(&level,xi,yi);
-		A[i]=(IssmDouble)level;
+		A[i]=(IssmPDouble)level;
 	}
 
 }/*}}}*/
 /*FUNCTION Observations::Variomap{{{*/
-void Observations::Variomap(IssmDouble* gamma,IssmDouble *x,int n){
+void Observations::Variomap(IssmPDouble* gamma,IssmPDouble *x,int n){
 
 	/*Output and Intermediaries*/
 	int          i,j,k;
-	IssmDouble       distance;
+	IssmPDouble  distance;
 	Observation *observation1 = NULL;
 	Observation *observation2 = NULL;
 
-	IssmDouble *counter = xNew<IssmDouble>(n);
+	IssmPDouble *counter = xNew<IssmPDouble>(n);
 	for(j=0;j<n;j++) counter[j] = 0.0;
 	for(j=0;j<n;j++) gamma[j]   = 0.0;
 
@@ -474,5 +474,5 @@
 	}
 
 	/*Assign output pointer*/
-	xDelete<IssmDouble>(counter);
+	xDelete<IssmPDouble>(counter);
 }/*}}}*/
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/Solverx/Solverx.h
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/Solverx/Solverx.h	(revision 13260)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/Solverx/Solverx.h	(revision 13261)
@@ -23,6 +23,7 @@
 #endif
 
 void SolverxSeq(SeqVec<IssmDouble>** puf,SeqMat<IssmDouble>* Kff, SeqVec<IssmDouble>* pf,Parameters* parameters);
+void SolverxSeq(IssmPDouble **pX, IssmPDouble *A, IssmPDouble *B,int n);
 void SolverxSeq(IssmPDouble *X, IssmPDouble *A, IssmPDouble *B,int n);
 
 #ifdef _HAVE_ADOLC_
Index: /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/Solverx/SolverxSeq.cpp
===================================================================
--- /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/Solverx/SolverxSeq.cpp	(revision 13260)
+++ /u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/modules/Solverx/SolverxSeq.cpp	(revision 13261)
@@ -51,21 +51,32 @@
 	#endif
 
 }/*}}}*/
+void SolverxSeq(IssmPDouble **pX, IssmPDouble *A, IssmPDouble *B,int n){ /*{{{*/
+
+	/*Allocate output*/
+	double* X = xNew<double>(n); 
+
+	/*Solve*/
+	SolverxSeq(X,A,B,n);
+
+	/*Assign output pointer*/
+	*pX=X;
+}
+/*}}}*/
+
 #ifdef _HAVE_ADOLC_
-
-int EDF_for_solverx(int n, IssmPDouble *x, int m, IssmPDouble *y) {
+int EDF_for_solverx(int n, IssmPDouble *x, int m, IssmPDouble *y){/*{{{*/
     if(m*(m+1)!=n)_error_("Stiffness matrix should be square!");
     SolverxSeq(y,x, x+m*m, m);
     return 0;
-}
-
-void SolverxSeq(IssmDouble *X,IssmDouble *A,IssmDouble *B,int n, Parameters* parameters){//{{{
+}/*}}}*/
+void SolverxSeq(IssmDouble *X,IssmDouble *A,IssmDouble *B,int n, Parameters* parameters){/*{{{*/
 	// pack inputs to conform to the EDF-prescribed interface
-        IssmDouble*  adoubleEDFin=xNew<IssmDouble>(n*(n+1)); // packed inputs, i.e. matrix and right hand side
-        for(int i=0; i<n*n;i++)adoubleEDFin[i]    =A[i]; // pack matrix
-        for(int i=0; i<n;  i++)adoubleEDFin[i+n*n]=B[i]; // pack the right hand side
+        IssmDouble*  adoubleEDFin=xNew<IssmDouble>(n*(n+1));  // packed inputs, i.e. matrix and right hand side
+        for(int i=0; i<n*n;i++)adoubleEDFin[i]    =A[i];      // pack matrix
+        for(int i=0; i<n;  i++)adoubleEDFin[i+n*n]=B[i];      // pack the right hand side
         IssmPDouble* pdoubleEDFin=xNew<IssmPDouble>(n*(n+1)); // provide space to transfer inputs during call_ext_fct
-	IssmPDouble* pdoubleEDFout=xNew<IssmPDouble>(n);       // provide space to transfer outputs during call_ext_fct
+	IssmPDouble* pdoubleEDFout=xNew<IssmPDouble>(n);           // provide space to transfer outputs during call_ext_fct
 	// call the wrapped solver through the registry entry we retrieve from parameters
 	call_ext_fct(dynamic_cast<GenericParam<Adolc_edf> * >(parameters->FindParamObject(AdolcParamEnum))->GetParameterValue().myEDF_for_solverx_p,
 	             n*(n+1), pdoubleEDFin, adoubleEDFin,
@@ -76,8 +87,8 @@
 }
 /*}}}*/
 #endif
-void SolverxSeq(IssmPDouble * X, IssmPDouble * A, IssmPDouble * B,int n){ //{{{
-	#ifdef _HAVE_GSL_
+void SolverxSeq(IssmPDouble *X, IssmPDouble *A, IssmPDouble *B,int n){ /*{{{*/
+#ifdef _HAVE_GSL_
 	/*GSL Matrices and vectors: */
 	int              s;
 	gsl_matrix_view  a;
@@ -108,6 +119,6 @@
 	xDelete(Acopy);
 	gsl_permutation_free(p);
 	gsl_vector_free(x);
-	#endif
+#endif
 }
 /*}}}*/
