Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

app-kersten/ThinSheet/DiffReactAsympModel.hh
Go to the documentation of this file.
00001 
00008 #ifndef DiffReactAsympModel_hh
00009 #define DiffReactAsympModel_hh
00010 
00011 #include "basics.hh"
00012 #include "toolbox.hh"
00013 #include "geometry.hh"
00014 #include "space.hh"
00015 #include "function.hh"
00016 #include "operator/denseMatrix.hh"
00017 #include "operator/sparseMatrix.hh"
00018 #include "models/models.hh"
00019 #include "hp1D/element.hh"
00020 #include "hp1D/pSpaceL2.hh"
00021 #include "hp2D.hh"
00022 
00023 namespace concepts {
00024 
00025   // forward declaration
00026   template<uint order, class F>
00027   class DiffReactAsympModelOffset;
00028 
00029 
00030   // ******************************************** DiffReactAsympModelSolBase **
00031 
00040   template<class F = Real>
00041   class DiffReactAsympModelSolBase : public OutputOperator {
00042   public:
00044     DiffReactAsympModelSolBase(const F c0);
00045     ~DiffReactAsympModelSolBase();
00046 
00052     const ElementFormula<F>* operator()(const uint i) const;
00053 
00059     const ElementFormula<Point<F,2> >* grad(const uint i) const;
00060 
00066     const ElementFormula<F>* offset(const uint i) const;
00067 
00073     const ElementFormula<Point<F,2> >* offset_grad(const uint i) const;
00074 
00080     const ElementFormula<F>* source(const uint i) const;
00081 
00082 
00088     ElementFormula<F>* trace(const uint i) const;
00089 
00096     ElementFormula<F>* traceDeriv(const uint i) const;
00097 
00104     ElementFormula<F>* meandnu(const uint i) const;
00105 
00110     ElementFormula<F>* U(const uint i) const;
00111 
00116     ElementFormula<Point<F,2> >* grad_U(const uint i) const;
00117 
00119     Space<Real>* space() const {
00120       conceptsAssert(spc_, Assertion());
00121       return spc_;
00122     }
00123 
00125     hp2D::TraceSpace* traceSpace() const {
00126       conceptsAssert(tspc_, Assertion());
00127       return tspc_;
00128     }
00130     void space(Space<Real>& spc) { spc_ = &spc; }
00132     void traceSpace(hp2D::TraceSpace& tspc) { tspc_ = &tspc; }
00133 
00134     F c0() const { return c0_; }
00135   protected:
00136     virtual std::ostream& info(std::ostream& os) const;
00138     const F c0_;
00139     // Offset function from boundary condition
00140     typename std::auto_ptr<ElementFormula<Real> > u_bc_;
00142     Space<Real>* spc_;
00144     hp2D::TraceSpace* tspc_;
00145     // Sequence of FEM solution vectors uhat0, uhat1, ... in 2D space
00146     typename concepts::Sequence<Vector<F>*> uvec_;
00147     // Sequence of FEM solution vectors uhat0, uhat1, ... on midline edges
00148     typename concepts::Sequence<Vector<F>*> utvec_;
00149     // Sequence of offset functions utilde0, utilde1, ...
00150     typename concepts::Sequence<ElementFormula<Real>*> utilde_;
00151     // Sequence of gradient of the offset function utilde0, utilde1, ...
00152     typename concepts::Sequence<ElementFormula<Real2d>*> utilde_grad_;
00153     // The source
00154     std::auto_ptr<ElementFormula<F> > source_;
00155     // Sequence of FEM solutions uhat0, uhat1, ...
00156     typename concepts::Sequence<ElementFormula<F>*> uhat_;
00157     // Sequence of gradient of FEM solutions uhat0, uhat1, ...
00158     typename concepts::Sequence<ElementFormula<Point<F,2> >*> uhat_grad_;
00159     // Sequence of solution as formula vectors u0, u1, ...
00160     typename concepts::Sequence<ElementFormula<F>*> u_;
00161     // Sequence of gradient of solution as formula vectors u0, u1, ...
00162     typename concepts::Sequence<ElementFormula<Point<F,2> >*> u_grad_;
00163     // Trace of solution
00164     typename concepts::Sequence<ElementFormula<F>*> ut_;
00165     // First (tangential) derivative of trace of solution
00166     typename concepts::Sequence<ElementFormula<F>*> ut_t_;
00167     // Neumann trace of solution (mean value)
00168     typename concepts::Sequence<ElementFormula<F>*> meandnu_;
00169     // Solution inside the sheet in (t,S) coordinates as element formula
00170     // over the edges 
00171     typename concepts::Sequence<ElementFormula<F>*> U_;
00172     // Gradient in (t,S) of the solution inside the sheet in (t,S)
00173     // coordinates as element formula over the edges
00174     typename concepts::Sequence<ElementFormula<Point<F,2> >*> grad_U_;
00175   };
00176 
00177   // ************************************************ DiffReactAsympModelSol **
00178 
00186   template<class F = Real>
00187   class DiffReactAsympModelSol : public DiffReactAsympModelSolBase<F> {
00188     friend class DiffReactAsympModelOffset<0,F>;
00189     friend class DiffReactAsympModelOffset<1,F>;
00190     friend class DiffReactAsympModelOffset<2,F>;
00191   public:
00193     DiffReactAsympModelSol(const F c0);
00195     DiffReactAsympModelSol(const F c0, const BoundaryConditions bc);
00197     DiffReactAsympModelSol(const F c0,
00198                            const ElementFormula<F>& source);
00199 
00201     void set(const Vector<F>& u);
00202   protected:
00203     virtual std::ostream& info(std::ostream& os) const;
00204   };
00205 
00206   // ******************************************** DiffReactAsympCollModelSol **
00207 
00213   template<class F = Real>
00214   class DiffReactAsympCollModelSolBase : public DiffReactAsympModelSolBase<F> {
00215   public:
00217     DiffReactAsympCollModelSolBase(const F c0, const Real eps,
00218                                    const BoundaryConditions* bc = 0);
00219 
00221     inline const Real eps() const { return eps_; }
00222 
00223     inline ElementFormula<F>* meandnuDeriv() const {
00224       conceptsAssert(meandnuDeriv_.get(), Assertion());
00225       return meandnuDeriv_.get();
00226     }
00227 
00229     virtual void set(const Vector<F>& u) = 0;
00230 
00232     Space<Real>* dnu_Space() const {
00233       conceptsAssert(dnu_spc_, Assertion());
00234       return dnu_spc_;
00235     }
00236     void dnu_Space(Space<Real>& dnu_spc) { dnu_spc_ = &dnu_spc; }
00237   protected:
00238     virtual std::ostream& info(std::ostream& os) const;
00240     const Real eps_;
00241     std::auto_ptr<ElementFormula<F> > meandnuDeriv_;
00243     Space<Real>* dnu_spc_;
00244   };
00245 
00246   // *************************************** DiffReactAsympCollModelSol_Cont **
00247 
00256   template<uint order, uint alpha = 1, class F = Real>
00257   class DiffReactAsympCollModelSol_Cont 
00258     : public DiffReactAsympCollModelSolBase<F> {
00259   public:
00261     DiffReactAsympCollModelSol_Cont(const F c0, const Real eps)
00262       : DiffReactAsympCollModelSolBase<F>(c0, eps) {}
00264     DiffReactAsympCollModelSol_Cont(const F c0, const Real eps,
00265                                     const BoundaryConditions bc)
00266       : DiffReactAsympCollModelSolBase<F>(c0, eps, &bc) {}
00267 
00268     virtual void set(const Vector<F>& u);
00269   protected:
00270     virtual std::ostream& info(std::ostream& os) const;
00271   };
00272 
00273   // ************************************ DiffReactAsympCollModelSol_Discont **
00274 
00281   template<uint order, uint alpha = 1, class F = Real>
00282   class DiffReactAsympCollModelSol_Discont 
00283     : public DiffReactAsympCollModelSolBase<F> {
00284   public:
00286     DiffReactAsympCollModelSol_Discont(const F c0, const Real eps)
00287       : DiffReactAsympCollModelSolBase<F>(c0, eps) {}
00289     DiffReactAsympCollModelSol_Discont(const F c0, const Real eps,
00290                                        const BoundaryConditions bc)
00291       : DiffReactAsympCollModelSolBase<F>(c0, eps, &bc) {}
00292 
00293     virtual ~DiffReactAsympCollModelSol_Discont();
00294 
00296     virtual void set(const Vector<F>& u);
00297   protected:
00298     virtual std::ostream& info(std::ostream& os) const;
00299   private:
00300     std::auto_ptr<Vector<F> > meandnu_vec_;
00301   };
00302 
00303 
00304   // ********************************************* DiffReactAsympModelOffset **
00305   
00314   template<uint order, class F = Real>
00315   class DiffReactAsympModelOffset : public ElementFormula<F> {
00316   public:
00318     DiffReactAsympModelOffset(DiffReactAsympModelSol<F>& sol);
00319     virtual ~DiffReactAsympModelOffset() {}
00320   
00321     virtual F operator() (const ElementWithCell<Real>& elm,
00322                           const Real p, const Real t = 0.0) const;
00323     virtual F operator() (const ElementWithCell<Real>& elm,
00324         const Real2d& p, const Real t = 0.0) const;
00325     virtual F operator() (const ElementWithCell<Real>& elm,
00326         const Real3d& p, const Real t = 0.0) const;
00327     
00328     virtual DiffReactAsympModelOffset<order,F>* clone() const { 
00329       return new DiffReactAsympModelOffset<order,F>
00330   (sol_, E_o_.get(), E_u_.get(), E_ko_.get(), E_ku_.get());
00331     }
00332   protected:
00333     virtual std::ostream& info(std::ostream& os) const;
00334   private:
00335     DiffReactAsympModelSol<F>& sol_;
00336 
00337     mutable std::auto_ptr<const hp2D::H1Extension<Real> >
00338     E_o_, E_u_, E_ko_, E_ku_;
00339 
00340     DiffReactAsympModelOffset
00341     (DiffReactAsympModelSol<F>& sol,
00342      const hp2D::H1Extension<Real>* E_o, const hp2D::H1Extension<Real>* E_u,
00343      const hp2D::H1Extension<Real>* E_ko, const hp2D::H1Extension<Real>* E_ku) :
00344       sol_(sol), E_o_(E_o ? E_o->clone() : 0), E_u_(E_u ? E_u->clone() : 0)
00345       , E_ko_(E_ko ? E_ko->clone() : 0), E_ku_(E_ku ? E_ku->clone() : 0) {}
00346   };
00347 
00348   // ********************************************* DiffReactAsympModelVector **
00349   
00356   template<uint order, class F = Real>
00357   class DiffReactAsympModelVector : public Vector<F> {
00358   public:
00359     DiffReactAsympModelVector(Space<Real>& spc,
00360                               DiffReactAsympModelSol<F>& sol);
00361   private:
00362     const Space<Real>& spc_;
00363   };
00364 
00365   // *************************************** DiffReactAsympModelSimpleVector **
00366   
00374   template<class F = Real>
00375   class DiffReactAsympModelSimpleVector : public Vector<F> {
00376   public:
00377     DiffReactAsympModelSimpleVector(Space<Real>& spc,
00378                                     DiffReactAsympModelSolBase<F>& sol);
00379   private:
00380     const Space<Real>& spc_;
00381   };
00382 
00383   // ********************************************** DiffReactAsympModelUBase **
00384 
00390   template<typename F = Real>
00391   class DiffReactAsympModelUBase : public ElementFormula<F> {
00392   public:
00394     virtual F operator() (const ElementWithCell<Real>& elm,
00395                           const Real p, const Real t = 0.0) const;
00399     virtual F operator() (const ElementWithCell<Real>& elm,
00400                           const Real2d& p, const Real t = 0.0) const;
00402     virtual F operator() (const ElementWithCell<Real>& elm,
00403                           const Real3d& p, const Real t = 0.0) const;
00404     
00406     virtual Array<F> polynomial
00407     (const ElementWithCell<Real>& elm,
00408      const Real p, const Real t = 0.0) const = 0;
00409   protected:
00410     virtual std::ostream& info(std::ostream& os) const;
00411   };
00412 
00413   // ************************************************** DiffReactAsympModelU **
00414 
00420   template<uint order, typename F = Real>
00421   class DiffReactAsympModelU : public DiffReactAsympModelUBase<F> {
00422   public:
00423     DiffReactAsympModelU(DiffReactAsympModelSol<F>& sol)
00424       : sol_(sol), dtu0_(0), dttu0_(0) {}
00425     virtual ~DiffReactAsympModelU() {}
00426       
00427     virtual DiffReactAsympModelU<order, F>* clone() const { 
00428       return new DiffReactAsympModelU<order, F>(sol_);
00429     }
00430 
00432     virtual Array<F> polynomial
00433     (const ElementWithCell<Real>& elm,
00434      const Real p, const Real t = 0.0) const;
00435   protected:
00436     virtual std::ostream& info(std::ostream& os) const;
00437   private:
00438     DiffReactAsympModelSol<F>& sol_;
00439 
00440     mutable std::auto_ptr<const ElementFormula<F> > dtu0_, dttu0_;
00441   };
00442 
00443   // ********************************** DiffReactAsympCollModel_U_alpha0and1 **
00444 
00451   template<uint order, uint alpha = 1, typename F = Real>
00452   class DiffReactAsympCollModelU_alpha0and1 
00453     : public DiffReactAsympModelUBase<F> {
00454   public:
00455     DiffReactAsympCollModelU_alpha0and1
00456     (DiffReactAsympCollModelSolBase<F>& sol) : sol_(sol) {}
00457     virtual ~DiffReactAsympCollModelU_alpha0and1() {}
00458       
00459     virtual DiffReactAsympCollModelU_alpha0and1<order,alpha,F>* clone() const {
00460       return new DiffReactAsympCollModelU_alpha0and1<order,alpha,F>(sol_);
00461     }
00462 
00464     virtual Array<F> polynomial
00465     (const ElementWithCell<Real>& elm,
00466      const Real p, const Real t = 0.0) const;
00467   protected:
00468     virtual std::ostream& info(std::ostream& os) const;
00469   private:
00470     DiffReactAsympCollModelSolBase<F>& sol_;
00471   };
00472 
00473   // ************************************** DiffReactAsympCollModel_U_alpha2 **
00474 
00481   template<uint order, typename F = Real>
00482   class DiffReactAsympCollModelU_alpha2
00483     : public DiffReactAsympModelUBase<F> {
00484   public:
00485     DiffReactAsympCollModelU_alpha2
00486     (DiffReactAsympCollModelSolBase<F>& sol) : sol_(sol) {}
00487     virtual ~DiffReactAsympCollModelU_alpha2() {}
00488       
00489     virtual DiffReactAsympCollModelU_alpha2<order,F>* clone() const {
00490       return new DiffReactAsympCollModelU_alpha2<order,F>(sol_);
00491     }
00492 
00494     F operator() (const ElementWithCell<Real>& elm,
00495                   const Real2d& p, const Real t = 0.0) const;
00496 
00497     virtual Array<F> polynomial
00498     (const ElementWithCell<Real>& elm,
00499      const Real p, const Real t = 0.0) const;
00500   protected:
00501     virtual std::ostream& info(std::ostream& os) const;
00502   private:
00503     DiffReactAsympCollModelSolBase<F>& sol_;
00504   };
00505 
00506   // ********************************************** DiffReactAsympCollModelU **
00507 
00508   template<uint order, uint alpha = 1, typename F = Real>
00509   class DiffReactAsympCollModelU {};
00510 
00511   template<uint order, typename F>
00512   class DiffReactAsympCollModelU<order,0,F> : 
00513     public DiffReactAsympCollModelU_alpha0and1<order,0,F> {  
00514   public:
00515     DiffReactAsympCollModelU
00516     (DiffReactAsympCollModelSolBase<F>& sol)
00517       : DiffReactAsympCollModelU_alpha0and1<order,0,F>(sol) {}
00518   };
00519 
00520   template<uint order, typename F>
00521   class DiffReactAsympCollModelU<order,1,F> : 
00522     public DiffReactAsympCollModelU_alpha0and1<order,1,F> {  
00523   public:
00524     DiffReactAsympCollModelU
00525     (DiffReactAsympCollModelSolBase<F>& sol) 
00526       : DiffReactAsympCollModelU_alpha0and1<order,1,F>(sol) {}
00527   };
00528 
00529   template<uint order, typename F>
00530   class DiffReactAsympCollModelU<order,2,F> : 
00531     public DiffReactAsympCollModelU_alpha2<order,F> {  
00532   public:
00533     DiffReactAsympCollModelU
00534     (DiffReactAsympCollModelSolBase<F>& sol) 
00535       : DiffReactAsympCollModelU_alpha2<order,F>(sol) {}
00536   };
00537 
00538   // ********************************************** DiffReactAsympModelUepsN **
00539 
00545   template<typename F = Real>
00546   class DiffReactAsympModelUepsN : public ElementFormula<F> {
00547   public:
00548     DiffReactAsympModelUepsN(DiffReactAsympModelSol<F>& sol, const Real eps,
00549                              uint order) 
00550       : sol_(sol), eps_(eps), order_(order) {}
00551     virtual ~DiffReactAsympModelUepsN() {}
00552   
00554     virtual F operator() (const ElementWithCell<Real>& elm,
00555                           const Real p, const Real t = 0.0) const;
00559     virtual F operator() (const ElementWithCell<Real>& elm,
00560                           const Real2d& p, const Real t = 0.0) const;
00562     virtual F operator() (const ElementWithCell<Real>& elm,
00563                           const Real3d& p, const Real t = 0.0) const;
00564     
00565     virtual DiffReactAsympModelUepsN<F>* clone() const { 
00566       return new DiffReactAsympModelUepsN<F>(sol_, eps_, order_);
00567     }
00568 
00569     Real eps() const { return eps_; }
00570     uint order() const { return order_; }
00571   protected:
00572     virtual std::ostream& info(std::ostream& os) const;
00573   private:
00575     DiffReactAsympModelSol<F>& sol_;
00577     const Real eps_;
00579     const uint order_;
00580   };
00581 
00582   // ********************************************** DiffReactAsympModelUBase **
00583 
00589   template<typename F = Real>
00590   class DiffReactAsympModelgrad_UBase : public ElementFormula<Point<F,2> > {
00591   public:
00593     virtual Point<F,2> operator() (const ElementWithCell<Real>& elm,
00594                                    const Real p, const Real t = 0.0) const;
00598     virtual Point<F,2> operator() (const ElementWithCell<Real>& elm,
00599                                    const Real2d& p, const Real t = 0.0) const;
00601     virtual Point<F,2> operator() (const ElementWithCell<Real>& elm,
00602                                    const Real3d& p, const Real t = 0.0) const;
00603     
00609     virtual Array<F> polynomial
00610     (bool normal, const ElementWithCell<Real>& elm,
00611      const Real p, const Real t = 0.0) const = 0;
00612   protected:
00613     virtual std::ostream& info(std::ostream& os) const;
00614   };
00615 
00616   // ***************************** DiffReactAsympCollModel_grad_U_alpha0and1 **
00617 
00624   template<uint order, uint alpha = 1, typename F = Real>
00625   class DiffReactAsympCollModel_grad_U_alpha0and1 
00626     : public DiffReactAsympModelgrad_UBase<F> {
00627   public:
00628     DiffReactAsympCollModel_grad_U_alpha0and1
00629     (DiffReactAsympCollModelSolBase<F>& sol) : sol_(sol) {}
00630     virtual ~DiffReactAsympCollModel_grad_U_alpha0and1() {}
00631       
00632     virtual DiffReactAsympCollModel_grad_U_alpha0and1<order,alpha,F>* clone() const {
00633       return new DiffReactAsympCollModel_grad_U_alpha0and1<order,alpha,F>(sol_);
00634     }
00635 
00637     virtual Array<F> polynomial
00638     (bool normal, const ElementWithCell<Real>& elm,
00639      const Real p, const Real t = 0.0) const;
00640   protected:
00641     virtual std::ostream& info(std::ostream& os) const;
00642   private:
00643     DiffReactAsympCollModelSolBase<F>& sol_;
00644   };
00645 
00646   // ********************************* DiffReactAsympCollModel_grad_U_alpha2 **
00647 
00654   template<uint order, typename F = Real>
00655   class DiffReactAsympCollModel_grad_U_alpha2 
00656     : public DiffReactAsympModelgrad_UBase<F> {
00657   public:
00658     DiffReactAsympCollModel_grad_U_alpha2
00659     (DiffReactAsympCollModelSolBase<F>& sol) : sol_(sol) {}
00660     virtual ~DiffReactAsympCollModel_grad_U_alpha2() {}
00661       
00662     virtual DiffReactAsympCollModel_grad_U_alpha2<order,F>* clone() const {
00663       return new DiffReactAsympCollModel_grad_U_alpha2<order,F>(sol_);
00664     }
00665 
00667     Point<F,2> operator() (const ElementWithCell<Real>& elm,
00668                            const Real2d& p, const Real t = 0.0) const;
00669 
00670     virtual Array<F> polynomial
00671     (bool normal, const ElementWithCell<Real>& elm,
00672      const Real p, const Real t = 0.0) const;
00673   protected:
00674     virtual std::ostream& info(std::ostream& os) const;
00675   private:
00676     DiffReactAsympCollModelSolBase<F>& sol_;
00677   };
00678 
00679   // ***************************************** DiffReactAsympCollModelgrad_U **
00680 
00681   template<uint order, uint alpha = 1, typename F = Real>
00682   class DiffReactAsympCollModelgrad_U {};
00683 
00684   template<uint order, typename F>
00685   class DiffReactAsympCollModelgrad_U<order,0,F> : 
00686     public DiffReactAsympCollModel_grad_U_alpha0and1<order,0,F> {  
00687   public:
00688     DiffReactAsympCollModelgrad_U
00689     (DiffReactAsympCollModelSolBase<F>& sol)
00690       : DiffReactAsympCollModel_grad_U_alpha0and1<order,0,F>(sol) {}
00691   };
00692 
00693   template<uint order, typename F>
00694   class DiffReactAsympCollModelgrad_U<order,1,F> : 
00695     public DiffReactAsympCollModel_grad_U_alpha0and1<order,1,F> {  
00696   public:
00697     DiffReactAsympCollModelgrad_U
00698     (DiffReactAsympCollModelSolBase<F>& sol) 
00699       : DiffReactAsympCollModel_grad_U_alpha0and1<order,1,F>(sol) {}
00700   };
00701 
00702   template<uint order, typename F>
00703   class DiffReactAsympCollModelgrad_U<order,2,F> : 
00704     public DiffReactAsympCollModel_grad_U_alpha2<order,F> {  
00705   public:
00706     DiffReactAsympCollModelgrad_U
00707     (DiffReactAsympCollModelSolBase<F>& sol) 
00708       : DiffReactAsympCollModel_grad_U_alpha2<order,F>(sol) {}
00709   };
00710 
00711   // ****************************************** diffReactAsympModelPowerLoss **
00712 
00718   template<class F>
00719   Real diffReactAsympModelPowerLoss(Real c0, Space<Real>* spc,
00720                                     DiffReactAsympModelUepsN<F>& UepsN)
00721   {
00722     Real val = 0.0;
00723     hp2D::TraceSpace* tspc = dynamic_cast<hp2D::TraceSpace*>(spc);
00724     conceptsAssert(tspc, Assertion());
00725     
00726     // loop over elements
00727     std::auto_ptr<hp2D::TraceSpace::Scan> tsc(tspc->scan());
00728     while (*tsc)
00729       val += diffReactAsympModelPowerLoss(c0, (*tsc)++, UepsN);
00730     return val;
00731   }
00732 
00737   template<class F>
00738   Real diffReactAsympModelPowerLoss(Real c0, hp1D::Element<Real>& elm,
00739                                     DiffReactAsympModelUepsN<F>& UepsN) 
00740   {
00741     const ElementWithCell<Real>* e = 
00742       dynamic_cast<const ElementWithCell<Real>*>(&elm);
00743     conceptsAssert(e, Assertion());
00744 
00745     const Edge2d* edge = dynamic_cast<const Edge2d*>(&e->cell());
00746     if (!edge)
00747       throw conceptsException(MissingFeature("not a valid cell"));
00748 
00749     // rule for integration over S
00750     QuadratureRuleGaussJacobi integrationS(UepsN.order() + 2);
00751     
00752     // quadrature points in t and S direction
00753     const uint        n[2] = { elm.integration()->n(), integrationS.n() };
00754     const Real* const w[2] = { elm.integration()->weights(),
00755                                 integrationS.weights() };
00756     const Real* const q[2] = { elm.integration()->abscissas(),
00757                                 integrationS.abscissas() };
00758 
00759     F val = 0.0;
00760     // loop over integration points along the midline
00761     for (uint i = 0; i < n[0]; ++i) {
00762       // integration point
00763       Real2d P; P[0] = (q[0][i]+1.0)/2.0;
00764       // curvature times thickness
00765       //        | sign ??
00766       Real kd = -edge->map()->curvature(P[0]) * UepsN.eps();
00767       //                                |
00768       //                                wrong position ???
00769       //                                would be only visible at ellipse
00770 
00771       // loop over integration points in S direction
00772       F tmp = 0.0;
00773       for(uint j = 0; j < n[1]; ++j) {
00774         P[1] = q[1][j] * 1 / 2.;
00775   tmp += std::norm(UepsN(elm, P)) * w[1][j] * (1 + P[1]*kd);
00776       } // for j
00777       val += tmp * w[0][i] * edge->jacobianDeterminant(P[0]);
00778     } // for i
00779     // factor 4 due to integration rule over [-1,1] instead of
00780     // [-0.5,0.5] in S direction and [-1,1] instead of [0,1] in
00781     // tangential direction
00782     val *= c0 / 4.0; 
00783     
00784     return val;
00785   }
00786 
00787   // ********************************************** DiffReactAsympModeluepsN **
00788 
00798   template<typename F = Real>
00799   class DiffReactAsympModeluepsN : public ElementFormula<F> {
00800   public:
00801     DiffReactAsympModeluepsN(DiffReactAsympModelSolBase<F>& sol, 
00802                              CellToCellMapping<2,2>& map, 
00803                              Space<Real>& spc, Space<Real>& tspc,
00804                              const Real eps,
00805                              uint order);
00806     virtual ~DiffReactAsympModeluepsN() {}
00807   
00809     virtual F operator() (const ElementWithCell<Real>& elm,
00810                           const Real p, const Real t = 0.0) const;
00811     virtual F operator() (const ElementWithCell<Real>& elm,
00812                           const Real2d& p, const Real t = 0.0) const;
00814     virtual F operator() (const ElementWithCell<Real>& elm,
00815                           const Real3d& p, const Real t = 0.0) const;
00816     
00817     virtual DiffReactAsympModeluepsN<F>* clone() const { 
00818       return new DiffReactAsympModeluepsN<F>(sol_, map_, spc_, tspc_, eps_,
00819                                              order_);
00820     }
00821 
00822     Real eps() const { return eps_; }
00823     uint order() const { return order_; }
00824   protected:
00825     virtual std::ostream& info(std::ostream& os) const;
00826   private:
00828     DiffReactAsympModelSolBase<F>& sol_;
00830     CellToCellMapping<2,2>& map_;
00832     Space<Real> &spc_, &tspc_;
00834     const Real eps_;
00836     const uint order_;
00837     
00838     std::map<const Connector*, const ElementWithCell<Real>*> mapToElm_;
00839   };
00840 
00841 
00842   // ***************************************** DiffReactAsympModeluepsN_grad **
00843 
00854   template<typename F = Real>
00855   class DiffReactAsympModeluepsN_grad : public ElementFormula<Point<F,2> > {
00856   public:
00857     DiffReactAsympModeluepsN_grad(DiffReactAsympModelSolBase<F>& sol, 
00858                                   CellToCellMapping<2,2>& map, 
00859                                   Space<Real>& spc, Space<Real>& tspc,
00860                                   const Real eps,
00861                                   uint order);
00862     virtual ~DiffReactAsympModeluepsN_grad() {}
00863   
00865     virtual Point<F,2> operator() (const ElementWithCell<Real>& elm,
00866                                    const Real p, const Real t = 0.0) const;
00867     virtual Point<F,2> operator() (const ElementWithCell<Real>& elm,
00868                                    const Real2d& p, const Real t = 0.0) const;
00870     virtual Point<F,2> operator() (const ElementWithCell<Real>& elm,
00871                                    const Real3d& p, const Real t = 0.0) const;
00872     
00873     virtual DiffReactAsympModeluepsN_grad<F>* clone() const { 
00874       return new DiffReactAsympModeluepsN_grad<F>(sol_, map_, spc_, tspc_, eps_,
00875                                                   order_);
00876     }
00877 
00878     Real eps() const { return eps_; }
00879     uint order() const { return order_; }
00880   protected:
00881     virtual std::ostream& info(std::ostream& os) const;
00882   private:
00884     DiffReactAsympModelSolBase<F>& sol_;
00886     CellToCellMapping<2,2>& map_;
00888     Space<Real> &spc_, &tspc_;
00890     const Real eps_;
00892     const uint order_;
00893     
00894     std::map<const Connector*, const ElementWithCell<Real>*> mapToElm_;
00895   };
00896 
00897 
00898   // ****************************************** ElementFormulaTimesCurvature **
00899 
00900   template<typename F = Real>
00901   class ElementFormulaTimesCurvature : public ElementFormula<F> {
00902   public:
00903     ElementFormulaTimesCurvature(ElementFormula<F>& frm) : frm_(frm.clone()) {}
00904     virtual ~ElementFormulaTimesCurvature() {}
00905   
00906     virtual F operator() (const ElementWithCell<Real>& elm,
00907                           const Real p, const Real t = 0.0) const;
00909     virtual F operator() (const ElementWithCell<Real>& elm,
00910         const Real2d& p, const Real t = 0.0) const;
00912     virtual F operator() (const ElementWithCell<Real>& elm,
00913         const Real3d& p, const Real t = 0.0) const;
00914     
00915     virtual ElementFormulaTimesCurvature<F>* clone() const { 
00916       return new ElementFormulaTimesCurvature<F>(*frm_);
00917     }
00918   protected:
00919     virtual std::ostream& info(std::ostream& os) const;
00920   private:
00921     std::auto_ptr<ElementFormula<F> > frm_;
00922   };
00923 
00924   // ********************************************* DiffReactAsympCollFormula **
00925   
00926   template<class F>
00927   class DiffReactAsympCollFormula : public ElementFormula<F> {
00928   public:
00929     DiffReactAsympCollFormula(const F c0, const Real eps)
00930       : c0_(c0), eps_(eps) {}
00931     F&    c0 () { return c0_; }
00932     Real& eps() { return eps_;}
00933     virtual F operator()(const ElementWithCell<Real>& elm, const Real p,
00934                          const Real t = 0.0) const;
00935   protected:
00936     virtual std::ostream& info(std::ostream& os) const;
00937 
00938     virtual F compute_(const Edge2d& cell, const Real p) const = 0;
00939     
00940     virtual std::string str_() const = 0;
00941 
00942     F c0_;
00943     Real eps_;
00944   };
00945 
00946   // ********************************************* DiffReactAsympCollGamma_0 **
00947 
00948   template<class F, uint N, uint d = 0>
00949   class DiffReactAsympCollGamma_0 : public DiffReactAsympCollFormula<F> {
00950   public:
00951     DiffReactAsympCollGamma_0(const F c0, const Real eps)
00952       : DiffReactAsympCollFormula<F>(c0, eps) {}
00953   protected:
00954     virtual std::ostream& info(std::ostream& os) const;
00955   private:
00956     virtual F compute_(const Edge2d& cell, const Real p) const;
00957 
00958     virtual std::string str_() const = 0;
00959   };
00960 
00961   // ********************************************* DiffReactAsympCollGamma_1 **
00962 
00963   template<class F, uint N, uint d = 0>
00964   class DiffReactAsympCollGamma_1 : public DiffReactAsympCollFormula<F> {
00965   public:
00966     DiffReactAsympCollGamma_1(const F c0, const Real eps)
00967       : DiffReactAsympCollFormula<F>(c0, eps) {}
00968   protected:
00969     virtual std::ostream& info(std::ostream& os) const;
00970   private:
00971     virtual F compute_(const Edge2d& cell, const Real p) const;
00972 
00973     virtual std::string str_() const = 0;
00974   };
00975 
00976   // ********************************************* DiffReactAsympCollDelta_0 **
00977 
00978   template<class F, uint N, uint d = 0>
00979   class DiffReactAsympCollDelta_0 : public DiffReactAsympCollFormula<F> {
00980   public:
00981     DiffReactAsympCollDelta_0(const F c0, const Real eps)
00982       : DiffReactAsympCollFormula<F>(c0, eps) {}
00983   protected:
00984     virtual std::ostream& info(std::ostream& os) const;
00985   private:
00986     virtual F compute_(const Edge2d& cell, const Real p) const;
00987 
00988     virtual std::string str_() const = 0;
00989   };
00990 
00991   // ********************************************* DiffReactAsympCollDelta_1 **
00992 
00993   template<class F, uint N, uint d = 0>
00994   class DiffReactAsympCollDelta_1 : public DiffReactAsympCollFormula<F> {
00995   public:
00996     DiffReactAsympCollDelta_1(const F c0, const Real eps)
00997       : DiffReactAsympCollFormula<F>(c0, eps) {}
00998   protected:
00999     virtual std::ostream& info(std::ostream& os) const;
01000   private:
01001     virtual F compute_(const Edge2d& cell, const Real p) const;
01002 
01003     virtual std::string str_() const = 0;
01004   };
01005 
01006   // *********************************************** DiffReactAsympModelBase **
01007 
01016   template<class F = Real>
01017   class DiffReactAsympModelBase : public Model<F> {
01018   public:
01019     DiffReactAsympModelBase(std::string problemName) 
01020       : Model<F>(problemName), c_(1.0), eps_(1.0) {}
01021 
01022     virtual DiffReactAsympModelSolBase<F>* modelSol() = 0;
01023 
01025     inline const Real eps() const { return eps_; }
01026     inline void setEps(Real eps) {
01027       if (eps != eps_) {
01028         this->sol_.reset(0);
01029         eps_ = eps;
01030       }
01031     }
01033     inline const F& c() const { return c_; }
01034     inline void setC(const F c) { 
01035       if (c != c_) {
01036         this->sol_.reset(0);
01037         c_ = c;
01038       }
01039     }
01040   protected:
01042     F c_;
01044     Real eps_;
01045   };
01046 
01047   // *********************************************** DiffReactAsympCollModel **
01048 
01049   template<class F = Real, uint order = 0, uint alpha = 1,
01050            class G = typename Realtype<F>::type>
01051   class DiffReactAsympCollModel {
01052   private:
01053     
01054   };
01055 
01056   // ***************************** DiffReactAsympCollModel_Alpha0_Order0and1 **
01057 
01058   template<class F = Real, uint order = 2, 
01059            class G = typename Realtype<F>::type>
01060   class DiffReactAsympCollModel_Alpha0_Order0and1 
01061     : public DiffReactAsympModelBase<F> {
01062   public:
01063     DiffReactAsympCollModel_Alpha0_Order0and1
01064     (Mesh2& msh, const uint l, const uint p,
01065      const ElementFormula<G>& j0frm,
01066      BoundaryConditions* bc = 0);
01067 
01068     virtual ~DiffReactAsympCollModel_Alpha0_Order0and1();
01069 
01070     virtual Space<Real>& space() const {
01071       conceptsAssert(spcE_.get(), Assertion());
01072       return *spcE_;
01073     }
01074 
01075     virtual DiffReactAsympCollModelSol_Cont<order,0,F>* modelSol() {
01076       return modelSol_.get();
01077     }
01078   private:
01080     Mesh2& msh_;
01081     // Space for E-field
01082     std::auto_ptr<hp2D::hpAdaptiveSpaceH1> spcE_;
01083     // Trace space on r = Ri
01084     std::auto_ptr<hp2D::TraceSpace> tspc_;
01085 
01087     std::auto_ptr<DiffReactAsympCollModelSol_Cont<order,0,F> > modelSol_;
01088 
01090     std::auto_ptr<SparseMatrix<Real> > A_;
01092     std::auto_ptr<SparseMatrix<Real> > M_;
01094     std::auto_ptr<DenseMatrix<Real> > L_;
01095 
01097     std::auto_ptr<Vector<G> > rhs_;
01098 
01099     virtual Mesh& mesh_() {
01100       return msh_;
01101     }
01102 
01103     virtual const std::string mshAbbr_() {
01104       return "ThinSheet";
01105     }
01106 
01108     virtual void solve_();
01109   };
01110 
01111 
01112   // ***************************** DiffReactAsympCollModel_Alpha1_Order0and1 **
01113 
01114   template<class F = Real, uint order = 2, 
01115            class G = typename Realtype<F>::type>
01116   class DiffReactAsympCollModel_Alpha1_Order0and1 
01117     : public DiffReactAsympModelBase<F> {
01118   public:
01119     DiffReactAsympCollModel_Alpha1_Order0and1
01120     (Mesh2& msh, const uint l, const uint p,
01121      const ElementFormula<G>& j0frm,
01122      BoundaryConditions* bc = 0);
01123 
01124     virtual ~DiffReactAsympCollModel_Alpha1_Order0and1();
01125 
01126     virtual Space<Real>& space() const {
01127       conceptsAssert(spcE_.get(), Assertion());
01128       return *spcE_;
01129     }
01130 
01131     virtual DiffReactAsympCollModelSol_Cont<order,1,F>* modelSol() {
01132       return modelSol_.get();
01133     }
01134   private:
01136     Mesh2& msh_;
01137     // Space for E-field
01138     std::auto_ptr<hp2D::hpAdaptiveSpaceH1> spcE_;
01139     // Trace space on r = Ri
01140     std::auto_ptr<hp2D::TraceSpace> tspc_;
01141 
01143     std::auto_ptr<DiffReactAsympCollModelSol_Cont<order,1,F> > modelSol_;
01144 
01146     std::auto_ptr<SparseMatrix<Real> > A_;
01148     std::auto_ptr<SparseMatrix<Real> > M_;
01149 
01151     std::auto_ptr<Vector<G> > rhs_;
01152 
01153     virtual Mesh& mesh_() {
01154       return msh_;
01155     }
01156 
01157     virtual const std::string mshAbbr_() {
01158       return "ThinSheet";
01159     }
01160 
01162     virtual void solve_();
01163   };
01164 
01165   // ***************************** DiffReactAsympCollModel_Alpha1_Order2plus **
01166 
01167   template<class F = Real, uint order = 2, 
01168            class G = typename Realtype<F>::type>
01169   class DiffReactAsympCollModel_Alpha1_Order2plus 
01170     : public DiffReactAsympModelBase<F> {
01171   public:
01172     DiffReactAsympCollModel_Alpha1_Order2plus
01173     (Mesh2& msh, const uint l, const uint p,
01174      const ElementFormula<G>& j0frm,
01175      BoundaryConditions* bc = 0);
01176 
01177     virtual ~DiffReactAsympCollModel_Alpha1_Order2plus();
01178 
01179     virtual Space<Real>& space() const {
01180       conceptsAssert(spcE_.get(), Assertion());
01181       return *spcE_;
01182     }
01183 
01184     virtual DiffReactAsympCollModelSol_Discont<order,1,F>* modelSol() {
01185       return modelSol_.get();
01186     }
01187 
01188     const Vector<F>* solL() {
01189       this->solve_();
01190       return solL_.get();
01191     }
01192   private:
01194     Mesh2& msh_;
01196     MutableMesh1 mshG_;
01197     // Space for E-field
01198     std::auto_ptr<hp2D::hpAdaptiveSpaceH1_DG> spcE_;
01199     // Trace space for mean {e} on r = Ri
01200     std::auto_ptr<hp2D::TraceSpace> spcE_mean_;
01201     std::auto_ptr<hp2D::TraceSpace> spcE_jump_;
01202     // Space for Lagrange multiplier space lambda = {dn e}
01203     std::auto_ptr<hp1D::pSpaceL2> spcL_;
01204 
01206     std::auto_ptr<DiffReactAsympCollModelSol_Discont<order,1,F> > modelSol_;
01207 
01209     std::auto_ptr<SparseMatrix<Real> > A_;
01211     std::auto_ptr<SparseMatrix<Real> > M_;
01213     std::auto_ptr<SparseMatrix<Real> > E_;
01215     std::auto_ptr<SparseMatrix<Real> > T01_;
01217     std::auto_ptr<SparseMatrix<Real> > L_;
01219     std::auto_ptr<SparseMatrix<Real> > N_;
01221     std::auto_ptr<SparseMatrix<Real> > Mk2_;
01222 
01224     std::auto_ptr<Vector<G> > rhs_;
01225 
01226     std::auto_ptr<Vector<F> > solL_;
01227 
01228     virtual Mesh& mesh_() {
01229       return msh_;
01230     }
01231 
01232     virtual const std::string mshAbbr_() {
01233       return "ThinSheet";
01234     }
01235 
01237     virtual void solve_();
01238   };
01239 
01240 
01241   // ********************************* DiffReactAsympCollModel_Alpha2_Order0 **
01242 
01243   template<class F = Real, class G = typename Realtype<F>::type>
01244   class DiffReactAsympCollModel_Alpha2_Order0 
01245     : public DiffReactAsympModelBase<F> {
01246   public:
01247     DiffReactAsympCollModel_Alpha2_Order0
01248     (Mesh2& msh, const uint l, const uint p,
01249      const ElementFormula<G>& j0frm,
01250      BoundaryConditions* bc = 0, bool robuster = false);
01251 
01252     virtual ~DiffReactAsympCollModel_Alpha2_Order0();
01253 
01254     virtual Space<Real>& space() const {
01255       conceptsAssert(spcE_.get(), Assertion());
01256       return *spcE_;
01257     }
01258 
01259     virtual DiffReactAsympCollModelSol_Cont<0,2,F>* modelSol() {
01260       return modelSol_.get();
01261     }
01262   private:
01264     Mesh2& msh_;
01265     // Space for E-field
01266     std::auto_ptr<hp2D::hpAdaptiveSpaceH1> spcE_;
01267     // Trace space on r = Ri (not used)
01268     std::auto_ptr<hp2D::TraceSpace> tspc_;
01269 
01271     bool robuster_;
01272 
01274     std::auto_ptr<DiffReactAsympCollModelSol_Cont<0,2,F> > modelSol_;
01275 
01277     std::auto_ptr<SparseMatrix<Real> > A_;
01278 
01279     std::auto_ptr<SparseMatrix<Real> > M_;
01280 
01282     std::auto_ptr<Vector<G> > rhs_;
01283 
01284     virtual Mesh& mesh_() {
01285       return msh_;
01286     }
01287 
01288     virtual const std::string mshAbbr_() {
01289       return "ThinSheet";
01290     }
01291 
01293     virtual void solve_();
01294   };
01295 
01296 
01297   // ***************************** DiffReactAsympCollModel_Alpha2_Order1plus **
01298 
01299   template<class F = Real, uint order = 1, class G = typename Realtype<F>::type>
01300   class DiffReactAsympCollModel_Alpha2_Order1plus 
01301     : public DiffReactAsympModelBase<F> {
01302   public:
01303     DiffReactAsympCollModel_Alpha2_Order1plus
01304     (Mesh2& msh, const uint l, const uint p,
01305      const ElementFormula<G>& j0frm,
01306      BoundaryConditions* bc = 0, bool robuster = false);
01307 
01308     virtual ~DiffReactAsympCollModel_Alpha2_Order1plus();
01309 
01310     virtual Space<Real>& space() const {
01311       conceptsAssert(spcE_.get(), Assertion());
01312       return *spcE_;
01313     }
01314     virtual DiffReactAsympCollModelSol_Discont<order,2,F>* modelSol() {
01315       return modelSol_.get();
01316     }
01317   private:
01319     Mesh2& msh_;
01321     MutableMesh1 mshG_;
01323     std::auto_ptr<hp2D::hpAdaptiveSpaceH1_DG> spcE_;
01325     std::auto_ptr<hp2D::TraceSpace> spcE_mean_;
01327     std::auto_ptr<hp2D::TraceSpace> spcE_jump_;
01329     std::auto_ptr<hp1D::pSpaceL2> spcL_;
01330 
01332     bool robuster_;
01333 
01335     std::auto_ptr<DiffReactAsympCollModelSol_Discont<order,2,F> > modelSol_;
01336 
01338     std::auto_ptr<SparseMatrix<Real> > A_;
01340     std::auto_ptr<SparseMatrix<Real> > E_;
01342     std::auto_ptr<SparseMatrix<Real> > T01_;
01344     std::auto_ptr<SparseMatrix<Real> > T10_;
01346     std::auto_ptr<SparseMatrix<Real> > T21_;
01348     std::auto_ptr<SparseMatrix<Real> > L_;
01349 
01351     std::auto_ptr<Vector<G> > rhs_;
01352 
01353     std::auto_ptr<Vector<F> > solL_;
01354 
01355     virtual Mesh& mesh_() {
01356       return msh_;
01357     }
01358 
01359     virtual const std::string mshAbbr_() {
01360       return "ThinSheet";
01361     }
01362 
01364     virtual void solve_();
01365   };
01366 
01367 
01368   // ************************************** DiffReactAsympCollModel<F,0-1,0> **
01369 
01370   template<class F, class G>
01371   class DiffReactAsympCollModel<F, 0, 0, G> 
01372     : public DiffReactAsympCollModel_Alpha0_Order0and1<F,0, G> {
01373   public:
01374     DiffReactAsympCollModel
01375     (Mesh2& msh, const uint l, const uint p,
01376      const ElementFormula<G>& j0frm, 
01377      BoundaryConditions* bc = 0)
01378       : DiffReactAsympCollModel_Alpha0_Order0and1<F,0,G>(msh, l, p, j0frm, bc) {}
01379   };
01380 
01381   template<class F, class G>
01382   class DiffReactAsympCollModel<F, 1, 0, G> 
01383     : public DiffReactAsympCollModel_Alpha0_Order0and1<F,1,G> {
01384   public:
01385     DiffReactAsympCollModel
01386     (Mesh2& msh, const uint l, const uint p,
01387      const ElementFormula<G>& j0frm, 
01388      BoundaryConditions* bc = 0)
01389       : DiffReactAsympCollModel_Alpha0_Order0and1<F,1,G>(msh, l, p, j0frm, bc) {}
01390   };
01391 
01392 
01393   // ************************************** DiffReactAsympCollModel<F,0-3,1> **
01394 
01395   template<class F, class G>
01396   class DiffReactAsympCollModel<F, 0, 1, G> 
01397     : public DiffReactAsympCollModel_Alpha1_Order0and1<F,0,G> {
01398   public:
01399     DiffReactAsympCollModel
01400     (Mesh2& msh, const uint l, const uint p,
01401      const ElementFormula<G>& j0frm, 
01402      BoundaryConditions* bc = 0)
01403       : DiffReactAsympCollModel_Alpha1_Order0and1<F,0,G>(msh, l, p, j0frm, bc) {}
01404   };
01405 
01406   template<class F, class G>
01407   class DiffReactAsympCollModel<F, 1, 1, G> 
01408     : public DiffReactAsympCollModel_Alpha1_Order0and1<F,1,G> {
01409   public:
01410     DiffReactAsympCollModel
01411     (Mesh2& msh, const uint l, const uint p,
01412      const ElementFormula<G>& j0frm, 
01413      BoundaryConditions* bc = 0)
01414       : DiffReactAsympCollModel_Alpha1_Order0and1<F,1,G>(msh, l, p, j0frm, bc) {}
01415   };
01416 
01417   template<class F, class G>
01418   class DiffReactAsympCollModel<F, 2, 1, G> 
01419     : public DiffReactAsympCollModel_Alpha1_Order2plus<F,2,G> {
01420   public:
01421     DiffReactAsympCollModel
01422     (Mesh2& msh, const uint l, const uint p,
01423      const ElementFormula<G>& j0frm, 
01424      BoundaryConditions* bc = 0)
01425       : DiffReactAsympCollModel_Alpha1_Order2plus<F,2,G>(msh, l, p, j0frm, bc) {}
01426   };
01427 
01428   template<class F, class G>
01429   class DiffReactAsympCollModel<F, 3, 1, G> 
01430     : public DiffReactAsympCollModel_Alpha1_Order2plus<F,3,G> {
01431   public:
01432     DiffReactAsympCollModel
01433     (Mesh2& msh, const uint l, const uint p,
01434      const ElementFormula<G>& j0frm, 
01435      BoundaryConditions* bc = 0)
01436       : DiffReactAsympCollModel_Alpha1_Order2plus<F,3,G>(msh, l, p, j0frm, bc) {}
01437   };
01438 
01439   // ************************************** DiffReactAsympCollModel<F,0-1,2> **
01440 
01441   template<class F, class G>
01442   class DiffReactAsympCollModel<F, 0, 2, G>
01443     : public DiffReactAsympCollModel_Alpha2_Order0<F, G> {
01444   public:
01445     DiffReactAsympCollModel
01446     (Mesh2& msh, const uint l, const uint p,
01447      const ElementFormula<G>& j0frm, 
01448      BoundaryConditions* bc = 0, bool robuster = false)
01449       : DiffReactAsympCollModel_Alpha2_Order0<F,G>(msh, l, p, j0frm, bc, robuster) {}
01450   };
01451 
01452   template<class F, class G>
01453   class DiffReactAsympCollModel<F, 1, 2, G>
01454     : public DiffReactAsympCollModel_Alpha2_Order1plus<F,1,G> {
01455   public:
01456     DiffReactAsympCollModel
01457     (Mesh2& msh, const uint l, const uint p,
01458      const ElementFormula<G>& j0frm, 
01459      BoundaryConditions* bc = 0, bool robuster = false)
01460       : DiffReactAsympCollModel_Alpha2_Order1plus<F,1,G>(msh, l, p, j0frm, bc, robuster)
01461     {}
01462   };
01463 
01464 
01465   // *************************************** DiffReactAsympModelKraehenbuehl **
01466 
01467   template<class F = Real, class G = typename Realtype<F>::type>
01468   class DiffReactAsympModelKraehenbuehl : public DiffReactAsympModelBase<F> {
01469   public:
01470     DiffReactAsympModelKraehenbuehl
01471     (Mesh2& msh, const uint l, const uint p,
01472      const ElementFormula<G>& j0frm,
01473      BoundaryConditions* bc = 0);
01474 
01475     virtual ~DiffReactAsympModelKraehenbuehl();
01476 
01477     virtual Space<Real>& space() const {
01478       conceptsAssert(spcE_.get(), Assertion());
01479       return *spcE_;
01480     }
01481     virtual DiffReactAsympCollModelSol_Discont<0,0,F>* modelSol() {
01482       return modelSol_.get();
01483     }
01484   private:
01486     Mesh2& msh_;
01488     MutableMesh1 mshG_;
01490     std::auto_ptr<hp2D::hpAdaptiveSpaceH1_DG> spcE_;
01492     std::auto_ptr<hp2D::TraceSpace> spcE_mean_;
01494     std::auto_ptr<hp2D::TraceSpace> spcE_jump_;
01496     std::auto_ptr<hp1D::pSpaceL2> spcL_;
01497 
01499     // second template parameter is dummy as no internal solution given
01500     std::auto_ptr<DiffReactAsympCollModelSol_Discont<0,0,F> > modelSol_;
01501 
01503     std::auto_ptr<SparseMatrix<Real> > A_;
01505     std::auto_ptr<SparseMatrix<Real> > E_;
01507     std::auto_ptr<SparseMatrix<Real> > T01_;
01509     std::auto_ptr<SparseMatrix<Real> > L_;
01510 
01512     std::auto_ptr<Vector<G> > rhs_;
01513 
01514     std::auto_ptr<Vector<F> > solL_;
01515 
01516     virtual Mesh& mesh_() {
01517       return msh_;
01518     }
01519 
01520     virtual const std::string mshAbbr_() {
01521       return "ThinSheet";
01522     }
01523 
01525     virtual void solve_();
01526   };
01527 
01528     
01529 } // namespace concepts
01530 
01531 #endif // DiffReactAsympModel_hh
01532 
01533 

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)