Changeset 2304


Ignore:
Timestamp:
09/24/09 09:16:11 (15 years ago)
Author:
Mathieu Morlighem
Message:

accelerated interpolation process

File:
1 edited

Legend:

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

    r2301 r2304  
    1818        /*Intermediary*/
    1919        int    i,j,n;
     20        int    i1,i2,j1,j2;
    2021        int    interpolation_type;
    2122        bool   debug;
     23        int    xflip,yflip;
    2224        double area;
    2325        double area_1,area_2,area_3;
     
    5759        debug=(bool)((double)ncols*nlines*nels >= pow((double)10,(double)10));
    5860
    59         /*Initialize coordintes and griddata*/
     61        /*figure out if x or y are flipped*/
     62        if (xposting<0) xflip=1;
     63        else xflip=0;
     64        if (yposting<0) yflip=1;
     65        else yflip=0;
     66
     67        /*Compute coordinates lists*/
    6068        // EAST = ACTUAL WEST !!!!!!!!!!!!!!!
    6169        cornersouth=cornernorth-nlines*yposting;
     
    6573        for(i=0;i<=nlines;i++)   y_m[i]   = cornersouth + yposting*i;
    6674        for(i=0;i<=ncols; i++)   x_m[i]   = cornereast  + xposting*i;
     75
     76        /*Initialize coordintes and griddata*/
    6777        for(i=0;i<nlines;i++){
    6878                for(j=0;j<ncols; j++){
     
    7282       
    7383        /*Get extreme coordinates of the grid*/
    74         if (xposting>0){
    75                 x_grid_min=cornereast;
    76                 x_grid_max=cornerwest;
     84        if (xflip){
     85                x_grid_min=x_grid[ncols-1]; x_grid_max=x_grid[0];
    7786        }
    7887        else{
    79                 x_grid_min=cornerwest;
    80                 x_grid_max=cornereast;
     88                x_grid_min=x_grid[0]; x_grid_max=x_grid[ncols-1];
    8189        }
    82         if (yposting>0){
    83                 y_grid_min=cornersouth;
    84                 y_grid_max=cornernorth;
     90        if (yflip){
     91                y_grid_min=y_grid[nlines-1]; y_grid_max=y_grid[0];
    8592        }
    8693        else{
    87                 y_grid_min=cornernorth;
    88                 y_grid_max=cornersouth;
     94                y_grid_min=y_grid[0]; y_grid_max=y_grid[nlines-1];
    8995        }
    9096
     
    109115                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;
    110116
     117                /*Get indices i and j that form a square around the currant triangle*/
     118                if (yflip){
     119                        i1=floor((y_tria_max-y_grid_max)/yposting)-1;
     120                        i2= ceil((y_tria_min-y_grid_max)/yposting);
     121                }
     122                else{
     123                        i1=floor((y_tria_min-y_grid_min)/yposting)-1;
     124                        i2= ceil((y_tria_max-y_grid_min)/yposting);
     125                }
     126                if (xflip){
     127                        j1=floor((x_tria_max-x_grid_max)/xposting)-1;
     128                        j2= ceil((x_tria_min-x_grid_max)/xposting);
     129                }
     130                else{
     131                        j1=floor((x_tria_min-x_grid_min)/xposting)-1;
     132                        j2= ceil((x_tria_max-x_grid_min)/xposting);
     133                }
     134
    111135                /*get area of the current element (Jacobian = 2 * area)*/
    112136                //area =x2 * y3 - y2*x3 + x1 * y2 - y1 * x2 + x3 * y1 - y3 * x1;
     
    115139                  +  x_mesh[(int)index_mesh[3*n+2]-1]*y_mesh[(int)index_mesh[3*n+0]-1]-y_mesh[(int)index_mesh[3*n+2]-1]*x_mesh[(int)index_mesh[3*n+0]-1];
    116140
    117 
    118141                /*Go through x_grid and y_grid and interpolate if necessary*/
    119                 for (i=0;i<nlines;i++){
     142                for (i=i1;i<=i2;i++){
    120143
    121144                        //exit if y not between y_tria_min and y_tria_max
    122145                        if((y_grid[i]>y_tria_max) || (y_grid[i]<y_tria_min)) continue;
    123146
    124                         for(j=0;j<ncols; j++){
     147                        for(j=j1;j<=j2; j++){
    125148
    126149                                //exit if x not between x_tria_min and x_tria_max
Note: See TracChangeset for help on using the changeset viewer.