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