Changeset 12422
- Timestamp:
- 06/15/12 12:13:38 (13 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Container/Observations.cpp
r12419 r12422 276 276 *pnobs=nobs; 277 277 }/*}}}*/ 278 /*FUNCTION Observations::InterpolationIDW{{{*/ 279 void 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 }/*}}}*/ 278 327 /*FUNCTION Observations::InterpolationKriging{{{*/ 279 328 void Observations::InterpolationKriging(double *pprediction,double *perror,double x_interp,double y_interp,double radius,int mindata,int maxdata,Variogram* variogram){ … … 363 412 364 413 }/*}}}*/ 414 /*FUNCTION Observations::InterpolationNearestNeighbor{{{*/ 415 void 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 }/*}}}*/ 365 426 /*FUNCTION Observations::QuadtreeColoring{{{*/ 366 427 void Observations::QuadtreeColoring(double* A,double *x,double *y,int n){ -
issm/trunk-jpl/src/c/Container/Observations.h
r12419 r12422 25 25 /*Methods*/ 26 26 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); 27 28 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); 28 30 void ObservationList(double **px,double **py,double **pobs,int* pnobs); 29 31 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 228 228 229 229 /*Intermediaries*/ 230 int i,j,n_obs; 231 double x,y,obs; 230 int i; 232 231 double localpercent; 233 232 … … 242 241 printf("\r interpolation progress: %5.2lf%%",localpercent); 243 242 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); 247 244 } 248 245 … … 279 276 280 277 /*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; 287 279 double power = 2.; 288 280 … … 294 286 percent[my_thread]=double(idx-i0)/double(i1-i0)*100.; 295 287 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]); 297 289 printf("\r interpolation progress: %5.2lf%%",localpercent); 298 290 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 } 317 293 return NULL; 318 294 }/*}}}*/ -
issm/trunk-jpl/src/c/modules/Krigingx/pKrigingx.cpp
r12421 r12422 9 9 #include "../../objects/objects.h" 10 10 #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" 16 12 17 13 /*FUNCTION pKrigingx{{{*/ … … 32 28 Observations *observations = NULL; 33 29 34 /*Get Variogram from Options*/ 35 ProcessVariogram(&variogram,options); 30 /*Get some Options*/ 36 31 options->Get(&radius,"searchradius",0.); 37 32 options->Get(&mindata,"mindata",1); … … 56 51 else if(strcmp(output,"prediction")==0){ 57 52 53 /*Process Variogram*/ 54 ProcessVariogram(&variogram,options); 55 58 56 /*partition loop across threads: */ 59 57 for(int idx=my_rank;idx<n_interp;idx+=num_procs){ … … 72 70 #endif 73 71 } 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 } 74 104 else{ 75 105 _error_("output '%s' not supported yet",output); 76 106 } 77 _printf_(true,"\r interpolation progress: %5.2lf%%\n",100.);78 107 79 108 /*clean-up and Assign output pointer*/ … … 105 134 *pvariogram = variogram; 106 135 }/*}}}*/ 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 #else144 _error_("GSL support required");145 #endif146 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.