Changeset 2362


Ignore:
Timestamp:
10/02/09 10:47:13 (15 years ago)
Author:
Mathieu Morlighem
Message:

Reduced interpolation time for 3d meshes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/InterpFromMeshToMesh3dx/InterpFromMeshToMesh3dx.cpp

    r2292 r2362  
    2222        double zeta,bed,surface;
    2323        double data_value;
    24         double xmin,xmax;
    25         double ymin,ymax;
     24        double x_prime_min,x_prime_max;
     25        double y_prime_min,y_prime_max;
     26        double x_tria_min,y_tria_min;
     27        double x_tria_max,y_tria_max;
    2628
    2729        /*some checks*/
     
    4547
    4648        /*Get prime mesh extrema coordinates*/
    47         xmin=x_prime[0]; xmax=x_prime[0];ymin=y_prime[0]; ymax=y_prime[0];
     49        x_prime_min=x_prime[0]; x_prime_max=x_prime[0];y_prime_min=y_prime[0]; y_prime_max=y_prime[0];
    4850        for (i=1;i<nods_prime;i++){
    49                 if (x_prime[i]<xmin) xmin=x_prime[i];
    50                 if (x_prime[i]>xmax) xmax=x_prime[i];
    51                 if (y_prime[i]<ymin) ymin=y_prime[i];
    52                 if (y_prime[i]>ymax) ymax=y_prime[i];
     51                if (x_prime[i]<x_prime_min) x_prime_min=x_prime[i];
     52                if (x_prime[i]>x_prime_max) x_prime_max=x_prime[i];
     53                if (y_prime[i]<y_prime_min) y_prime_min=y_prime[i];
     54                if (y_prime[i]>y_prime_max) y_prime_max=y_prime[i];
    5355        }
    5456
     
    6466                if (debug && fmod((double)i,(double)100)==0) printf("\b\b\b\b\b\b\b%5.2lf %%",(double)i/nels_data*100);
    6567
     68                /*Get extrema coordinates of current elements*/
     69                x_tria_min=x_data[(int)index_data[6*i+0]-1]; x_tria_max=x_tria_min;
     70                y_tria_min=y_data[(int)index_data[6*i+0]-1]; y_tria_max=y_tria_min;
     71                for (j=1;j<3;j++){
     72                        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];
     73                        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];
     74                        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];
     75                        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                }
     77
    6678                /*if there is no point inside the domain, go to next iteration*/
    67                 if ( (x_data[(int)index_data[6*i+0]-1]<xmin) && (x_data[(int)index_data[6*i+1]-1]<xmin) && (x_data[(int)index_data[6*i+2]-1]<xmin)) continue;
    68                 if ( (x_data[(int)index_data[6*i+0]-1]>xmax) && (x_data[(int)index_data[6*i+1]-1]>xmax) && (x_data[(int)index_data[6*i+2]-1]>xmax)) continue;
    69                 if ( (y_data[(int)index_data[6*i+0]-1]<ymin) && (y_data[(int)index_data[6*i+1]-1]<ymin) && (y_data[(int)index_data[6*i+2]-1]<ymin)) continue;
    70                 if ( (y_data[(int)index_data[6*i+0]-1]>ymax) && (y_data[(int)index_data[6*i+1]-1]>ymax) && (y_data[(int)index_data[6*i+2]-1]>ymax)) continue;
     79                if ( x_prime_max < x_tria_min ) continue;
     80                if ( x_prime_min > x_tria_max ) continue;
     81                if ( y_prime_max < y_tria_min ) continue;
     82                if ( y_prime_min > y_tria_max ) continue;
    7183
    7284                /*get area of the current element (Jacobian = 2 * area)*/
     
    7890                /*loop over the prime nodes*/
    7991                for (j=0;j<nods_prime;j++){
     92
     93                        /*if the current point is not in the triangle, continue*/
     94                        if ( x_prime[j] < x_tria_min ) continue;
     95                        if ( x_prime[j] > x_tria_max ) continue;
     96                        if ( y_prime[j] < y_tria_min ) continue;
     97                        if ( y_prime[j] > y_tria_max ) continue;
    8098
    8199                        /*Get first area coordinate = det(x-x3  x2-x3 ; y-y3   y2-y3)/area*/
Note: See TracChangeset for help on using the changeset viewer.