00001
00002
00003
00004
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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++ ) {
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