Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals

Rtmra_Data_t_scalar.h

Go to the documentation of this file.
00001 // Rtmra_Data_t_scalar.h
00002 //////////////////////////////////////////////////////////////////////
00003 //          (c) Copyright 2000-2002 Brown Deer Technology, LLC.
00004 //                        All rights reserved.
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 // partial specialization Rtmra<Data_t,scalar>
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; } //DEBUG
00046       virtual int mcycle();
00047       bool isvalid(const int m) { return ( m < mcycle() ) ; }
00048       virtual Data_t scal( const int ); // m
00049       virtual Data_t wav( const int );  // m
00050       virtual Data_t ave( const int );  // m
00051       virtual Data_t chg( const int );  // m
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 //#ifdef STORM_USEC
00165    rtmrartjiwt( _Msize, _mmax, _mrastep, _mracoef, *_data );
00166 //#else
00167 //   _mrastep++;
00168 //   int itmp = (1<<_mmax) - 1;
00169 //   itmp = itmp - ( itmp & _mrastep );
00170 //   int imcycle = 0;
00171 //   while ( ( itmp & (1<<imcycle) ) && ( imcycle < _mmax ) ) { imcycle++; }
00172 //   int m = imcycle;
00173 //   if ( m < _mmax ) { 
00174 //      _mracoef[2*m] = ( _mracoef[ 2*(m+1) ] 
00175 //                        - _mracoef[ 2*(m+1) + 1 ] ) * INVSQRT2; 
00176 //   }
00177 //   m--;
00178 //   while ( m >= 0 ) {
00179 //      _mracoef[2*m] = ( _mracoef[ 2*(m+1) ] 
00180 //                        + _mracoef[ 2*(m+1) + 1 ]) * INVSQRT2;
00181 //      m--;
00182 //   }
00183 //   *_data = _mracoef[0];
00184 //#endif
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00207       scalcoef = _mracoef[2*m]; 
00208 //   }
00209 //   else { 
00210 //      scalcoef = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00224       wavcoef = _mracoef[ 2*m + 1 ]; 
00225 //   }
00226 //   else { wavcoef = 1.0/0; }
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00239       scala = _mracoef[2*m] * pow(INVSQRT2,m); 
00240 //   }
00241 //   else { 
00242 //      scala = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
00256       wavd = _mracoef[ 2*m + 1 ] * pow(INVSQRT2,m); 
00257 //   }
00258 //   else { 
00259 //      wavd = 1.0/0; 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
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 //   if ( ( m >= 0 ) && ( m <= _mmax ) ) { 
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 //cout << "SPECIAL" << endl;
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 

Generated on Mon May 31 21:38:52 2004 for SR2k4 Assembler by doxygen 1.3.6