Department of Scientific Computing   
Institute for Numerical Simulation   
University of Bonn   
Documentation
Download
Programming References
Bug Reports / Suggestions
FAQ
Authors
Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members  

Adaptive1DIndexSet.cc

00001 #include "Adaptive1D.hpp"
00002 
00003 extern int debugRefine ;
00004 
00005 /**********************/
00006 /*                    */
00007 /*     IndexSet::     */
00008 /*                    */
00009 /**********************/
00010 
00011 IndexSet::IndexSet()          {a=e=NULL ;nr=0 ;}
00012 IndexSet::IndexSet(int Size)  {a=e=NULL ;nr=0 ;Init(Size);}
00013 IndexSet::~IndexSet()         {delete []a; delete []e;}
00014 
00015 // Init. of IndexSet with number of intervals <= Size 
00016 // to avoid UMR errors the arrays are allocated for Size+1 intervals and are explicitely int.
00017 int IndexSet::Init(int Size) {
00018  Size=min(Size,_MAX_INDEXSET_) ;
00019  if (a==NULL) {
00020    a=new int[Size+1] ;
00021    e=new int[Size+1] ;
00022    for (int i=0; i<=Size; i++) a[i]=e[i]=0 ;
00023  }
00024  nr=0 ;
00025  return 1 ;
00026 }
00027 
00028 int IndexSet::Print(char *st) 
00029 { int c=0 ;
00030  if (st) std::cout <<st ;
00031  std::cout << "nr: "<<nr<<' '<<a<<','<<e<<'\n';
00032  for (int i=0; i<nr; i++) {  
00033    if (st) std::cout <<st ;
00034    std::cout << "r "<<i<<": "<<a[i]<<' '<<e[i]<<'\n';
00035    c+=(e[i]-a[i]+1) ; 
00036  }
00037  return c ;
00038 }
00039 
00040 // print three columns: *st, i*2^(-*l*) , l     //  *l* = (l==Level0) ? l : l-1 
00041 void IndexSet::Print(char *st,int l,int Level0) 
00042 { int si = (l==Level0) ? 1<<l : 1<<(l-1) ;
00043  for (int r=0; r<nr; r++)
00044    for (int i=a[r];i<=e[r];i++)
00045      std::cout<<st<<' '<<((double)i)/si<<' '<<l<<'\n' ;
00046 }
00047 
00048 size_t IndexSet::Size() {
00049   size_t s=0 ;
00050   for (int r=0; r<nr; r++) s += (size_t)(e[r]-a[r]+1) ; 
00051   return s ;
00052 }
00053 
00054 void IndexSet::Copy(IndexSet *F)
00055 {
00056  if (this==F) return ;
00057  nr=F->nr ; assert(nr<_MAX_INDEXSET_) ;
00058  for (int i=0;i<nr;i++) a[i]=F->a[i] , e[i]=F->e[i] ;
00059 }
00060 
00061 //
00062 // essentially the given index set of scaling functions (!) is copied, 
00063 // but if scaling functions on the interval are given, then the following condition
00064 // is maintained: if any boundary scaling function is active then all boundary scaling
00065 // functions are activated
00066 void IndexSet::CopyWithBounds(IndexSet *B,int l, int *BC, Wavelets *W) {
00067   int *Ba=B->a , *Be=B->e ,Bn=B->nr , r, iend=(1<<l) ;
00068   int K0=-1,NKW1=iend+1 ;
00069 
00070   assert(Bn<_MAX_INDEXSET_) ;
00071 
00072   if (BC[1]!=PERIODIC) { K0=W->K0 , NKW1=iend-W->K1 ;}
00073   
00074   nr=0 ;
00075   if (Bn==0) return ;
00076 
00077   r=0 ;
00078   // left boundary
00079   if (Ba[0]<K0) {
00080     a[0]=0 ; e[0]=K0-1 ;
00081     while ((r<Bn)&&(Ba[r]<K0)) { e[0]=max(e[0],Be[r]) ;r++;}
00082     nr=1 ;
00083   }
00084   // center
00085   for (;r<Bn;r++) { a[nr]=Ba[r] ; e[nr++]=Be[r] ; }
00086   
00087   // right boundary
00088   r=nr-1 ;
00089   while ((r>=0) && (e[r]>NKW1)) r-- ;
00090 
00091   if (r+1<nr) {
00092     a[r+1]=min(a[r+1],NKW1) ;
00093     e[r+1]=iend;
00094     nr=r+2 ;
00095   }
00096   
00097  // Patch: if the last interval and it's predecessor touch merge them
00098  if (nr>1)
00099    if (a[nr-1]==e[nr-2]+1) { e[nr-2]=e[nr-1] ; nr--;}
00100 }
00101 
00102 // scalings(l) which span the given wavelets(l)
00103 void IndexSet::InducedByWavelets(IndexSet *B,int l, int *BC, Wavelets *W)
00104 {                                       
00105   if(l==W->Level0) { CopyWithBounds(B,W->Level0,BC,W) ;return ;} // Auf level0 ist nichts zu tun 
00106   //if(l==Level0) { this->Copy(B) ; return ;}
00107 
00108   struct MatrixShape H ;
00109   W->GtJ.GetShape(l,&H) ;
00110   H.Transpose()        ;
00111   CAM(B,BC,&H,TransformMatrixTransposeFirstNZEP , TransformMatrixTransposeLastNZEP ,
00112               TransformMatrixTransposeFirstNZE  , TransformMatrixTransposeLastNZE) ;
00113 
00114   assert(nr<_MAX_INDEXSET_) ;
00115 } 
00116 
00117 // scalings(l) influenced by the given scalings(l-1)
00118 void IndexSet::InducedByCoarseScalings(IndexSet *B,int l, int *BC, Wavelets *W)
00119 {  
00120   struct MatrixShape H ;
00121   W->HJ.GetShape(l,&H) ;
00122   H.Transpose()        ;
00123   CAM(B,BC,&H,TransformMatrixTransposeFirstNZEP , TransformMatrixTransposeLastNZEP ,
00124               TransformMatrixTransposeFirstNZE  , TransformMatrixTransposeLastNZE) ;
00125 
00126   assert(nr<_MAX_INDEXSET_) ;
00127 } 
00128 
00129 // scalings(l-1) required to span the given scalings(l)
00130 void IndexSet::InducedByFineScalings(IndexSet *S,int l, int *BC, Wavelets *W) { 
00131   struct MatrixShape H ;
00132   W->HJ.GetShape(l,&H) ;
00133   CAM(S,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00134               TransformMatrixFirstNZE  , TransformMatrixLastNZE) ;
00135 }
00136 
00137 // dual scalings(l-1) required to span the given dual scalings(l)
00138 void IndexSet::InducedByFineDualScalings(IndexSet *S,int l, int *BC, Wavelets *W) { 
00139   struct MatrixShape H ;
00140   W->HtJ.GetShape(l,&H) ;
00141   CAM(S,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00142               TransformMatrixFirstNZE  , TransformMatrixLastNZE) ;
00143 
00144   assert(nr<_MAX_INDEXSET_) ;
00145 }
00146 
00147 // wavelets(l) which coincide with the given scalings(l)
00148 void IndexSet::WaveletsInducedByFineScalings(IndexSet *S,int l, int *BC, Wavelets *W) { 
00149   struct MatrixShape H ;
00150   //NEVER EVER:: if(l==Level0) { this->CopyWithBounds(S,Level0,BC,W) ;return ;} 
00151   if(l==W->Level0)  { Copy(S) ;return ;}
00152   W->GJ.GetShape(l,&H) ;
00153   CAM(S,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00154               TransformMatrixFirstNZE  , TransformMatrixLastNZE) ;
00155 
00156   assert(nr<_MAX_INDEXSET_) ;
00157 }
00158 
00159 // dual wavelets(l) influenced by the given dual scalings(l)
00160 void IndexSet::WaveletsInducedByFineDualScalings(IndexSet *B,int l, int *BC, Wavelets *W) {
00161   struct MatrixShape H ;
00162   if(l==W->Level0)  { Copy(B) ;return ;}
00163   W->GtJ.GetShape(l,&H) ;
00164   //debugRefine=1 ;
00165   CAM(B,BC,&H,TransformMatrixFirstNZEP , TransformMatrixLastNZEP ,
00166               TransformMatrixFirstNZE  , TransformMatrixLastNZE) ;
00167   //debugRefine=0 ;
00168   //H.Print() ;
00169   //B->Print() ;
00170   //this->Print() ;
00171 
00172   assert(nr<_MAX_INDEXSET_) ;
00173 }
00174 
00175 
00176 void IndexSet::InducedByOperatorMatrix(IndexSet *S,int l, int *BC, OperatorMatrix *W) { 
00177   struct MatrixShape H ;
00178   W->GetShape(l,&H) ;
00179   CAM(S,BC,&H,OperatorMatrixFirstNZEP , OperatorMatrixLastNZEP ,
00180               OperatorMatrixFirstNZE  , OperatorMatrixLastNZE) ;
00181 
00182   assert(nr<_MAX_INDEXSET_) ;
00183 }
00184 
00185 // scalings(l-1) required to span the given lifting wavelets(l)
00186 void IndexSet::ScalingsInducedByLifting(IndexSet *S,int l, int *BC, Wavelets *W) { 
00187   struct MatrixShape H  ;
00188   W->Q.GetShape(l-1,&H) ;
00189   CAM(S,BC,&H,LiftingMatrixTransposeFirstNZEP , LiftingMatrixTransposeLastNZEP ,
00190               LiftingMatrixTransposeFirstNZE  , LiftingMatrixTransposeLastNZE) ;
00191 
00192   assert(nr<_MAX_INDEXSET_) ;
00193 }
00194 
00195 
00196 void IndexSet::IndexSetForTypeIII(IndexSet *S,int l, int *BC, Wavelets *W) {
00197   struct MatrixShape H ;
00198   W->HtJ.GetShape(l,&H) ;
00199   EAM(S,BC,&H,TransformMatrixFirst2NZEP , TransformMatrixLast2NZEP ,
00200               TransformMatrixFirst2NZE  , TransformMatrixLast2NZE) ;
00201 
00202   assert(nr<_MAX_INDEXSET_) ;
00203 }
00204 
00205 //
00206 // calculates the intersection of I with the set of boundary wavelets
00207 void IndexSet::ForBoundaryWavelets(bool left, bool right, IndexSet *I, int level,Wavelets *W) {
00208   int *Ia=I->a , *Ie=I->e , n=I->nr ,r ,KW0=W->KW0 , NKW1=(1<<(level-1))-1-W->KW1 ;
00209   bool flag ;
00210 
00211   nr=0 ;
00212   if (left) 
00213     for (r=0; r<n ;r++) if (Ia[r]<KW0) { a[nr]=Ia[r] ; e[nr++]=min(Ie[r],KW0-1) ; }
00214                                   else r=n ;
00215 
00216   if (right) {
00217     r=n-1 ;
00218     flag=true ;
00219     while ((r>=0)&&flag) { 
00220       if   (Ie[r]>NKW1) r-- ;
00221                    else flag=false ;
00222      }
00223 
00224     for (r=r+1; r<n; r++) { a[nr]=max(Ia[r],NKW1+1) ; e[nr++]=Ie[r] ;}
00225   }
00226 
00227   assert(nr<_MAX_INDEXSET_) ;
00228 }
00229 
00230 //
00231 //extern int debugRefine ;
00232 void IndexSet::CAM(IndexSet *S, int *BC, 
00233                    MatrixShape *H,
00234                    int (*FirstNZEP)(int,MatrixShape *) , int (*LastNZEP )(int,MatrixShape *) ,
00235                    int (*FirstNZE )(int,MatrixShape *) , int (*LastNZE  )(int,MatrixShape *)) 
00236 {                         
00237  int *Sa=S->a , *Se=S->e , Sn=S->nr ;
00238  int aa,ee,a2,e2,r ;
00239  
00240  nr=0 ;
00241  if (Sn==0) return ; 
00242 
00243  if (BC[1]==PERIODIC) { 
00244    int M=H->M  /* N=H->N , U=H->U , O=H->O*/  ;
00245    M=(M+1)&0xfffe ;                            // M shall be even
00246    int a3=M ;
00247 
00248    aa=FirstNZEP(Sa[0],H) ,  ee=min(LastNZEP(Se[0],H) , M-1) ; 
00249 
00250    if (aa<0) { a3=aa+M , aa=0 ; }              // Ueberlapp ans Ende
00251    
00252    e2=LastNZEP(Se[Sn-1],H) ;
00253    if (e2>=M) {                                // Ueberlapp an den Anfang
00254      e2-=M ;
00255      if (e2+1 < aa) { a[nr]=0 , e[nr++]=e2 ; } // aber kein Ueberlapp mit erstem Intervall
00256      else   aa=0 ;                             // Ueberlapp -> erstes Intervall faengt mit 0 an
00257     }
00258   
00259    for (r=1; r<Sn; r++) {
00260      a2=max(FirstNZEP(Sa[r],H),0)  ,  e2=min(LastNZEP(Se[r],H) , M-1) ; // abgeschnittenes Intervall holen
00261      if (ee+1 < a2) { a[nr]=aa , e[nr++]=ee , aa=a2 ;}                           // kein Ueberlapp mit angefangenem
00262      ee=e2 ;                                                              
00263    }
00264 
00265    if (ee+1<a3) {                                                                // angefangenes hat kein Ueberlapp mit 
00266      a[nr]=aa , e[nr++]=ee ;                                                     // moeglichem letztem a3 Intervall
00267      if (a3<M) { a[nr]=a3 , e[nr++]=M-1 ; }                                      // letztes Intervall eintragen
00268    } else {                                                                      
00269      a[nr]=aa , e[nr++]=M-1 ;                                                    // Ueberlapp mit a3 Intervall
00270    }
00271    return ;
00272  }
00273 
00274  // not periodic
00275  aa=FirstNZE(Sa[0],H) ; // first prospective interval
00276  ee=LastNZE (Se[0],H) ;
00277 
00278  for (r=1; r< Sn ;r++) {
00279    a2=FirstNZE(Sa[r],H) ;
00280    e2=LastNZE (Se[r],H) ;
00281 
00282    if (a2<=ee+1) ee=e2 ;
00283    else a[nr]=aa , e[nr]=ee , nr++ , aa=a2 , ee=e2 ;
00284  }
00285  if(aa<=ee) a[nr]=aa , e[nr]=ee , nr++ ;
00286 }
00287 
00288 //
00289 //
00290 void IndexSet::EAM(IndexSet *S, int *BC, 
00291                    MatrixShape *H,
00292                    int (*FirstNZEP)(int,MatrixShape *) , int (*LastNZEP )(int,MatrixShape *) ,
00293                    int (*FirstNZE )(int,MatrixShape *) , int (*LastNZE  )(int,MatrixShape *)) {
00294 
00295  int *Sa=S->a , *Se=S->e , Sn=S->nr ;
00296  int  a2,e2,a3=-MAXINT,e3=-MAXINT,r=0 ;
00297  bool flag=false ; 
00298 
00299  int M=H->M,N=H->N ;
00300  M=(M+1)&0xfffe ; // M shall be a power of 2
00301  N=(N+1)&0xfffe ;
00302 
00303  nr=0 ;
00304  if (Sn==0) return ; 
00305 
00306  if (BC[1]==PERIODIC) { 
00307 
00308    // first interval may be a periodic interval together with the last one
00309    // -> special treatment necessary
00310    if ((Sa[0]==0) && (Se[Sn-1]>=N-1)) {
00311      e2=FirstNZEP(Se[0   ],H)   ;
00312      a2=LastNZEP (Sa[Sn-1],H)-M ;
00313 
00314      if (a2<=e2) { // valid interval
00315        if ((a2<0) && (e2< 0)) { a3=a2+M, e3=e2+M, flag=true; } else 
00316        if ((a2<0) && (e2>=0)) { a3=a2+M, e3=M-1 , flag=true; a[0]=0, e[nr++]=e2; } else
00317        if  (a2>=0)            { a[0]=a2, e[nr++]=e2 ; }
00318      }
00319      r=1  ;
00320      Sn-- ;
00321    }
00322    
00323    // general case
00324    for (;r<Sn;r++) {
00325      a2=LastNZEP (Sa[r],H) ;
00326      e2=FirstNZEP(Se[r],H) ;
00327      if (a2<=e2) { a[nr]=a2, e[nr++]=e2 ;}
00328    }
00329 
00330    if (flag) { a[nr]=a3, e[nr++]=e3 ;}
00331    return ;
00332   }
00333 
00334  // not periodic:
00335  for (r=0; r<Sn; r++) {
00336    a2=LastNZE (Sa[r],H) ;
00337    e2=FirstNZE(Se[r],H) ;
00338    if (a2<=e2) { a[nr]=a2, e[nr++]=e2 ;}
00339  }
00340 
00341  assert(nr<_MAX_INDEXSET_) ;
00342 }
00343 
00344 
00345 //
00346 //
00347 void IndexSet::Union(IndexSet *A,IndexSet *B)
00348 { 
00349   int i,a1,e1 ;
00350   int *Aa=A->a , *Ae=A->e , Ai ; // Berechnet This= A vereinigt B
00351   int *Ba=B->a , *Be=B->e , Bi ;
00352  
00353   assert(this!=A) ;
00354   assert(this!=B) ;
00355 
00356   Ai=Bi=i=0 ;
00357   while ((Bi<B->nr) && (Ai<A->nr)) {
00358 
00359 // start new run
00360     if (Ba[Bi] < Aa[Ai]) a1=Ba[Bi] , e1=Be[Bi] , Bi++ ;
00361                     else a1=Aa[Ai] , e1=Ae[Ai] , Ai++ ;
00362 
00363     int cond;
00364     while ( (cond=(Ai<A->nr) && (e1>=Aa[Ai]-1)) || ((Bi<B->nr)&&(e1>=Ba[Bi]-1)) )
00365      {                                             // Fortsetzung moeglich 
00366        if (cond) {                                 // aktueller Run ist  Ba,Be[Bi-1] , aber Ueberlappung mit A run
00367          if (e1<Ae[Ai]) e1=Ae[Ai] ;                // aha, nur teilweise Uberlappung des A runs
00368          Ai++ ;                                    // auf nachsten A setzen
00369        } else {                                    // e1 < Aa[Ai] aber e1>=Ba[Bi] , aktueller run ist Aa,Ae[Ai-1] , aber Uberlapp. mit B run
00370          if(e1<Be[Bi]) e1=Be[Bi] ;                 // ansonsten Ende des Ier nachruecken
00371          Bi++ ;                                    // auf naechsten B run setzen
00372         } 
00373      } // while 
00374    
00375    // aha entweder A/B zu Ende oder erstmal keine Ueberlappung mehr
00376     
00377     a[i]=a1 , e[i]=e1 , i++ ;                     // A U B schreiben
00378   } // while A und B noch nicht zu Ende 
00379 
00380   if(Bi==B->nr) // keine B runs mehr also alle weiteren A nach This , D  kopieren 
00381     while (Ai<A->nr) a[i]=Aa[Ai] , e[i++]=Ae[Ai++] ;
00382   else
00383     while (Bi<B->nr) a[i]=Ba[Bi] , e[i++]=Be[Bi++] ;
00384 
00385   nr  =i  ;
00386   assert(nr<_MAX_INDEXSET_) ;
00387 }
00388  
00389 
00390 void IndexSet::Difference(IndexSet *A,IndexSet *B) // Berechnet A\B
00391 {
00392  int Ai,Bi ;
00393  int *Aa=A->a , *Ae=A->e , An=A->nr ;
00394  int *Ba=B->a , *Be=B->e , Bn=B->nr ;
00395 
00396  assert(this!=A) ;
00397  assert(this!=B) ;
00398 
00399  Ai=Bi=nr=0 ;
00400  for (Ai=0; Ai<An; Ai++) {
00401 
00402    while((Bi<Bn)&&(Be[Bi]<Aa[Ai])) Bi++ ; // B Intervalle uberspringen, die vor akt. A liegt
00403 
00404    if (Bi>=Bn) { a[nr]=Aa[Ai] , e[nr++]=Ae[Ai] ; } // kein B Intervall mehr da -> A kopieren
00405    else {                                          // :: Be[Bi]>=Aa[Ai]
00406 
00407      if (Aa[Ai]<Ba[Bi]) { a[nr]=Aa[Ai] , e[nr++]=min(Ae[Ai],Ba[Bi]-1) ;} // Anfang von A kopieren
00408 
00409      while((Be[Bi]<Ae[Ai])&&(Bi<Bn)) { 
00410        a[nr  ]=Be[Bi]+1 ;
00411        e[nr++]=(Bi+1<Bn) ? min(Ae[Ai],Ba[Bi+1]-1) : Ae[Ai] ;
00412        Bi++ ; 
00413      }
00414    } 
00415  } // next Ai
00416 
00417  assert(nr<_MAX_INDEXSET_) ;
00418 }
00419 
00420 bool IndexSet::IsSame(IndexSet *I) {
00421  if (this==I) return true;
00422  int *aa=I->a , *ee=I->e , n=I->nr ;
00423  if (n!=nr) return false ;
00424  
00425  for (int r=0;r<n ;r++) {
00426    if (aa[r]!=a[r]) return false ;
00427    if (ee[r]!=e[r]) return false ;
00428  }
00429  return true ;
00430 }
00431 
00432 
00433 bool IndexSet::Contains(int i,int *rr) {
00434   int r=(rr) ? *rr : 0 ;
00435   if (nr==0) return false ;
00436   if (r>=nr)  r=0 ; // invalid guess
00437   if (a[r]>i) r=0 ;
00438 
00439   if (a[0]>i) return false ;
00440   // here: a[r]<=i 
00441   do {
00442     if (i<=e[r]) { 
00443       if (rr) *rr=r; 
00444       return true ;
00445      }
00446 
00447     r++ ;
00448   } while ((r<nr) && (a[r]<=i)) ;
00449    
00450   return false ;  
00451 }
00452 
00453 double IndexSet::VecMaxAbs (double *t) {
00454   double mx=-1 ;
00455   int r,i ;
00456   for (r=0; r<nr; r++)  
00457     for (i=a[r]; i<=e[r]; i++) mx = (fabs(t[i]) > mx) ? fabs(t[i]) : mx ;
00458   return mx ;
00459 }
00460 
00461 double IndexSet::VecMax (double *t) {
00462   double mx=-HUGE ;
00463   int r,i ;
00464   for (r=0; r<nr; r++)  
00465     for (i=a[r]; i<=e[r]; i++) mx = (t[i] > mx) ? t[i] : mx ;
00466   return mx ;
00467 }
00468 
00469 double IndexSet::VecInnerProd(double *v1,double *v2) {
00470  int r,i ;
00471  double s=0.0 ; 
00472  for (r=0; r<nr; r++)  
00473  for (i=a[r]; i<=e[r]; i++) s+=v1[i]*v2[i] ;
00474  return s ;
00475 }
00476 
00477 void IndexSet::VecAdd (double *t,double *p,double *q) {
00478  int r,i ;
00479  for (r=0; r<nr; r++)  
00480  for (i=a[r]; i<=e[r]; i++) t[i] =q[i]+p[i] ;
00481 }
00482 
00483 void IndexSet::VecSub (double *t,double *p,double *q) {
00484  int r,i ;
00485  for (r=0; r<nr; r++)  
00486  for (i=a[r]; i<=e[r]; i++) t[i] =p[i]-q[i] ;
00487 }
00488 
00489 void IndexSet::VecPlus(double *t,double *p) {
00490  int r,i ;
00491  for (r=0; r<nr; r++)  
00492  for (i=a[r]; i<=e[r]; i++) t[i] +=p[i] ;
00493 }
00494 
00495 void IndexSet::VecMinus(double *t,double p) {
00496  int r,i ;
00497  for (r=0; r<nr; r++)  
00498  for (i=a[r]; i<=e[r]; i++) t[i] -=p ;
00499 }
00500 
00501 void IndexSet::VecMinus(double *t,double *p) {
00502  int r,i ;
00503  for (r=0; r<nr; r++)  
00504  for (i=a[r]; i<=e[r]; i++) t[i] -=p[i] ;
00505 }
00506 
00507 /*
00508 void IndexSet::VecCopy(double *t,double *p) {
00509  int r,i,er ;
00510  for (r=0; r<nr; r++) {
00511    er=e[r] ;
00512    for (i=a[r]; i<=er; i++) t[i]=p[i] ;
00513  }
00514 }
00515 */
00516 
00517 void IndexSet::VecCopy(double *t,double *p) {
00518  int r,i,er,n,n4,n2 ;
00519  
00520  for (r=0; r<nr; r++) {
00521    n=e[r]-a[r]+1 ;
00522    n4=n/4 ; er=n4*4 ; n=n-er ; er +=a[r] ;
00523    n2=n/2 ; n=n-(n2*2) ;
00524 
00525    for (i=a[r]; i<er; i+=4 ) {
00526      t[i  ]=p[i  ] ;
00527      t[i+1]=p[i+1] ;
00528      t[i+2]=p[i+2] ;
00529      t[i+3]=p[i+3] ;
00530    }
00531 
00532    if (n2>0) {
00533      t[i  ]=p[i  ];
00534      t[i+1]=p[i+1];
00535      i+=2 ;
00536    }
00537    if (n>0) t[i]=p[i] ;
00538  }
00539 }
00540 
00541 void IndexSet::VecMul(double *t, const double f) {
00542  int r,i ;
00543  for (r=0; r<nr; r++)  
00544  for (i=a[r]; i<=e[r]; i++) t[i] *= f ;
00545 }
00546 
00547 void IndexSet::VecFill(double *t,const double f) {
00548  int r,i ;
00549  for (r=0; r<nr; r++)  
00550  for (i=a[r]; i<=e[r]; i++) t[i]=f ;
00551 }
00552 
00553 void IndexSet::VecClear(double *t) { VecFill(t,0) ;}
00554 
00555 void IndexSet::VecPrint(const char *st,double *t) {
00556  int r,i ;
00557  for (r=0; r<nr; r++)  
00558    for (i=a[r]; i<=e[r]; i++) std::cout<<st<<' '<<i<<' '<<t[i]<<'\n' ;
00559 }
00560 
00561 
00562 //
00563 // Load Operation including Treatment of Ghostcells
00564 //
00565 
00566 void IndexSet::Load(AdaptiveLE *al) {
00567  int    ee,i ;
00568  AdaptiveLE::iterator alit,alend=(*al).end() ;
00569 
00570  nr=0 ;
00571  ee=-10000000 ;
00572  for (alit=(*al).begin();alit!=alend ;alit++) {
00573    i=(*alit).first  ;
00574    if (ee<i-1) { a[nr]=i ; ee=e[nr]=i ; nr++ ;} 
00575          else    ee=e[nr-1]=i ;
00576   }
00577 } 
00578 
00579 void IndexSet::Load(AdaptiveLE *al, vector<double> *v, double *d) {
00580  int    ee,i ;
00581  long   j    ;
00582  AdaptiveLE::iterator alit,alend=(*al).end() ;
00583 
00584  nr=0 ;
00585  ee=-10000000 ;
00586  for (alit=(*al).begin();alit!=alend ;alit++) {
00587    i=(*alit).first  ;
00588    j=(*alit).second ;
00589    if (ee<i-1) { a[nr]=i ; ee=e[nr]=i ; nr++ ;} 
00590          else    ee=e[nr-1]=i ;
00591    d[i] = (j<0) ? (*v)[1-j] : (*v)[j] ;
00592   }
00593 }
00594 
00595 void IndexSet::LoadIS(AdaptiveLE *al) {
00596  int    ee,i ;
00597  long   j    ;
00598  AdaptiveLE::iterator alit,alend=(*al).end() ;
00599 
00600  nr=0 ;
00601  ee=-MAXINT ;
00602  for (alit=(*al).begin();alit!=alend ;alit++) {
00603    i=(*alit).first  ;
00604    j=(*alit).second ;
00605    if (j>=0) {
00606      if (ee<i-1) { a[nr]=i ; ee=e[nr]=i ; nr++ ;} 
00607            else    ee=e[nr-1]=i ;
00608     }
00609   }
00610 }
00611 
00612 /*
00613 void IndexSet::Store(AdaptiveLE *al, vector<double> *v, double *d,int p) {
00614  int  ix ,sx=(*v).size() ;
00615  long jx ; 
00616  AdaptiveLE::iterator alit,alend=(*al).end() ;
00617 
00618  for (alit=(*al).begin();alit!=alend ;alit++) {
00619    ix=(*alit).first  ;
00620    jx=(*alit).second ;
00621    //assert(jx<sx) ;
00622    //if (jx>=sx) printf ("Store: %d,%d\n",jx,sx) ;
00623    //assert(jx>=0) ;
00624    //assert(ix>=0) ;
00625    //assert(ix<p)  ;
00626    if (jx>=0) (*v)[jx]=d[ix] ;
00627   }
00628 }
00629 */
00630 
00631 void IndexSet::Store(AdaptiveLE *al, vector<double> *v, double *d, bool add) {
00632  int  i ;
00633  long j ; 
00634  AdaptiveLE::iterator alit,alend=(*al).end() ;
00635 
00636  for (alit=(*al).begin();alit!=alend ;alit++) {
00637    i=(*alit).first  ;
00638    j=(*alit).second ;
00639    if (j>=0) 
00640      if (add) (*v)[j] +=d[i] ;
00641      else     (*v)[j]  =d[i] ;
00642   }
00643 }
00644 
00645 // load only the few coefficients near the boundaries, i.e. [0..l-1] , [r+1,..end()]
00646 // it is assumed, that if any then the complete ranges [0..l-1] , [r+1,..end()] are active
00647 void IndexSet::LoadBoundary(AdaptiveLE *al, vector<double> *v, double *d,int l,int r) {
00648  int  i ;
00649  long j ;
00650  AdaptiveLE::iterator          alit ;
00651  AdaptiveLE::reverse_iterator ralit ;
00652 
00653  nr=0 ;
00654  if ((*al).empty()) return;
00655  
00656  alit=(*al).begin(); 
00657  i=(*alit).first   ;
00658 
00659  if (i<l) { 
00660    assert(i==0) ;
00661    nr=1 ;
00662    a[0]=0;e[0]=l-1;
00663    j=(*alit).second ;
00664    d[0]=(*v)[j] ;
00665    alit++ ;
00666    for (; i<l-1; alit++) {
00667      i=(*alit).first  ;
00668      j=(*alit).second ;
00669      d[i] = (j<0) ? (*v)[1-j] : (*v)[j] ;
00670    }
00671  }
00672 
00673  ralit=(*al).rbegin(); 
00674  i=(*ralit).first   ;
00675 
00676  if (i>r) { 
00677    a[nr]=r+1;e[nr]=i;
00678    nr++ ;
00679    j=(*ralit).second ;
00680    d[i]=(*v)[j] ;
00681    ralit++ ;
00682    for (; i>r+1; ralit++) {
00683      i=(*ralit).first  ;
00684      j=(*ralit).second ;
00685      d[i] = (j<0) ? (*v)[1-j] : (*v)[j] ;
00686    }
00687  }
00688 }
00689 
00690 
00691 void IndexSet::LoadBoundaryIS(AdaptiveLE *al , int l,int r) {
00692  int  i ;
00693  AdaptiveLE::iterator          alit ;
00694  AdaptiveLE::reverse_iterator ralit ;
00695 
00696  nr=0 ;
00697  if ((*al).empty()) return;
00698  
00699  alit=(*al).begin(); 
00700  i=(*alit).first   ;
00701  if (i<l) { 
00702    assert(i==0) ;
00703    nr=1 ;
00704    a[0]=0;e[0]=l-1;
00705    alit++ ;
00706    for (; i<l-1; alit++) i=(*alit).first ;
00707  }
00708 
00709  ralit=(*al).rbegin(); 
00710  i=(*ralit).first   ;
00711  if (i>r) { 
00712    a[nr]=r+1;e[nr]=i;
00713    nr++ ;
00714    ralit++ ;
00715    for (; i>r+1; ralit++) i=(*ralit).first  ;
00716  }
00717 }
00718 
00719 
00720 void IndexSet::StoreBoundary(AdaptiveLE *al, vector<double> *v, double *d,int l,int r,bool add) {
00721  int  i ;
00722  long j ;
00723  AdaptiveLE::iterator          alit ;
00724  AdaptiveLE::reverse_iterator ralit ;
00725 
00726  if ((*al).empty()) {assert(nr==0); return;}
00727  
00728  alit=(*al).begin();
00729  i=(*alit).first   ;
00730  if (i<l) {
00731    j=(*alit).second ;
00732    if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00733    alit++ ;
00734    for (; i<l-1; alit++) {
00735      i=(*alit).first  ;
00736      j=(*alit).second ;
00737      if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00738    }
00739  }
00740 
00741  ralit=(*al).rbegin(); 
00742  i=(*ralit).first    ;
00743  if (i>r) {
00744    j=(*ralit).second ;
00745    if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00746    ralit++ ;
00747    for (; i>r+1; ralit++) {
00748      i=(*ralit).first  ;
00749      j=(*ralit).second ;
00750      if (add) (*v)[j]+=d[i]; else (*v)[j]=d[i] ;
00751    }
00752  }
00753 }
00754 
00755 
00756 
00757 
00758 
00759 /*
00760 //
00761 // fast insert of IndexSet into the AdaptiveLevels:AdaptiveL datastructure
00762 void IndexSet::WriteToAdaptiveLE(AdaptiveLE *al,int *counter) {
00763   int    r,i=0 ;
00764   size_t c=(size_t)(*counter) ;
00765   //AdaptiveLE::iterator hint,ins  ;
00766  
00767   
00768   //(*al).clear() ;
00769   hint=(*al).end() ;
00770   
00771   for (r=nr-1;r>=0;r--)
00772     for (i=e[r];i>=a[r]; i--) {
00773       pair<const int,size_t> p(i,c) ;
00774       ins=(*al).insert(hint,p) ;
00775       hint=ins ;
00776       //(*al)[i]=c ;
00777       c++ ;
00778      }
00779   
00780   *counter=c ;
00781 }
00782 */
00783 
00784 
00785 void IndexSet::GenerateRandom(bool boundflag , int KW , int J , bool isW , bool dorandom) {
00786   int i,r,m ;
00787   int nJ=1<<J , M= isW ? nJ-1 : nJ ;
00788 
00789   // generate full indexset
00790   if (!dorandom) {
00791     M = (!boundflag) ? nJ-1 : nJ ;
00792     if (isW) M=nJ-1 ;
00793     nr=1 ;
00794     a[0]=0; 
00795     e[0]=M ;
00796     return ;
00797   }
00798 
00799 
00800   m=(int)(mydrand()*8) ;
00801   nr=0 ;
00802   a[0]=(int)(mydrand()*8) ;
00803   for (i=0; i<m ;i++) {
00804     e[nr]=min(a[nr] + (int)(mydrand()*10) , M) ;
00805     if (e[nr] >= a[nr]) { 
00806       nr++ ;
00807       a[nr] = e[nr-1] + (int)(mydrand()*10) + 1  ;
00808     }
00809   }
00810  
00811   if (boundflag && (nr>0)) {
00812     r=0 ;
00813     while ((r<nr) && (a[r]<KW)) r++ ;
00814     if (r>0) {
00815       r-- ;
00816       for (i=r; i<nr ;i++) a[i-r]=a[i] , e[i-r]=e[i] ;
00817       a[0]=0 ;
00818       nr=nr-r  ;
00819     }
00820   
00821     if (e[0]<KW-1) {
00822       e[0]=KW-1 ;
00823       if ( (nr>1) && (a[1]==KW) ) {
00824         for (i=1; i<nr ;i++) a[i-1]=a[i] , e[i-1]=e[i] ;
00825         a[0]=0  ;
00826         nr--    ;
00827       }
00828     }
00829 
00830     r=nr-1 ;
00831     while ((r>=0) && (e[r]>M-KW)) r-- ;
00832 
00833     if (r<nr-1) {
00834       r++ ;
00835       e[r]=M ;
00836       nr=r+1  ;
00837    
00838       if (a[nr-1]>M-KW+1) {
00839         a[nr-1]=M-KW+1 ;
00840          if ((nr>1)&&(e[nr-2]==M-KW)) { 
00841            e[nr-2]=M ;
00842            nr-- ;
00843           } 
00844        }
00845     }
00846   }
00847 }

Generated at Mon Aug 19 10:02:31 2002 for AWFD by doxygen1.2.8.1 written by Dimitri van Heesch, © 1997-2001