00001
00002
00003
00004
00005
00006 #ifndef _BLENDINGSPACES_
00007 # define _BLENDINGSPACES_
00008
00009 #include <assert.h>
00010 #include "LevelAdaptive.hpp"
00011 #include "Math.hpp"
00012 #include "NonAdaptive.hpp"
00013
00014
00015
00016
00017
00018 template<int DIM>
00019 BlendingData<DIM>::BlendingData() {
00020 a=NULL ;
00021 A=NULL ;
00022 Ext.InitXAE() ;
00023 }
00024
00025
00026 template<int DIM>
00027 BlendingData<DIM>::BlendingData(BlendingWeights<DIM> *Ac) {
00028 a=NULL ;
00029 Init(Ac) ;
00030 Ext.InitXAE() ;
00031 }
00032
00033
00034 template<int DIM>
00035 void BlendingData<DIM>::Init(BlendingWeights<DIM> *Ac) {
00036 A =Ac ;
00037 A->Attach(this) ;
00038 Ext.WC=A->G->W ;
00039 a=new Matrix< Matrix<double,DIM> *, DIM> ;
00040
00041 int b[DIM]={0} ;
00042 a->Init(b,A->G->L) ;
00043
00044 Matrix< Matrix<double,DIM> *, DIM>::iterator it(a) ;
00045 for (it=(*a).begin(); it<=(*a).end(); ++it) (*a)[it]=NULL ;
00046 }
00047
00048
00049 template<int DIM>
00050 void BlendingData<DIM>::Clear() {
00051 A =NULL ;
00052
00053 if (a!=NULL) {
00054 Matrix< Matrix<double,DIM> *, DIM>::iterator it(a) ;
00055 for (it=(*a).begin(); it<=(*a).end(); ++it) { delete (*a)[it] ; (*a)[it]=NULL ; }
00056 delete a ;
00057 a=NULL ;
00058 }
00059 }
00060
00061
00062 template<int DIM>
00063 BlendingData<DIM>::~BlendingData() {
00064 Clear() ;
00065 }
00066
00067
00068 template<int DIM>
00069 void BlendingData<DIM>::Allocate() {
00070 int i ;
00071 Matrix< Matrix<double,DIM> *, DIM>::iterator it(a) ;
00072 for (it=(*a).begin(); it<=(*a).end(); ++it)
00073 if ( (*(A->a))[it.i] != 0 ) {
00074 int b[DIM],e[DIM] ;
00075 for (i=0; i<DIM; i++) { b[i]=0 ; e[i] = 1 << it.i[i] ; }
00076
00077 (*a)[it]=new Matrix<double,DIM>(b,e) ;
00078 }
00079 }
00080
00081
00082
00083 template<int DIM>
00084 void BlendingData<DIM>::Compatible(BlendingData<DIM> *X) {
00085 assert(Ext.IsSame(&X->Ext)) ;
00086 }
00087
00088 template<int DIM>
00089 void BlendingData<DIM>::Compatible(BlendingData<DIM> *S0, BlendingData<DIM> *S1) {
00090 Compatible(S0) ;
00091 Compatible(S1) ;
00092 }
00093
00094 template<int DIM>
00095 void BlendingData<DIM>::Compatible(BlendingData<DIM> *S0, BlendingData<DIM> *S1, BlendingData<DIM> *S2) {
00096 Compatible(S0) ;
00097 Compatible(S1) ;
00098 Compatible(S2) ;
00099 }
00100
00101 template<int DIM>
00102 void BlendingData<DIM>::Compatible(BlendingData<DIM> *S0, BlendingData<DIM> *S1, BlendingData<DIM> *S2, BlendingData<DIM> *S3) {
00103 Compatible(S0) ;
00104 Compatible(S1) ;
00105 Compatible(S2) ;
00106 Compatible(S3) ;
00107 }
00108
00109 template<int DIM>
00110 void BlendingData<DIM>::CopyExtensions(BlendingData<DIM> *X) {
00111 Ext.CopyFlags(&X->Ext) ;
00112 }
00113
00114
00115
00116 template<int DIM>
00117 void BlendingData<DIM>::SetBoundaryConditions(int B[DIM][2]) {
00118 Ext.SetBoundaryConditions(B) ;
00119 }
00120
00121 template<int DIM>
00122 void BlendingData<DIM>::CheckBC(int BC0[DIM][2] , int BC1[DIM][2]) {
00123 int i ;
00124 for (i=0; i<DIM; i++) { assert(BC0[i][0]==BC1[i][0]) ; assert(BC0[i][1]==BC1[i][1]) ;}
00125 }
00126
00127
00128
00129
00130
00131 template<int DIM>
00132 void BlendingData<DIM>::Add(const double c0,BlendingData<DIM> *S0 , const double c1,BlendingData<DIM> *S1) {
00133 S0->Compatible(S1) ;
00134 CopyExtensions(S0) ;
00135
00136 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00137 for (it=(*a).begin(); it<=(*a).end(); ++it)
00138 if ((*A->a)[it.i] !=0 ) (*a)[it]->Add(c0,(*S0->a)[it] , c1,(*S1->a)[it]) ;
00139
00140 Ext.Add(c0,&S0->Ext , c1,&S1->Ext);
00141 }
00142
00143
00144 template<int DIM>
00145 void BlendingData<DIM>::Add(const double c0,BlendingData<DIM> *S0 , const double c1,BlendingData<DIM> *S1 ,
00146 const double c2,BlendingData<DIM> *S2) {
00147 S0->Compatible(S1,S2) ;
00148 CopyExtensions(S0) ;
00149
00150 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00151 for (it=(*a).begin(); it<=(*a).end(); ++it)
00152 if ((*(A->a))[it.i] !=0 ) (*a)[it]->Add(c0,(*(S0->a))[it] , c1,(*(S1->a))[it] , c2,(*(S2->a))[it]) ;
00153
00154 Ext.Add(c0,&S0->Ext , c1,&S1->Ext , c2,&S2->Ext);
00155 }
00156
00157 template<int DIM>
00158 void BlendingData<DIM>::Add(const double c0,BlendingData<DIM> *S0 , const double c1,BlendingData<DIM> *S1 ,
00159 const double c2,BlendingData<DIM> *S2 , const double c3,BlendingData<DIM> *S3) {
00160 S0->Compatible(S1,S2,S3) ;
00161 CopyExtensions(S0) ;
00162
00163 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00164 for (it=(*a).begin(); it<=(*a).end(); ++it)
00165 if ((*(A->a))[it.i] !=0 ) (*a)[it]->Add(c0,(*(S0->a))[it] , c1,(*(S1->a))[it] , c2,(*(S2->a))[it] , c3,(*(S3->a))[it]) ;
00166
00167 Ext.Add(c0,&S0->Ext , c1,&S1->Ext , c2,&S2->Ext , c3,&S3->Ext);
00168 }
00169
00170
00171 template<int DIM>
00172 void BlendingData<DIM>::Sub(BlendingData<DIM> *S0 , BlendingData<DIM> *S1) {
00173 S0->Compatible(S1) ;
00174 CopyExtensions(S0) ;
00175
00176 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00177 for (it=(*a).begin(); it<=(*a).end(); ++it)
00178 if ((*(A->a))[it.i] !=0 ) (*a)[it]->Sub((*(S0->a))[it] , (*(S1->a))[it]) ;
00179
00180 Ext.Sub(&S0->Ext , &S1->Ext);
00181 }
00182
00183 template<int DIM>
00184 double BlendingData<DIM>::Max() {
00185 double s=-1e+100,r ;
00186 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00187 for (it=(*a).begin(); it<=(*a).end(); ++it) if ((*(A->a))[it.i] !=0 ) { r=(*a)[it]->Max() ; s = max(s,r) ; }
00188 return max(s,Ext.Max()) ;
00189 }
00190
00191 template<int DIM>
00192 double BlendingData<DIM>::Min() {
00193 double s=+1e+100,r ;
00194 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00195 for (it=(*a).begin(); it<=(*a).end(); ++it) if ((*(A->a))[it.i] !=0 ) { r=(*a)[it]->Max() ; s = min(s,r) ; }
00196 return min(s,Ext.Min()) ;
00197 }
00198
00199 template<int DIM>
00200 double BlendingData<DIM>::MaxAbs() {
00201 double s=-1e+100,r ;
00202 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00203 for (it=(*a).begin(); it<=(*a).end(); ++it) if ((*(A->a))[it.i] !=0 ) { r=(*a)[it]->MaxAbs() ; s = max(s,r) ; }
00204 return max(s,Ext.MaxAbs()) ;
00205 }
00206
00207 template<int DIM>
00208 void BlendingData<DIM>::Set(const double c) {
00209 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00210 for (it=(*a).begin(); it<=(*a).end(); ++it) if ((*(A->a))[it.i] !=0 ) (*a)[it]->Set(c) ;
00211 Ext.Set(0) ;
00212 }
00213
00214
00215
00216
00217
00218 template<int DIM>
00219 void BlendingData<DIM>::SetFunction(Function *F) {
00220
00221 Matrix<Matrix<double,DIM> * , DIM>::iterator it(a) ;
00222 for (it=(*a).begin(); it<=(*a).end(); ++it) if ((*(A->a))[it.i] !=0 ) (*a)[it]->Set(F) ;
00223
00224 for (int i=0; i<DIM; i++) {
00225 Ext.BC[i][0]=Ext.BC[i][1]=-1 ;
00226 Ext.ismultiscale[i]=false ;
00227 Ext.islifting [i]=false ;
00228 }
00229 Ext.dimext=0 ;
00230 }
00231
00232
00233
00234
00235
00236 template<int DIM>
00237 void BlendingData<DIM>::ApplyOp(int *BCT , BlendingData<DIM> *S , int dir , unsigned int op) {
00238
00239 assert(A==S->A) ;
00240 assert(dir<DIM) ;
00241
00242
00243
00244
00245
00246 int bg[DIM]={0},e[DIM]={0} ;
00247 UniformData<DIM> X(bg,e,Ext.WC,Ext.XA,Ext.XE),
00248 Y(bg,e,Ext.WC,Ext.XA,Ext.XE) ;
00249 Matrix<double,DIM> *Xba=X.ba, *Yba=Y.ba ;
00250
00251 Y.Ext.CopyFlags(&S->Ext) ;
00252
00253
00254 Matrix<Matrix<double,DIM> * , DIM>::iterator il(A->G->Level0,A->G->L) ;
00255 for (il.Set(A->G->Level0); il<=(*a).end(); ++il) {
00256 if ((*A->a)[il.i] != 0) {
00257
00258 X.ba=( *a)[il] ;
00259 Y.ba=(*S->a)[il] ;
00260 X.ApplyOp(BCT, &Y, dir, op) ;
00261 }
00262 }
00263
00264 Ext.CopyFlags(&X.Ext) ;
00265 Ext.CopyData (&X.Ext) ;
00266
00267 X.ba=Xba, Y.ba=Yba ;
00268
00269
00270 }
00271
00272
00273 #endif