libMesh
first_order_unsteady_solver_test.C
Go to the documentation of this file.
1 #include <libmesh/equation_systems.h>
2 #include <libmesh/mesh.h>
3 #include <libmesh/mesh_generation.h>
4 #include <libmesh/quadrature.h>
5 #include <libmesh/diff_solver.h>
6 #include <libmesh/euler_solver.h>
7 #include <libmesh/euler2_solver.h>
8 
10 
11 
14 {
15 public:
16  ConstantFirstOrderODE(EquationSystems & es,
17  const std::string & name_in,
18  const unsigned int number_in)
19  : FirstOrderScalarSystemBase(es, name_in, number_in)
20  {}
21 
22  virtual Number F( FEMContext & /*context*/, unsigned int /*qp*/ )
23  { return 5.0; }
24 
25  virtual Number M( FEMContext & /*context*/, unsigned int /*qp*/ )
26  { return Real(21)/10; }
27 
28  virtual Number u( Real t )
29  { return Real(50)/21*t; }
30 };
31 
34 {
35 public:
36  LinearTimeFirstOrderODE(EquationSystems & es,
37  const std::string & name_in,
38  const unsigned int number_in)
39  : FirstOrderScalarSystemBase(es, name_in, number_in)
40  {}
41 
42  virtual Number F( FEMContext & context, unsigned int /*qp*/ )
43  { return 2.0*context.get_time(); }
44 
45  virtual Number M( FEMContext & /*context*/, unsigned int /*qp*/ )
46  { return 5.0; }
47 
48  virtual Number u( Real t )
49  { return 1/Real(5)*t*t; }
50 };
51 
52 template<typename TimeSolverType>
53 class ThetaSolverTestBase : public TimeSolverTestImplementation<TimeSolverType>
54 {
55 public:
57  : TimeSolverTestImplementation<TimeSolverType>(),
58  _theta(1.0)
59  {}
60 
61 protected:
62 
63  virtual void aux_time_solver_init( TimeSolverType & time_solver )
64  { time_solver.theta = _theta; }
65 
66  void set_theta( Real theta )
67  { _theta = theta; }
68 
70 };
71 
72 class EulerSolverTest : public CppUnit::TestCase,
73  public ThetaSolverTestBase<EulerSolver>
74 {
75 public:
77 
78 #ifdef LIBMESH_HAVE_SOLVER
81 #endif
82 
84 
85 public:
86 
88  {
89  this->set_theta(1.0);
90  this->run_test_with_exact_soln<ConstantFirstOrderODE>(0.5,10);
91 
92  this->set_theta(0.5);
93  this->run_test_with_exact_soln<ConstantFirstOrderODE>(0.5,10);
94  }
95 
97  {
98  // Need \theta = 0.5 since this has t in F.
99  this->set_theta(0.5);
100  this->run_test_with_exact_soln<LinearTimeFirstOrderODE>(0.5,10);
101  }
102 
103 };
104 
105 class Euler2SolverTest : public CppUnit::TestCase,
106  public ThetaSolverTestBase<Euler2Solver>
107 {
108 public:
110 
111 #ifdef LIBMESH_HAVE_SOLVER
114 #endif
115 
117 
118 public:
120  {
121  this->set_theta(1.0);
122  this->run_test_with_exact_soln<ConstantFirstOrderODE>(0.5,10);
123 
124  this->set_theta(0.5);
125  this->run_test_with_exact_soln<ConstantFirstOrderODE>(0.5,10);
126  }
127 
129  {
130  // Need \theta = 0.5 since this has t in F.
131  this->set_theta(0.5);
132  this->run_test_with_exact_soln<LinearTimeFirstOrderODE>(0.5,10);
133  }
134 };
135 
Euler2SolverTest::CPPUNIT_TEST_SUITE
CPPUNIT_TEST_SUITE(Euler2SolverTest)
libMesh::Number
Real Number
Definition: libmesh_common.h:195
ConstantFirstOrderODE::F
virtual Number F(FEMContext &, unsigned int)
Definition: first_order_unsteady_solver_test.C:22
LinearTimeFirstOrderODE
Implements ODE: 5.0.
Definition: first_order_unsteady_solver_test.C:33
EulerSolverTest::testEulerSolverLinearTimeFirstOrderODE
void testEulerSolverLinearTimeFirstOrderODE()
Definition: first_order_unsteady_solver_test.C:96
time_solver_test_common.h
EulerSolverTest
Definition: first_order_unsteady_solver_test.C:72
LinearTimeFirstOrderODE::M
virtual Number M(FEMContext &, unsigned int)
Definition: first_order_unsteady_solver_test.C:45
FirstOrderScalarSystemBase
FEMSystem-based class for testing of TimeSolvers using first order SCALARs.
Definition: time_solver_test_common.h:91
ThetaSolverTestBase::_theta
Real _theta
Definition: first_order_unsteady_solver_test.C:69
ThetaSolverTestBase
Definition: first_order_unsteady_solver_test.C:53
ConstantFirstOrderODE
Implements ODE: 2.1.
Definition: first_order_unsteady_solver_test.C:13
TimeSolverTestImplementation
Definition: time_solver_test_common.h:16
EulerSolverTest::CPPUNIT_TEST_SUITE
CPPUNIT_TEST_SUITE(EulerSolverTest)
CPPUNIT_TEST_SUITE_REGISTRATION
CPPUNIT_TEST_SUITE_REGISTRATION(EulerSolverTest)
LinearTimeFirstOrderODE::LinearTimeFirstOrderODE
LinearTimeFirstOrderODE(EquationSystems &es, const std::string &name_in, const unsigned int number_in)
Definition: first_order_unsteady_solver_test.C:36
Euler2SolverTest::testEuler2SolverLinearTimeFirstOrderODE
void testEuler2SolverLinearTimeFirstOrderODE()
Definition: first_order_unsteady_solver_test.C:128
Euler2SolverTest::testEuler2SolverConstantFirstOrderODE
void testEuler2SolverConstantFirstOrderODE()
Definition: first_order_unsteady_solver_test.C:119
Euler2SolverTest::CPPUNIT_TEST
CPPUNIT_TEST(testEuler2SolverConstantFirstOrderODE)
LinearTimeFirstOrderODE::u
virtual Number u(Real t)
Exact solution as a function of time t.
Definition: first_order_unsteady_solver_test.C:48
EulerSolverTest::CPPUNIT_TEST_SUITE_END
CPPUNIT_TEST_SUITE_END()
LinearTimeFirstOrderODE::F
virtual Number F(FEMContext &context, unsigned int)
Definition: first_order_unsteady_solver_test.C:42
ConstantFirstOrderODE::ConstantFirstOrderODE
ConstantFirstOrderODE(EquationSystems &es, const std::string &name_in, const unsigned int number_in)
Definition: first_order_unsteady_solver_test.C:16
Euler2SolverTest
Definition: first_order_unsteady_solver_test.C:105
EulerSolverTest::testEulerSolverConstantFirstOrderODE
void testEulerSolverConstantFirstOrderODE()
Definition: first_order_unsteady_solver_test.C:87
Euler2SolverTest::CPPUNIT_TEST_SUITE_END
CPPUNIT_TEST_SUITE_END()
ThetaSolverTestBase::ThetaSolverTestBase
ThetaSolverTestBase()
Definition: first_order_unsteady_solver_test.C:56
ConstantFirstOrderODE::M
virtual Number M(FEMContext &, unsigned int)
Definition: first_order_unsteady_solver_test.C:25
ConstantFirstOrderODE::u
virtual Number u(Real t)
Exact solution as a function of time t.
Definition: first_order_unsteady_solver_test.C:28
ThetaSolverTestBase::aux_time_solver_init
virtual void aux_time_solver_init(TimeSolverType &time_solver)
Definition: first_order_unsteady_solver_test.C:63
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
EulerSolverTest::CPPUNIT_TEST
CPPUNIT_TEST(testEulerSolverConstantFirstOrderODE)
ThetaSolverTestBase::set_theta
void set_theta(Real theta)
Definition: first_order_unsteady_solver_test.C:66