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
00026 template<uint order, class F>
00027 class DiffReactAsympModelOffset;
00028
00029
00030
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
00140 typename std::auto_ptr<ElementFormula<Real> > u_bc_;
00142 Space<Real>* spc_;
00144 hp2D::TraceSpace* tspc_;
00145
00146 typename concepts::Sequence<Vector<F>*> uvec_;
00147
00148 typename concepts::Sequence<Vector<F>*> utvec_;
00149
00150 typename concepts::Sequence<ElementFormula<Real>*> utilde_;
00151
00152 typename concepts::Sequence<ElementFormula<Real2d>*> utilde_grad_;
00153
00154 std::auto_ptr<ElementFormula<F> > source_;
00155
00156 typename concepts::Sequence<ElementFormula<F>*> uhat_;
00157
00158 typename concepts::Sequence<ElementFormula<Point<F,2> >*> uhat_grad_;
00159
00160 typename concepts::Sequence<ElementFormula<F>*> u_;
00161
00162 typename concepts::Sequence<ElementFormula<Point<F,2> >*> u_grad_;
00163
00164 typename concepts::Sequence<ElementFormula<F>*> ut_;
00165
00166 typename concepts::Sequence<ElementFormula<F>*> ut_t_;
00167
00168 typename concepts::Sequence<ElementFormula<F>*> meandnu_;
00169
00170
00171 typename concepts::Sequence<ElementFormula<F>*> U_;
00172
00173
00174 typename concepts::Sequence<ElementFormula<Point<F,2> >*> grad_U_;
00175 };
00176
00177
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
00750 QuadratureRuleGaussJacobi integrationS(UepsN.order() + 2);
00751
00752
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
00761 for (uint i = 0; i < n[0]; ++i) {
00762
00763 Real2d P; P[0] = (q[0][i]+1.0)/2.0;
00764
00765
00766 Real kd = -edge->map()->curvature(P[0]) * UepsN.eps();
00767
00768
00769
00770
00771
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 }
00777 val += tmp * w[0][i] * edge->jacobianDeterminant(P[0]);
00778 }
00779
00780
00781
00782 val *= c0 / 4.0;
00783
00784 return val;
00785 }
00786
00787
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
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
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
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
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
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
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
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
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
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
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
01082 std::auto_ptr<hp2D::hpAdaptiveSpaceH1> spcE_;
01083
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
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
01138 std::auto_ptr<hp2D::hpAdaptiveSpaceH1> spcE_;
01139
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
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
01198 std::auto_ptr<hp2D::hpAdaptiveSpaceH1_DG> spcE_;
01199
01200 std::auto_ptr<hp2D::TraceSpace> spcE_mean_;
01201 std::auto_ptr<hp2D::TraceSpace> spcE_jump_;
01202
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
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
01266 std::auto_ptr<hp2D::hpAdaptiveSpaceH1> spcE_;
01267
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
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
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
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
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
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
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 }
01530
01531 #endif // DiffReactAsympModel_hh
01532
01533