00001
00002
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
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
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