6 #include "../../shared/shared.h"
7 #include "../../toolkits/toolkits.h"
8 #include "../../classes/classes.h"
9 #include "../modules.h"
11 #include <gsl/gsl_linalg.h>
13 int Krigingx(
double** ppredictions,
double **perror,
double* obs_x,
double* obs_y,
double* obs_list,
int obs_length,
double* x_interp,
double* y_interp,
int n_interp,
Options* options){
16 double *predictions = NULL;
21 double dmindata,dmaxdata,dnumthreads;
29 int num = _NUMTHREADS_;
33 options->
Get(&radius,
"searchradius",0.);
34 options->
Get(&dmindata,
"mindata",1.); mindata=int(dmindata);
35 options->
Get(&dmaxdata,
"maxdata",50.); maxdata=int(dmaxdata);
36 options->
Get(&dnumthreads,
"numthreads",
double(num)); num=int(dnumthreads);
39 observations=
new Observations(obs_list,obs_x,obs_y,obs_length,options);
42 predictions =xNewZeroInit<double>(n_interp);
43 error =xNewZeroInit<double>(n_interp);
46 options->
Get(&output,
"output",(
char*)
"prediction");
48 if(strcmp(output,
"quadtree")==0){
51 else if(strcmp(output,
"variomap")==0){
52 observations->
Variomap(predictions,x_interp,n_interp);
54 else if(strcmp(output,
"distance")==0){
66 gate.
numdone = xNewZeroInit<int>(num);
70 xDelete<int>(gate.numdone);
72 else if(strcmp(output,
"delaunay")==0){
83 _printf_(
"Generation Delaunay Triangulation\n");
87 xDelete<double>(predictions);
88 InterpFromMeshToMesh2dx(&predictions,index,x,y,nobs,nel,data,nobs,1,x_interp,y_interp,n_interp,options);
91 xDelete<double>(data);
94 _error_(
"you did not compile ISSM with bamg");
97 else if(strcmp(output,
"nearestneighbor")==0){
109 gate.
numdone = xNewZeroInit<int>(num);
113 _printf_(
"\r interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<
"% \n");
114 xDelete<int>(gate.numdone);
116 else if(strcmp(output,
"idw")==0){
118 options->
Get(&power,
"power",2.);
130 gate.
numdone = xNewZeroInit<int>(num);
135 _printf_(
"\r interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<
"% \n");
136 xDelete<int>(gate.numdone);
138 else if(strcmp(output,
"v4")==0){
139 #if !defined(_HAVE_GSL_)
140 _error_(
"GSL is required for v4 interpolation");
153 gate.
numdone = xNewZeroInit<int>(num);
157 _printf_(
"\r interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<
"% \n");
158 xDelete<int>(gate.numdone);
160 else if(strcmp(output,
"prediction")==0){
161 #if !defined(_HAVE_GSL_)
162 _error_(
"GSL is required for v4 interpolation");
176 gate.
numdone = xNewZeroInit<int>(num);
180 _printf_(
"\r interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<
"% \n");
181 xDelete<int>(gate.numdone);
184 _error_(
"output '" << output <<
"' not supported yet");
190 xDelete<char>(output);
191 *ppredictions = predictions;
207 my_thread = handle->
id;
208 num_threads = handle->
num;
214 double radius = gate->
radius;
220 double *error = gate->
error;
225 for(
int idx=i0;idx<i1;idx++){
228 numdone[my_thread]=idx-i0;
230 int alldone=numdone[0];
231 for(
int i=1;i<num_threads;i++) alldone+=numdone[i];
232 _printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<
double(alldone)/
double(n_interp)*100.<<
"% ");
236 observations->InterpolationKriging(&predictions[idx],&error[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata,variogram);
253 my_thread = handle->
id;
254 num_threads = handle->
num;
260 double radius = gate->
radius;
266 double *error = gate->
error;
271 for(
int idx=i0;idx<i1;idx++){
274 numdone[my_thread]=idx-i0;
276 int alldone=numdone[0];
277 for(
int i=1;i<num_threads;i++) alldone+=numdone[i];
278 _printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<
double(alldone)/
double(n_interp)*100.<<
"% ");
281 observations->InterpolationNearestNeighbor(&predictions[idx],x_interp[idx],y_interp[idx],radius);
286 void*
idwt(
void* vpthread_handle){
298 my_thread = handle->
id;
299 num_threads = handle->
num;
305 double radius = gate->
radius;
311 double *error = gate->
error;
313 double power = gate->
power;
317 for(
int idx=i0;idx<i1;idx++){
320 numdone[my_thread]=idx-i0;
322 int alldone=numdone[0];
323 for(
int i=1;i<num_threads;i++) alldone+=numdone[i];
324 _printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<
double(alldone)/
double(n_interp)*100.<<
"% ");
327 observations->InterpolationIDW(&predictions[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata,power);
331 void*
v4t(
void* vpthread_handle){
343 my_thread = handle->
id;
344 num_threads = handle->
num;
350 double radius = gate->
radius;
356 double *error = gate->
error;
361 for(
int idx=i0;idx<i1;idx++){
364 numdone[my_thread]=idx-i0;
366 int alldone=numdone[0];
367 for(
int i=1;i<num_threads;i++) alldone+=numdone[i];
368 _printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<
double(alldone)/
double(n_interp)*100.<<
"% ");
371 observations->InterpolationV4(&predictions[idx],x_interp[idx],y_interp[idx],radius,mindata,maxdata);
387 my_thread = handle->
id;
388 num_threads = handle->
num;
394 double radius = gate->
radius;
400 double *error = gate->
error;
405 observations->Distances(&predictions[i0],&x_interp[i0],&y_interp[i0],i1-i0,radius);
416 options->
Get(&model,
"model");
420 else if(strcmp(model,
"power")==0) variogram =
new PowerVariogram(options);
421 else _error_(
"variogram " << model <<
" not supported yet (list of supported variogram: gaussian, exponential, spherical and power)");
426 xDelete<char>(model);
427 *pvariogram = variogram;