00001 #ifndef DUNE_ALBERTAGRIDDATAHANDLE_HH
00002 #define DUNE_ALBERTAGRIDDATAHANDLE_HH
00003
00004
00005 #include <iostream>
00006
00007 namespace AlbertHelp {
00008
00010
00011
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
00060
00061 grid_.arrangeDofVec();
00062
00063 vati_.el = elem;
00064 int level = grid_.getLevelOfElement( elem );
00065 vati_.level = level;
00066 ++level;
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
00091
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 }
00121 #endif