15 int interpolation_type;
18 double area_1,area_2,area_3;
19 double zeta,bed,surface;
21 double x_prime_min,x_prime_max;
22 double y_prime_min,y_prime_max;
23 double x_tria_min,y_tria_min;
24 double x_tria_max,y_tria_max;
27 if (nels_data<1 || nods_data<6 || nods_prime==0){
28 _error_(
"nothing to be done according to the mesh given in input");
32 debug=(bool)((
double)nels_data*(double)nods_prime >= pow((
double)10,(double)9));
35 if (data_length==nods_data){
38 else if (data_length==nels_data){
42 _error_(
"length of vector data not supported yet. It should be of length (number of nodes) or (number of elements)!");
46 x_prime_min=x_prime[0]; x_prime_max=x_prime[0];y_prime_min=y_prime[0]; y_prime_max=y_prime[0];
47 for (i=1;i<nods_prime;i++){
48 if (x_prime[i]<x_prime_min) x_prime_min=x_prime[i];
49 if (x_prime[i]>x_prime_max) x_prime_max=x_prime[i];
50 if (y_prime[i]<y_prime_min) y_prime_min=y_prime[i];
51 if (y_prime[i]>y_prime_max) y_prime_max=y_prime[i];
56 for (i=0;i<nods_prime;i++) data_prime->
SetValue(i,default_value,
INS_VAL);
59 for (i=0;i<nels_data;i++){
62 if (debug && fmod((
double)i,(
double)100)==0)
63 _printf_(
"\r interpolation progress: "<<setw(6)<<setprecision(2)<<
double(i)/
double(nels_data)*100<<
"% ");
66 x_tria_min=x_data[(int)index_data[6*i+0]-1]; x_tria_max=x_tria_min;
67 y_tria_min=y_data[(int)index_data[6*i+0]-1]; y_tria_max=y_tria_min;
69 if(x_data[(
int)index_data[6*i+j]-1]<x_tria_min) x_tria_min=x_data[(
int)index_data[6*i+j]-1];
70 if(x_data[(
int)index_data[6*i+j]-1]>x_tria_max) x_tria_max=x_data[(
int)index_data[6*i+j]-1];
71 if(y_data[(
int)index_data[6*i+j]-1]<y_tria_min) y_tria_min=y_data[(
int)index_data[6*i+j]-1];
72 if(y_data[(
int)index_data[6*i+j]-1]>y_tria_max) y_tria_max=y_data[(
int)index_data[6*i+j]-1];
76 if ( x_prime_max < x_tria_min )
continue;
77 if ( x_prime_min > x_tria_max )
continue;
78 if ( y_prime_max < y_tria_min )
continue;
79 if ( y_prime_min > y_tria_max )
continue;
83 area=x_data[(int)index_data[6*i+1]-1]*y_data[(
int)index_data[6*i+2]-1]-y_data[(int)index_data[6*i+1]-1]*x_data[(
int)index_data[6*i+2]-1]
84 + x_data[(int)index_data[6*i+0]-1]*y_data[(
int)index_data[6*i+1]-1]-y_data[(int)index_data[6*i+0]-1]*x_data[(
int)index_data[6*i+1]-1]
85 + x_data[(int)index_data[6*i+2]-1]*y_data[(
int)index_data[6*i+0]-1]-y_data[(int)index_data[6*i+2]-1]*x_data[(
int)index_data[6*i+0]-1];
88 for (j=0;j<nods_prime;j++){
91 if ( x_prime[j] < x_tria_min )
continue;
92 if ( x_prime[j] > x_tria_max )
continue;
93 if ( y_prime[j] < y_tria_min )
continue;
94 if ( y_prime[j] > y_tria_max )
continue;
97 area_1=((x_prime[j]-x_data[(int)index_data[6*i+2]-1])*(y_data[(int)index_data[6*i+1]-1]-y_data[(
int)index_data[6*i+2]-1])
98 - (y_prime[j]-y_data[(
int)index_data[6*i+2]-1])*(x_data[(
int)index_data[6*i+1]-1]-x_data[(int)index_data[6*i+2]-1]))/area;
100 area_2=((x_data[(int)index_data[6*i+0]-1]-x_data[(
int)index_data[6*i+2]-1])*(y_prime[j]-y_data[(
int)index_data[6*i+2]-1])
101 - (y_data[(
int)index_data[6*i+0]-1]-y_data[(int)index_data[6*i+2]-1])*(x_prime[j]-x_data[(int)index_data[6*i+2]-1]))/area;
103 area_3=1-area_1-area_2;
106 if (area_1>=0 && area_2>=0 && area_3>=0){
109 bed =area_1*z_data[(int)index_data[6*i+0]-1]+area_2*z_data[(
int)index_data[6*i+1]-1]+area_3*z_data[(int)index_data[6*i+2]-1];
110 surface=area_1*z_data[(int)index_data[6*i+3]-1]+area_2*z_data[(
int)index_data[6*i+4]-1]+area_3*z_data[(int)index_data[6*i+5]-1];
113 zeta=2*(z_prime[j]-bed)/(surface-bed)-1;
115 if (zeta >=-1 && zeta<=1){
116 if (interpolation_type==1){
118 data_value=(1-zeta)/2*(area_1*data[(
int)index_data[6*i+0]-1]+area_2*data[(int)index_data[6*i+1]-1]+area_3*data[(
int)index_data[6*i+2]-1])
119 + (1+zeta)/2*(area_1*data[(int)index_data[6*i+3]-1]+area_2*data[(
int)index_data[6*i+4]-1]+area_3*data[(int)index_data[6*i+5]-1]);
125 if (xIsNan<IssmPDouble>(data_value)) data_value=default_value;
134 _printf_(
"\r interpolation progress: "<<fixed<<setw(6)<<setprecision(2)<<100.<<
"% \n");
137 *pdata_prime=data_prime;