albertagrid/datahandle.hh

00001 #ifndef DUNE_ALBERTAGRIDDATAHANDLE_HH
00002 #define DUNE_ALBERTAGRIDDATAHANDLE_HH
00003 
00004 //- system includes 
00005 #include <iostream>
00006 
00007 namespace AlbertHelp {
00008 
00010 //
00011 //  --AdaptRestrictProlong 
00012 //
00014 template <class GridType , class RestrictProlongOperatorType >
00015 class AdaptRestrictProlongHandler
00016 {
00017   GridType & grid_;
00018   enum { dim = GridType :: dimension };
00019   typedef Dune :: MakeableInterfaceObject<typename GridType::template Codim<0>::Entity> EntityType;
00020   typedef typename EntityType :: ImplementationType RealEntityType;
00021   
00022   EntityType & reFather_;
00023   EntityType & reSon_;
00024   RealEntityType & realFather_;
00025   RealEntityType & realSon_;
00026 
00027   RestrictProlongOperatorType & rp_;
00028 
00029   ALBERTA EL_INFO vati_;
00030   ALBERTA EL_INFO sohn_; 
00031  
00032   int maxlevel_;
00033 
00034 public:
00036   AdaptRestrictProlongHandler (GridType & grid, 
00037       EntityType & f, RealEntityType & rf, EntityType & s, RealEntityType & rs
00038       , RestrictProlongOperatorType & rp) 
00039     : grid_(grid)
00040     , reFather_(f)
00041     , reSon_(s)
00042     , realFather_(rf) 
00043     , realSon_(rs) 
00044     , rp_(rp) 
00045     , vati_()
00046     , sohn_()
00047     , maxlevel_(-1) 
00048   {
00049     makeEmptyElInfo<dim,dim>(&vati_);
00050     makeEmptyElInfo<dim,dim>(&sohn_);
00051 
00052     vati_.mesh = grid.getMesh();
00053     sohn_.mesh = grid.getMesh();
00054   }
00055 
00057   void preCoarsening ( EL * elem )
00058   {
00059     // check pointers of mesh internal dof vecs 
00060     // this call has to be done before all other things 
00061     grid_.arrangeDofVec();
00062 
00063     vati_.el    = elem;
00064     int level   = grid_.getLevelOfElement( elem );
00065     vati_.level = level;
00066     ++level; // children level now 
00067     
00068     realFather_.setElInfo(&vati_);
00069     sohn_.parent = elem;
00070 
00071     for(int ch=0; ch<2; ++ch)
00072     {
00073       EL * son = elem->child[ch];
00074       assert( son );
00075       
00076       sohn_.el    = son; 
00077       sohn_.level = level; 
00078       
00079       realSon_.setElInfo(&sohn_);
00080 
00081       rp_.restrictLocal(reFather_,reSon_,(ch == 0));
00082     }
00083     
00084     if(level > maxlevel_) maxlevel_ = level;
00085   }
00086 
00088   void postRefinement ( EL * elem )
00089   {
00090     // check pointers of mesh internal dof vecs 
00091     // this call has to be done before all other things 
00092     grid_.arrangeDofVec();
00093 
00094     vati_.el    = elem;
00095     int level   = grid_.getLevelOfElement( elem );
00096     vati_.level = level;
00097     ++level;
00098     realFather_.setElInfo(&vati_);
00099     sohn_.parent = elem;
00100 
00101     for(int ch=0; ch<2; ++ch)
00102     {
00103       EL * son = elem->child[ch];
00104       assert( son );
00105       
00106       sohn_.el    = son; 
00107       sohn_.level = level; 
00108       
00109       realSon_.setElInfo(&sohn_);
00110 
00111       rp_.prolongLocal(reFather_,reSon_,(ch == 0));
00112     }
00113     
00114     if(level > maxlevel_) maxlevel_ = level;
00115   }
00116 
00117   int maxLevel () const { return maxlevel_; }
00118 };
00119 
00120 } // end namespace 
00121 #endif

Generated on 9 Apr 2008 with Doxygen (ver 1.5.2) [logfile].