00001
00002
00003
00004
00005
00006
00007 #ifndef _RTMRA_DATA_T_SCALAR_H
00008 #define _RTMRA_DATA_T_SCALAR_H
00009
00010 #ifdef USE_STD
00011 #include <cmath>
00012 using namespace std;
00013 #else
00014 #include <math.h>
00015 #endif
00016
00017 #include "stormdef.h"
00018 #define INVSQRT2 STORMDEF_MATHCONST_INVSQRT2
00019
00020
00021 template <typename Data_t>
00022 class Rtmra<Data_t,scalar> {
00023
00024 public:
00025
00026 typedef Data_t DataType;
00027 static const int ArrayDim = 0;
00028
00029 Rtmra( const int msize = 8);
00030 virtual ~Rtmra();
00031 virtual void remalloc( const int msize = 8);
00032 virtual void clear();
00033 void assign( const Data_t data ) { *_data = data; }
00034 Rtmra<Data_t,scalar>& operator=( const Data_t data);
00035 operator Data_t() { return *_data; }
00036 virtual void rtwt();
00037 int operator ++() { rtwt(); return 0; }
00038 int operator ++(int) { rtwt(); return 0; }
00039 int mmax() { return _mmax; }
00040 virtual void rtiwt();
00041 virtual void rtjiwt();
00042 int operator --() { rtiwt(); return 0; }
00043 int operator --(int) { rtiwt(); return 0; }
00044 int mrastep() { return _mrastep; }
00045 void mrastep( const int mrastep ) { _mrastep = mrastep; }
00046 virtual int mcycle();
00047 bool isvalid(const int m) { return ( m < mcycle() ) ; }
00048 virtual Data_t scal( const int );
00049 virtual Data_t wav( const int );
00050 virtual Data_t ave( const int );
00051 virtual Data_t chg( const int );
00052 virtual int imcycle();
00053 virtual void scal( const int m, Data_t scalcoef );
00054 virtual void wav( const int m, Data_t wavcoef );
00055
00056 protected:
00057 int _Msize;
00058 int _mmax;
00059 int _mrastep;
00060 Data_t *_mracoef;
00061 Data_t *_data;
00062
00063 };
00064
00065 template <typename Data_t>
00066 inline Rtmra<Data_t,scalar>::Rtmra( const int msize )
00067 : _Msize(msize), _mmax(msize-1), _mrastep(-1)
00068 {
00069 _mracoef = new Data_t[ 2*_Msize ];
00070 _data = new Data_t;
00071 for( int i = 0; i < 2*_Msize; i++) { _mracoef[i] = 0; }
00072 *_data = 0;
00073 }
00074
00075 template <typename Data_t>
00076 inline Rtmra<Data_t,scalar>::~Rtmra()
00077 {
00078 delete _data; _data = 0;
00079 delete [] _mracoef; _mracoef = 0;
00080 }
00081
00082 template <typename Data_t>
00083 inline void Rtmra<Data_t,scalar>::remalloc( const int msize )
00084 {
00085 _Msize = msize;
00086 _mmax = msize-1;
00087 _mrastep = -1;
00088 if (_mracoef) delete [] _mracoef; _mracoef = 0;
00089 if (_data) delete _data; _data = 0;
00090 _mracoef = new Data_t[ 2*_Msize ];
00091 _data = new Data_t;
00092 for( int i = 0; i< 2*_Msize; i++) { _mracoef[i] = 0; }
00093 *_data = 0;
00094 }
00095
00096 template <typename Data_t>
00097 inline void Rtmra<Data_t,scalar>::clear()
00098 {
00099 _mrastep = -1;
00100 for( int i = 0; i < 2*_Msize; i++) { _mracoef[i] = 0; }
00101 *_data = 0;
00102 }
00103
00104 template <typename Data_t>
00105 inline Rtmra<Data_t,scalar>&
00106 Rtmra<Data_t,scalar>::operator=( const Data_t data )
00107 {
00108 assign(data);
00109 return *this;
00110 }
00111
00112 template <typename Data_t>
00113 inline void Rtmra<Data_t,scalar>::rtwt()
00114 {
00115 #ifdef STORM_USEC
00116 rtmrartwt( _Msize, _mmax, _mrastep, _mracoef, *_data );
00117 #else
00118 _mrastep++;
00119 int mcycle = 0;
00120 while ( ( _mrastep & (1<<mcycle) ) && ( mcycle < _mmax ) ) { mcycle++; }
00121 Data_t tmpold;
00122 Data_t tmp = *_data;
00123 int m = 1;
00124 while ( m <= mcycle ) {
00125 tmpold = _mracoef[ 2*(m-1) ];
00126 _mracoef[ 2*(m-1) ] = tmp;
00127 _mracoef[ 2*m + 1 ] = (tmpold-tmp) * INVSQRT2;
00128 tmp = (tmpold+tmp) * INVSQRT2;
00129 m++;
00130 }
00131 _mracoef[ 2*(m-1) ] = tmp;
00132 #endif
00133 }
00134
00135 template <typename Data_t>
00136 inline void Rtmra<Data_t,scalar>::rtiwt()
00137 {
00138 #ifdef STORM_USEC
00139 rtmrartiwt( _Msize, _mmax, _mrastep, _mracoef, *_data );
00140 #else
00141 _mrastep++;
00142 int itmp = (1<<_mmax) - 1;
00143 itmp = itmp - ( itmp & _mrastep );
00144 int imcycle = 0;
00145 while ( ( itmp & (1<<imcycle) ) && ( imcycle < _mmax ) ) { imcycle++; }
00146 int m = imcycle;
00147 if ( m < _mmax ) {
00148 _mracoef[2*m] = ( _mracoef[ 2*(m+1) ]
00149 - _mracoef[ 2*(m+1) + 1 ] ) * INVSQRT2;
00150 }
00151 m--;
00152 while ( m >= 0 ) {
00153 _mracoef[2*m] = ( _mracoef[ 2*(m+1) ]
00154 + _mracoef[ 2*(m+1) + 1 ]) * INVSQRT2;
00155 m--;
00156 }
00157 *_data = _mracoef[0];
00158 #endif
00159 }
00160
00161 template <typename Data_t>
00162 inline void Rtmra<Data_t,scalar>::rtjiwt()
00163 {
00164
00165 rtmrartjiwt( _Msize, _mmax, _mrastep, _mracoef, *_data );
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185 }
00186
00187 template <typename Data_t>
00188 inline int Rtmra<Data_t,scalar>::mcycle()
00189 {
00190 int mcycle=0;
00191 #ifdef STORM_USEC
00192 rtmramcycle( _Msize, _mmax, _mrastep, mcycle );
00193 #else
00194 while ((_mrastep&(1<<mcycle))&&(mcycle<_mmax)) { mcycle++; }
00195 #endif
00196 return mcycle;
00197 }
00198
00199 template <typename Data_t>
00200 inline Data_t Rtmra<Data_t,scalar>::scal( const int m )
00201 {
00202 Data_t scalcoef;
00203 #ifdef STORM_USEC
00204 rtmrascalcoef( _Msize, _mmax, _mrastep, _mracoef, m, scalcoef );
00205 #else
00206
00207 scalcoef = _mracoef[2*m];
00208
00209
00210
00211
00212 #endif
00213 return scalcoef;
00214 }
00215
00216 template <typename Data_t>
00217 inline Data_t Rtmra<Data_t,scalar>::wav( const int m )
00218 {
00219 Data_t wavcoef;
00220 #ifdef STORM_USEC
00221 rtmrawavcoef( _Msize, _mmax, _mrastep, _mracoef, m, wavcoef );
00222 #else
00223
00224 wavcoef = _mracoef[ 2*m + 1 ];
00225
00226
00227 #endif
00228 return wavcoef;
00229 }
00230
00231 template <typename Data_t>
00232 inline Data_t Rtmra<Data_t,scalar>::ave( const int m )
00233 {
00234 Data_t scala;
00235 #ifdef STORM_USEC
00236 rtmrascala( _Msize, _mmax, _mrastep, _mracoef, m, scala );
00237 #else
00238
00239 scala = _mracoef[2*m] * pow(INVSQRT2,m);
00240
00241
00242
00243
00244 #endif
00245 return scala;
00246 }
00247
00248 template <typename Data_t>
00249 inline Data_t Rtmra<Data_t,scalar>::chg( const int m )
00250 {
00251 Data_t wavd;
00252 #ifdef STORM_USEC
00253 rtmrawavd( _Msize, _mmax, _mrastep, _mracoef, m, wavd );
00254 #else
00255
00256 wavd = _mracoef[ 2*m + 1 ] * pow(INVSQRT2,m);
00257
00258
00259
00260
00261 #endif
00262 return wavd;
00263 }
00264
00265 template <typename Data_t>
00266 inline int Rtmra<Data_t,scalar>::imcycle()
00267 {
00268 int imcycle = 0;
00269 #ifdef STORM_USEC
00270 rtmraimcycle( _Msize, _mmax, _mrastep, imcycle );
00271 #else
00272 int itmp = (1<<_mmax) - 1;
00273 itmp = itmp - ( itmp & ( _mrastep + 1) );
00274 while ( ( itmp & (1<<imcycle) ) && ( imcycle < _mmax ) ) { imcycle++; }
00275 #endif
00276 return imcycle;
00277 }
00278
00279 template <typename Data_t>
00280 inline void Rtmra<Data_t,scalar>::scal( const int m, Data_t scalcoef )
00281 {
00282 #ifdef STORM_USEC
00283 rtmraputscalcoef( _Msize, _mmax, _mrastep, _mracoef, m, scalcoef );
00284 #else
00285
00286 _mracoef[2*m] = scalcoef;
00287
00288 #endif
00289 }
00290
00291 template <typename Data_t>
00292 inline void Rtmra<Data_t,scalar>::wav( const int m, Data_t wavcoef )
00293 {
00294 #ifdef STORM_USEC
00295 rtmraputwavcoef( _Msize, _mmax, _mrastep, _mracoef, m, wavcoef );
00296 #else
00297
00298 _mracoef[ 2*m + 1 ] = wavcoef;
00299
00300 #endif
00301 }
00302
00303 template <>
00304 inline void Rtmra<int,scalar>::rtwt()
00305 {
00306 #ifdef STORM_USEC
00307 rtmrartwt( _Msize, _mmax, _mrastep, _mracoef, *_data );
00308 #else
00309 _mrastep++;
00310 int mcycle = 0;
00311 while ( ( _mrastep & (1<<mcycle) ) && ( mcycle < _mmax ) ) { mcycle++; }
00312 int tmpold;
00313 int tmp = *_data;
00314 int m = 1;
00315 while ( m <= mcycle ) {
00316 tmpold = _mracoef[ 2*(m-1) ];
00317 _mracoef[ 2*(m-1) ] = tmp;
00318 _mracoef[ 2*m + 1 ] = (tmpold-tmp);
00319 tmp = (tmpold+tmp) >> 1;
00320 m++;
00321 }
00322 _mracoef[ 2*(m-1) ] = tmp;
00323 #endif
00324 }
00325
00326 template <>
00327 inline void Rtmra<int,scalar>::rtiwt()
00328 {
00329 #ifdef STORM_USEC
00330 rtmrartiwt( _Msize, _mmax, _mrastep, _mracoef, *_data );
00331
00332 #else
00333 _mrastep++;
00334 int itmp = (1<<_mmax) - 1;
00335 itmp = itmp - ( itmp & _mrastep );
00336 int imcycle = 0;
00337 while ( ( itmp & (1<<imcycle) ) && ( imcycle < _mmax ) ) { imcycle++; }
00338 int m = imcycle;
00339 if ( m < _mmax ) {
00340 _mracoef[2*m] = _mracoef[ 2*(m+1) ]
00341 - ( _mracoef[ 2*(m+1) + 1 ] >> 1 );
00342 }
00343 m--;
00344 while ( m >= 0 ) {
00345 _mracoef[2*m] = _mracoef[ 2*(m+1) ]
00346 + ( ( _mracoef[ 2*(m+1) + 1 ] + 1 ) >> 1 );
00347 m--;
00348 }
00349 *_data = _mracoef[0];
00350 #endif
00351 }
00352
00353 #endif // _RTMRA_DATA_T_SCALAR_H
00354