30 #ifndef RYTHMOS_RK_BUTCHER_TABLEAU_HPP
31 #define RYTHMOS_RK_BUTCHER_TABLEAU_HPP
35 #pragma clang system_header
38 #include "Rythmos_Types.hpp"
39 #include "Rythmos_RKButcherTableauBase.hpp"
41 #include "Teuchos_Assert.hpp"
42 #include "Teuchos_as.hpp"
43 #include "Teuchos_StandardParameterEntryValidators.hpp"
44 #include "Teuchos_Describable.hpp"
45 #include "Teuchos_VerboseObject.hpp"
46 #include "Teuchos_VerboseObjectParameterListHelpers.hpp"
47 #include "Teuchos_ParameterListAcceptor.hpp"
48 #include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
50 #include "Thyra_ProductVectorBase.hpp"
56 inline const std::string RKBT_ForwardEuler_name() {
return "Forward Euler"; }
57 inline const std::string RKBT_BackwardEuler_name() {
return "Backward Euler"; }
58 inline const std::string Explicit4Stage_name() {
return "Explicit 4 Stage"; }
59 inline const std::string Explicit3_8Rule_name() {
return "Explicit 3/8 Rule"; }
61 inline const std::string ExplicitTrapezoidal_name() {
return "Explicit Trapezoidal"; }
62 inline const std::string Explicit2Stage2ndOrderRunge_name() {
return "Explicit 2 Stage 2nd order by Runge"; }
63 inline const std::string Explicit2Stage2ndOrderTVD_name() {
return "Explicit 2 Stage 2nd order TVD"; }
64 inline const std::string Explicit3Stage3rdOrderHeun_name() {
return "Explicit 3 Stage 3rd order by Heun"; }
65 inline const std::string Explicit3Stage3rdOrder_name() {
return "Explicit 3 Stage 3rd order"; }
66 inline const std::string Explicit3Stage3rdOrderTVD_name() {
return "Explicit 3 Stage 3rd order TVD"; }
67 inline const std::string Explicit4Stage3rdOrderRunge_name() {
return "Explicit 4 Stage 3rd order by Runge"; }
68 inline const std::string Explicit5Stage3rdOrderKandG_name() {
return "Explicit 5 Stage 3rd order by Kinnmark and Gray"; }
70 inline const std::string IRK1StageTheta_name() {
return "IRK 1 Stage Theta Method"; }
71 inline const std::string IRK2StageTheta_name() {
return "IRK 2 Stage Theta Method"; }
72 inline const std::string Implicit1Stage2ndOrderGauss_name() {
return "Implicit 1 Stage 2nd order Gauss"; }
73 inline const std::string Implicit2Stage4thOrderGauss_name() {
return "Implicit 2 Stage 4th order Gauss"; }
74 inline const std::string Implicit3Stage6thOrderGauss_name() {
return "Implicit 3 Stage 6th order Gauss"; }
76 inline const std::string Implicit1Stage1stOrderRadauA_name() {
return "Implicit 1 Stage 1st order Radau left"; }
77 inline const std::string Implicit2Stage3rdOrderRadauA_name() {
return "Implicit 2 Stage 3rd order Radau left"; }
78 inline const std::string Implicit3Stage5thOrderRadauA_name() {
return "Implicit 3 Stage 5th order Radau left"; }
80 inline const std::string Implicit1Stage1stOrderRadauB_name() {
return "Implicit 1 Stage 1st order Radau right"; }
81 inline const std::string Implicit2Stage3rdOrderRadauB_name() {
return "Implicit 2 Stage 3rd order Radau right"; }
82 inline const std::string Implicit3Stage5thOrderRadauB_name() {
return "Implicit 3 Stage 5th order Radau right"; }
84 inline const std::string Implicit2Stage2ndOrderLobattoA_name() {
return "Implicit 2 Stage 2nd order Lobatto A"; }
85 inline const std::string Implicit3Stage4thOrderLobattoA_name() {
return "Implicit 3 Stage 4th order Lobatto A"; }
86 inline const std::string Implicit4Stage6thOrderLobattoA_name() {
return "Implicit 4 Stage 6th order Lobatto A"; }
88 inline const std::string Implicit2Stage2ndOrderLobattoB_name() {
return "Implicit 2 Stage 2nd order Lobatto B"; }
89 inline const std::string Implicit3Stage4thOrderLobattoB_name() {
return "Implicit 3 Stage 4th order Lobatto B"; }
90 inline const std::string Implicit4Stage6thOrderLobattoB_name() {
return "Implicit 4 Stage 6th order Lobatto B"; }
92 inline const std::string Implicit2Stage2ndOrderLobattoC_name() {
return "Implicit 2 Stage 2nd order Lobatto C"; }
93 inline const std::string Implicit3Stage4thOrderLobattoC_name() {
return "Implicit 3 Stage 4th order Lobatto C"; }
94 inline const std::string Implicit4Stage6thOrderLobattoC_name() {
return "Implicit 4 Stage 6th order Lobatto C"; }
96 inline const std::string Implicit2Stage4thOrderHammerHollingsworth_name() {
return "Implicit 2 Stage 4th Order Hammer & Hollingsworth"; }
97 inline const std::string Implicit3Stage6thOrderKuntzmannButcher_name() {
return "Implicit 3 Stage 6th Order Kuntzmann & Butcher"; }
98 inline const std::string Implicit4Stage8thOrderKuntzmannButcher_name() {
return "Implicit 4 Stage 8th Order Kuntzmann & Butcher"; }
100 inline const std::string DIRK2Stage3rdOrder_name() {
return "Diagonal IRK 2 Stage 3rd order"; }
102 inline const std::string SDIRK2Stage2ndOrder_name() {
return "Singly Diagonal IRK 2 Stage 2nd order"; }
103 inline const std::string SDIRK2Stage3rdOrder_name() {
return "Singly Diagonal IRK 2 Stage 3rd order"; }
104 inline const std::string SDIRK5Stage5thOrder_name() {
return "Singly Diagonal IRK 5 Stage 5th order"; }
105 inline const std::string SDIRK5Stage4thOrder_name() {
return "Singly Diagonal IRK 5 Stage 4th order"; }
106 inline const std::string SDIRK3Stage4thOrder_name() {
return "Singly Diagonal IRK 3 Stage 4th order"; }
108 template<
class Scalar>
109 class RKButcherTableauDefaultBase :
110 virtual public RKButcherTableauBase<Scalar>,
111 virtual public Teuchos::ParameterListAcceptorDefaultBase
115 virtual int numStages()
const {
return A_.numRows(); }
117 virtual const Teuchos::SerialDenseMatrix<int,Scalar>& A()
const {
return A_; }
119 virtual const Teuchos::SerialDenseVector<int,Scalar>& b()
const {
return b_; }
121 virtual const Teuchos::SerialDenseVector<int,Scalar>& bhat()
const {
return bhat_ ; }
123 virtual const Teuchos::SerialDenseVector<int,Scalar>& c()
const {
return c_; }
125 virtual int order()
const {
return order_; }
127 virtual bool isEmbeddedMethod()
const {
return isEmbedded_; }
129 virtual void setDescription(std::string longDescription) { longDescription_ = longDescription; }
132 virtual void initialize(
133 const Teuchos::SerialDenseMatrix<int,Scalar>& A_in,
134 const Teuchos::SerialDenseVector<int,Scalar>& b_in,
135 const Teuchos::SerialDenseVector<int,Scalar>& c_in,
137 const std::string& longDescription_in,
138 bool isEmbedded =
false,
139 const Teuchos::SerialDenseVector<int,Scalar>& bhat_in = Teuchos::SerialDenseVector<int,Scalar>()
142 const int numStages_in = A_in.numRows();
143 TEUCHOS_ASSERT_EQUALITY( A_in.numRows(), numStages_in );
144 TEUCHOS_ASSERT_EQUALITY( A_in.numCols(), numStages_in );
145 TEUCHOS_ASSERT_EQUALITY( b_in.length(), numStages_in );
146 TEUCHOS_ASSERT_EQUALITY( c_in.length(), numStages_in );
147 TEUCHOS_ASSERT( order_in > 0 );
152 longDescription_ = longDescription_in;
156 TEUCHOS_ASSERT_EQUALITY( bhat_in.length(), numStages_in );
166 virtual void setParameterList(RCP<Teuchos::ParameterList>
const& paramList)
168 TEUCHOS_TEST_FOR_EXCEPT( is_null(paramList) );
169 paramList->validateParameters(*this->getValidParameters());
170 Teuchos::readVerboseObjectSublist(&*paramList,
this);
171 setMyParamList(paramList);
175 virtual RCP<const Teuchos::ParameterList> getValidParameters()
const
177 if (is_null(validPL_)) {
178 validPL_ = Teuchos::parameterList();
179 validPL_->set(
"Description",
"",this->getMyDescription());
180 Teuchos::setupVerboseObjectSublist(&*validPL_);
191 virtual std::string description()
const {
return "Rythmos::RKButcherTableauDefaultBase"; }
194 virtual void describe(
195 Teuchos::FancyOStream &out,
196 const Teuchos::EVerbosityLevel verbLevel
199 if (verbLevel != Teuchos::VERB_NONE) {
200 out << this->description() << std::endl;
201 out << this->getMyDescription() << std::endl;
202 out <<
"number of Stages = " << this->numStages() << std::endl;
203 out <<
"A = " << printMat(this->A()) << std::endl;
204 out <<
"b = " << printMat(this->b()) << std::endl;
205 out <<
"c = " << printMat(this->c()) << std::endl;
206 out <<
"order = " << this->order() << std::endl;
213 void setMyDescription(std::string longDescription) { longDescription_ = longDescription; }
214 const std::string& getMyDescription()
const {
return longDescription_; }
216 void setMy_A(
const Teuchos::SerialDenseMatrix<int,Scalar>& new_A) { A_ = new_A; }
217 void setMy_b(
const Teuchos::SerialDenseVector<int,Scalar>& new_b) { b_ = new_b; }
218 void setMy_c(
const Teuchos::SerialDenseVector<int,Scalar>& new_c) { c_ = new_c; }
219 void setMy_order(
const int& new_order) { order_ = new_order; }
221 void setMyValidParameterList(
const RCP<ParameterList> validPL ) { validPL_ = validPL; }
222 RCP<ParameterList> getMyNonconstValidParameterList() {
return validPL_; }
225 Teuchos::SerialDenseMatrix<int,Scalar> A_;
226 Teuchos::SerialDenseVector<int,Scalar> b_;
227 Teuchos::SerialDenseVector<int,Scalar> c_;
229 std::string longDescription_;
230 mutable RCP<ParameterList> validPL_;
233 Teuchos::SerialDenseVector<int,Scalar> bhat_;
234 bool isEmbedded_ =
false;
239 template<
class Scalar>
240 RCP<RKButcherTableauBase<Scalar> > rKButcherTableau()
242 return(rcp(
new RKButcherTableauDefaultBase<Scalar>()));
246 template<
class Scalar>
247 RCP<RKButcherTableauBase<Scalar> > rKButcherTableau(
248 const Teuchos::SerialDenseMatrix<int,Scalar>& A_in,
249 const Teuchos::SerialDenseVector<int,Scalar>& b_in,
250 const Teuchos::SerialDenseVector<int,Scalar>& c_in,
252 const std::string& description_in =
""
255 RCP<RKButcherTableauDefaultBase<Scalar> > rkbt = rcp(
new RKButcherTableauDefaultBase<Scalar>());
256 rkbt->initialize(A_in,b_in,c_in,order_in,description_in);
261 template<
class Scalar>
262 class BackwardEuler_RKBT :
263 virtual public RKButcherTableauDefaultBase<Scalar>
268 std::ostringstream myDescription;
269 myDescription << RKBT_BackwardEuler_name() <<
"\n"
272 <<
"b = [ 1 ]'" << std::endl;
273 typedef ScalarTraits<Scalar> ST;
274 Teuchos::SerialDenseMatrix<int,Scalar> myA(1,1);
275 myA(0,0) = ST::one();
276 Teuchos::SerialDenseVector<int,Scalar> myb(1);
278 Teuchos::SerialDenseVector<int,Scalar> myc(1);
281 this->setMyDescription(myDescription.str());
285 this->setMy_order(1);
291 template<
class Scalar>
292 class ForwardEuler_RKBT :
293 virtual public RKButcherTableauDefaultBase<Scalar>
299 std::ostringstream myDescription;
300 myDescription << RKBT_ForwardEuler_name() <<
"\n"
303 <<
"b = [ 1 ]'" << std::endl;
304 typedef ScalarTraits<Scalar> ST;
305 Teuchos::SerialDenseMatrix<int,Scalar> myA(1,1);
306 Teuchos::SerialDenseVector<int,Scalar> myb(1);
308 Teuchos::SerialDenseVector<int,Scalar> myc(1);
310 this->setMyDescription(myDescription.str());
314 this->setMy_order(1);
319 template<
class Scalar>
320 class Explicit4Stage4thOrder_RKBT :
321 virtual public RKButcherTableauDefaultBase<Scalar>
324 Explicit4Stage4thOrder_RKBT()
326 std::ostringstream myDescription;
327 myDescription << Explicit4Stage_name() <<
"\n"
328 <<
"\"The\" Runge-Kutta Method (explicit):\n"
329 <<
"Solving Ordinary Differential Equations I:\n"
330 <<
"Nonstiff Problems, 2nd Revised Edition\n"
331 <<
"E. Hairer, S.P. Norsett, G. Wanner\n"
332 <<
"Table 1.2, pg 138\n"
333 <<
"c = [ 0 1/2 1/2 1 ]'\n"
338 <<
"b = [ 1/6 1/3 1/3 1/6 ]'" << std::endl;
339 typedef ScalarTraits<Scalar> ST;
340 Scalar one = ST::one();
341 Scalar zero = ST::zero();
342 Scalar onehalf = ST::one()/(2*ST::one());
343 Scalar onesixth = ST::one()/(6*ST::one());
344 Scalar onethird = ST::one()/(3*ST::one());
347 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
348 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
349 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
384 this->setMyDescription(myDescription.str());
388 this->setMy_order(4);
393 template<
class Scalar>
394 class Explicit3_8Rule_RKBT :
395 virtual public RKButcherTableauDefaultBase<Scalar>
398 Explicit3_8Rule_RKBT()
401 std::ostringstream myDescription;
402 myDescription << Explicit3_8Rule_name() <<
"\n"
403 <<
"Solving Ordinary Differential Equations I:\n"
404 <<
"Nonstiff Problems, 2nd Revised Edition\n"
405 <<
"E. Hairer, S.P. Norsett, G. Wanner\n"
406 <<
"Table 1.2, pg 138\n"
407 <<
"c = [ 0 1/3 2/3 1 ]'\n"
412 <<
"b = [ 1/8 3/8 3/8 1/8 ]'" << std::endl;
413 typedef ScalarTraits<Scalar> ST;
415 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
416 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
417 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
419 Scalar one = ST::one();
420 Scalar zero = ST::zero();
421 Scalar one_third = as<Scalar>(ST::one()/(3*ST::one()));
422 Scalar two_third = as<Scalar>(2*ST::one()/(3*ST::one()));
423 Scalar one_eighth = as<Scalar>(ST::one()/(8*ST::one()));
424 Scalar three_eighth = as<Scalar>(3*ST::one()/(8*ST::one()));
432 myA(1,0) = one_third;
437 myA(2,0) = as<Scalar>(-one_third);
443 myA(3,1) = as<Scalar>(-one);
449 myb(1) = three_eighth;
450 myb(2) = three_eighth;
459 this->setMyDescription(myDescription.str());
463 this->setMy_order(4);
468 template<
class Scalar>
469 class Explicit4Stage3rdOrderRunge_RKBT :
470 virtual public RKButcherTableauDefaultBase<Scalar>
473 Explicit4Stage3rdOrderRunge_RKBT()
476 std::ostringstream myDescription;
477 myDescription << Explicit4Stage3rdOrderRunge_name() <<
"\n"
478 <<
"Solving Ordinary Differential Equations I:\n"
479 <<
"Nonstiff Problems, 2nd Revised Edition\n"
480 <<
"E. Hairer, S.P. Norsett, G. Wanner\n"
481 <<
"Table 1.1, pg 135\n"
482 <<
"c = [ 0 1/2 1 1 ]'\n"
487 <<
"b = [ 1/6 2/3 0 1/6 ]'" << std::endl;
488 typedef ScalarTraits<Scalar> ST;
490 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
491 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
492 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
494 Scalar one = ST::one();
495 Scalar onehalf = ST::one()/(2*ST::one());
496 Scalar onesixth = ST::one()/(6*ST::one());
497 Scalar twothirds = 2*ST::one()/(3*ST::one());
498 Scalar zero = ST::zero();
533 this->setMyDescription(myDescription.str());
537 this->setMy_order(3);
541 template<
class Scalar>
542 class Explicit5Stage3rdOrderKandG_RKBT :
543 virtual public RKButcherTableauDefaultBase<Scalar>
546 Explicit5Stage3rdOrderKandG_RKBT()
549 std::ostringstream myDescription;
550 myDescription << Explicit5Stage3rdOrderKandG_name() <<
"\n"
551 <<
"Kinnmark & Gray 5 stage, 3rd order scheme \n"
552 <<
"Modified by P. Ullrich. From the prim_advance_mod.F90 \n"
553 <<
"routine in the HOMME atmosphere model code.\n"
554 <<
"c = [ 0 1/5 1/5 1/3 2/3 ]'\n"
558 <<
" [ 0 0 1/3 0 ]\n"
559 <<
" [ 0 0 0 2/3 0 ]\n"
560 <<
"b = [ 1/4 0 0 0 3/4 ]'" << std::endl;
561 typedef ScalarTraits<Scalar> ST;
563 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
564 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
565 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
567 Scalar onefifth = ST::one()/(5*ST::one());
568 Scalar onefourth = ST::one()/(4*ST::one());
569 Scalar onethird = ST::one()/(3*ST::one());
570 Scalar twothirds = 2*ST::one()/(3*ST::one());
571 Scalar threefourths = 3*ST::one()/(4*ST::one());
572 Scalar zero = ST::zero();
602 myA(4,3) = twothirds;
610 myb(4) = threefourths;
619 this->setMyDescription(myDescription.str());
623 this->setMy_order(3);
628 template<
class Scalar>
629 class Explicit3Stage3rdOrder_RKBT :
630 virtual public RKButcherTableauDefaultBase<Scalar>
633 Explicit3Stage3rdOrder_RKBT()
636 std::ostringstream myDescription;
637 myDescription << Explicit3Stage3rdOrder_name() <<
"\n"
638 <<
"c = [ 0 1/2 1 ]'\n"
642 <<
"b = [ 1/6 4/6 1/6 ]'" << std::endl;
643 typedef ScalarTraits<Scalar> ST;
644 Scalar one = ST::one();
645 Scalar two = as<Scalar>(2*ST::one());
646 Scalar zero = ST::zero();
647 Scalar onehalf = ST::one()/(2*ST::one());
648 Scalar onesixth = ST::one()/(6*ST::one());
649 Scalar foursixth = 4*ST::one()/(6*ST::one());
652 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
653 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
654 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
679 this->setMyDescription(myDescription.str());
683 this->setMy_order(3);
687 template<
class Scalar>
688 class Explicit2Stage2ndOrderTVD_RKBT :
689 virtual public RKButcherTableauDefaultBase<Scalar>
692 Explicit2Stage2ndOrderTVD_RKBT()
695 std::ostringstream myDescription;
696 myDescription << Explicit2Stage2ndOrderTVD_name() <<
"\n"
697 <<
"Sigal Gottlieb, David Ketcheson and Chi-Wang Shu\n"
698 <<
"`Strong Stability Preserving Runge-Kutta and Multistep Time Discretizations'\n"
699 <<
"World Scientific, 2011\n"
704 <<
"b = [ 1/2 1/2]'\n"
705 <<
"This is also written in the following set of updates.\n"
706 <<
"u1 = u^n + dt L(u^n)\n"
707 <<
"u^(n+1) = u^n/2 + u1/2 + dt L(u1)/2"
709 typedef ScalarTraits<Scalar> ST;
710 Scalar one = ST::one();
711 Scalar zero = ST::zero();
712 Scalar onehalf = ST::one()/(2*ST::one());
715 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
716 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
717 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
734 this->setMyDescription(myDescription.str());
738 this->setMy_order(2);
742 template<
class Scalar>
743 class Explicit3Stage3rdOrderTVD_RKBT :
744 virtual public RKButcherTableauDefaultBase<Scalar>
747 Explicit3Stage3rdOrderTVD_RKBT()
750 std::ostringstream myDescription;
751 myDescription << Explicit3Stage3rdOrderTVD_name() <<
"\n"
752 <<
"Sigal Gottlieb and Chi-Wang Shu\n"
753 <<
"`Total Variation Diminishing Runge-Kutta Schemes'\n"
754 <<
"Mathematics of Computation\n"
755 <<
"Volume 67, Number 221, January 1998, pp. 73-85\n"
756 <<
"c = [ 0 1 1/2 ]'\n"
759 <<
" [ 1/4 1/4 0 ]\n"
760 <<
"b = [ 1/6 1/6 4/6 ]'\n"
761 <<
"This is also written in the following set of updates.\n"
762 <<
"u1 = u^n + dt L(u^n)\n"
763 <<
"u2 = 3 u^n/4 + u1/4 + dt L(u1)/4\n"
764 <<
"u^(n+1) = u^n/3 + 2 u2/2 + 2 dt L(u2)/3"
766 typedef ScalarTraits<Scalar> ST;
767 Scalar one = ST::one();
768 Scalar zero = ST::zero();
769 Scalar onehalf = ST::one()/(2*ST::one());
770 Scalar onefourth = ST::one()/(4*ST::one());
771 Scalar onesixth = ST::one()/(6*ST::one());
772 Scalar foursixth = 4*ST::one()/(6*ST::one());
775 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
776 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
777 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
788 myA(2,0) = onefourth;
789 myA(2,1) = onefourth;
802 this->setMyDescription(myDescription.str());
806 this->setMy_order(3);
811 template<
class Scalar>
812 class Explicit3Stage3rdOrderHeun_RKBT :
813 virtual public RKButcherTableauDefaultBase<Scalar>
816 Explicit3Stage3rdOrderHeun_RKBT()
818 std::ostringstream myDescription;
819 myDescription << Explicit3Stage3rdOrderHeun_name() <<
"\n"
820 <<
"Solving Ordinary Differential Equations I:\n"
821 <<
"Nonstiff Problems, 2nd Revised Edition\n"
822 <<
"E. Hairer, S.P. Norsett, G. Wanner\n"
823 <<
"Table 1.1, pg 135\n"
824 <<
"c = [ 0 1/3 2/3 ]'\n"
828 <<
"b = [ 1/4 0 3/4 ]'" << std::endl;
829 typedef ScalarTraits<Scalar> ST;
830 Scalar one = ST::one();
831 Scalar zero = ST::zero();
832 Scalar onethird = one/(3*one);
833 Scalar twothirds = 2*one/(3*one);
834 Scalar onefourth = one/(4*one);
835 Scalar threefourths = 3*one/(4*one);
838 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
839 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
840 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
852 myA(2,1) = twothirds;
858 myb(2) = threefourths;
865 this->setMyDescription(myDescription.str());
869 this->setMy_order(3);
874 template<
class Scalar>
875 class Explicit2Stage2ndOrderRunge_RKBT :
876 virtual public RKButcherTableauDefaultBase<Scalar>
879 Explicit2Stage2ndOrderRunge_RKBT()
881 std::ostringstream myDescription;
882 myDescription << Explicit2Stage2ndOrderRunge_name() <<
"\n"
883 <<
"Also known as Explicit Midpoint\n"
884 <<
"Solving Ordinary Differential Equations I:\n"
885 <<
"Nonstiff Problems, 2nd Revised Edition\n"
886 <<
"E. Hairer, S.P. Norsett, G. Wanner\n"
887 <<
"Table 1.1, pg 135\n"
888 <<
"c = [ 0 1/2 ]'\n"
891 <<
"b = [ 0 1 ]'" << std::endl;
892 typedef ScalarTraits<Scalar> ST;
893 Scalar one = ST::one();
894 Scalar zero = ST::zero();
895 Scalar onehalf = ST::one()/(2*ST::one());
898 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
899 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
900 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
917 this->setMyDescription(myDescription.str());
921 this->setMy_order(2);
926 template<
class Scalar>
927 class ExplicitTrapezoidal_RKBT :
928 virtual public RKButcherTableauDefaultBase<Scalar>
931 ExplicitTrapezoidal_RKBT()
933 std::ostringstream myDescription;
934 myDescription << ExplicitTrapezoidal_name() <<
"\n"
938 <<
"b = [ 1/2 1/2 ]'" << std::endl;
939 typedef ScalarTraits<Scalar> ST;
940 Scalar one = ST::one();
941 Scalar zero = ST::zero();
942 Scalar onehalf = ST::one()/(2*ST::one());
945 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
946 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
947 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
964 this->setMyDescription(myDescription.str());
968 this->setMy_order(2);
973 template<
class Scalar>
974 class SDIRK2Stage2ndOrder_RKBT :
975 virtual public RKButcherTableauDefaultBase<Scalar>
978 SDIRK2Stage2ndOrder_RKBT()
980 std::ostringstream myDescription;
981 myDescription << SDIRK2Stage2ndOrder_name() <<
"\n"
982 <<
"Computer Methods for ODEs and DAEs\n"
983 <<
"U. M. Ascher and L. R. Petzold\n"
985 <<
"gamma = (2+-sqrt(2))/2\n"
986 <<
"c = [ gamma 1 ]'\n"
987 <<
"A = [ gamma 0 ]\n"
988 <<
" [ 1-gamma gamma ]\n"
989 <<
"b = [ 1-gamma gamma ]'" << std::endl;
991 this->setMyDescription(myDescription.str());
992 typedef ScalarTraits<Scalar> ST;
993 Scalar one = ST::one();
994 gamma_default_ = as<Scalar>( (2*one - ST::squareroot(2*one))/(2*one) );
995 gamma_ = gamma_default_;
998 RCP<ParameterList> validPL = Teuchos::parameterList();
999 validPL->set(
"Description",
"",this->getMyDescription());
1000 validPL->set<
double>(
"gamma",gamma_default_,
1001 "The default value is gamma = (2-sqrt(2))/2. "
1002 "This will produce an L-stable 2nd order method with the stage "
1003 "times within the timestep. Other values of gamma will still "
1004 "produce an L-stable scheme, but will only be 1st order accurate.");
1005 Teuchos::setupVerboseObjectSublist(&*validPL);
1006 this->setMyValidParameterList(validPL);
1010 typedef ScalarTraits<Scalar> ST;
1011 int myNumStages = 2;
1012 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1013 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1014 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1015 Scalar one = ST::one();
1016 Scalar zero = ST::zero();
1019 myA(1,0) = as<Scalar>( one - gamma_ );
1021 myb(0) = as<Scalar>( one - gamma_ );
1029 this->setMy_order(2);
1031 void setParameterList(RCP<Teuchos::ParameterList>
const& paramList)
1033 TEUCHOS_TEST_FOR_EXCEPT( is_null(paramList) );
1034 paramList->validateParameters(*this->getValidParameters());
1035 Teuchos::readVerboseObjectSublist(&*paramList,
this);
1036 gamma_ = paramList->get<
double>(
"gamma",gamma_default_);
1038 this->setMyParamList(paramList);
1041 Scalar gamma_default_;
1048 template<
class Scalar>
1049 class SDIRK2Stage3rdOrder_RKBT :
1050 virtual public RKButcherTableauDefaultBase<Scalar>
1053 SDIRK2Stage3rdOrder_RKBT()
1055 std::ostringstream myDescription;
1056 myDescription << SDIRK2Stage3rdOrder_name() <<
"\n"
1057 <<
"Solving Ordinary Differential Equations I:\n"
1058 <<
"Nonstiff Problems, 2nd Revised Edition\n"
1059 <<
"E. Hairer, S. P. Norsett, and G. Wanner\n"
1060 <<
"Table 7.2, pg 207\n"
1061 <<
"gamma = (3+-sqrt(3))/6 -> 3rd order and A-stable\n"
1062 <<
"gamma = (2+-sqrt(2))/2 -> 2nd order and L-stable\n"
1063 <<
"c = [ gamma 1-gamma ]'\n"
1064 <<
"A = [ gamma 0 ]\n"
1065 <<
" [ 1-2*gamma gamma ]\n"
1066 <<
"b = [ 1/2 1/2 ]'" << std::endl;
1068 this->setMyDescription(myDescription.str());
1069 thirdOrderAStable_default_ =
true;
1070 secondOrderLStable_default_ =
false;
1071 thirdOrderAStable_ =
true;
1072 secondOrderLStable_ =
false;
1073 typedef ScalarTraits<Scalar> ST;
1074 Scalar one = ST::one();
1075 gamma_default_ = as<Scalar>( (3*one + ST::squareroot(3*one))/(6*one) );
1076 gamma_ = gamma_default_;
1079 RCP<ParameterList> validPL = Teuchos::parameterList();
1080 validPL->set(
"Description",
"",this->getMyDescription());
1081 validPL->set(
"3rd Order A-stable",thirdOrderAStable_default_,
1082 "If true, set gamma to gamma = (3+sqrt(3))/6 to obtain "
1083 "a 3rd order A-stable scheme. '3rd Order A-stable' and "
1084 "'2nd Order L-stable' can not both be true.");
1085 validPL->set(
"2nd Order L-stable",secondOrderLStable_default_,
1086 "If true, set gamma to gamma = (2+sqrt(2))/2 to obtain "
1087 "a 2nd order L-stable scheme. '3rd Order A-stable' and "
1088 "'2nd Order L-stable' can not both be true.");
1089 validPL->set(
"gamma",gamma_default_,
1090 "If both '3rd Order A-stable' and '2nd Order L-stable' "
1091 "are false, gamma will be used. The default value is the "
1092 "'3rd Order A-stable' gamma value, (3+sqrt(3))/6.");
1094 Teuchos::setupVerboseObjectSublist(&*validPL);
1095 this->setMyValidParameterList(validPL);
1099 typedef ScalarTraits<Scalar> ST;
1100 int myNumStages = 2;
1101 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1102 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1103 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1104 Scalar one = ST::one();
1105 Scalar zero = ST::zero();
1107 if (thirdOrderAStable_)
1108 gamma = as<Scalar>( (3*one + ST::squareroot(3*one))/(6*one) );
1109 else if (secondOrderLStable_)
1110 gamma = as<Scalar>( (2*one + ST::squareroot(2*one))/(2*one) );
1115 myA(1,0) = as<Scalar>( one - 2*gamma );
1117 myb(0) = as<Scalar>( one/(2*one) );
1118 myb(1) = as<Scalar>( one/(2*one) );
1120 myc(1) = as<Scalar>( one - gamma );
1125 this->setMy_order(3);
1127 void setParameterList(RCP<Teuchos::ParameterList>
const& paramList)
1129 TEUCHOS_TEST_FOR_EXCEPT( is_null(paramList) );
1130 paramList->validateParameters(*this->getValidParameters());
1131 Teuchos::readVerboseObjectSublist(&*paramList,
this);
1132 thirdOrderAStable_ = paramList->get(
"3rd Order A-stable",
1133 thirdOrderAStable_default_);
1134 secondOrderLStable_ = paramList->get(
"2nd Order L-stable",
1135 secondOrderLStable_default_);
1136 TEUCHOS_TEST_FOR_EXCEPTION(
1137 thirdOrderAStable_ && secondOrderLStable_, std::logic_error,
1138 "'3rd Order A-stable' and '2nd Order L-stable' can not both be true.");
1139 gamma_ = paramList->get(
"gamma",gamma_default_);
1142 this->setMyParamList(paramList);
1145 bool thirdOrderAStable_default_;
1146 bool thirdOrderAStable_;
1147 bool secondOrderLStable_default_;
1148 bool secondOrderLStable_;
1149 Scalar gamma_default_;
1154 template<
class Scalar>
1155 class DIRK2Stage3rdOrder_RKBT :
1156 virtual public RKButcherTableauDefaultBase<Scalar>
1159 DIRK2Stage3rdOrder_RKBT()
1162 std::ostringstream myDescription;
1163 myDescription << DIRK2Stage3rdOrder_name() <<
"\n"
1164 <<
"Hammer & Hollingsworth method\n"
1165 <<
"Solving Ordinary Differential Equations I:\n"
1166 <<
"Nonstiff Problems, 2nd Revised Edition\n"
1167 <<
"E. Hairer, S. P. Norsett, and G. Wanner\n"
1168 <<
"Table 7.1, pg 205\n"
1169 <<
"c = [ 0 2/3 ]'\n"
1172 <<
"b = [ 1/4 3/4 ]'" << std::endl;
1173 typedef ScalarTraits<Scalar> ST;
1174 int myNumStages = 2;
1175 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1176 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1177 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1178 Scalar one = ST::one();
1179 Scalar zero = ST::zero();
1182 myA(1,0) = as<Scalar>( one/(3*one) );
1183 myA(1,1) = as<Scalar>( one/(3*one) );
1184 myb(0) = as<Scalar>( one/(4*one) );
1185 myb(1) = as<Scalar>( 3*one/(4*one) );
1187 myc(1) = as<Scalar>( 2*one/(3*one) );
1188 this->setMyDescription(myDescription.str());
1192 this->setMy_order(3);
1197 template<
class Scalar>
1198 class Implicit3Stage6thOrderKuntzmannButcher_RKBT :
1199 virtual public RKButcherTableauDefaultBase<Scalar>
1202 Implicit3Stage6thOrderKuntzmannButcher_RKBT()
1205 std::ostringstream myDescription;
1206 myDescription << Implicit3Stage6thOrderKuntzmannButcher_name() <<
"\n"
1207 <<
"Kuntzmann & Butcher method\n"
1208 <<
"Solving Ordinary Differential Equations I:\n"
1209 <<
"Nonstiff Problems, 2nd Revised Edition\n"
1210 <<
"E. Hairer, S. P. Norsett, and G. Wanner\n"
1211 <<
"Table 7.4, pg 209\n"
1212 <<
"c = [ 1/2-sqrt(15)/10 1/2 1/2-sqrt(15)/10 ]'\n"
1213 <<
"A = [ 5/36 2/9-sqrt(15)/15 5/36-sqrt(15)/30 ]\n"
1214 <<
" [ 5/36+sqrt(15)/24 2/9 5/36-sqrt(15)/24 ]\n"
1215 <<
" [ 5/36+sqrt(15)/30 2/9+sqrt(15)/15 5/36 ]\n"
1216 <<
"b = [ 5/18 4/9 5/18 ]'" << std::endl;
1217 typedef ScalarTraits<Scalar> ST;
1218 int myNumStages = 3;
1219 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1220 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1221 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1222 Scalar one = ST::one();
1223 myA(0,0) = as<Scalar>( 5*one/(36*one) );
1224 myA(0,1) = as<Scalar>( 2*one/(9*one) - ST::squareroot(15*one)/(15*one) );
1225 myA(0,2) = as<Scalar>( 5*one/(36*one) - ST::squareroot(15*one)/(30*one) );
1226 myA(1,0) = as<Scalar>( 5*one/(36*one) + ST::squareroot(15*one)/(24*one) );
1227 myA(1,1) = as<Scalar>( 2*one/(9*one) );
1228 myA(1,2) = as<Scalar>( 5*one/(36*one) - ST::squareroot(15*one)/(24*one) );
1229 myA(2,0) = as<Scalar>( 5*one/(36*one) + ST::squareroot(15*one)/(30*one) );
1230 myA(2,1) = as<Scalar>( 2*one/(9*one) + ST::squareroot(15*one)/(15*one) );
1231 myA(2,2) = as<Scalar>( 5*one/(36*one) );
1232 myb(0) = as<Scalar>( 5*one/(18*one) );
1233 myb(1) = as<Scalar>( 4*one/(9*one) );
1234 myb(2) = as<Scalar>( 5*one/(18*one) );
1235 myc(0) = as<Scalar>( one/(2*one)-ST::squareroot(15*one)/(10*one) );
1236 myc(1) = as<Scalar>( one/(2*one) );
1237 myc(2) = as<Scalar>( one/(2*one)+ST::squareroot(15*one)/(10*one) );
1238 this->setMyDescription(myDescription.str());
1242 this->setMy_order(6);
1247 template<
class Scalar>
1248 class Implicit4Stage8thOrderKuntzmannButcher_RKBT :
1249 virtual public RKButcherTableauDefaultBase<Scalar>
1252 Implicit4Stage8thOrderKuntzmannButcher_RKBT()
1255 std::ostringstream myDescription;
1256 myDescription << Implicit4Stage8thOrderKuntzmannButcher_name() <<
"\n"
1257 <<
"Kuntzmann & Butcher method\n"
1258 <<
"Solving Ordinary Differential Equations I:\n"
1259 <<
"Nonstiff Problems, 2nd Revised Edition\n"
1260 <<
"E. Hairer, S. P. Norsett, and G. Wanner\n"
1261 <<
"Table 7.5, pg 209\n"
1262 <<
"c = [ 1/2-w2 1/2-w2p 1/2+w2p 1/2+w2 ]'\n"
1263 <<
"A = [ w1 w1p-w3+w4p w1p-w3-w4p w1-w5 ]\n"
1264 <<
" [ w1-w3p+w4 w1p w1p-w5p w1-w3p-w4 ]\n"
1265 <<
" [ w1+w3p+w4 w1p+w5p w1p w1+w3p-w4 ]\n"
1266 <<
" [ w1+w5 w1p+w3+w4p w1p+w3-w4p w1 ]\n"
1267 <<
"b = [ 2*w1 2*w1p 2*w1p 2*w1 ]'\n"
1268 <<
"w1 = 1/8-sqrt(30)/144\n"
1269 <<
"w2 = (1/2)*sqrt((15+2*sqrt(3))/35)\n"
1270 <<
"w3 = w2*(1/6+sqrt(30)/24)\n"
1271 <<
"w4 = w2*(1/21+5*sqrt(30)/168)\n"
1273 <<
"w1p = 1/8+sqrt(30)/144\n"
1274 <<
"w2p = (1/2)*sqrt((15-2*sqrt(3))/35)\n"
1275 <<
"w3p = w2*(1/6-sqrt(30)/24)\n"
1276 <<
"w4p = w2*(1/21-5*sqrt(30)/168)\n"
1277 <<
"w5p = w2p-2*w3p" << std::endl;
1278 typedef ScalarTraits<Scalar> ST;
1279 int myNumStages = 4;
1280 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1281 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1282 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1283 Scalar one = ST::one();
1284 Scalar onehalf = as<Scalar>( one/(2*one) );
1285 Scalar w1 = as<Scalar>( one/(8*one) - ST::squareroot(30*one)/(144*one) );
1286 Scalar w2 = as<Scalar>( (one/(2*one))*ST::squareroot((15*one+2*one*ST::squareroot(30*one))/(35*one)) );
1287 Scalar w3 = as<Scalar>( w2*(one/(6*one)+ST::squareroot(30*one)/(24*one)) );
1288 Scalar w4 = as<Scalar>( w2*(one/(21*one)+5*one*ST::squareroot(30*one)/(168*one)) );
1289 Scalar w5 = as<Scalar>( w2-2*w3 );
1290 Scalar w1p = as<Scalar>( one/(8*one) + ST::squareroot(30*one)/(144*one) );
1291 Scalar w2p = as<Scalar>( (one/(2*one))*ST::squareroot((15*one-2*one*ST::squareroot(30*one))/(35*one)) );
1292 Scalar w3p = as<Scalar>( w2p*(one/(6*one)-ST::squareroot(30*one)/(24*one)) );
1293 Scalar w4p = as<Scalar>( w2p*(one/(21*one)-5*one*ST::squareroot(30*one)/(168*one)) );
1294 Scalar w5p = as<Scalar>( w2p-2*w3p );
1296 myA(0,1) = w1p-w3+w4p;
1297 myA(0,2) = w1p-w3-w4p;
1299 myA(1,0) = w1-w3p+w4;
1302 myA(1,3) = w1-w3p-w4;
1303 myA(2,0) = w1+w3p+w4;
1306 myA(2,3) = w1+w3p-w4;
1308 myA(3,1) = w1p+w3+w4p;
1309 myA(3,2) = w1p+w3-w4p;
1315 myc(0) = onehalf - w2;
1316 myc(1) = onehalf - w2p;
1317 myc(2) = onehalf + w2p;
1318 myc(3) = onehalf + w2;
1319 this->setMyDescription(myDescription.str());
1323 this->setMy_order(8);
1328 template<
class Scalar>
1329 class Implicit2Stage4thOrderHammerHollingsworth_RKBT :
1330 virtual public RKButcherTableauDefaultBase<Scalar>
1333 Implicit2Stage4thOrderHammerHollingsworth_RKBT()
1336 std::ostringstream myDescription;
1337 myDescription << Implicit2Stage4thOrderHammerHollingsworth_name() <<
"\n"
1338 <<
"Hammer & Hollingsworth method\n"
1339 <<
"Solving Ordinary Differential Equations I:\n"
1340 <<
"Nonstiff Problems, 2nd Revised Edition\n"
1341 <<
"E. Hairer, S. P. Norsett, and G. Wanner\n"
1342 <<
"Table 7.3, pg 207\n"
1343 <<
"c = [ 1/2-sqrt(3)/6 1/2+sqrt(3)/6 ]'\n"
1344 <<
"A = [ 1/4 1/4-sqrt(3)/6 ]\n"
1345 <<
" [ 1/4+sqrt(3)/6 1/4 ]\n"
1346 <<
"b = [ 1/2 1/2 ]'" << std::endl;
1347 typedef ScalarTraits<Scalar> ST;
1348 int myNumStages = 2;
1349 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1350 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1351 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1352 Scalar one = ST::one();
1353 Scalar onequarter = as<Scalar>( one/(4*one) );
1354 Scalar onehalf = as<Scalar>( one/(2*one) );
1355 myA(0,0) = onequarter;
1356 myA(0,1) = as<Scalar>( onequarter-ST::squareroot(3*one)/(6*one) );
1357 myA(1,0) = as<Scalar>( onequarter+ST::squareroot(3*one)/(6*one) );
1358 myA(1,1) = onequarter;
1361 myc(0) = as<Scalar>( onehalf - ST::squareroot(3*one)/(6*one) );
1362 myc(1) = as<Scalar>( onehalf + ST::squareroot(3*one)/(6*one) );
1363 this->setMyDescription(myDescription.str());
1367 this->setMy_order(4);
1372 template<
class Scalar>
1373 class IRK1StageTheta_RKBT :
1374 virtual public RKButcherTableauDefaultBase<Scalar>
1377 IRK1StageTheta_RKBT()
1380 std::ostringstream myDescription;
1381 myDescription << IRK1StageTheta_name() <<
"\n"
1382 <<
"Non-standard finite-difference methods\n"
1383 <<
"in dynamical systems, P. Kama,\n"
1384 <<
"Dissertation, University of Pretoria, pg. 49.\n"
1385 <<
"Comment: Generalized Implicit Midpoint Method\n"
1386 <<
"c = [ theta ]'\n"
1387 <<
"A = [ theta ]\n"
1391 this->setMyDescription(myDescription.str());
1392 typedef ScalarTraits<Scalar> ST;
1393 theta_default_ = ST::one()/(2*ST::one());
1394 theta_ = theta_default_;
1397 RCP<ParameterList> validPL = Teuchos::parameterList();
1398 validPL->set(
"Description",
"",this->getMyDescription());
1399 validPL->set<
double>(
"theta",theta_default_,
1400 "Valid values are 0 <= theta <= 1, where theta = 0 "
1401 "implies Forward Euler, theta = 1/2 implies midpoint "
1402 "method, and theta = 1 implies Backward Euler. "
1403 "For theta != 1/2, this method is first-order accurate, "
1404 "and with theta = 1/2, it is second-order accurate. "
1405 "This method is A-stable, but becomes L-stable with theta=1.");
1406 Teuchos::setupVerboseObjectSublist(&*validPL);
1407 this->setMyValidParameterList(validPL);
1412 typedef ScalarTraits<Scalar> ST;
1413 int myNumStages = 1;
1414 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1415 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1416 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1423 if (theta_ == theta_default_) this->setMy_order(2);
1424 else this->setMy_order(1);
1427 void setParameterList(RCP<Teuchos::ParameterList>
const& paramList)
1429 TEUCHOS_TEST_FOR_EXCEPT( is_null(paramList) );
1430 paramList->validateParameters(*this->getValidParameters());
1431 Teuchos::readVerboseObjectSublist(&*paramList,
this);
1432 theta_ = paramList->get<
double>(
"theta",theta_default_);
1434 this->setMyParamList(paramList);
1437 Scalar theta_default_;
1442 template<
class Scalar>
1443 class IRK2StageTheta_RKBT :
1444 virtual public RKButcherTableauDefaultBase<Scalar>
1447 IRK2StageTheta_RKBT()
1449 std::ostringstream myDescription;
1450 myDescription << IRK2StageTheta_name() <<
"\n"
1451 <<
"Computer Methods for ODEs and DAEs\n"
1452 <<
"U. M. Ascher and L. R. Petzold\n"
1456 <<
" [ 1-theta theta ]\n"
1457 <<
"b = [ 1-theta theta ]'\n"
1460 this->setMyDescription(myDescription.str());
1461 typedef ScalarTraits<Scalar> ST;
1462 theta_default_ = ST::one()/(2*ST::one());
1463 theta_ = theta_default_;
1466 RCP<ParameterList> validPL = Teuchos::parameterList();
1467 validPL->set(
"Description",
"",this->getMyDescription());
1468 validPL->set<
double>(
"theta",theta_default_,
1469 "Valid values are 0 < theta <= 1, where theta = 0 "
1470 "implies Forward Euler, theta = 1/2 implies trapezoidal "
1471 "method, and theta = 1 implies Backward Euler. "
1472 "For theta != 1/2, this method is first-order accurate, "
1473 "and with theta = 1/2, it is second-order accurate. "
1474 "This method is A-stable, but becomes L-stable with theta=1.");
1475 Teuchos::setupVerboseObjectSublist(&*validPL);
1476 this->setMyValidParameterList(validPL);
1480 typedef ScalarTraits<Scalar> ST;
1481 int myNumStages = 2;
1482 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1483 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1484 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1485 Scalar one = ST::one();
1486 Scalar zero = ST::zero();
1489 myA(1,0) = as<Scalar>( one - theta_ );
1491 myb(0) = as<Scalar>( one - theta_ );
1499 TEUCHOS_TEST_FOR_EXCEPTION(
1500 theta_ == zero, std::logic_error,
1501 "'theta' can not be zero, as it makes this IRK stepper explicit.");
1502 if (theta_ == theta_default_) this->setMy_order(2);
1503 else this->setMy_order(1);
1505 void setParameterList(RCP<Teuchos::ParameterList>
const& paramList)
1507 TEUCHOS_TEST_FOR_EXCEPT( is_null(paramList) );
1508 paramList->validateParameters(*this->getValidParameters());
1509 Teuchos::readVerboseObjectSublist(&*paramList,
this);
1510 theta_ = paramList->get<
double>(
"theta",theta_default_);
1512 this->setMyParamList(paramList);
1515 Scalar theta_default_;
1520 template<
class Scalar>
1521 class Implicit1Stage2ndOrderGauss_RKBT :
1522 virtual public RKButcherTableauDefaultBase<Scalar>
1525 Implicit1Stage2ndOrderGauss_RKBT()
1528 std::ostringstream myDescription;
1529 myDescription << Implicit1Stage2ndOrderGauss_name() <<
"\n"
1531 <<
"Solving Ordinary Differential Equations II:\n"
1532 <<
"Stiff and Differential-Algebraic Problems,\n"
1533 <<
"2nd Revised Edition\n"
1534 <<
"E. Hairer and G. Wanner\n"
1535 <<
"Table 5.2, pg 72\n"
1536 <<
"Also: Implicit midpoint rule\n"
1537 <<
"Solving Ordinary Differential Equations I:\n"
1538 <<
"Nonstiff Problems, 2nd Revised Edition\n"
1539 <<
"E. Hairer, S. P. Norsett, and G. Wanner\n"
1540 <<
"Table 7.1, pg 205\n"
1543 <<
"b = [ 1 ]'" << std::endl;
1544 typedef ScalarTraits<Scalar> ST;
1545 int myNumStages = 1;
1546 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1547 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1548 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1549 Scalar onehalf = ST::one()/(2*ST::one());
1550 Scalar one = ST::one();
1554 this->setMyDescription(myDescription.str());
1558 this->setMy_order(2);
1563 template<
class Scalar>
1564 class Implicit2Stage4thOrderGauss_RKBT :
1565 virtual public RKButcherTableauDefaultBase<Scalar>
1568 Implicit2Stage4thOrderGauss_RKBT()
1571 std::ostringstream myDescription;
1572 myDescription << Implicit2Stage4thOrderGauss_name() <<
"\n"
1574 <<
"Solving Ordinary Differential Equations II:\n"
1575 <<
"Stiff and Differential-Algebraic Problems,\n"
1576 <<
"2nd Revised Edition\n"
1577 <<
"E. Hairer and G. Wanner\n"
1578 <<
"Table 5.2, pg 72\n"
1579 <<
"c = [ 1/2-sqrt(3)/6 1/2+sqrt(3)/6 ]'\n"
1580 <<
"A = [ 1/4 1/4-sqrt(3)/6 ]\n"
1581 <<
" [ 1/4+sqrt(3)/6 1/4 ]\n"
1582 <<
"b = [ 1/2 1/2 ]'" << std::endl;
1583 typedef ScalarTraits<Scalar> ST;
1584 int myNumStages = 2;
1585 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1586 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1587 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1588 Scalar one = ST::one();
1589 Scalar onehalf = as<Scalar>(one/(2*one));
1590 Scalar three = as<Scalar>(3*one);
1591 Scalar six = as<Scalar>(6*one);
1592 Scalar onefourth = as<Scalar>(one/(4*one));
1593 Scalar alpha = ST::squareroot(three)/six;
1595 myA(0,0) = onefourth;
1596 myA(0,1) = onefourth-alpha;
1597 myA(1,0) = onefourth+alpha;
1598 myA(1,1) = onefourth;
1601 myc(0) = onehalf-alpha;
1602 myc(1) = onehalf+alpha;
1603 this->setMyDescription(myDescription.str());
1607 this->setMy_order(4);
1612 template<
class Scalar>
1613 class Implicit3Stage6thOrderGauss_RKBT :
1614 virtual public RKButcherTableauDefaultBase<Scalar>
1617 Implicit3Stage6thOrderGauss_RKBT()
1620 std::ostringstream myDescription;
1621 myDescription << Implicit3Stage6thOrderGauss_name() <<
"\n"
1623 <<
"Solving Ordinary Differential Equations II:\n"
1624 <<
"Stiff and Differential-Algebraic Problems,\n"
1625 <<
"2nd Revised Edition\n"
1626 <<
"E. Hairer and G. Wanner\n"
1627 <<
"Table 5.2, pg 72\n"
1628 <<
"c = [ 1/2-sqrt(15)/10 1/2 1/2+sqrt(15)/10 ]'\n"
1629 <<
"A = [ 5/36 2/9-sqrt(15)/15 5/36-sqrt(15)/30 ]\n"
1630 <<
" [ 5/36+sqrt(15)/24 2/9 5/36-sqrt(15)/24 ]\n"
1631 <<
" [ 5/36+sqrt(15)/30 2/9+sqrt(15)/15 5/36 ]\n"
1632 <<
"b = [ 5/18 4/9 5/18 ]'" << std::endl;
1633 typedef ScalarTraits<Scalar> ST;
1634 int myNumStages = 3;
1635 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1636 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1637 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1638 Scalar one = ST::one();
1639 Scalar ten = as<Scalar>(10*one);
1640 Scalar fifteen = as<Scalar>(15*one);
1641 Scalar twentyfour = as<Scalar>(24*one);
1642 Scalar thirty = as<Scalar>(30*one);
1643 Scalar sqrt15over10 = as<Scalar>(ST::squareroot(fifteen)/ten);
1644 Scalar sqrt15over15 = as<Scalar>(ST::squareroot(fifteen)/fifteen);
1645 Scalar sqrt15over24 = as<Scalar>(ST::squareroot(fifteen)/twentyfour);
1646 Scalar sqrt15over30 = as<Scalar>(ST::squareroot(fifteen)/thirty);
1648 myA(0,0) = as<Scalar>(5*one/(36*one));
1649 myA(0,1) = as<Scalar>(2*one/(9*one))-sqrt15over15;
1650 myA(0,2) = as<Scalar>(5*one/(36*one))-sqrt15over30;
1651 myA(1,0) = as<Scalar>(5*one/(36*one))+sqrt15over24;
1652 myA(1,1) = as<Scalar>(2*one/(9*one));
1653 myA(1,2) = as<Scalar>(5*one/(36*one))-sqrt15over24;
1654 myA(2,0) = as<Scalar>(5*one/(36*one))+sqrt15over30;
1655 myA(2,1) = as<Scalar>(2*one/(9*one))+sqrt15over15;
1656 myA(2,2) = as<Scalar>(5*one/(36*one));
1657 myb(0) = as<Scalar>(5*one/(18*one));
1658 myb(1) = as<Scalar>(4*one/(9*one));
1659 myb(2) = as<Scalar>(5*one/(18*one));
1660 myc(0) = as<Scalar>(one/(2*one))-sqrt15over10;
1661 myc(1) = as<Scalar>(one/(2*one));
1662 myc(2) = as<Scalar>(one/(2*one))+sqrt15over10;
1663 this->setMyDescription(myDescription.str());
1667 this->setMy_order(6);
1672 template<
class Scalar>
1673 class Implicit1Stage1stOrderRadauA_RKBT :
1674 virtual public RKButcherTableauDefaultBase<Scalar>
1677 Implicit1Stage1stOrderRadauA_RKBT()
1680 std::ostringstream myDescription;
1681 myDescription << Implicit1Stage1stOrderRadauA_name() <<
"\n"
1683 <<
"Solving Ordinary Differential Equations II:\n"
1684 <<
"Stiff and Differential-Algebraic Problems,\n"
1685 <<
"2nd Revised Edition\n"
1686 <<
"E. Hairer and G. Wanner\n"
1687 <<
"Table 5.3, pg 73\n"
1690 <<
"b = [ 1 ]'" << std::endl;
1691 typedef ScalarTraits<Scalar> ST;
1692 int myNumStages = 1;
1693 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1694 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1695 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1696 Scalar one = ST::one();
1697 Scalar zero = ST::zero();
1701 this->setMyDescription(myDescription.str());
1705 this->setMy_order(1);
1710 template<
class Scalar>
1711 class Implicit2Stage3rdOrderRadauA_RKBT :
1712 virtual public RKButcherTableauDefaultBase<Scalar>
1715 Implicit2Stage3rdOrderRadauA_RKBT()
1718 std::ostringstream myDescription;
1719 myDescription << Implicit2Stage3rdOrderRadauA_name() <<
"\n"
1721 <<
"Solving Ordinary Differential Equations II:\n"
1722 <<
"Stiff and Differential-Algebraic Problems,\n"
1723 <<
"2nd Revised Edition\n"
1724 <<
"E. Hairer and G. Wanner\n"
1725 <<
"Table 5.3, pg 73\n"
1726 <<
"c = [ 0 2/3 ]'\n"
1727 <<
"A = [ 1/4 -1/4 ]\n"
1728 <<
" [ 1/4 5/12 ]\n"
1729 <<
"b = [ 1/4 3/4 ]'" << std::endl;
1730 typedef ScalarTraits<Scalar> ST;
1731 int myNumStages = 2;
1732 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1733 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1734 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1735 Scalar zero = ST::zero();
1736 Scalar one = ST::one();
1737 myA(0,0) = as<Scalar>(one/(4*one));
1738 myA(0,1) = as<Scalar>(-one/(4*one));
1739 myA(1,0) = as<Scalar>(one/(4*one));
1740 myA(1,1) = as<Scalar>(5*one/(12*one));
1741 myb(0) = as<Scalar>(one/(4*one));
1742 myb(1) = as<Scalar>(3*one/(4*one));
1744 myc(1) = as<Scalar>(2*one/(3*one));
1745 this->setMyDescription(myDescription.str());
1749 this->setMy_order(3);
1754 template<
class Scalar>
1755 class Implicit3Stage5thOrderRadauA_RKBT :
1756 virtual public RKButcherTableauDefaultBase<Scalar>
1759 Implicit3Stage5thOrderRadauA_RKBT()
1762 std::ostringstream myDescription;
1763 myDescription << Implicit3Stage5thOrderRadauA_name() <<
"\n"
1765 <<
"Solving Ordinary Differential Equations II:\n"
1766 <<
"Stiff and Differential-Algebraic Problems,\n"
1767 <<
"2nd Revised Edition\n"
1768 <<
"E. Hairer and G. Wanner\n"
1769 <<
"Table 5.4, pg 73\n"
1770 <<
"c = [ 0 (6-sqrt(6))/10 (6+sqrt(6))/10 ]'\n"
1771 <<
"A = [ 1/9 (-1-sqrt(6))/18 (-1+sqrt(6))/18 ]\n"
1772 <<
" [ 1/9 (88+7*sqrt(6))/360 (88-43*sqrt(6))/360 ]\n"
1773 <<
" [ 1/9 (88+43*sqrt(6))/360 (88-7*sqrt(6))/360 ]\n"
1774 <<
"b = [ 1/9 (16+sqrt(6))/36 (16-sqrt(6))/36 ]'" << std::endl;
1775 typedef ScalarTraits<Scalar> ST;
1776 int myNumStages = 3;
1777 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1778 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1779 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1780 Scalar zero = ST::zero();
1781 Scalar one = ST::one();
1782 myA(0,0) = as<Scalar>(one/(9*one));
1783 myA(0,1) = as<Scalar>( (-one-ST::squareroot(6*one))/(18*one) );
1784 myA(0,2) = as<Scalar>( (-one+ST::squareroot(6*one))/(18*one) );
1785 myA(1,0) = as<Scalar>(one/(9*one));
1786 myA(1,1) = as<Scalar>( (88*one+7*one*ST::squareroot(6*one))/(360*one) );
1787 myA(1,2) = as<Scalar>( (88*one-43*one*ST::squareroot(6*one))/(360*one) );
1788 myA(2,0) = as<Scalar>(one/(9*one));
1789 myA(2,1) = as<Scalar>( (88*one+43*one*ST::squareroot(6*one))/(360*one) );
1790 myA(2,2) = as<Scalar>( (88*one-7*one*ST::squareroot(6*one))/(360*one) );
1791 myb(0) = as<Scalar>(one/(9*one));
1792 myb(1) = as<Scalar>( (16*one+ST::squareroot(6*one))/(36*one) );
1793 myb(2) = as<Scalar>( (16*one-ST::squareroot(6*one))/(36*one) );
1795 myc(1) = as<Scalar>( (6*one-ST::squareroot(6*one))/(10*one) );
1796 myc(2) = as<Scalar>( (6*one+ST::squareroot(6*one))/(10*one) );
1797 this->setMyDescription(myDescription.str());
1801 this->setMy_order(5);
1806 template<
class Scalar>
1807 class Implicit1Stage1stOrderRadauB_RKBT :
1808 virtual public RKButcherTableauDefaultBase<Scalar>
1811 Implicit1Stage1stOrderRadauB_RKBT()
1814 std::ostringstream myDescription;
1815 myDescription << Implicit1Stage1stOrderRadauB_name() <<
"\n"
1817 <<
"Solving Ordinary Differential Equations II:\n"
1818 <<
"Stiff and Differential-Algebraic Problems,\n"
1819 <<
"2nd Revised Edition\n"
1820 <<
"E. Hairer and G. Wanner\n"
1821 <<
"Table 5.5, pg 74\n"
1824 <<
"b = [ 1 ]'" << std::endl;
1825 typedef ScalarTraits<Scalar> ST;
1826 int myNumStages = 1;
1827 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1828 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1829 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1830 Scalar one = ST::one();
1834 this->setMyDescription(myDescription.str());
1838 this->setMy_order(1);
1843 template<
class Scalar>
1844 class Implicit2Stage3rdOrderRadauB_RKBT :
1845 virtual public RKButcherTableauDefaultBase<Scalar>
1848 Implicit2Stage3rdOrderRadauB_RKBT()
1851 std::ostringstream myDescription;
1852 myDescription << Implicit2Stage3rdOrderRadauB_name() <<
"\n"
1854 <<
"Solving Ordinary Differential Equations II:\n"
1855 <<
"Stiff and Differential-Algebraic Problems,\n"
1856 <<
"2nd Revised Edition\n"
1857 <<
"E. Hairer and G. Wanner\n"
1858 <<
"Table 5.5, pg 74\n"
1859 <<
"c = [ 1/3 1 ]'\n"
1860 <<
"A = [ 5/12 -1/12 ]\n"
1862 <<
"b = [ 3/4 1/4 ]'" << std::endl;
1863 typedef ScalarTraits<Scalar> ST;
1864 int myNumStages = 2;
1865 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1866 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1867 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1868 Scalar one = ST::one();
1869 myA(0,0) = as<Scalar>( 5*one/(12*one) );
1870 myA(0,1) = as<Scalar>( -one/(12*one) );
1871 myA(1,0) = as<Scalar>( 3*one/(4*one) );
1872 myA(1,1) = as<Scalar>( one/(4*one) );
1873 myb(0) = as<Scalar>( 3*one/(4*one) );
1874 myb(1) = as<Scalar>( one/(4*one) );
1875 myc(0) = as<Scalar>( one/(3*one) );
1877 this->setMyDescription(myDescription.str());
1881 this->setMy_order(3);
1886 template<
class Scalar>
1887 class Implicit3Stage5thOrderRadauB_RKBT :
1888 virtual public RKButcherTableauDefaultBase<Scalar>
1891 Implicit3Stage5thOrderRadauB_RKBT()
1894 std::ostringstream myDescription;
1895 myDescription << Implicit3Stage5thOrderRadauB_name() <<
"\n"
1897 <<
"Solving Ordinary Differential Equations II:\n"
1898 <<
"Stiff and Differential-Algebraic Problems,\n"
1899 <<
"2nd Revised Edition\n"
1900 <<
"E. Hairer and G. Wanner\n"
1901 <<
"Table 5.6, pg 74\n"
1902 <<
"c = [ (4-sqrt(6))/10 (4+sqrt(6))/10 1 ]'\n"
1903 <<
"A = [ A1 A2 A3 ]\n"
1904 <<
" A1 = [ (88-7*sqrt(6))/360 ]\n"
1905 <<
" [ (296+169*sqrt(6))/1800 ]\n"
1906 <<
" [ (16-sqrt(6))/36 ]\n"
1907 <<
" A2 = [ (296-169*sqrt(6))/1800 ]\n"
1908 <<
" [ (88+7*sqrt(6))/360 ]\n"
1909 <<
" [ (16+sqrt(6))/36 ]\n"
1910 <<
" A3 = [ (-2+3*sqrt(6))/225 ]\n"
1911 <<
" [ (-2-3*sqrt(6))/225 ]\n"
1913 <<
"b = [ (16-sqrt(6))/36 (16+sqrt(6))/36 1/9 ]'"
1915 typedef ScalarTraits<Scalar> ST;
1916 int myNumStages = 3;
1917 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1918 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1919 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1920 Scalar one = ST::one();
1921 myA(0,0) = as<Scalar>( (88*one-7*one*ST::squareroot(6*one))/(360*one) );
1922 myA(0,1) = as<Scalar>( (296*one-169*one*ST::squareroot(6*one))/(1800*one) );
1923 myA(0,2) = as<Scalar>( (-2*one+3*one*ST::squareroot(6*one))/(225*one) );
1924 myA(1,0) = as<Scalar>( (296*one+169*one*ST::squareroot(6*one))/(1800*one) );
1925 myA(1,1) = as<Scalar>( (88*one+7*one*ST::squareroot(6*one))/(360*one) );
1926 myA(1,2) = as<Scalar>( (-2*one-3*one*ST::squareroot(6*one))/(225*one) );
1927 myA(2,0) = as<Scalar>( (16*one-ST::squareroot(6*one))/(36*one) );
1928 myA(2,1) = as<Scalar>( (16*one+ST::squareroot(6*one))/(36*one) );
1929 myA(2,2) = as<Scalar>( one/(9*one) );
1930 myb(0) = as<Scalar>( (16*one-ST::squareroot(6*one))/(36*one) );
1931 myb(1) = as<Scalar>( (16*one+ST::squareroot(6*one))/(36*one) );
1932 myb(2) = as<Scalar>( one/(9*one) );
1933 myc(0) = as<Scalar>( (4*one-ST::squareroot(6*one))/(10*one) );
1934 myc(1) = as<Scalar>( (4*one+ST::squareroot(6*one))/(10*one) );
1936 this->setMyDescription(myDescription.str());
1940 this->setMy_order(5);
1945 template<
class Scalar>
1946 class Implicit2Stage2ndOrderLobattoA_RKBT :
1947 virtual public RKButcherTableauDefaultBase<Scalar>
1950 Implicit2Stage2ndOrderLobattoA_RKBT()
1953 std::ostringstream myDescription;
1954 myDescription << Implicit2Stage2ndOrderLobattoA_name() <<
"\n"
1956 <<
"Solving Ordinary Differential Equations II:\n"
1957 <<
"Stiff and Differential-Algebraic Problems,\n"
1958 <<
"2nd Revised Edition\n"
1959 <<
"E. Hairer and G. Wanner\n"
1960 <<
"Table 5.7, pg 75\n"
1964 <<
"b = [ 1/2 1/2 ]'" << std::endl;
1965 typedef ScalarTraits<Scalar> ST;
1966 int myNumStages = 2;
1967 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
1968 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
1969 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
1970 Scalar zero = ST::zero();
1971 Scalar one = ST::one();
1974 myA(1,0) = as<Scalar>( one/(2*one) );
1975 myA(1,1) = as<Scalar>( one/(2*one) );
1976 myb(0) = as<Scalar>( one/(2*one) );
1977 myb(1) = as<Scalar>( one/(2*one) );
1980 this->setMyDescription(myDescription.str());
1984 this->setMy_order(2);
1989 template<
class Scalar>
1990 class Implicit3Stage4thOrderLobattoA_RKBT :
1991 virtual public RKButcherTableauDefaultBase<Scalar>
1994 Implicit3Stage4thOrderLobattoA_RKBT()
1997 std::ostringstream myDescription;
1998 myDescription << Implicit3Stage4thOrderLobattoA_name() <<
"\n"
2000 <<
"Solving Ordinary Differential Equations II:\n"
2001 <<
"Stiff and Differential-Algebraic Problems,\n"
2002 <<
"2nd Revised Edition\n"
2003 <<
"E. Hairer and G. Wanner\n"
2004 <<
"Table 5.7, pg 75\n"
2005 <<
"c = [ 0 1/2 1 ]'\n"
2006 <<
"A = [ 0 0 0 ]\n"
2007 <<
" [ 5/24 1/3 -1/24 ]\n"
2008 <<
" [ 1/6 2/3 1/6 ]\n"
2009 <<
"b = [ 1/6 2/3 1/6 ]'" << std::endl;
2010 typedef ScalarTraits<Scalar> ST;
2011 int myNumStages = 3;
2012 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2013 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2014 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2015 Scalar zero = ST::zero();
2016 Scalar one = ST::one();
2020 myA(1,0) = as<Scalar>( (5*one)/(24*one) );
2021 myA(1,1) = as<Scalar>( (one)/(3*one) );
2022 myA(1,2) = as<Scalar>( (-one)/(24*one) );
2023 myA(2,0) = as<Scalar>( (one)/(6*one) );
2024 myA(2,1) = as<Scalar>( (2*one)/(3*one) );
2025 myA(2,2) = as<Scalar>( (1*one)/(6*one) );
2026 myb(0) = as<Scalar>( (one)/(6*one) );
2027 myb(1) = as<Scalar>( (2*one)/(3*one) );
2028 myb(2) = as<Scalar>( (1*one)/(6*one) );
2030 myc(1) = as<Scalar>( one/(2*one) );
2032 this->setMyDescription(myDescription.str());
2036 this->setMy_order(4);
2041 template<
class Scalar>
2042 class Implicit4Stage6thOrderLobattoA_RKBT :
2043 virtual public RKButcherTableauDefaultBase<Scalar>
2046 Implicit4Stage6thOrderLobattoA_RKBT()
2050 typedef Teuchos::ScalarTraits<Scalar> ST;
2052 std::ostringstream myDescription;
2053 myDescription << Implicit4Stage6thOrderLobattoA_name() <<
"\n"
2055 <<
"Solving Ordinary Differential Equations II:\n"
2056 <<
"Stiff and Differential-Algebraic Problems,\n"
2057 <<
"2nd Revised Edition\n"
2058 <<
"E. Hairer and G. Wanner\n"
2059 <<
"Table 5.8, pg 75\n"
2060 <<
"c = [ 0 (5-sqrt(5))/10 (5+sqrt(5))/10 1 ]'\n"
2061 <<
"A = [ A1 A2 A3 A4 ]\n"
2063 <<
" [ (11+sqrt(5)/120 ]\n"
2064 <<
" [ (11-sqrt(5)/120 ]\n"
2067 <<
" [ (25-sqrt(5))/120 ]\n"
2068 <<
" [ (25+13*sqrt(5))/120 ]\n"
2071 <<
" [ (25-13*sqrt(5))/120 ]\n"
2072 <<
" [ (25+sqrt(5))/120 ]\n"
2075 <<
" [ (-1+sqrt(5))/120 ]\n"
2076 <<
" [ (-1-sqrt(5))/120 ]\n"
2078 <<
"b = [ 1/12 5/12 5/12 1/12 ]'" << std::endl;
2079 typedef ScalarTraits<Scalar> ST;
2080 int myNumStages = 4;
2081 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2082 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2083 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2084 Scalar zero = ST::zero();
2085 Scalar one = ST::one();
2090 myA(1,0) = as<Scalar>( (11*one+ST::squareroot(5*one))/(120*one) );
2091 myA(1,1) = as<Scalar>( (25*one-ST::squareroot(5*one))/(120*one) );
2092 myA(1,2) = as<Scalar>( (25*one-13*one*ST::squareroot(5*one))/(120*one) );
2093 myA(1,3) = as<Scalar>( (-one+ST::squareroot(5*one))/(120*one) );
2094 myA(2,0) = as<Scalar>( (11*one-ST::squareroot(5*one))/(120*one) );
2095 myA(2,1) = as<Scalar>( (25*one+13*one*ST::squareroot(5*one))/(120*one) );
2096 myA(2,2) = as<Scalar>( (25*one+ST::squareroot(5*one))/(120*one) );
2097 myA(2,3) = as<Scalar>( (-one-ST::squareroot(5*one))/(120*one) );
2098 myA(3,0) = as<Scalar>( one/(12*one) );
2099 myA(3,1) = as<Scalar>( 5*one/(12*one) );
2100 myA(3,2) = as<Scalar>( 5*one/(12*one) );
2101 myA(3,3) = as<Scalar>( one/(12*one) );
2102 myb(0) = as<Scalar>( one/(12*one) );
2103 myb(1) = as<Scalar>( 5*one/(12*one) );
2104 myb(2) = as<Scalar>( 5*one/(12*one) );
2105 myb(3) = as<Scalar>( one/(12*one) );
2107 myc(1) = as<Scalar>( (5*one-ST::squareroot(5))/(10*one) );
2108 myc(2) = as<Scalar>( (5*one+ST::squareroot(5))/(10*one) );
2110 this->setMyDescription(myDescription.str());
2114 this->setMy_order(6);
2119 template<
class Scalar>
2120 class Implicit2Stage2ndOrderLobattoB_RKBT :
2121 virtual public RKButcherTableauDefaultBase<Scalar>
2124 Implicit2Stage2ndOrderLobattoB_RKBT()
2127 std::ostringstream myDescription;
2128 myDescription << Implicit2Stage2ndOrderLobattoB_name() <<
"\n"
2130 <<
"Solving Ordinary Differential Equations II:\n"
2131 <<
"Stiff and Differential-Algebraic Problems,\n"
2132 <<
"2nd Revised Edition\n"
2133 <<
"E. Hairer and G. Wanner\n"
2134 <<
"Table 5.9, pg 76\n"
2136 <<
"A = [ 1/2 0 ]\n"
2138 <<
"b = [ 1/2 1/2 ]'" << std::endl;
2139 typedef ScalarTraits<Scalar> ST;
2140 int myNumStages = 2;
2141 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2142 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2143 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2144 Scalar zero = ST::zero();
2145 Scalar one = ST::one();
2146 myA(0,0) = as<Scalar>( one/(2*one) );
2148 myA(1,0) = as<Scalar>( one/(2*one) );
2150 myb(0) = as<Scalar>( one/(2*one) );
2151 myb(1) = as<Scalar>( one/(2*one) );
2154 this->setMyDescription(myDescription.str());
2158 this->setMy_order(2);
2163 template<
class Scalar>
2164 class Implicit3Stage4thOrderLobattoB_RKBT :
2165 virtual public RKButcherTableauDefaultBase<Scalar>
2168 Implicit3Stage4thOrderLobattoB_RKBT()
2171 std::ostringstream myDescription;
2172 myDescription << Implicit3Stage4thOrderLobattoB_name() <<
"\n"
2174 <<
"Solving Ordinary Differential Equations II:\n"
2175 <<
"Stiff and Differential-Algebraic Problems,\n"
2176 <<
"2nd Revised Edition\n"
2177 <<
"E. Hairer and G. Wanner\n"
2178 <<
"Table 5.9, pg 76\n"
2179 <<
"c = [ 0 1/2 1 ]'\n"
2180 <<
"A = [ 1/6 -1/6 0 ]\n"
2181 <<
" [ 1/6 1/3 0 ]\n"
2182 <<
" [ 1/6 5/6 0 ]\n"
2183 <<
"b = [ 1/6 2/3 1/6 ]'" << std::endl;
2184 typedef ScalarTraits<Scalar> ST;
2185 int myNumStages = 3;
2186 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2187 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2188 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2189 Scalar zero = ST::zero();
2190 Scalar one = ST::one();
2191 myA(0,0) = as<Scalar>( one/(6*one) );
2192 myA(0,1) = as<Scalar>( -one/(6*one) );
2194 myA(1,0) = as<Scalar>( one/(6*one) );
2195 myA(1,1) = as<Scalar>( one/(3*one) );
2197 myA(2,0) = as<Scalar>( one/(6*one) );
2198 myA(2,1) = as<Scalar>( 5*one/(6*one) );
2200 myb(0) = as<Scalar>( one/(6*one) );
2201 myb(1) = as<Scalar>( 2*one/(3*one) );
2202 myb(2) = as<Scalar>( one/(6*one) );
2204 myc(1) = as<Scalar>( one/(2*one) );
2206 this->setMyDescription(myDescription.str());
2210 this->setMy_order(4);
2215 template<
class Scalar>
2216 class Implicit4Stage6thOrderLobattoB_RKBT :
2217 virtual public RKButcherTableauDefaultBase<Scalar>
2220 Implicit4Stage6thOrderLobattoB_RKBT()
2223 std::ostringstream myDescription;
2224 myDescription << Implicit4Stage6thOrderLobattoB_name() <<
"\n"
2226 <<
"Solving Ordinary Differential Equations II:\n"
2227 <<
"Stiff and Differential-Algebraic Problems,\n"
2228 <<
"2nd Revised Edition\n"
2229 <<
"E. Hairer and G. Wanner\n"
2230 <<
"Table 5.10, pg 76\n"
2231 <<
"c = [ 0 (5-sqrt(5))/10 (5+sqrt(5))/10 1 ]'\n"
2232 <<
"A = [ 1/12 (-1-sqrt(5))/24 (-1+sqrt(5))/24 0 ]\n"
2233 <<
" [ 1/12 (25+sqrt(5))/120 (25-13*sqrt(5))/120 0 ]\n"
2234 <<
" [ 1/12 (25+13*sqrt(5))/120 (25-sqrt(5))/120 0 ]\n"
2235 <<
" [ 1/12 (11-sqrt(5))/24 (11+sqrt(5))/24 0 ]\n"
2236 <<
"b = [ 1/12 5/12 5/12 1/12 ]'" << std::endl;
2237 typedef ScalarTraits<Scalar> ST;
2238 int myNumStages = 4;
2239 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2240 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2241 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2242 Scalar zero = ST::zero();
2243 Scalar one = ST::one();
2244 myA(0,0) = as<Scalar>( one/(12*one) );
2245 myA(0,1) = as<Scalar>( (-one-ST::squareroot(5))/(24*one) );
2246 myA(0,2) = as<Scalar>( (-one+ST::squareroot(5))/(24*one) );
2248 myA(1,0) = as<Scalar>( one/(12*one) );
2249 myA(1,1) = as<Scalar>( (25*one+ST::squareroot(5))/(120*one) );
2250 myA(1,2) = as<Scalar>( (25*one-13*one*ST::squareroot(5))/(120*one) );
2252 myA(2,0) = as<Scalar>( one/(12*one) );
2253 myA(2,1) = as<Scalar>( (25*one+13*one*ST::squareroot(5))/(120*one) );
2254 myA(2,2) = as<Scalar>( (25*one-ST::squareroot(5))/(120*one) );
2256 myA(3,0) = as<Scalar>( one/(12*one) );
2257 myA(3,1) = as<Scalar>( (11*one-ST::squareroot(5*one))/(24*one) );
2258 myA(3,2) = as<Scalar>( (11*one+ST::squareroot(5*one))/(24*one) );
2260 myb(0) = as<Scalar>( one/(12*one) );
2261 myb(1) = as<Scalar>( 5*one/(12*one) );
2262 myb(2) = as<Scalar>( 5*one/(12*one) );
2263 myb(3) = as<Scalar>( one/(12*one) );
2265 myc(1) = as<Scalar>( (5*one-ST::squareroot(5*one))/(10*one) );
2266 myc(2) = as<Scalar>( (5*one+ST::squareroot(5*one))/(10*one) );
2268 this->setMyDescription(myDescription.str());
2272 this->setMy_order(6);
2277 template<
class Scalar>
2278 class Implicit2Stage2ndOrderLobattoC_RKBT :
2279 virtual public RKButcherTableauDefaultBase<Scalar>
2282 Implicit2Stage2ndOrderLobattoC_RKBT()
2285 std::ostringstream myDescription;
2286 myDescription << Implicit2Stage2ndOrderLobattoC_name() <<
"\n"
2288 <<
"Solving Ordinary Differential Equations II:\n"
2289 <<
"Stiff and Differential-Algebraic Problems,\n"
2290 <<
"2nd Revised Edition\n"
2291 <<
"E. Hairer and G. Wanner\n"
2292 <<
"Table 5.11, pg 76\n"
2294 <<
"A = [ 1/2 -1/2 ]\n"
2296 <<
"b = [ 1/2 1/2 ]'" << std::endl;
2297 typedef ScalarTraits<Scalar> ST;
2298 int myNumStages = 2;
2299 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2300 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2301 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2302 Scalar zero = ST::zero();
2303 Scalar one = ST::one();
2304 myA(0,0) = as<Scalar>( one/(2*one) );
2305 myA(0,1) = as<Scalar>( -one/(2*one) );
2306 myA(1,0) = as<Scalar>( one/(2*one) );
2307 myA(1,1) = as<Scalar>( one/(2*one) );
2308 myb(0) = as<Scalar>( one/(2*one) );
2309 myb(1) = as<Scalar>( one/(2*one) );
2312 this->setMyDescription(myDescription.str());
2316 this->setMy_order(2);
2321 template<
class Scalar>
2322 class Implicit3Stage4thOrderLobattoC_RKBT :
2323 virtual public RKButcherTableauDefaultBase<Scalar>
2326 Implicit3Stage4thOrderLobattoC_RKBT()
2329 std::ostringstream myDescription;
2330 myDescription << Implicit3Stage4thOrderLobattoC_name() <<
"\n"
2332 <<
"Solving Ordinary Differential Equations II:\n"
2333 <<
"Stiff and Differential-Algebraic Problems,\n"
2334 <<
"2nd Revised Edition\n"
2335 <<
"E. Hairer and G. Wanner\n"
2336 <<
"Table 5.11, pg 76\n"
2337 <<
"c = [ 0 1/2 1 ]'\n"
2338 <<
"A = [ 1/6 -1/3 1/6 ]\n"
2339 <<
" [ 1/6 5/12 -1/12 ]\n"
2340 <<
" [ 1/6 2/3 1/6 ]\n"
2341 <<
"b = [ 1/6 2/3 1/6 ]'" << std::endl;
2342 typedef ScalarTraits<Scalar> ST;
2343 int myNumStages = 3;
2344 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2345 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2346 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2347 Scalar zero = ST::zero();
2348 Scalar one = ST::one();
2349 myA(0,0) = as<Scalar>( one/(6*one) );
2350 myA(0,1) = as<Scalar>( -one/(3*one) );
2351 myA(0,2) = as<Scalar>( one/(6*one) );
2352 myA(1,0) = as<Scalar>( one/(6*one) );
2353 myA(1,1) = as<Scalar>( 5*one/(12*one) );
2354 myA(1,2) = as<Scalar>( -one/(12*one) );
2355 myA(2,0) = as<Scalar>( one/(6*one) );
2356 myA(2,1) = as<Scalar>( 2*one/(3*one) );
2357 myA(2,2) = as<Scalar>( one/(6*one) );
2358 myb(0) = as<Scalar>( one/(6*one) );
2359 myb(1) = as<Scalar>( 2*one/(3*one) );
2360 myb(2) = as<Scalar>( one/(6*one) );
2362 myc(1) = as<Scalar>( one/(2*one) );
2364 this->setMyDescription(myDescription.str());
2368 this->setMy_order(4);
2373 template<
class Scalar>
2374 class Implicit4Stage6thOrderLobattoC_RKBT :
2375 virtual public RKButcherTableauDefaultBase<Scalar>
2378 Implicit4Stage6thOrderLobattoC_RKBT()
2381 std::ostringstream myDescription;
2382 myDescription << Implicit4Stage6thOrderLobattoC_name() <<
"\n"
2384 <<
"Solving Ordinary Differential Equations II:\n"
2385 <<
"Stiff and Differential-Algebraic Problems,\n"
2386 <<
"2nd Revised Edition\n"
2387 <<
"E. Hairer and G. Wanner\n"
2388 <<
"Table 5.12, pg 76\n"
2389 <<
"c = [ 0 (5-sqrt(5))/10 (5+sqrt(5))/10 1 ]'\n"
2390 <<
"A = [ 1/12 -sqrt(5)/12 sqrt(5)/12 -1/12 ]\n"
2391 <<
" [ 1/12 1/4 (10-7*sqrt(5))/60 sqrt(5)/60 ]\n"
2392 <<
" [ 1/12 (10+7*sqrt(5))/60 1/4 -sqrt(5)/60 ]\n"
2393 <<
" [ 1/12 5/12 5/12 1/12 ]\n"
2394 <<
"b = [ 1/12 5/12 5/12 1/12 ]'" << std::endl;
2395 typedef ScalarTraits<Scalar> ST;
2396 int myNumStages = 4;
2397 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2398 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2399 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2400 Scalar zero = ST::zero();
2401 Scalar one = ST::one();
2402 myA(0,0) = as<Scalar>( one/(12*one) );
2403 myA(0,1) = as<Scalar>( -ST::squareroot(5*one)/(12*one) );
2404 myA(0,2) = as<Scalar>( ST::squareroot(5*one)/(12*one) );
2405 myA(0,3) = as<Scalar>( -one/(12*one) );
2406 myA(1,0) = as<Scalar>( one/(12*one) );
2407 myA(1,1) = as<Scalar>( one/(4*one) );
2408 myA(1,2) = as<Scalar>( (10*one-7*one*ST::squareroot(5*one))/(60*one) );
2409 myA(1,3) = as<Scalar>( ST::squareroot(5*one)/(60*one) );
2410 myA(2,0) = as<Scalar>( one/(12*one) );
2411 myA(2,1) = as<Scalar>( (10*one+7*one*ST::squareroot(5*one))/(60*one) );
2412 myA(2,2) = as<Scalar>( one/(4*one) );
2413 myA(2,3) = as<Scalar>( -ST::squareroot(5*one)/(60*one) );
2414 myA(3,0) = as<Scalar>( one/(12*one) );
2415 myA(3,1) = as<Scalar>( 5*one/(12*one) );
2416 myA(3,2) = as<Scalar>( 5*one/(12*one) );
2417 myA(3,3) = as<Scalar>( one/(12*one) );
2418 myb(0) = as<Scalar>( one/(12*one) );
2419 myb(1) = as<Scalar>( 5*one/(12*one) );
2420 myb(2) = as<Scalar>( 5*one/(12*one) );
2421 myb(3) = as<Scalar>( one/(12*one) );
2423 myc(1) = as<Scalar>( (5*one-ST::squareroot(5*one))/(10*one) );
2424 myc(2) = as<Scalar>( (5*one+ST::squareroot(5*one))/(10*one) );
2426 this->setMyDescription(myDescription.str());
2430 this->setMy_order(6);
2436 template<
class Scalar>
2437 class SDIRK5Stage5thOrder_RKBT :
2438 virtual public RKButcherTableauDefaultBase<Scalar>
2441 SDIRK5Stage5thOrder_RKBT()
2444 std::ostringstream myDescription;
2445 myDescription << SDIRK5Stage5thOrder_name() <<
"\n"
2447 <<
"Solving Ordinary Differential Equations II:\n"
2448 <<
"Stiff and Differential-Algebraic Problems,\n"
2449 <<
"2nd Revised Edition\n"
2450 <<
"E. Hairer and G. Wanner\n"
2452 <<
"c = [ (6-sqrt(6))/10 ]\n"
2453 <<
" [ (6+9*sqrt(6))/35 ]\n"
2455 <<
" [ (4-sqrt(6))/10 ]\n"
2456 <<
" [ (4+sqrt(6))/10 ]\n"
2457 <<
"A = [ A1 A2 A3 A4 A5 ]\n"
2458 <<
" A1 = [ (6-sqrt(6))/10 ]\n"
2459 <<
" [ (-6+5*sqrt(6))/14 ]\n"
2460 <<
" [ (888+607*sqrt(6))/2850 ]\n"
2461 <<
" [ (3153-3082*sqrt(6))/14250 ]\n"
2462 <<
" [ (-32583+14638*sqrt(6))/71250 ]\n"
2464 <<
" [ (6-sqrt(6))/10 ]\n"
2465 <<
" [ (126-161*sqrt(6))/1425 ]\n"
2466 <<
" [ (3213+1148*sqrt(6))/28500 ]\n"
2467 <<
" [ (-17199+364*sqrt(6))/142500 ]\n"
2470 <<
" [ (6-sqrt(6))/10 ]\n"
2471 <<
" [ (-267+88*sqrt(6))/500 ]\n"
2472 <<
" [ (1329-544*sqrt(6))/2500 ]\n"
2476 <<
" [ (6-sqrt(6))/10 ]\n"
2477 <<
" [ (-96+131*sqrt(6))/625 ]\n"
2482 <<
" [ (6-sqrt(6))/10 ]\n"
2486 <<
" [ (16-sqrt(6))/36 ]\n"
2487 <<
" [ (16+sqrt(6))/36 ]" << std::endl;
2488 typedef ScalarTraits<Scalar> ST;
2489 int myNumStages = 5;
2490 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2491 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2492 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2493 Scalar zero = ST::zero();
2494 Scalar one = ST::one();
2495 Scalar sqrt6 = ST::squareroot(as<Scalar>(6*one));
2496 Scalar gamma = as<Scalar>( (6*one - sqrt6) / (10*one) );
2503 myA(1,0) = as<Scalar>( (-6*one+5*one*sqrt6)/(14*one) );
2509 myA(2,0) = as<Scalar>( (888*one+607*one*sqrt6)/(2850*one) );
2510 myA(2,1) = as<Scalar>( (126*one-161*one*sqrt6)/(1425*one) );
2515 myA(3,0) = as<Scalar>( (3153*one-3082*one*sqrt6)/(14250*one) );
2516 myA(3,1) = as<Scalar>( (3213*one+1148*one*sqrt6)/(28500*one) );
2517 myA(3,2) = as<Scalar>( (-267*one+88*one*sqrt6)/(500*one) );
2521 myA(4,0) = as<Scalar>( (-32583*one+14638*one*sqrt6)/(71250*one) );
2522 myA(4,1) = as<Scalar>( (-17199*one+364*one*sqrt6)/(142500*one) );
2523 myA(4,2) = as<Scalar>( (1329*one-544*one*sqrt6)/(2500*one) );
2524 myA(4,3) = as<Scalar>( (-96*one+131*sqrt6)/(625*one) );
2529 myb(2) = as<Scalar>( one/(9*one) );
2530 myb(3) = as<Scalar>( (16*one-sqrt6)/(36*one) );
2531 myb(4) = as<Scalar>( (16*one+sqrt6)/(36*one) );
2534 myc(1) = as<Scalar>( (6*one+9*one*sqrt6)/(35*one) );
2536 myc(3) = as<Scalar>( (4*one-sqrt6)/(10*one) );
2537 myc(4) = as<Scalar>( (4*one+sqrt6)/(10*one) );
2539 this->setMyDescription(myDescription.str());
2543 this->setMy_order(5);
2548 template<
class Scalar>
2549 class SDIRK5Stage4thOrder_RKBT :
2550 virtual public RKButcherTableauDefaultBase<Scalar>
2553 SDIRK5Stage4thOrder_RKBT()
2556 std::ostringstream myDescription;
2557 myDescription << SDIRK5Stage4thOrder_name() <<
"\n"
2559 <<
"Solving Ordinary Differential Equations II:\n"
2560 <<
"Stiff and Differential-Algebraic Problems,\n"
2561 <<
"2nd Revised Edition\n"
2562 <<
"E. Hairer and G. Wanner\n"
2564 <<
"c = [ 1/4 3/4 11/20 1/2 1 ]'\n"
2567 <<
" [ 17/50 -1/25 1/4 ]\n"
2568 <<
" [ 371/1360 -137/2720 15/544 1/4 ]\n"
2569 <<
" [ 25/24 -49/48 125/16 -85/12 1/4 ]\n"
2570 <<
"b = [ 25/24 -49/48 125/16 -85/12 1/4 ]'\n"
2571 <<
"b' = [ 59/48 -17/96 225/32 -85/12 0 ]'" << std::endl;
2572 typedef ScalarTraits<Scalar> ST;
2573 int myNumStages = 5;
2574 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2575 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2576 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2577 Scalar zero = ST::zero();
2578 Scalar one = ST::one();
2579 Scalar onequarter = as<Scalar>( one/(4*one) );
2580 myA(0,0) = onequarter;
2586 myA(1,0) = as<Scalar>( one / (2*one) );
2587 myA(1,1) = onequarter;
2592 myA(2,0) = as<Scalar>( 17*one/(50*one) );
2593 myA(2,1) = as<Scalar>( -one/(25*one) );
2594 myA(2,2) = onequarter;
2598 myA(3,0) = as<Scalar>( 371*one/(1360*one) );
2599 myA(3,1) = as<Scalar>( -137*one/(2720*one) );
2600 myA(3,2) = as<Scalar>( 15*one/(544*one) );
2601 myA(3,3) = onequarter;
2604 myA(4,0) = as<Scalar>( 25*one/(24*one) );
2605 myA(4,1) = as<Scalar>( -49*one/(48*one) );
2606 myA(4,2) = as<Scalar>( 125*one/(16*one) );
2607 myA(4,3) = as<Scalar>( -85*one/(12*one) );
2608 myA(4,4) = onequarter;
2610 myb(0) = as<Scalar>( 25*one/(24*one) );
2611 myb(1) = as<Scalar>( -49*one/(48*one) );
2612 myb(2) = as<Scalar>( 125*one/(16*one) );
2613 myb(3) = as<Scalar>( -85*one/(12*one) );
2614 myb(4) = onequarter;
2624 myc(0) = onequarter;
2625 myc(1) = as<Scalar>( 3*one/(4*one) );
2626 myc(2) = as<Scalar>( 11*one/(20*one) );
2627 myc(3) = as<Scalar>( one/(2*one) );
2630 this->setMyDescription(myDescription.str());
2634 this->setMy_order(4);
2639 template<
class Scalar>
2640 class SDIRK3Stage4thOrder_RKBT :
2641 virtual public RKButcherTableauDefaultBase<Scalar>
2644 SDIRK3Stage4thOrder_RKBT()
2647 std::ostringstream myDescription;
2648 myDescription << SDIRK3Stage4thOrder_name() <<
"\n"
2650 <<
"Solving Ordinary Differential Equations II:\n"
2651 <<
"Stiff and Differential-Algebraic Problems,\n"
2652 <<
"2nd Revised Edition\n"
2653 <<
"E. Hairer and G. Wanner\n"
2655 <<
"gamma = (1/sqrt(3))*cos(pi/18)+1/2\n"
2656 <<
"delta = 1/(6*(2*gamma-1)^2)\n"
2657 <<
"c = [ gamma 1/2 1-gamma ]'\n"
2658 <<
"A = [ gamma ]\n"
2659 <<
" [ 1/2-gamma gamma ]\n"
2660 <<
" [ 2*gamma 1-4*gamma gamma ]\n"
2661 <<
"b = [ delta 1-2*delta delta ]'" << std::endl;
2662 typedef ScalarTraits<Scalar> ST;
2663 int myNumStages = 3;
2664 Teuchos::SerialDenseMatrix<int,Scalar> myA(myNumStages,myNumStages);
2665 Teuchos::SerialDenseVector<int,Scalar> myb(myNumStages);
2666 Teuchos::SerialDenseVector<int,Scalar> myc(myNumStages);
2667 Scalar zero = ST::zero();
2668 Scalar one = ST::one();
2669 Scalar pi = as<Scalar>(4*one)*std::atan(one);
2670 Scalar gamma = as<Scalar>( one/ST::squareroot(3*one)*std::cos(pi/(18*one))+one/(2*one) );
2671 Scalar delta = as<Scalar>( one/(6*one*std::pow(2*gamma-one,2*one)) );
2676 myA(1,0) = as<Scalar>( one/(2*one) - gamma );
2680 myA(2,0) = as<Scalar>( 2*gamma );
2681 myA(2,1) = as<Scalar>( one - 4*gamma );
2685 myb(1) = as<Scalar>( one-2*delta );
2689 myc(1) = as<Scalar>( one/(2*one) );
2690 myc(2) = as<Scalar>( one - gamma );
2692 this->setMyDescription(myDescription.str());
2696 this->setMy_order(4);
2704 #endif // RYTHMOS_RK_BUTCHER_TABLEAU_HPP