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