12 int interpolation_type;
14 double area_1,area_2,area_3;
15 double x_tria_min,y_tria_min;
16 double x_tria_max,y_tria_max;
17 double x_grid_min,y_grid_min;
18 double x_grid_max,y_grid_max;
22 if(nels<1 || nods<3 || nlines<2 || ncols<2)
_error_(
"nothing to be done according to the mesh given in input");
25 if(data_length==nods) interpolation_type=1;
26 else if(data_length==nels) interpolation_type=2;
27 else _error_(
"length of vector data not supported yet. It should be of length (number of nodes) or (number of elements)!");
30 double* griddata=xNew<double>(nlines*ncols);
31 for(
int i=0;i<nlines;i++)
for(
int j=0;j<ncols; j++) griddata[i*ncols+j]=default_value;
34 bool debug=(bool)((
double)ncols*nlines*nels >= 5.e10);
39 if(x_grid[1]-x_grid[0]<0) xflip=
true;
40 if(y_grid[1]-y_grid[0]<0) yflip=
true;
43 double xposting = x_grid[1]-x_grid[0];
44 double yposting = y_grid[1]-y_grid[0];
46 x_grid_min=x_grid[ncols-1];
51 x_grid_max=x_grid[ncols-1];
54 y_grid_min=y_grid[nlines-1];
59 y_grid_max=y_grid[nlines-1];
63 for(
int n=0;n<nels;n++){
66 if(debug && n%10000==0)
67 _printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<
double(n)/
double(nels)*100<<
"% ");
70 x_tria_min=x_mesh[index_mesh[3*n+0]-1]; x_tria_max=x_tria_min;
71 y_tria_min=y_mesh[index_mesh[3*n+0]-1]; y_tria_max=y_tria_min;
73 if(x_mesh[index_mesh[3*n+i]-1]<x_tria_min) x_tria_min=x_mesh[index_mesh[3*n+i]-1];
74 if(x_mesh[index_mesh[3*n+i]-1]>x_tria_max) x_tria_max=x_mesh[index_mesh[3*n+i]-1];
75 if(y_mesh[index_mesh[3*n+i]-1]<y_tria_min) y_tria_min=y_mesh[index_mesh[3*n+i]-1];
76 if(y_mesh[index_mesh[3*n+i]-1]>y_tria_max) y_tria_max=y_mesh[index_mesh[3*n+i]-1];
80 if( (x_tria_min>x_grid_max) || (x_tria_max<x_grid_min) || (y_tria_min>y_grid_max) || (y_tria_max<y_grid_min) )
continue;
84 i1=
max(0, (
int)floor((y_tria_max-y_grid_max)/yposting)-1);
85 i2=
min(nlines-1,(
int)ceil((y_tria_min-y_grid_max)/yposting));
88 i1=
max(0, (
int)floor((y_tria_min-y_grid_min)/yposting)-1);
89 i2=
min(nlines-1,(
int)ceil((y_tria_max-y_grid_min)/yposting));
92 j1=
max(0, (
int)floor((x_tria_max-x_grid_max)/xposting)-1);
93 j2=
min(ncols-1,(
int)ceil((x_tria_min-x_grid_max)/xposting));
96 j1=
max(0, (
int)floor((x_tria_min-x_grid_min)/xposting)-1);
97 j2=
min(ncols-1,(
int)ceil((x_tria_max-x_grid_min)/xposting));
102 area=x_mesh[index_mesh[3*n+1]-1]*y_mesh[index_mesh[3*n+2]-1]-y_mesh[index_mesh[3*n+1]-1]*x_mesh[index_mesh[3*n+2]-1]
103 + x_mesh[index_mesh[3*n+0]-1]*y_mesh[index_mesh[3*n+1]-1]-y_mesh[index_mesh[3*n+0]-1]*x_mesh[index_mesh[3*n+1]-1]
104 + x_mesh[index_mesh[3*n+2]-1]*y_mesh[index_mesh[3*n+0]-1]-y_mesh[index_mesh[3*n+2]-1]*x_mesh[index_mesh[3*n+0]-1];
107 for(
int i=i1;i<=i2;i++){
110 if((y_grid[i]>y_tria_max) || (y_grid[i]<y_tria_min))
continue;
112 for(
int j=j1;j<=j2; j++){
115 if((x_grid[j]>x_tria_max) || (x_grid[j]<x_tria_min))
continue;
118 area_1=((x_grid[j]-x_mesh[index_mesh[3*n+2]-1])*(y_mesh[index_mesh[3*n+1]-1]-y_mesh[index_mesh[3*n+2]-1])
119 - (y_grid[i]-y_mesh[index_mesh[3*n+2]-1])*(x_mesh[index_mesh[3*n+1]-1]-x_mesh[index_mesh[3*n+2]-1]))/area;
121 area_2=((x_mesh[index_mesh[3*n+0]-1]-x_mesh[index_mesh[3*n+2]-1])*(y_grid[i]-y_mesh[index_mesh[3*n+2]-1])
122 - (y_mesh[index_mesh[3*n+0]-1]-y_mesh[index_mesh[3*n+2]-1])*(x_grid[j]-x_mesh[index_mesh[3*n+2]-1]))/area;
124 area_3=1.-area_1-area_2;
127 if(area_1>-1e-12 && area_2>-1e-12 && area_3>-1e-12){
130 if(interpolation_type==1){
132 data_value=area_1*data_mesh[index_mesh[3*n+0]-1]+area_2*data_mesh[index_mesh[3*n+1]-1]+area_3*data_mesh[index_mesh[3*n+2]-1];
136 data_value=data_mesh[n];
138 if (xIsNan<IssmDouble>(data_value)) data_value=default_value;
141 griddata[i*ncols+j]=data_value;
146 if(debug)
_printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<fixed<<100.<<
"% \n");