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  

LevelAdaptiveGrid.hpp

00001 //
00002 // implementation for ActiveSubSpaces
00003 //
00004 
00005 #ifndef _ACTIVESUBSPACES_
00006 # define _ACTIVESUBSPACES_
00007 
00008 #include "LevelAdaptive.hpp"
00009 
00010 template<int DIM>
00011 LevelAdaptiveGrid<DIM>::LevelAdaptiveGrid() {
00012  int i ;
00013  for (i=0; i<DIM; i++) Level0[i]=L[i]=0 ;
00014  a=NULL ;
00015  nLAD=nBW=0 ;
00016 }
00017 
00018 template<int DIM>
00019 LevelAdaptiveGrid<DIM>::LevelAdaptiveGrid(int *L0, int *LL, Wavelets *WC) {
00020  int i ;
00021  for (i=0; i<DIM; i++) Level0[i]=L[i]=0 ;
00022  a=NULL ;
00023  Init(L0,LL,WC) ;  
00024 }
00025 
00026 template<int DIM>
00027 void LevelAdaptiveGrid<DIM>::Init(int *L0 , int *LL, Wavelets *WC) {
00028 
00029  // copy 
00030  int i ;
00031  for (i=0; i<DIM; i++) { 
00032    Level0[i]=L0[i] ; 
00033    L[i]=LL[i] ;
00034    assert(L[i]<=LMAX) ;
00035   }
00036  
00037  // allocate
00038  a=new Matrix<bool,DIM> ;
00039  int A[DIM]={0} ;
00040  a->Init(A,L)   ;
00041 
00042  Matrix<bool,DIM>::iterator it(a) ;
00043  for (it=(*a).begin(); it <= (*a).end(); ++it) (*a)[it]=false ;
00044 
00045  W=WC   ;
00046  nLAD=0 ;
00047 }
00048 
00049 template<int DIM>
00050 LevelAdaptiveGrid<DIM>::~LevelAdaptiveGrid() {
00051  int i ;
00052  for (i=0; i<DIM; i++) Level0[i]=L[i]=0 ;
00053  delete a ;
00054 }
00055 
00056 template<int DIM>
00057 void LevelAdaptiveGrid<DIM>::Attach(LevelAdaptiveData<DIM> *AD) {
00058   int i ;
00059   for (i=0; i<nLAD; i++) if (LAD[i]==AD) break;
00060   if (i==nLAD) LAD[nLAD++]=AD ;
00061 }
00062 
00063 template<int DIM>
00064 void LevelAdaptiveGrid<DIM>::Attach(BlendingWeights<DIM> *B) {
00065   int i ;
00066   for (i=0; i<nBW; i++) if (BW[i]==B) break;
00067   if (i==nBW) BW[nBW++]=B ;
00068 }
00069 
00070 template<int DIM>
00071 void LevelAdaptiveGrid<DIM>::Print() {
00072  int i ;
00073  std::cout <<"Flags:\n" ;
00074 
00075  Matrix<bool,DIM>::iterator it(a,DIM-1) ;
00076  for (it=(*a).begin(DIM-1); it <= (*a).end(); ++it) {
00077    std::cout<<'('<<it.i[0] ;
00078    for (i=1; i<DIM-1; i++) std::cout<<','<<it.i[i] ;
00079    std::cout<<",.)=" ;
00080    
00081    int in[DIM] ;
00082    for (i=0; i<DIM-1; i++) in[i]=it.i[i] ;
00083    for (in[DIM-1]=0; in[DIM-1]<=L[DIM-1]; in[DIM-1]++)
00084      if ((*a)[in]) std::cout<<"1 " ;
00085               else std::cout<<"0 " ;
00086 
00087    std::cout<<'\n';
00088  }
00089 }
00090 
00091 
00092 template<int DIM>
00093 size_t LevelAdaptiveGrid<DIM>::Size() {
00094  int i,s=0 ; 
00095  Matrix<bool , DIM>::iterator it(a) ;
00096  for (it=(*a).begin(); it<=(*a).end(); ++it) 
00097    if ( (*a)[it.i] ) {
00098      int q=1 ;
00099      for (i=0; i<DIM; i++) { q *= (it.i[i]==Level0[i]) ? (1<<Level0[i])+1 : (1<<(it.i[i]-1)) ; }
00100      s+=q ;
00101     }
00102  return s ;
00103 }
00104 
00105 
00106 
00107 template<int DIM>
00108 void LevelAdaptiveGrid<DIM>::Set(Function *F , double n) {
00109  int i ;
00110  double x[DIM] ;
00111 
00112  if (a==NULL) { std::cout<<"LevelAdaptiveGrid<"<<DIM<<">::Set(F,n) : (*this) not initialized\n"; exit(-1) ;} 
00113 
00114  Matrix<bool,DIM>::iterator it(a) ;
00115  for (it=(*a).begin(); it <= (*a).end(); ++it) {
00116    bool lev0=true ;
00117    for (i=0; i<DIM; i++) {
00118      x[i]=(double)it.i[i] ;
00119      if (it.i[i]<Level0[i]) lev0=false ;
00120     }
00121    if ((F->Eval(x) <= n+1e-10) && lev0) (*a)[it]=true  ;
00122                                  else   (*a)[it]=false ;
00123  }
00124 
00125  for (i=0; i<nLAD; i++) LAD[i]->Allocate() ;
00126  for (i=0; i<nBW ; i++) BW[i]->Set(this) ;
00127 }
00128 
00129 template<int DIM>
00130 void LevelAdaptiveGrid<DIM>::Clear() {
00131  Matrix<bool,DIM>::iterator it(a) ;
00132  for (it=(*a).begin(); it <= (*a).end(); ++it) (*a)[it]=false  ;
00133 }
00134 #endif

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