Changeset 12422


Ignore:
Timestamp:
06/15/12 12:13:38 (13 years ago)
Author:
Mathieu Morlighem
Message:

Simpler kriging

Location:
issm/trunk-jpl/src/c
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/Container/Observations.cpp

    r12419 r12422  
    276276        *pnobs=nobs;
    277277}/*}}}*/
     278/*FUNCTION Observations::InterpolationIDW{{{*/
     279void Observations::InterpolationIDW(double *pprediction,double x_interp,double y_interp,double radius,int mindata,int maxdata,double power){
     280
     281        /*Intermediaries*/
     282        int    i,n_obs;
     283        double prediction;
     284        double numerator,denominator,h,weight;
     285        double *x   = NULL;
     286        double *y   = NULL;
     287        double *obs = NULL;
     288
     289        /*Some checks*/
     290        _assert_(maxdata>0);
     291        _assert_(pprediction);
     292        _assert_(power>0);
     293
     294        /*If radius is not provided or is 0, return all observations*/
     295        if(radius==0) radius=this->quadtree->root->length;
     296
     297        /*Get list of observations for current point*/
     298        this->ObservationList(&x,&y,&obs,&n_obs,x_interp,y_interp,radius,maxdata);
     299
     300        /*If we have less observations than mindata, return UNDEF*/
     301        if(n_obs<mindata){
     302                prediction = UNDEF;
     303        }
     304        else{
     305                numerator   = 0.;
     306                denominator = 0.;
     307                for(i=0;i<n_obs;i++){
     308                        h = sqrt( (x[i]-x_interp)*(x[i]-x_interp) + (y[i]-y_interp)*(y[i]-y_interp));
     309                        if (h<0.0000001){
     310                                numerator   = obs[i];
     311                                denominator = 1.;
     312                                break;
     313                        }
     314                        weight = 1./pow(h,power);
     315                        numerator   += weight*obs[i];
     316                        denominator += weight;
     317                }
     318                prediction = numerator/denominator;
     319        }
     320
     321        /*clean-up*/
     322        *pprediction = prediction;
     323        xfree((void**)&x);
     324        xfree((void**)&y);
     325        xfree((void**)&obs);
     326}/*}}}*/
    278327/*FUNCTION Observations::InterpolationKriging{{{*/
    279328void Observations::InterpolationKriging(double *pprediction,double *perror,double x_interp,double y_interp,double radius,int mindata,int maxdata,Variogram* variogram){
     
    363412
    364413}/*}}}*/
     414/*FUNCTION Observations::InterpolationNearestNeighbor{{{*/
     415void Observations::InterpolationNearestNeighbor(double *pprediction,double x_interp,double y_interp,double radius){
     416
     417        /*Intermediaries*/
     418        double        x,y,obs;
     419
     420        /*Get clostest observation*/
     421        this->ClosestObservation(&x,&y,&obs,x_interp,y_interp,radius);
     422
     423        /*Assign output pointer*/
     424        *pprediction = obs;
     425}/*}}}*/
    365426/*FUNCTION Observations::QuadtreeColoring{{{*/
    366427void Observations::QuadtreeColoring(double* A,double *x,double *y,int n){
  • issm/trunk-jpl/src/c/Container/Observations.h

    r12419 r12422  
    2525                /*Methods*/
    2626                void ClosestObservation(double *px,double *py,double *pobs,double x_interp,double y_interp,double radius);
     27                void InterpolationIDW(double *pprediction,double x_interp,double y_interp,double radius,int mindata,int maxdata,double power);
    2728                void InterpolationKriging(double *pprediction,double *perror,double x_interp,double y_interp,double radius,int mindata,int maxdata,Variogram* variogram);
     29                void InterpolationNearestNeighbor(double *pprediction,double x_interp,double y_interp,double radius);
    2830                void ObservationList(double **px,double **py,double **pobs,int* pnobs);
    2931                void ObservationList(double **px,double **py,double **pobs,int* pnobs,double x_interp,double y_interp,double radius,int maxdata);
  • issm/trunk-jpl/src/c/modules/Krigingx/Krigingx.cpp

    r12421 r12422  
    228228
    229229        /*Intermediaries*/
    230         int           i,j,n_obs;
    231         double        x,y,obs;
     230        int           i;
    232231        double        localpercent;
    233232
     
    242241                printf("\r      interpolation progress: %5.2lf%%",localpercent);
    243242
    244                 /*Get closest observation to current point*/
    245                 observations->ClosestObservation(&x,&y,&obs,x_interp[idx],y_interp[idx],radius);
    246                 predictions[idx] = obs;
     243                observations->InterpolationNearestNeighbor(&predictions[idx],x_interp[idx],y_interp[idx],radius);
    247244        }
    248245
     
    279276
    280277        /*Intermediaries*/
    281         int           i,j,n_obs;
    282         double        localpercent;
    283         double        numerator,denominator,h,weight;
    284         double *x     = NULL;
    285         double *y     = NULL;
    286         double *obs   = NULL;
     278        double localpercent;
    287279        double  power = 2.;
    288280
     
    294286                percent[my_thread]=double(idx-i0)/double(i1-i0)*100.;
    295287                localpercent=percent[0];
    296                 for(i=1;i<num_threads;i++) localpercent=min(localpercent,percent[i]);
     288                for(int i=1;i<num_threads;i++) localpercent=min(localpercent,percent[i]);
    297289                printf("\r      interpolation progress: %5.2lf%%",localpercent);
    298290
    299                 /*Get closest observation to current point*/
    300                 observations->ObservationList(&x,&y,&obs,&n_obs,x_interp[idx],y_interp[idx],radius,maxdata);
    301                 if(n_obs){
    302                         numerator   = 0;
    303                         denominator = 0;
    304                         for(j=0;j<n_obs;j++){
    305                                 h      = sqrt( (x[j]-x_interp[idx])*(x[j]-x_interp[idx]) + (y[j]-y_interp[idx])*(y[j]-y_interp[idx]));
    306                                 weight = 1./pow(h,power);
    307                                 numerator   += weight*obs[j];
    308                                 denominator += weight;
    309                         }
    310                         predictions[idx] = numerator/denominator;
    311                 }
    312                 else{
    313                         predictions[idx] = UNDEF;
    314                 }
    315         }
    316 
     291                observations->InterpolationIDW(&predictions[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata,power);
     292        }
    317293        return NULL;
    318294}/*}}}*/
  • issm/trunk-jpl/src/c/modules/Krigingx/pKrigingx.cpp

    r12421 r12422  
    99#include "../../objects/objects.h"
    1010#include "../../Container/Container.h"
    11 #include "../modules.h"
    12 
    13 #ifdef _HAVE_GSL_
    14 #include <gsl/gsl_linalg.h>
    15 #endif
     11#include "../../io/io.h"
    1612
    1713/*FUNCTION pKrigingx{{{*/
     
    3228        Observations *observations = NULL;
    3329
    34         /*Get Variogram from Options*/
    35         ProcessVariogram(&variogram,options);
     30        /*Get some Options*/
    3631        options->Get(&radius,"searchradius",0.);
    3732        options->Get(&mindata,"mindata",1);
     
    5651        else if(strcmp(output,"prediction")==0){
    5752
     53                /*Process Variogram*/
     54                ProcessVariogram(&variogram,options);
     55
    5856                /*partition loop across threads: */
    5957                for(int idx=my_rank;idx<n_interp;idx+=num_procs){
     
    7270#endif
    7371        }
     72        else if(strcmp(output,"nearestneighbor")==0){
     73
     74                /*partition loop across threads: */
     75                for(int idx=my_rank;idx<n_interp;idx+=num_procs){
     76                        _printf_(true,"\r      interpolation progress: %5.2lf%%",double(idx)/double(n_interp)*100);
     77                        observations->InterpolationNearestNeighbor(&predictions[idx],x_interp[idx],y_interp[idx],radius);
     78                }
     79                _printf_(true,"\r      interpolation progress: %5.2lf%%\n",100.);
     80
     81#ifdef _HAVE_MPI_
     82                double *sumpredictions =(double*)xmalloc(n_interp*sizeof(double));
     83                MPI_Allreduce(predictions,sumpredictions,n_interp,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
     84                xfree((void**)&predictions); predictions=sumpredictions;
     85#endif
     86        }
     87        else if(strcmp(output,"idw")==0){
     88                double power;
     89                options->Get(&power,"power",2.);
     90
     91                /*partition loop across threads: */
     92                for(int idx=my_rank;idx<n_interp;idx+=num_procs){
     93                        _printf_(true,"\r      interpolation progress: %5.2lf%%",double(idx)/double(n_interp)*100);
     94                        observations->InterpolationIDW(&predictions[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata,power);
     95                }
     96                _printf_(true,"\r      interpolation progress: %5.2lf%%\n",100.);
     97
     98#ifdef _HAVE_MPI_
     99                double *sumpredictions =(double*)xmalloc(n_interp*sizeof(double));
     100                MPI_Allreduce(predictions,sumpredictions,n_interp,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
     101                xfree((void**)&predictions); predictions=sumpredictions;
     102#endif
     103        }
    74104        else{
    75105                _error_("output '%s' not supported yet",output);
    76106        }
    77         _printf_(true,"\r      interpolation progress: %5.2lf%%\n",100.);
    78107
    79108        /*clean-up and Assign output pointer*/
     
    105134        *pvariogram = variogram;
    106135}/*}}}*/
    107 void GslSolve(double** pX,double* A,double* B,int n){/*{{{*/
    108 #ifdef _HAVE_GSL_
    109 
    110                 /*GSL Matrices and vectors: */
    111                 int              s;
    112                 gsl_matrix_view  a;
    113                 gsl_vector_view  b;
    114                 gsl_vector      *x = NULL;
    115                 gsl_permutation *p = NULL;
    116 
    117                 /*A will be modified by LU decomposition. Use copy*/
    118                 double* Acopy = (double*)xmalloc(n*n*sizeof(double));
    119                 memcpy(Acopy,A,n*n*sizeof(double));
    120 
    121                 /*Initialize gsl matrices and vectors: */
    122                 a = gsl_matrix_view_array (Acopy,n,n);
    123                 b = gsl_vector_view_array (B,n);
    124                 x = gsl_vector_alloc (n);
    125 
    126                 /*Run LU and solve: */
    127                 p = gsl_permutation_alloc (n);
    128                 gsl_linalg_LU_decomp (&a.matrix, p, &s);
    129                 gsl_linalg_LU_solve (&a.matrix, p, &b.vector, x);
    130 
    131                 //printf ("x = \n");
    132                 //gsl_vector_fprintf (stdout, x, "%g");
    133 
    134                 /*Copy result*/
    135                 double* X = (double*)xmalloc(n*sizeof(double));
    136                 memcpy(X,gsl_vector_ptr(x,0),n*sizeof(double));
    137 
    138                 /*Clean up and assign output pointer*/
    139                 xfree((void**)&Acopy);
    140                 gsl_permutation_free(p);
    141                 gsl_vector_free(x);
    142                 *pX=X;
    143 #else
    144                 _error_("GSL support required");
    145 #endif
    146         }/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.