00001
00002
00003
00004
00005
00006
00007 #ifdef STORM_USEF
00008 #include "pd4ifwt2ds_.h"
00009 #include "dpd4ifwt2ds_.h"
00010 #include "pd4ifwt2dsws_.h"
00011 #include "dpd4ifwt2dsws_.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 pd4ifwt2ds(
00021 const int& Sizef2d,
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 pd4ifwt2ds_( &Sizef2d, &ns, &ks, &size, wdata, sdata, &iflag );
00033 return iflag;
00034
00035 #else
00036
00037 int ii;
00038 int i1,j1;
00039 int size2;
00040 int size1 = ns;
00041 float *u = new float[Sizef2d];
00042 float *v = new float[Sizef2d];
00043
00044 #ifdef STORM_FWT_CCHECKUSAGE
00045 if ( size1 < ns ) return 1;
00046 #endif
00047
00048 for( int i = 0; i < size*size; i++ ) {
00049 sdata[i] = wdata[i];
00050 }
00051
00052 if ( size == ns ) return 0;
00053
00054 while ( size1 < size ) {
00055
00056 size2 = size1;
00057 size1 = 2 * size1;
00058
00059 for( int j = 0; j < size1; j++ ) {
00060 for( int i = 0; i < size1; i++ ) {
00061 ii = i * size;
00062 u[i] = sdata[ii+j];
00063 }
00064 for( int i = 0; i < size2; i++ ) {
00065 i1 = (i-1+size2)%size2;
00066 v[2*i] = H0*u[i] + H2*u[i1]
00067 + H3*u[size2+i] + H1*u[size2+i1];
00068 v[2*i+1] = H1*u[i] + H3*u[i1]
00069 - H2*u[size2+i] - H0*u[size2+i1];
00070 }
00071 for( int i = 0; i < size1; i++ ) {
00072 ii = i * size;
00073 sdata[ii+j] = v[i];
00074 }
00075 }
00076
00077 for( int i = 0; i < size1; i++ ) {
00078 ii = i * size;
00079 for( int j = 0; j < size1; j++ ) {
00080 u[j] = sdata[ii+j];
00081 }
00082 for( int j = 0; j < size2; j++ ) {
00083 j1 = (j-1+size2)%size2;
00084 v[2*j] = H0*u[j] + H2*u[j1]
00085 + H3*u[size2+j] + H1*u[size2+j1];
00086 v[2*j+1] = H1*u[j] + H3*u[j1]
00087 - H2*u[size2+j] - H0*u[size2+j1];
00088 }
00089 for( int j = 0; j < size1; j++ ) {
00090 sdata[ii+j] = v[j];
00091 }
00092 }
00093
00094 }
00095
00096 delete [] u;
00097 delete [] v;
00098
00099 #ifdef STORM_FWT_CCHECKUSAGE
00100 if ( size1 > size ) return 2;
00101 #endif
00102
00103 return 0;
00104
00105 #endif
00106 }
00107
00108
00109 int pd4ifwt2ds(
00110 const int& Sizef2d,
00111 const int& ns,
00112 const int& ks,
00113 const int& size,
00114 const double* wdata,
00115 double* sdata
00116 ) {
00117
00118 #ifdef STORM_USEF
00119
00120 int iflag;
00121 dpd4ifwt2ds_( &Sizef2d, &ns, &ks, &size, wdata, sdata, &iflag );
00122 return iflag;
00123
00124 #else
00125
00126 int ii;
00127 int i1,j1;
00128 int size2;
00129 int size1 = ns;
00130 double *u = new double[Sizef2d];
00131 double *v = new double[Sizef2d];
00132
00133 #ifdef STORM_FWT_CCHECKUSAGE
00134 if ( size1 < ns ) return 1;
00135 #endif
00136
00137 for( int i = 0; i < size*size; i++ ) {
00138 sdata[i] = wdata[i];
00139 }
00140
00141 if ( size == ns ) return 0;
00142
00143 while ( size1 < size ) {
00144
00145 size2 = size1;
00146 size1 = 2 * size1;
00147
00148 for( int j = 0; j < size1; j++ ) {
00149 for( int i = 0; i < size1; i++ ) {
00150 ii = i * size;
00151 u[i] = sdata[ii+j];
00152 }
00153 for( int i = 0; i < size2; i++ ) {
00154 i1 = (i-1+size2)%size2;
00155 v[2*i] = H0*u[i] + H2*u[i1]
00156 + H3*u[size2+i] + H1*u[size2+i1];
00157 v[2*i+1] = H1*u[i] + H3*u[i1]
00158 - H2*u[size2+i] - H0*u[size2+i1];
00159 }
00160 for( int i = 0; i < size1; i++ ) {
00161 ii = i * size;
00162 sdata[ii+j] = v[i];
00163 }
00164 }
00165
00166 for( int i = 0; i < size1; i++ ) {
00167 ii = i * size;
00168 for( int j = 0; j < size1; j++ ) {
00169 u[j] = sdata[ii+j];
00170 }
00171 for( int j = 0; j < size2; j++ ) {
00172 j1 = (j-1+size2)%size2;
00173 v[2*j] = H0*u[j] + H2*u[j1]
00174 + H3*u[size2+j] + H1*u[size2+j1];
00175 v[2*j+1] = H1*u[j] + H3*u[j1]
00176 - H2*u[size2+j] - H0*u[size2+j1];
00177 }
00178 for( int j = 0; j < size1; j++ ) {
00179 sdata[ii+j] = v[j];
00180 }
00181 }
00182
00183 }
00184
00185 delete [] u;
00186 delete [] v;
00187
00188 #ifdef STORM_FWT_CCHECKUSAGE
00189 if ( size1 > size ) return 2;
00190 #endif
00191
00192 return 0;
00193
00194 #endif
00195 }
00196
00197
00198 int pd4ifwt2ds(
00199 const int& Sizef2d,
00200 const int& ns,
00201 const int& ks,
00202 const int& size,
00203 const float* wdata,
00204 float* sdata,
00205 float* ws
00206 ) {
00207
00208 #ifdef STORM_USEF
00209
00210 int iflag;
00211 pd4ifwt2dsws_( &Sizef2d, &ns, &ks, &size, wdata, sdata, ws, &iflag );
00212 return iflag;
00213
00214 #else
00215
00216 int ii;
00217 int i1,j1;
00218 int size2;
00219 int size1 = ns;
00220 float *u = ws;
00221 float *v = &ws[Sizef2d];
00222
00223 #ifdef STORM_FWT_CCHECKUSAGE
00224 if ( size1 < ns ) return 1;
00225 #endif
00226
00227 for( int i = 0; i < size*size; i++ ) {
00228 sdata[i] = wdata[i];
00229 }
00230
00231 if ( size == ns ) return 0;
00232
00233 while ( size1 < size ) {
00234
00235 size2 = size1;
00236 size1 = 2 * size1;
00237
00238 for( int j = 0; j < size1; j++ ) {
00239 for( int i = 0; i < size1; i++ ) {
00240 ii = i * size;
00241 u[i] = sdata[ii+j];
00242 }
00243 for( int i = 0; i < size2; i++ ) {
00244 i1 = (i-1+size2)%size2;
00245 v[2*i] = H0*u[i] + H2*u[i1]
00246 + H3*u[size2+i] + H1*u[size2+i1];
00247 v[2*i+1] = H1*u[i] + H3*u[i1]
00248 - H2*u[size2+i] - H0*u[size2+i1];
00249 }
00250 for( int i = 0; i < size1; i++ ) {
00251 ii = i * size;
00252 sdata[ii+j] = v[i];
00253 }
00254 }
00255
00256 for( int i = 0; i < size1; i++ ) {
00257 ii = i * size;
00258 for( int j = 0; j < size1; j++ ) {
00259 u[j] = sdata[ii+j];
00260 }
00261 for( int j = 0; j < size2; j++ ) {
00262 j1 = (j-1+size2)%size2;
00263 v[2*j] = H0*u[j] + H2*u[j1]
00264 + H3*u[size2+j] + H1*u[size2+j1];
00265 v[2*j+1] = H1*u[j] + H3*u[j1]
00266 - H2*u[size2+j] - H0*u[size2+j1];
00267 }
00268 for( int j = 0; j < size1; j++ ) {
00269 sdata[ii+j] = v[j];
00270 }
00271 }
00272
00273 }
00274
00275 #ifdef STORM_FWT_CCHECKUSAGE
00276 if ( size1 > size ) return 2;
00277 #endif
00278
00279 return 0;
00280
00281 #endif
00282 }
00283
00284
00285 int pd4ifwt2ds(
00286 const int& Sizef2d,
00287 const int& ns,
00288 const int& ks,
00289 const int& size,
00290 const double* wdata,
00291 double* sdata,
00292 double* ws
00293 ) {
00294
00295 #ifdef STORM_USEF
00296
00297 int iflag;
00298 dpd4ifwt2dsws_( &Sizef2d, &ns, &ks, &size, wdata, sdata, ws, &iflag );
00299 return iflag;
00300
00301 #else
00302
00303 int ii;
00304 int i1,j1;
00305 int size2;
00306 int size1 = ns;
00307 double *u = ws;
00308 double *v = &ws[Sizef2d];
00309
00310 #ifdef STORM_FWT_CCHECKUSAGE
00311 if ( size1 < ns ) return 1;
00312 #endif
00313
00314 for( int i = 0; i < size*size; i++ ) {
00315 sdata[i] = wdata[i];
00316 }
00317
00318 if ( size == ns ) return 0;
00319
00320 while ( size1 < size ) {
00321
00322 size2 = size1;
00323 size1 = 2 * size1;
00324
00325 for( int j = 0; j < size1; j++ ) {
00326 for( int i = 0; i < size1; i++ ) {
00327 ii = i * size;
00328 u[i] = sdata[ii+j];
00329 }
00330 for( int i = 0; i < size2; i++ ) {
00331 i1 = (i-1+size2)%size2;
00332 v[2*i] = H0*u[i] + H2*u[i1]
00333 + H3*u[size2+i] + H1*u[size2+i1];
00334 v[2*i+1] = H1*u[i] + H3*u[i1]
00335 - H2*u[size2+i] - H0*u[size2+i1];
00336 }
00337 for( int i = 0; i < size1; i++ ) {
00338 ii = i * size;
00339 sdata[ii+j] = v[i];
00340 }
00341 }
00342
00343 for( int i = 0; i < size1; i++ ) {
00344 ii = i * size;
00345 for( int j = 0; j < size1; j++ ) {
00346 u[j] = sdata[ii+j];
00347 }
00348 for( int j = 0; j < size2; j++ ) {
00349 j1 = (j-1+size2)%size2;
00350 v[2*j] = H0*u[j] + H2*u[j1]
00351 + H3*u[size2+j] + H1*u[size2+j1];
00352 v[2*j+1] = H1*u[j] + H3*u[j1]
00353 - H2*u[size2+j] - H0*u[size2+j1];
00354 }
00355 for( int j = 0; j < size1; j++ ) {
00356 sdata[ii+j] = v[j];
00357 }
00358 }
00359
00360 }
00361
00362 #ifdef STORM_FWT_CCHECKUSAGE
00363 if ( size1 > size ) return 2;
00364 #endif
00365
00366 return 0;
00367
00368 #endif
00369 }
00370
00371
00372 #undef H0
00373 #undef H1
00374 #undef H2
00375 #undef H3
00376