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