Changeset 12421
- Timestamp:
- 06/15/12 11:48:36 (13 years ago)
- Location:
- issm/trunk-jpl/src/c/modules/Krigingx
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/modules/Krigingx/Krigingx.cpp ¶
r12377 r12421 56 56 observations->Variomap(predictions,x_interp,n_interp); 57 57 } 58 else if(strcmp(output,"prediction")==0){ 59 58 else if(strcmp(output,"delaunay")==0){ 59 int nobs,nel; 60 double *x = NULL; 61 double *y = NULL; 62 double *data = NULL; 63 int *index = NULL; 64 double *indexd= NULL; 65 66 observations->ObservationList(&x,&y,&data,&nobs); 67 68 printf("Generation Delaunay Triangulation\n"); 69 BamgTriangulatex(&index,&nel,x,y,nobs); 70 indexd =(double*)xcalloc(nel*3,sizeof(double)); 71 for(int i=0;i<nel*3;i++) indexd[i]=(double)index[i]; 72 xfree((void**)&index); 73 74 printf("Interpolating\n"); 75 xfree((void**)&predictions); 76 InterpFromMeshToMesh2dx(&predictions,indexd,x,y,nobs,nel,data,nobs,1,x_interp,y_interp,n_interp,NULL,0,new DataSet()); 77 xfree((void**)&x); 78 xfree((void**)&y); 79 xfree((void**)&index); 80 xfree((void**)&data); 81 } 82 else if(strcmp(output,"nearestneighbor")==0){ 60 83 /*initialize thread parameters: */ 61 84 gate.n_interp = n_interp; … … 72 95 73 96 /*launch the thread manager with Krigingxt as a core: */ 97 LaunchThread(NearestNeighbort,(void*)&gate,num); 98 printf("\r interpolation progress: 100.00%%\n"); 99 xfree((void**)&gate.percent); 100 } 101 else if(strcmp(output,"idw")==0){ //Inverse distance weighting 102 /*initialize thread parameters: */ 103 gate.n_interp = n_interp; 104 gate.x_interp = x_interp; 105 gate.y_interp = y_interp; 106 gate.radius = radius; 107 gate.mindata = mindata; 108 gate.maxdata = maxdata; 109 gate.variogram = variogram; 110 gate.observations = observations; 111 gate.predictions = predictions; 112 gate.error = error; 113 gate.percent = (double*)xcalloc(num,sizeof(double)); 114 115 /*launch the thread manager with Krigingxt as a core: */ 116 LaunchThread(idwt,(void*)&gate,num); 117 printf("\r interpolation progress: 100.00%%\n"); 118 xfree((void**)&gate.percent); 119 } 120 else if(strcmp(output,"prediction")==0){ 121 122 /*initialize thread parameters: */ 123 gate.n_interp = n_interp; 124 gate.x_interp = x_interp; 125 gate.y_interp = y_interp; 126 gate.radius = radius; 127 gate.mindata = mindata; 128 gate.maxdata = maxdata; 129 gate.variogram = variogram; 130 gate.observations = observations; 131 gate.predictions = predictions; 132 gate.error = error; 133 gate.percent = (double*)xcalloc(num,sizeof(double)); 134 135 /*launch the thread manager with Krigingxt as a core: */ 74 136 LaunchThread(Krigingxt,(void*)&gate,num); 75 137 printf("\r interpolation progress: 100.00%%\n"); … … 118 180 119 181 /*Intermediaries*/ 182 double localpercent; 183 184 /*partition loop across threads: */ 185 PartitionRange(&i0,&i1,n_interp,num_threads,my_thread); 186 for(int idx=i0;idx<i1;idx++){ 187 188 /*Print info*/ 189 percent[my_thread]=double(idx-i0)/double(i1-i0)*100.; 190 localpercent=percent[0]; 191 for(int i=1;i<num_threads;i++) localpercent=min(localpercent,percent[i]); 192 printf("\r interpolation progress: %5.2lf%%",localpercent); 193 194 /*Kriging interpolation*/ 195 observations->InterpolationKriging(&predictions[idx],&error[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata,variogram); 196 } 197 198 return NULL; 199 }/*}}}*/ 200 /*FUNCTION NearestNeighbort{{{*/ 201 void* NearestNeighbort(void* vpthread_handle){ 202 203 /*gate variables :*/ 204 KrigingxThreadStruct *gate = NULL; 205 pthread_handle *handle = NULL; 206 int my_thread; 207 int num_threads; 208 int i0,i1; 209 210 /*recover handle and gate: */ 211 handle = (pthread_handle*)vpthread_handle; 212 gate = (KrigingxThreadStruct*)handle->gate; 213 my_thread = handle->id; 214 num_threads = handle->num; 215 216 /*recover parameters :*/ 217 int n_interp = gate->n_interp; 218 double *x_interp = gate->x_interp; 219 double *y_interp = gate->y_interp; 220 double radius = gate->radius; 221 int mindata = gate->mindata; 222 int maxdata = gate->maxdata; 223 Variogram *variogram = gate->variogram; 224 Observations *observations = gate->observations; 225 double *predictions = gate->predictions; 226 double *error = gate->error; 227 double *percent = gate->percent; 228 229 /*Intermediaries*/ 120 230 int i,j,n_obs; 121 double numerator,denominator,ratio,localpercent; 122 double *x = NULL; 123 double *y = NULL; 124 double *obs = NULL; 125 double *Gamma = NULL; 126 double *GinvG0 = NULL; 127 double *Ginv1 = NULL; 128 double *GinvZ = NULL; 129 double *gamma0 = NULL; 130 double *ones = NULL; 231 double x,y,obs; 232 double localpercent; 131 233 132 234 /*partition loop across threads: */ … … 140 242 printf("\r interpolation progress: %5.2lf%%",localpercent); 141 243 142 /*Get list of observations for current point*/ 244 /*Get closest observation to current point*/ 245 observations->ClosestObservation(&x,&y,&obs,x_interp[idx],y_interp[idx],radius); 246 predictions[idx] = obs; 247 } 248 249 return NULL; 250 }/*}}}*/ 251 /*FUNCTION idwt{{{*/ 252 void* idwt(void* vpthread_handle){ 253 254 /*gate variables :*/ 255 KrigingxThreadStruct *gate = NULL; 256 pthread_handle *handle = NULL; 257 int my_thread; 258 int num_threads; 259 int i0,i1; 260 261 /*recover handle and gate: */ 262 handle = (pthread_handle*)vpthread_handle; 263 gate = (KrigingxThreadStruct*)handle->gate; 264 my_thread = handle->id; 265 num_threads = handle->num; 266 267 /*recover parameters :*/ 268 int n_interp = gate->n_interp; 269 double *x_interp = gate->x_interp; 270 double *y_interp = gate->y_interp; 271 double radius = gate->radius; 272 int mindata = gate->mindata; 273 int maxdata = gate->maxdata; 274 Variogram *variogram = gate->variogram; 275 Observations *observations = gate->observations; 276 double *predictions = gate->predictions; 277 double *error = gate->error; 278 double *percent = gate->percent; 279 280 /*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; 287 double power = 2.; 288 289 /*partition loop across threads: */ 290 PartitionRange(&i0,&i1,n_interp,num_threads,my_thread); 291 for(int idx=i0;idx<i1;idx++){ 292 293 /*Print info*/ 294 percent[my_thread]=double(idx-i0)/double(i1-i0)*100.; 295 localpercent=percent[0]; 296 for(i=1;i<num_threads;i++) localpercent=min(localpercent,percent[i]); 297 printf("\r interpolation progress: %5.2lf%%",localpercent); 298 299 /*Get closest observation to current point*/ 143 300 observations->ObservationList(&x,&y,&obs,&n_obs,x_interp[idx],y_interp[idx],radius,maxdata); 144 if(n_obs<mindata){ 145 predictions[idx] = -999.0; 146 error[idx] = -999.0; 147 continue; 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; 148 311 } 149 150 /*Allocate intermediary matrix and vectors*/ 151 152 Gamma = (double*)xmalloc(n_obs*n_obs*sizeof(double)); 153 gamma0 = (double*)xmalloc(n_obs*sizeof(double)); 154 ones = (double*)xmalloc(n_obs*sizeof(double)); 155 156 /*First: Create semivariogram matrix for observations*/ 157 for(i=0;i<n_obs;i++){ 158 for(j=0;j<=i;j++){ 159 //Gamma[i*n_obs+j] = variogram->SemiVariogram(x[i]-x[j],y[i]-y[j]); 160 Gamma[i*n_obs+j] = variogram->Covariance(x[i]-x[j],y[i]-y[j]); 161 Gamma[j*n_obs+i] = Gamma[i*n_obs+j]; 162 } 312 else{ 313 predictions[idx] = UNDEF; 163 314 } 164 for(i=0;i<n_obs;i++) ones[i]=1;165 166 /*Get semivariogram vector associated to this location*/167 //for(i=0;i<n_obs;i++) gamma0[i] = variogram->SemiVariogram(x[i]-x_interp[idx],y[i]-y_interp[idx]);168 for(i=0;i<n_obs;i++) gamma0[i] = variogram->Covariance(x[i]-x_interp[idx],y[i]-y_interp[idx]);169 170 /*Solve the three linear systems*/171 GslSolve(&GinvG0,Gamma,gamma0,n_obs); // Gamma^-1 gamma0172 GslSolve(&Ginv1, Gamma,ones,n_obs); // Gamma^-1 ones173 GslSolve(&GinvZ, Gamma,obs,n_obs); // Gamma^-1 Z174 175 /*Prepare predictor*/176 numerator=-1.; denominator=0.;177 for(i=0;i<n_obs;i++) numerator +=GinvG0[i];178 for(i=0;i<n_obs;i++) denominator+=Ginv1[i];179 ratio=numerator/denominator;180 181 predictions[idx] = 0.;182 error[idx] = - numerator*numerator/denominator;183 for(i=0;i<n_obs;i++) predictions[idx] += (gamma0[i]-ratio)*GinvZ[i];184 for(i=0;i<n_obs;i++) error[idx] += gamma0[i]*GinvG0[i];185 186 /*clean-up*/187 xfree((void**)&x);188 xfree((void**)&y);189 xfree((void**)&obs);190 xfree((void**)&Gamma);191 xfree((void**)&gamma0);192 xfree((void**)&ones);193 xfree((void**)&GinvG0);194 xfree((void**)&Ginv1);195 xfree((void**)&GinvZ);196 315 } 197 316 … … 219 338 *pvariogram = variogram; 220 339 }/*}}}*/ 221 void GslSolve(double** pX,double* A,double* B,int n){/*{{{*/222 #ifdef _HAVE_GSL_223 224 /*GSL Matrices and vectors: */225 int s;226 gsl_matrix_view a;227 gsl_vector_view b;228 gsl_vector *x = NULL;229 gsl_permutation *p = NULL;230 231 /*A will be modified by LU decomposition. Use copy*/232 double* Acopy = (double*)xmalloc(n*n*sizeof(double));233 memcpy(Acopy,A,n*n*sizeof(double));234 235 /*Initialize gsl matrices and vectors: */236 a = gsl_matrix_view_array (Acopy,n,n);237 b = gsl_vector_view_array (B,n);238 x = gsl_vector_alloc (n);239 240 /*Run LU and solve: */241 p = gsl_permutation_alloc (n);242 gsl_linalg_LU_decomp (&a.matrix, p, &s);243 gsl_linalg_LU_solve (&a.matrix, p, &b.vector, x);244 245 //printf ("x = \n");246 //gsl_vector_fprintf (stdout, x, "%g");247 248 /*Copy result*/249 double* X = (double*)xmalloc(n*sizeof(double));250 memcpy(X,gsl_vector_ptr(x,0),n*sizeof(double));251 252 /*Clean up and assign output pointer*/253 xfree((void**)&Acopy);254 gsl_permutation_free(p);255 gsl_vector_free(x);256 *pX=X;257 #else258 _error_("GSL support required");259 #endif260 }/*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/modules/Krigingx/Krigingx.h ¶
r12377 r12421 15 15 int pKrigingx(double** ppredictions,double **perror,double* x, double* y, double* observations, int n_obs,double* x_interp,double* y_interp,int n_interp,Options* options); 16 16 void ProcessVariogram(Variogram **pvariogram,Options* options); 17 void GslSolve(double** pX,double* A,double* B,int n);18 17 19 18 /*threading: */ … … 33 32 34 33 void* Krigingxt(void*); 34 void* NearestNeighbort(void*); 35 void* idwt(void*); 35 36 #endif /* _KRIGINGX_H */ -
TabularUnified issm/trunk-jpl/src/c/modules/Krigingx/pKrigingx.cpp ¶
r12409 r12421 56 56 else if(strcmp(output,"prediction")==0){ 57 57 58 /*Intermediaries*/59 int i,j,n_obs;60 double numerator,denominator,ratio,localpercent;61 double *x = NULL;62 double *y = NULL;63 double *obs = NULL;64 double *Gamma = NULL;65 double *GinvG0 = NULL;66 double *Ginv1 = NULL;67 double *GinvZ = NULL;68 double *gamma0 = NULL;69 double *ones = NULL;70 71 58 /*partition loop across threads: */ 72 59 for(int idx=my_rank;idx<n_interp;idx+=num_procs){ 73 74 /*Print info*/75 60 _printf_(true,"\r interpolation progress: %5.2lf%%",double(idx)/double(n_interp)*100); 76 77 /*Get list of observations for current point*/ 78 observations->ObservationList(&x,&y,&obs,&n_obs,x_interp[idx],y_interp[idx],radius,maxdata); 79 if(n_obs<mindata){ 80 predictions[idx] = -999.0; 81 error[idx] = -999.0; 82 continue; 83 } 84 85 /*Allocate intermediary matrix and vectors*/ 86 87 Gamma = (double*)xmalloc(n_obs*n_obs*sizeof(double)); 88 gamma0 = (double*)xmalloc(n_obs*sizeof(double)); 89 ones = (double*)xmalloc(n_obs*sizeof(double)); 90 91 /*First: Create semivariogram matrix for observations*/ 92 for(i=0;i<n_obs;i++){ 93 for(j=0;j<=i;j++){ 94 //Gamma[i*n_obs+j] = variogram->SemiVariogram(x[i]-x[j],y[i]-y[j]); 95 Gamma[i*n_obs+j] = variogram->Covariance(x[i]-x[j],y[i]-y[j]); 96 Gamma[j*n_obs+i] = Gamma[i*n_obs+j]; 97 } 98 } 99 for(i=0;i<n_obs;i++) ones[i]=1; 100 101 /*Get semivariogram vector associated to this location*/ 102 //for(i=0;i<n_obs;i++) gamma0[i] = variogram->SemiVariogram(x[i]-x_interp[idx],y[i]-y_interp[idx]); 103 for(i=0;i<n_obs;i++) gamma0[i] = variogram->Covariance(x[i]-x_interp[idx],y[i]-y_interp[idx]); 104 105 /*Solve the three linear systems*/ 106 GslSolve(&GinvG0,Gamma,gamma0,n_obs); // Gamma^-1 gamma0 107 GslSolve(&Ginv1, Gamma,ones,n_obs); // Gamma^-1 ones 108 GslSolve(&GinvZ, Gamma,obs,n_obs); // Gamma^-1 Z 109 110 /*Prepare predictor*/ 111 numerator=-1.; denominator=0.; 112 for(i=0;i<n_obs;i++) numerator +=GinvG0[i]; 113 for(i=0;i<n_obs;i++) denominator+=Ginv1[i]; 114 ratio=numerator/denominator; 115 116 predictions[idx] = 0.; 117 error[idx] = - numerator*numerator/denominator; 118 for(i=0;i<n_obs;i++) predictions[idx] += (gamma0[i]-ratio)*GinvZ[i]; 119 for(i=0;i<n_obs;i++) error[idx] += gamma0[i]*GinvG0[i]; 120 121 /*clean-up*/ 122 xfree((void**)&x); 123 xfree((void**)&y); 124 xfree((void**)&obs); 125 xfree((void**)&Gamma); 126 xfree((void**)&gamma0); 127 xfree((void**)&ones); 128 xfree((void**)&GinvG0); 129 xfree((void**)&Ginv1); 130 xfree((void**)&GinvZ); 61 observations->InterpolationKriging(&predictions[idx],&error[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata,variogram); 131 62 } 63 _printf_(true,"\r interpolation progress: %5.2lf%%\n",100.); 132 64 133 65 #ifdef _HAVE_MPI_ … … 139 71 xfree((void**)&predictions); predictions=sumpredictions; 140 72 #endif 141 142 73 } 143 74 else{
Note:
See TracChangeset
for help on using the changeset viewer.