Amandus: Simulations based on multilevel Schwarz methods
ode.h
Go to the documentation of this file.
1 /**********************************************************************
2  * Copyright (C) 2011 - 2014 by the authors
3  * Distributed under the MIT License
4  *
5  * See the files AUTHORS and LICENSE in the project root directory
6  *
7  **********************************************************************/
8 
9 #ifndef __brusselator_ode_h
10 #define __brusselator_ode_h
11 
12 #include <amandus/brusselator/parameters.h>
13 #include <deal.II/algorithms/operator.h>
14 #include <deal.II/base/smartpointer.h>
15 #include <deal.II/lac/full_matrix.h>
16 #include <deal.II/lac/vector.h>
17 
18 class Explicit : public dealii::Algorithms::OperatorBase
19 {
20 public:
22  virtual void operator()(dealii::AnyData& out, const dealii::AnyData& in);
23 
24 private:
25  dealii::SmartPointer<const Brusselator::Parameters, class Explicit> parameters;
26 };
27 
29  : parameters(&par)
30 {
31 }
32 
33 void Explicit::operator()(dealii::AnyData& out, const dealii::AnyData& in)
34 {
35  const double ts = *in.read_ptr<double>("Timestep");
36  dealii::Vector<double>& r = *out.entry<dealii::Vector<double>*>(0);
37  const dealii::Vector<double>& n = *in.read_ptr<dealii::Vector<double>>("Previous iterate");
38  const double u = n(0);
39  const double v = n(1);
40  r(0) = u - ts * (-parameters->B - u * u * v + (parameters->A + 1.) * u);
41  r(1) = v - ts * (-parameters->A * u + u * u * v);
42 }
43 
44 class ImplicitResidual : public dealii::Algorithms::OperatorBase
45 {
46 public:
48  virtual void operator()(dealii::AnyData& out, const dealii::AnyData& in);
49 
50 private:
51  dealii::SmartPointer<const Brusselator::Parameters, class ImplicitResidual> parameters;
52 };
53 
55  : parameters(&par)
56 {
57 }
58 
59 void ImplicitResidual::operator()(dealii::AnyData& out, const dealii::AnyData& in)
60 {
61  const double ts = *in.read_ptr<double>("Timestep");
62  dealii::Vector<double>& r = *out.entry<dealii::Vector<double>*>(0);
63  const dealii::Vector<double>& n = *in.read_ptr<dealii::Vector<double>>("Newton iterate");
64  const dealii::Vector<double>& p = *in.read_ptr<dealii::Vector<double>>("Previous time");
65  const double u = n(0);
66  const double v = n(1);
67 
68  r(0) = u - p(0) + ts * (-parameters->B - u * u * v + (parameters->A + 1.) * u);
69  r(1) = v - p(1) + ts * (-parameters->A * u + u * u * v);
70 }
71 
72 class ImplicitSolve : public dealii::Algorithms::OperatorBase
73 {
74 public:
76  virtual void operator()(dealii::AnyData& out, const dealii::AnyData& in);
77 
78 private:
79  dealii::SmartPointer<const Brusselator::Parameters, class ImplicitSolve> parameters;
80 };
81 
83  : parameters(&par)
84 {
85 }
86 
87 void ImplicitSolve::operator()(dealii::AnyData& out, const dealii::AnyData& in)
88 {
89  const double ts = *in.read_ptr<double>("Timestep");
90  dealii::Vector<double>& s = *out.entry<dealii::Vector<double>*>(0);
91  const dealii::Vector<double>& r = *in.read_ptr<dealii::Vector<double>>("Newton residual");
92  const dealii::Vector<double>& n = *in.read_ptr<dealii::Vector<double>>("Newton iterate");
93  const double u = n(0);
94  const double v = n(1);
95 
96  dealii::deallog << "ImS " << ts << std::endl;
97  dealii::FullMatrix<double> M(2, 2);
98  M(0, 0) = 1. + ts * (-2. * u * v + (parameters->A + 1.));
99  M(1, 1) = 1. + ts * u * u;
100  M(0, 1) = ts * (-u * u);
101  M(1, 0) = ts * (-parameters->A + 2. * u * v);
102 
103  M.gauss_jordan();
104  M.vmult(s, r);
105 }
106 
107 #endif
dealii::SmartPointer< const Brusselator::Parameters, class Explicit > parameters
Definition: ode.h:25
Definition: ode.h:18
Definition: ode.h:72
virtual void operator()(dealii::AnyData &out, const dealii::AnyData &in)
Definition: ode.h:87
Definition: brusselator/parameters.h:14
virtual void operator()(dealii::AnyData &out, const dealii::AnyData &in)
Definition: ode.h:33
virtual void operator()(dealii::AnyData &out, const dealii::AnyData &in)
Definition: ode.h:59
dealii::SmartPointer< const Brusselator::Parameters, class ImplicitResidual > parameters
Definition: ode.h:51
ImplicitResidual(const Brusselator::Parameters &par)
Definition: ode.h:54
dealii::SmartPointer< const Brusselator::Parameters, class ImplicitSolve > parameters
Definition: ode.h:79
Definition: ode.h:44
Explicit(const Brusselator::Parameters &par)
Definition: ode.h:28
ImplicitSolve(const Brusselator::Parameters &par)
Definition: ode.h:82