Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

pd4ifwt3ds.cpp

Go to the documentation of this file.
00001 // pd4ifwt3ds.cpp
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 1994-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
00005 //////////////////////////////////////////////////////////////////////
00006 
00007 #ifdef STORM_USEF
00008 #include "pd4ifwt3ds_.h"
00009 #include "dpd4ifwt3ds_.h"
00010 #include "pd4ifwt3dsws_.h"
00011 #include "dpd4ifwt3dsws_.h"
00012 #endif
00013 
00014 #include "stormdef.h"
00015 #define H0 STORMDEF_MATHCONST_D4H0
00016 #define H1 STORMDEF_MATHCONST_D4H1
00017 #define H2 STORMDEF_MATHCONST_D4H2
00018 #define H3 STORMDEF_MATHCONST_D4H3
00019 
00020 int pd4ifwt3ds( 
00021           const int& Sizef3d,
00022           const int& ns,
00023           const int& ks,
00024           const int& size,
00025           const float* wdata,
00026                 float* sdata
00027 ) { 
00028 
00029 #ifdef STORM_USEF
00030 
00031    int iflag;
00032    pd4ifwt3ds_( &Sizef3d, &ns, &ks, &size, wdata, sdata, &iflag );
00033    return iflag;
00034 
00035 #else
00036 
00037    int ii,jj;
00038    int i1,j1,k1;
00039    int size2;
00040    int size1 = ns;
00041    float *u = new float[Sizef3d];
00042    float *v = new float[Sizef3d];
00043 
00044 #ifdef STORM_FWT_CCHECKUSAGE
00045    if ( size1 < ns ) return 1;
00046 #endif
00047 
00048    for( int i = 0; i < size; i++ ) {
00049       ii=i*size*size;
00050       for( int j = 0; j < size; j++ ) {
00051          jj=j*size;
00052          for( int k = 0; k < size; k++ ) {
00053             sdata[ii+jj+k] = wdata[ii+jj+k];
00054          }
00055       }
00056    }
00057 
00058    if ( size == ns ) return 0;
00059 
00060    while ( size1 < size ) {
00061 
00062       size2 = size1;
00063       size1 = 2 * size1;
00064 
00065       for( int j = 0; j < size1; j++ ) {        // index 1
00066          jj = j * size;
00067          for( int k = 0; k < size1; k++ ) {
00068             for( int i = 0; i < size1; i++ ) {
00069                ii = i * size * size;
00070                u[i] = sdata[ii+jj+k];
00071             }
00072             for( int i = 0; i < size2; i++ ) {
00073                i1 = (i-1+size2)%size2;
00074                v[2*i] = H0*u[i] + H2*u[i1]
00075                  + H3*u[size2+i] + H1*u[size2+i1];
00076                v[2*i+1] = H1*u[i] + H3*u[i1]
00077                  - H2*u[size2+i] - H0*u[size2+i1];
00078             }
00079             for( int i = 0; i < size1; i++ ) {
00080                ii = i * size * size;
00081                sdata[ii+jj+k] = v[i];
00082             }
00083          }  
00084       }
00085 
00086       for( int i = 0; i < size1; i++ ) {        // index 2
00087          ii = i * size * size;
00088          for( int k = 0; k < size1; k++ ) {
00089             for( int j = 0; j < size1; j++ ) {
00090                jj = j * size;
00091                u[j] = sdata[ii+jj+k];
00092             }
00093             for( int j = 0; j < size2; j++ ) {
00094                j1 = (j-1+size2)%size2;
00095                v[2*j] = H0*u[j] + H2*u[j1]
00096                  + H3*u[size2+j] + H1*u[size2+j1];
00097                v[2*j+1] = H1*u[j] + H3*u[j1]
00098                  - H2*u[size2+j] - H0*u[size2+j1];
00099             }
00100             for( int j = 0; j < size1; j++ ) {
00101                jj = j * size;
00102                sdata[ii+jj+k] = v[j];
00103             }
00104          }
00105       }
00106 
00107       for( int i = 0; i < size1; i++ ) {        // index 3
00108          ii = i * size * size;
00109          for( int j = 0; j < size1; j++ ) {
00110             jj = j * size;
00111 
00112             for( int k = 0; k < size1; k++ ) {
00113                u[k] = sdata[ii+jj+k];
00114             }
00115 
00116             for( int k = 0; k < size2; k++ ) {
00117                k1 = (k-1+size2)%size2;
00118                v[2*k] = H0*u[k] + H2*u[k1]
00119                  + H3*u[size2+k] + H1*u[size2+k1];
00120                v[2*k+1] = H1*u[k] + H3*u[k1]
00121                  - H2*u[size2+k] - H0*u[size2+k1];
00122             }
00123 
00124             for( int k = 0; k < size1; k++ ) {
00125                sdata[ii+jj+k] = v[k];
00126             }
00127          }
00128       }
00129 
00130    }
00131    
00132    delete [] u;
00133    delete [] v;
00134 
00135 #ifdef STORM_FWT_CCHECKUSAGE
00136    if ( size1 > size ) return 2;
00137 #endif
00138 
00139    return 0;
00140 
00141 #endif
00142 } 
00143 
00144 
00145 int pd4ifwt3ds( 
00146           const int& Sizef3d,
00147           const int& ns,
00148           const int& ks,
00149           const int& size,
00150           const double* wdata,
00151                 double* sdata
00152 ) { 
00153 
00154 #ifdef STORM_USEF
00155 
00156    int iflag;
00157    dpd4ifwt3ds_( &Sizef3d, &ns, &ks, &size, wdata, sdata, &iflag );
00158    return iflag;
00159 
00160 #else
00161 
00162    int ii,jj;
00163    int i1,j1,k1;
00164    int size2;
00165    int size1 = ns;
00166    double *u = new double[Sizef3d];
00167    double *v = new double[Sizef3d];
00168 
00169 #ifdef STORM_FWT_CCHECKUSAGE
00170    if ( size1 < ns ) return 1;
00171 #endif
00172 
00173    for( int i = 0; i < size; i++ ) {
00174       ii=i*size*size;
00175       for( int j = 0; j < size; j++ ) {
00176          jj=j*size;
00177          for( int k = 0; k < size; k++ ) {
00178             sdata[ii+jj+k] = wdata[ii+jj+k];
00179          }
00180       }
00181    }
00182 
00183    if ( size == ns ) return 0;
00184 
00185    while ( size1 < size ) {
00186 
00187       size2 = size1;
00188       size1 = 2 * size1;
00189 
00190       for( int j = 0; j < size1; j++ ) {        // index 1
00191          jj = j * size;
00192          for( int k = 0; k < size1; k++ ) {
00193             for( int i = 0; i < size1; i++ ) {
00194                ii = i * size * size;
00195                u[i] = sdata[ii+jj+k];
00196             }
00197             for( int i = 0; i < size2; i++ ) {
00198                i1 = (i-1+size2)%size2;
00199                v[2*i] = H0*u[i] + H2*u[i1]
00200                  + H3*u[size2+i] + H1*u[size2+i1];
00201                v[2*i+1] = H1*u[i] + H3*u[i1]
00202                  - H2*u[size2+i] - H0*u[size2+i1];
00203             }
00204             for( int i = 0; i < size1; i++ ) {
00205                ii = i * size * size;
00206                sdata[ii+jj+k] = v[i];
00207             }
00208          }  
00209       }
00210 
00211       for( int i = 0; i < size1; i++ ) {        // index 2
00212          ii = i * size * size;
00213          for( int k = 0; k < size1; k++ ) {
00214             for( int j = 0; j < size1; j++ ) {
00215                jj = j * size;
00216                u[j] = sdata[ii+jj+k];
00217             }
00218             for( int j = 0; j < size2; j++ ) {
00219                j1 = (j-1+size2)%size2;
00220                v[2*j] = H0*u[j] + H2*u[j1]
00221                  + H3*u[size2+j] + H1*u[size2+j1];
00222                v[2*j+1] = H1*u[j] + H3*u[j1]
00223                  - H2*u[size2+j] - H0*u[size2+j1];
00224             }
00225             for( int j = 0; j < size1; j++ ) {
00226                jj = j * size;
00227                sdata[ii+jj+k] = v[j];
00228             }
00229          }
00230       }
00231 
00232       for( int i = 0; i < size1; i++ ) {        // index 3
00233          ii = i * size * size;
00234          for( int j = 0; j < size1; j++ ) {
00235             jj = j * size;
00236 
00237             for( int k = 0; k < size1; k++ ) {
00238                u[k] = sdata[ii+jj+k];
00239             }
00240 
00241             for( int k = 0; k < size2; k++ ) {
00242                k1 = (k-1+size2)%size2;
00243                v[2*k] = H0*u[k] + H2*u[k1]
00244                  + H3*u[size2+k] + H1*u[size2+k1];
00245                v[2*k+1] = H1*u[k] + H3*u[k1]
00246                  - H2*u[size2+k] - H0*u[size2+k1];
00247             }
00248 
00249             for( int k = 0; k < size1; k++ ) {
00250                sdata[ii+jj+k] = v[k];
00251             }
00252          }
00253       }
00254 
00255    }
00256 
00257    delete [] u;
00258    delete [] v;
00259 
00260 
00261 #ifdef STORM_FWT_CCHECKUSAGE
00262    if ( size1 > size ) return 2;
00263 #endif
00264 
00265    return 0;
00266 
00267 #endif
00268 } 
00269 
00270 
00271 int pd4ifwt3ds( 
00272           const int& Sizef3d,
00273           const int& ns,
00274           const int& ks,
00275           const int& size,
00276           const float* wdata,
00277                 float* sdata,
00278                 float* ws
00279 ) { 
00280 
00281 #ifdef STORM_USEF
00282 
00283    int iflag;
00284    pd4ifwt3dsws_( &Sizef3d, &ns, &ks, &size, wdata, sdata, ws, &iflag );
00285    return iflag;
00286 
00287 #else
00288 
00289    int ii,jj;
00290    int i1,j1,k1;
00291    int size2;
00292    int size1 = ns;
00293    float *u = ws;
00294    float *v = &ws[Sizef3d];
00295 
00296 #ifdef STORM_FWT_CCHECKUSAGE
00297    if ( size1 < ns ) return 1;
00298 #endif
00299 
00300    for( int i = 0; i < size; i++ ) {
00301       ii=i*size*size;
00302       for( int j = 0; j < size; j++ ) {
00303          jj=j*size;
00304          for( int k = 0; k < size; k++ ) {
00305             sdata[ii+jj+k] = wdata[ii+jj+k];
00306          }
00307       }
00308    }
00309 
00310    if ( size == ns ) return 0;
00311 
00312    while ( size1 < size ) {
00313 
00314       size2 = size1;
00315       size1 = 2 * size1;
00316 
00317       for( int j = 0; j < size1; j++ ) {        // index 1
00318          jj = j * size;
00319          for( int k = 0; k < size1; k++ ) {
00320             for( int i = 0; i < size1; i++ ) {
00321                ii = i * size * size;
00322                u[i] = sdata[ii+jj+k];
00323             }
00324             for( int i = 0; i < size2; i++ ) {
00325                i1 = (i-1+size2)%size2;
00326                v[2*i] = H0*u[i] + H2*u[i1]
00327                  + H3*u[size2+i] + H1*u[size2+i1];
00328                v[2*i+1] = H1*u[i] + H3*u[i1]
00329                  - H2*u[size2+i] - H0*u[size2+i1];
00330             }
00331             for( int i = 0; i < size1; i++ ) {
00332                ii = i * size * size;
00333                sdata[ii+jj+k] = v[i];
00334             }
00335          }  
00336       }
00337 
00338       for( int i = 0; i < size1; i++ ) {        // index 2
00339          ii = i * size * size;
00340          for( int k = 0; k < size1; k++ ) {
00341             for( int j = 0; j < size1; j++ ) {
00342                jj = j * size;
00343                u[j] = sdata[ii+jj+k];
00344             }
00345             for( int j = 0; j < size2; j++ ) {
00346                j1 = (j-1+size2)%size2;
00347                v[2*j] = H0*u[j] + H2*u[j1]
00348                  + H3*u[size2+j] + H1*u[size2+j1];
00349                v[2*j+1] = H1*u[j] + H3*u[j1]
00350                  - H2*u[size2+j] - H0*u[size2+j1];
00351             }
00352             for( int j = 0; j < size1; j++ ) {
00353                jj = j * size;
00354                sdata[ii+jj+k] = v[j];
00355             }
00356          }
00357       }
00358 
00359       for( int i = 0; i < size1; i++ ) {        // index 3
00360          ii = i * size * size;
00361          for( int j = 0; j < size1; j++ ) {
00362             jj = j * size;
00363 
00364             for( int k = 0; k < size1; k++ ) {
00365                u[k] = sdata[ii+jj+k];
00366             }
00367 
00368             for( int k = 0; k < size2; k++ ) {
00369                k1 = (k-1+size2)%size2;
00370                v[2*k] = H0*u[k] + H2*u[k1]
00371                  + H3*u[size2+k] + H1*u[size2+k1];
00372                v[2*k+1] = H1*u[k] + H3*u[k1]
00373                  - H2*u[size2+k] - H0*u[size2+k1];
00374             }
00375 
00376             for( int k = 0; k < size1; k++ ) {
00377                sdata[ii+jj+k] = v[k];
00378             }
00379          }
00380       }
00381 
00382    }
00383    
00384 #ifdef STORM_FWT_CCHECKUSAGE
00385    if ( size1 > size ) return 2;
00386 #endif
00387 
00388    return 0;
00389 
00390 #endif
00391 } 
00392 
00393 
00394 int pd4ifwt3ds( 
00395           const int& Sizef3d,
00396           const int& ns,
00397           const int& ks,
00398           const int& size,
00399           const double* wdata,
00400                 double* sdata,
00401                 double* ws
00402 ) { 
00403 
00404 #ifdef STORM_USEF
00405 
00406    int iflag;
00407    dpd4ifwt3dsws_( &Sizef3d, &ns, &ks, &size, wdata, sdata, ws, &iflag );
00408    return iflag;
00409 
00410 #else
00411 
00412    int ii,jj;
00413    int i1,j1,k1;
00414    int size2;
00415    int size1 = ns;
00416    double *u = ws;
00417    double *v = &ws[Sizef3d];
00418 
00419 #ifdef STORM_FWT_CCHECKUSAGE
00420    if ( size1 < ns ) return 1;
00421 #endif
00422 
00423    for( int i = 0; i < size; i++ ) {
00424       ii=i*size*size;
00425       for( int j = 0; j < size; j++ ) {
00426          jj=j*size;
00427          for( int k = 0; k < size; k++ ) {
00428             sdata[ii+jj+k] = wdata[ii+jj+k];
00429          }
00430       }
00431    }
00432 
00433    if ( size == ns ) return 0;
00434 
00435    while ( size1 < size ) {
00436 
00437       size2 = size1;
00438       size1 = 2 * size1;
00439 
00440       for( int j = 0; j < size1; j++ ) {        // index 1
00441          jj = j * size;
00442          for( int k = 0; k < size1; k++ ) {
00443             for( int i = 0; i < size1; i++ ) {
00444                ii = i * size * size;
00445                u[i] = sdata[ii+jj+k];
00446             }
00447             for( int i = 0; i < size2; i++ ) {
00448                i1 = (i-1+size2)%size2;
00449                v[2*i] = H0*u[i] + H2*u[i1]
00450                  + H3*u[size2+i] + H1*u[size2+i1];
00451                v[2*i+1] = H1*u[i] + H3*u[i1]
00452                  - H2*u[size2+i] - H0*u[size2+i1];
00453             }
00454             for( int i = 0; i < size1; i++ ) {
00455                ii = i * size * size;
00456                sdata[ii+jj+k] = v[i];
00457             }
00458          }  
00459       }
00460 
00461       for( int i = 0; i < size1; i++ ) {        // index 2
00462          ii = i * size * size;
00463          for( int k = 0; k < size1; k++ ) {
00464             for( int j = 0; j < size1; j++ ) {
00465                jj = j * size;
00466                u[j] = sdata[ii+jj+k];
00467             }
00468             for( int j = 0; j < size2; j++ ) {
00469                j1 = (j-1+size2)%size2;
00470                v[2*j] = H0*u[j] + H2*u[j1]
00471                  + H3*u[size2+j] + H1*u[size2+j1];
00472                v[2*j+1] = H1*u[j] + H3*u[j1]
00473                  - H2*u[size2+j] - H0*u[size2+j1];
00474             }
00475             for( int j = 0; j < size1; j++ ) {
00476                jj = j * size;
00477                sdata[ii+jj+k] = v[j];
00478             }
00479          }
00480       }
00481 
00482       for( int i = 0; i < size1; i++ ) {        // index 3
00483          ii = i * size * size;
00484          for( int j = 0; j < size1; j++ ) {
00485             jj = j * size;
00486 
00487             for( int k = 0; k < size1; k++ ) {
00488                u[k] = sdata[ii+jj+k];
00489             }
00490 
00491             for( int k = 0; k < size2; k++ ) {
00492                k1 = (k-1+size2)%size2;
00493                v[2*k] = H0*u[k] + H2*u[k1]
00494                  + H3*u[size2+k] + H1*u[size2+k1];
00495                v[2*k+1] = H1*u[k] + H3*u[k1]
00496                  - H2*u[size2+k] - H0*u[size2+k1];
00497             }
00498 
00499             for( int k = 0; k < size1; k++ ) {
00500                sdata[ii+jj+k] = v[k];
00501             }
00502          }
00503       }
00504 
00505    }
00506 
00507 #ifdef STORM_FWT_CCHECKUSAGE
00508    if ( size1 > size ) return 2;
00509 #endif
00510 
00511    return 0;
00512 
00513 #endif
00514 } 
00515 
00516 #undef H0
00517 #undef H1
00518 #undef H2
00519 #undef H3
00520 

Generated on Mon May 31 21:38:52 2004 for SR2k4 Assembler by doxygen 1.3.6