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  

BlendingData.hpp

00001 //
00002 // implementations for BlendingSpaces
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 // General
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 // linear algebra
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 // Set
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 // Operators
00235 //
00236 template<int DIM>
00237 void BlendingData<DIM>::ApplyOp(int *BCT , BlendingData<DIM> *S , int dir , unsigned int op) {
00238  // check
00239  assert(A==S->A) ;
00240  assert(dir<DIM) ;
00241 
00242  // nasty implementation: we allocate an auxiliary, dummy UniformData
00243  // and replace the actual array of numerical values by the arrays of *this
00244  // This way we may use UniformData::ApplyOp()
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 ; // keep old arrays
00250 
00251  Y.Ext.CopyFlags(&S->Ext) ;
00252 
00253  // forall ProjectionSubSpaces
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      // fake the arrays
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  // set old arrays to be deleted by ~X and ~Y
00267  X.ba=Xba, Y.ba=Yba ;
00268 
00269 
00270 }
00271 
00272 
00273 #endif

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