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