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

hfwt3ds.cpp

Go to the documentation of this file.
00001 // hfwt3ds.cpp
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 1994-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
00005 //////////////////////////////////////////////////////////////////////
00006 
00007 #ifdef STORM_USEF
00008 #include "hfwt3ds_.h"
00009 #include "dhfwt3ds_.h"
00010 #include "ihfwt3ds_.h"
00011 #include "hfwt3dsws_.h"
00012 #include "dhfwt3dsws_.h"
00013 #include "ihfwt3dsws_.h"
00014 #endif
00015 
00016 #include "stormdef.h"
00017 #define INVSQRT2 STORMDEF_MATHCONST_INVSQRT2
00018 
00019 int hfwt3ds( 
00020           const int& Sizef3d,
00021           const int& ns,
00022           const int& size,
00023           const float* sdata,
00024                 float* wdata
00025 ) { 
00026 
00027 #ifdef STORM_USEF
00028 
00029    int iflag;
00030    hfwt3ds_( &Sizef3d, &ns, &size, sdata, wdata, &iflag );
00031    return iflag;
00032 
00033 #else
00034 
00035    int ii,jj,l,size2;
00036    int size1 = size;
00037    float *u = new float[Sizef3d];
00038    float *v = new float[Sizef3d];
00039 
00040 #ifdef STORM_FWT_CCHECKUSAGE
00041    if ( size1 < ns ) return 1;
00042 #endif
00043 
00044    for( int i = 0; i < size1; i++ ) {
00045       ii=i*size*size;
00046       for( int j = 0; j < size1; j++ ) {
00047          jj=j*size;
00048          for( int k = 0; k < size1; k++ ) {
00049             wdata[ii+jj+k] = sdata[ii+jj+k];
00050          }
00051       }
00052    }
00053 
00054    if ( size1 == ns ) return 0;
00055 
00056    while ( size1 > ns ) {
00057 
00058       size2 = size1 / 2;
00059 
00060       for( int j = 0; j < size1; j++ ) {        // index 1
00061          jj = j * size;
00062          for( int k = 0; k < size1; k++ ) {
00063             for( int i = 0; i < size1; i++ ) {
00064                ii = i * size * size;
00065                u[i] = wdata[ii+jj+k];
00066             }
00067             for( int i = 0; i < size2; i++ ) {
00068                l = 2 * i;
00069                v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00070                v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00071             }
00072             for( int i = 0; i < size1; i++ ) {
00073                ii = i * size * size;
00074                wdata[ii+jj+k] = v[i];
00075             }
00076          }  
00077       }
00078 
00079       for( int i = 0; i < size1; i++ ) {        // index 2
00080          ii = i * size * size;
00081          for( int k = 0; k < size1; k++ ) {
00082             for( int j = 0; j < size1; j++ ) {
00083                jj = j * size;
00084                u[j] = wdata[ii+jj+k];
00085             }
00086             for( int j = 0; j < size2; j++ ) {
00087                l = 2 * j;
00088                v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00089                v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00090             }
00091             for( int j = 0; j < size1; j++ ) {
00092                jj = j * size;
00093                wdata[ii+jj+k] = v[j];
00094             }
00095          }
00096       }
00097 
00098       for( int i = 0; i < size1; i++ ) {        // index 3
00099          ii = i * size * size;
00100          for( int j = 0; j < size1; j++ ) {
00101             jj = j * size;
00102 
00103             for( int k = 0; k < size1; k++ ) {
00104                u[k] = wdata[ii+jj+k];
00105             }
00106 
00107             for( int k = 0; k < size2; k++ ) {
00108                l = 2 * k;
00109                v[k] = ( u[l] + u[l+1] ) * INVSQRT2;
00110                v[size2+k] = ( u[j] - u[l+1] ) * INVSQRT2;
00111             }
00112 
00113             for( int k = 0; k < size1; k++ ) {
00114                wdata[ii+jj+k] = v[k];
00115             }
00116          }
00117       }
00118 
00119       size1 = size2;
00120 
00121    }
00122 
00123    delete [] u;
00124    delete [] v;
00125 
00126 #ifdef STORM_FWT_CCHECKUSAGE
00127    if (size1 != ns) return 2;
00128 #endif
00129 
00130    return 0;
00131 
00132 #endif
00133 }
00134  
00135 
00136 int hfwt3ds( 
00137           const int& Sizef3d,
00138           const int& ns,
00139           const int& size,
00140           const double* sdata,
00141                 double* wdata
00142 ) { 
00143 
00144 #ifdef STORM_USEF
00145 
00146    int iflag;
00147    dhfwt3ds_( &Sizef3d, &ns, &size, sdata, wdata, &iflag );
00148    return iflag;
00149 
00150 #else
00151 
00152    int ii,jj,l,size2;
00153    int size1 = size;
00154    double *u = new double[Sizef3d];
00155    double *v = new double[Sizef3d];
00156 
00157 #ifdef STORM_FWT_CCHECKUSAGE
00158    if ( size1 < ns ) return 1;
00159 #endif
00160 
00161    for( int i = 0; i < size1; i++ ) {
00162       ii=i*size*size;
00163       for( int j = 0; j < size1; j++ ) {
00164          jj=j*size;
00165          for( int k = 0; k < size1; k++ ) {
00166             wdata[ii+jj+k] = sdata[ii+jj+k];
00167          }
00168       }
00169    }
00170 
00171    if ( size1 == ns ) return 0;
00172 
00173    while ( size1 > ns ) {
00174 
00175       size2 = size1 / 2;
00176 
00177       for( int j = 0; j < size1; j++ ) {        // index 1
00178          jj = j * size;
00179          for( int k = 0; k < size1; k++ ) {
00180             for( int i = 0; i < size1; i++ ) {
00181                ii = i * size * size;
00182                u[i] = wdata[ii+jj+k];
00183             }
00184             for( int i = 0; i < size2; i++ ) {
00185                l = 2 * i;
00186                v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00187                v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00188             }
00189             for( int i = 0; i < size1; i++ ) {
00190                ii = i * size * size;
00191                wdata[ii+jj+k] = v[i];
00192             }
00193          }  
00194       }
00195 
00196       for( int i = 0; i < size1; i++ ) {        // index 2
00197          ii = i * size * size;
00198          for( int k = 0; k < size1; k++ ) {
00199             for( int j = 0; j < size1; j++ ) {
00200                jj = j * size;
00201                u[j] = wdata[ii+jj+k];
00202             }
00203             for( int j = 0; j < size2; j++ ) {
00204                l = 2 * j;
00205                  v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00206                  v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00207             }
00208             for( int j = 0; j < size1; j++ ) {
00209                jj = j * size;
00210                wdata[ii+jj+k] = v[j];
00211             }
00212          }
00213       }
00214 
00215       for( int i = 0; i < size1; i++ ) {        // index 3
00216          ii = i * size * size;
00217          for( int j = 0; j < size1; j++ ) {
00218             jj = j * size;
00219 
00220             for( int k = 0; k < size1; k++ ) {
00221                u[k] = wdata[ii+jj+k];
00222             }
00223 
00224             for( int k = 0; k < size2; k++ ) {
00225                l = 2 * k;
00226                v[k] = ( u[l] + u[l+1] ) * INVSQRT2;
00227                v[size2+k] = ( u[j] - u[l+1] ) * INVSQRT2;
00228             }
00229 
00230             for( int k = 0; k < size1; k++ ) {
00231                wdata[ii+jj+k] = v[k];
00232             }
00233          }
00234       }
00235 
00236       size1 = size2;
00237 
00238    }
00239 
00240    delete [] u;
00241    delete [] v;
00242 
00243 #ifdef STORM_FWT_CCHECKUSAGE
00244    if (size1 != ns) return 2;
00245 #endif
00246 
00247    return 0;
00248 
00249 #endif
00250 } 
00251 
00252 
00253 int hfwt3ds( 
00254           const int& Sizef3d,
00255           const int& ns,
00256           const int& size,
00257           const int* sdata,
00258                 int* wdata
00259 ) { 
00260 
00261 #ifdef STORM_USEF
00262 
00263    int iflag;
00264    ihfwt3ds_( &Sizef3d, &ns, &size, sdata, wdata, &iflag );
00265    return iflag;
00266 
00267 #else
00268 
00269    int ii,jj,l,size2;
00270    int size1 = size;
00271    int *u = new int[Sizef3d];
00272    int *v = new int[Sizef3d];
00273 
00274 #ifdef STORM_FWT_CCHECKUSAGE
00275    if ( size1 < ns ) return 1;
00276 #endif
00277 
00278    for( int i = 0; i < size1; i++ ) {
00279       ii=i*size*size;
00280       for( int j = 0; j < size1; j++ ) {
00281          jj=j*size;
00282          for( int k = 0; k < size1; k++ ) {
00283             wdata[ii+jj+k] = sdata[ii+jj+k];
00284          }
00285       }
00286    }
00287 
00288    if ( size1 == ns ) return 0;
00289 
00290    while ( size1 > ns ) {
00291 
00292       size2 = size1 / 2;
00293 
00294       for( int j = 0; j < size1; j++ ) {        // index 1
00295          jj = j * size;
00296          for( int k = 0; k < size1; k++ ) {
00297             for( int i = 0; i < size1; i++ ) {
00298                ii = i * size * size;
00299                u[i] = wdata[ii+jj+k];
00300             }
00301             for( int i = 0; i < size2; i++ ) {
00302                l = 2 * i;
00303                v[i] = ( u[l] + u[l+1] ) / 2;
00304                v[size2+i] = u[l] - u[l+1];
00305             }
00306             for( int i = 0; i < size1; i++ ) {
00307                ii = i * size * size;
00308                wdata[ii+jj+k] = v[i];
00309             }
00310          }  
00311       }
00312 
00313       for( int i = 0; i < size1; i++ ) {        // index 2
00314          ii = i * size * size;
00315          for( int k = 0; k < size1; k++ ) {
00316             for( int j = 0; j < size1; j++ ) {
00317                jj = j * size;
00318                u[j] = wdata[ii+jj+k];
00319             }
00320             for( int j = 0; j < size2; j++ ) {
00321                l = 2 * j;
00322                v[j] = ( u[l] + u[l+1] ) / 2;
00323                v[size2+j] = u[l] - u[l+1];
00324             }
00325             for( int j = 0; j < size1; j++ ) {
00326                jj = j * size;
00327                wdata[ii+jj+k] = v[j];
00328             }
00329          }
00330       }
00331 
00332       for( int i = 0; i < size1; i++ ) {        // index 3
00333          ii = i * size * size;
00334          for( int j = 0; j < size1; j++ ) {
00335             jj = j * size;
00336 
00337             for( int k = 0; k < size1; k++ ) {
00338                u[k] = wdata[ii+jj+k];
00339             }
00340 
00341             for( int k = 0; k < size2; k++ ) {
00342                l = 2 * k;
00343                v[k] = ( u[l] + u[l+1] ) / 2;
00344                v[size2+k] = u[j] - u[l+1];
00345             }
00346 
00347             for( int k = 0; k < size1; k++ ) {
00348                wdata[ii+jj+k] = v[k];
00349             }
00350          }
00351       }
00352 
00353       size1 = size2;
00354 
00355    }
00356 
00357    delete [] u;
00358    delete [] v;
00359 
00360 #ifdef STORM_FWT_CCHECKUSAGE
00361    if (size1 != ns) return 2;
00362 #endif
00363 
00364    return 0;
00365 
00366 #endif
00367 } 
00368 
00369 
00370 int hfwt3ds( 
00371           const int& Sizef3d,
00372           const int& ns,
00373           const int& size,
00374           const float* sdata,
00375                 float* wdata,
00376                 float* ws
00377 ) { 
00378 
00379 #ifdef STORM_USEF
00380 
00381    int iflag;
00382    hfwt3dsws_( &Sizef3d, &ns, &size, sdata, wdata, ws, &iflag );
00383    return iflag;
00384 
00385 #else
00386 
00387    int ii,jj,l,size2;
00388    int size1 = size;
00389    float *u = ws;
00390    float *v = &ws[Sizef3d];
00391 
00392 #ifdef STORM_FWT_CCHECKUSAGE
00393    if ( size1 < ns ) return 1;
00394 #endif
00395 
00396    for( int i = 0; i < size1; i++ ) {
00397       ii=i*size*size;
00398       for( int j = 0; j < size1; j++ ) {
00399          jj=j*size;
00400          for( int k = 0; k < size1; k++ ) {
00401             wdata[ii+jj+k] = sdata[ii+jj+k];
00402          }
00403       }
00404    }
00405 
00406    if ( size1 == ns ) return 0;
00407 
00408    while ( size1 > ns ) {
00409 
00410       size2 = size1 / 2;
00411 
00412       for( int j = 0; j < size1; j++ ) {        // index 1
00413          jj = j * size;
00414          for( int k = 0; k < size1; k++ ) {
00415             for( int i = 0; i < size1; i++ ) {
00416                ii = i * size * size;
00417                u[i] = wdata[ii+jj+k];
00418             }
00419             for( int i = 0; i < size2; i++ ) {
00420                l = 2 * i;
00421                v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00422                v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00423             }
00424             for( int i = 0; i < size1; i++ ) {
00425                ii = i * size * size;
00426                wdata[ii+jj+k] = v[i];
00427             }
00428          }  
00429       }
00430 
00431       for( int i = 0; i < size1; i++ ) {        // index 2
00432          ii = i * size * size;
00433          for( int k = 0; k < size1; k++ ) {
00434             for( int j = 0; j < size1; j++ ) {
00435                jj = j * size;
00436                u[j] = wdata[ii+jj+k];
00437             }
00438             for( int j = 0; j < size2; j++ ) {
00439                l = 2 * j;
00440                v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00441                v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00442             }
00443             for( int j = 0; j < size1; j++ ) {
00444                jj = j * size;
00445                wdata[ii+jj+k] = v[j];
00446             }
00447          }
00448       }
00449 
00450       for( int i = 0; i < size1; i++ ) {        // index 3
00451          ii = i * size * size;
00452          for( int j = 0; j < size1; j++ ) {
00453             jj = j * size;
00454 
00455             for( int k = 0; k < size1; k++ ) {
00456                u[k] = wdata[ii+jj+k];
00457             }
00458 
00459             for( int k = 0; k < size2; k++ ) {
00460                l = 2 * k;
00461                v[k] = ( u[l] + u[l+1] ) * INVSQRT2;
00462                v[size2+k] = ( u[j] - u[l+1] ) * INVSQRT2;
00463             }
00464 
00465             for( int k = 0; k < size1; k++ ) {
00466                wdata[ii+jj+k] = v[k];
00467             }
00468          }
00469       }
00470 
00471       size1 = size2;
00472 
00473    }
00474 
00475 #ifdef STORM_FWT_CCHECKUSAGE
00476    if (size1 != ns) return 2;
00477 #endif
00478 
00479    return 0;
00480 
00481 #endif
00482 } 
00483 
00484 
00485 int hfwt3ds( 
00486           const int& Sizef3d,
00487           const int& ns,
00488           const int& size,
00489           const double* sdata,
00490                 double* wdata,
00491                 double* ws
00492 ) { 
00493 
00494 #ifdef STORM_USEF
00495 
00496    int iflag;
00497    dhfwt3dsws_( &Sizef3d, &ns, &size, sdata, wdata, ws, &iflag );
00498    return iflag;
00499 
00500 #else
00501 
00502    int ii,jj,l,size2;
00503    int size1 = size;
00504    double* u = ws;
00505    double* v = &ws[Sizef3d];
00506 
00507 #ifdef STORM_FWT_CCHECKUSAGE
00508    if ( size1 < ns ) return 1;
00509 #endif
00510 
00511    for( int i = 0; i < size1; i++ ) {
00512       ii=i*size*size;
00513       for( int j = 0; j < size1; j++ ) {
00514          jj=j*size;
00515          for( int k = 0; k < size1; k++ ) {
00516             wdata[ii+jj+k] = sdata[ii+jj+k];
00517          }
00518       }
00519    }
00520 
00521    if ( size1 == ns ) return 0;
00522 
00523    while ( size1 > ns ) {
00524 
00525       size2 = size1 / 2;
00526 
00527       for( int j = 0; j < size1; j++ ) {        // index 1
00528          jj = j * size;
00529          for( int k = 0; k < size1; k++ ) {
00530             for( int i = 0; i < size1; i++ ) {
00531                ii = i * size * size;
00532                u[i] = wdata[ii+jj+k];
00533             }
00534             for( int i = 0; i < size2; i++ ) {
00535                l = 2 * i;
00536                v[i] = ( u[l] + u[l+1] ) * INVSQRT2;
00537                v[size2+i] = ( u[l] - u[l+1] ) * INVSQRT2;
00538             }
00539             for( int i = 0; i < size1; i++ ) {
00540                ii = i * size * size;
00541                wdata[ii+jj+k] = v[i];
00542             }
00543          }  
00544       }
00545 
00546       for( int i = 0; i < size1; i++ ) {        // index 2
00547          ii = i * size * size;
00548          for( int k = 0; k < size1; k++ ) {
00549             for( int j = 0; j < size1; j++ ) {
00550                jj = j * size;
00551                u[j] = wdata[ii+jj+k];
00552             }
00553             for( int j = 0; j < size2; j++ ) {
00554                l = 2 * j;
00555                  v[j] = ( u[l] + u[l+1] ) * INVSQRT2;
00556                  v[size2+j] = ( u[l] - u[l+1] ) * INVSQRT2;
00557             }
00558             for( int j = 0; j < size1; j++ ) {
00559                jj = j * size;
00560                wdata[ii+jj+k] = v[j];
00561             }
00562          }
00563       }
00564 
00565       for( int i = 0; i < size1; i++ ) {        // index 3
00566          ii = i * size * size;
00567          for( int j = 0; j < size1; j++ ) {
00568             jj = j * size;
00569 
00570             for( int k = 0; k < size1; k++ ) {
00571                u[k] = wdata[ii+jj+k];
00572             }
00573 
00574             for( int k = 0; k < size2; k++ ) {
00575                l = 2 * k;
00576                v[k] = ( u[l] + u[l+1] ) * INVSQRT2;
00577                v[size2+k] = ( u[j] - u[l+1] ) * INVSQRT2;
00578             }
00579 
00580             for( int k = 0; k < size1; k++ ) {
00581                wdata[ii+jj+k] = v[k];
00582             }
00583          }
00584       }
00585 
00586       size1 = size2;
00587 
00588    }
00589 
00590 #ifdef STORM_FWT_CCHECKUSAGE
00591    if (size1 != ns) return 2;
00592 #endif
00593 
00594    return 0;
00595 
00596 #endif
00597 } 
00598 
00599 
00600 int hfwt3ds( 
00601           const int& Sizef3d,
00602           const int& ns,
00603           const int& size,
00604           const int* sdata,
00605                 int* wdata,
00606                 int* ws
00607 ) { 
00608 
00609 #ifdef STORM_USEF
00610 
00611    int iflag;
00612    ihfwt3dsws_( &Sizef3d, &ns, &size, sdata, wdata, ws, &iflag );
00613    return iflag;
00614 
00615 #else
00616 
00617    int ii,jj,l,size2;
00618    int size1 = size;
00619    int *u = ws;
00620    int *v = &ws[Sizef3d];
00621 
00622 #ifdef STORM_FWT_CCHECKUSAGE
00623    if ( size1 < ns ) return 1;
00624 #endif
00625 
00626    for( int i = 0; i < size1; i++ ) {
00627       ii=i*size*size;
00628       for( int j = 0; j < size1; j++ ) {
00629          jj=j*size;
00630          for( int k = 0; k < size1; k++ ) {
00631             wdata[ii+jj+k] = sdata[ii+jj+k];
00632          }
00633       }
00634    }
00635 
00636    if ( size1 == ns ) return 0;
00637 
00638    while ( size1 > ns ) {
00639 
00640       size2 = size1 / 2;
00641 
00642       for( int j = 0; j < size1; j++ ) {        // index 1
00643          jj = j * size;
00644          for( int k = 0; k < size1; k++ ) {
00645             for( int i = 0; i < size1; i++ ) {
00646                ii = i * size * size;
00647                u[i] = wdata[ii+jj+k];
00648             }
00649             for( int i = 0; i < size2; i++ ) {
00650                l = 2 * i;
00651                v[i] = ( u[l] + u[l+1] ) / 2;
00652                v[size2+i] = u[l] - u[l+1];
00653             }
00654             for( int i = 0; i < size1; i++ ) {
00655                ii = i * size * size;
00656                wdata[ii+jj+k] = v[i];
00657             }
00658          }  
00659       }
00660 
00661       for( int i = 0; i < size1; i++ ) {        // index 2
00662          ii = i * size * size;
00663          for( int k = 0; k < size1; k++ ) {
00664             for( int j = 0; j < size1; j++ ) {
00665                jj = j * size;
00666                u[j] = wdata[ii+jj+k];
00667             }
00668             for( int j = 0; j < size2; j++ ) {
00669                l = 2 * j;
00670                v[j] = ( u[l] + u[l+1] ) / 2;
00671                v[size2+j] = u[l] - u[l+1];
00672             }
00673             for( int j = 0; j < size1; j++ ) {
00674                jj = j * size;
00675                wdata[ii+jj+k] = v[j];
00676             }
00677          }
00678       }
00679 
00680       for( int i = 0; i < size1; i++ ) {        // index 3
00681          ii = i * size * size;
00682          for( int j = 0; j < size1; j++ ) {
00683             jj = j * size;
00684 
00685             for( int k = 0; k < size1; k++ ) {
00686                u[k] = wdata[ii+jj+k];
00687             }
00688 
00689             for( int k = 0; k < size2; k++ ) {
00690                l = 2 * k;
00691                v[k] = ( u[l] + u[l+1] ) / 2;
00692                v[size2+k] = u[j] - u[l+1];
00693             }
00694 
00695             for( int k = 0; k < size1; k++ ) {
00696                wdata[ii+jj+k] = v[k];
00697             }
00698          }
00699       }
00700 
00701       size1 = size2;
00702 
00703    }
00704 
00705 #ifdef STORM_FWT_CCHECKUSAGE
00706    if (size1 != ns) return 2;
00707 #endif
00708 
00709    return 0;
00710 
00711 #endif
00712 } 
00713 
00714 #undef INVSQRT2
00715 

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