libMesh
second_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/fem_system.h>
5 #include <libmesh/quadrature.h>
6 #include <libmesh/diff_solver.h>
7 #include <libmesh/newmark_solver.h>
8 #include <libmesh/euler_solver.h>
9 #include <libmesh/euler2_solver.h>
10 
12 
13 
15 template<typename SystemBase>
16 class ConstantSecondOrderODE : public SystemBase
17 {
18 public:
19  ConstantSecondOrderODE(EquationSystems & es,
20  const std::string & name_in,
21  const unsigned int number_in)
22  : SystemBase(es, name_in, number_in)
23  {}
24 
25  virtual Number F( FEMContext & /*context*/, unsigned int /*qp*/ ) override
26  { return -Real(271)/100; }
27 
28  virtual Number C( FEMContext & /*context*/, unsigned int /*qp*/ ) override
29  { return 0.0; }
30 
31  virtual Number M( FEMContext & /*context*/, unsigned int /*qp*/ ) override
32  { return Real(314)/100; }
33 
34  virtual Number u( Real t ) override
35  { return Real(271)/Real(314)*0.5*t*t; }
36 };
37 
39 template<typename SystemBase>
40 class LinearTimeSecondOrderODE : public SystemBase
41 {
42 public:
43  LinearTimeSecondOrderODE(EquationSystems & es,
44  const std::string & name_in,
45  const unsigned int number_in)
46  : SystemBase(es, name_in, number_in)
47  {}
48 
49  virtual Number F( FEMContext & context, unsigned int /*qp*/ ) override
50  { return -6.0*context.get_time()-2.0; }
51 
52  virtual Number C( FEMContext & /*context*/, unsigned int /*qp*/ ) override
53  { return 0.0; }
54 
55  virtual Number M( FEMContext & /*context*/, unsigned int /*qp*/ ) override
56  { return 1.0; }
57 
58  virtual Number u( Real t ) override
59  { return t*t*t+t*t; }
60 };
61 
63 {
64 public:
66  : TimeSolverTestImplementation<NewmarkSolver>(),
67  _beta(0.25)
68  {}
69 
70 protected:
71 
72  virtual void aux_time_solver_init( NewmarkSolver & time_solver ) override
73  { time_solver.set_beta(_beta);
74  time_solver.compute_initial_accel(); }
75 
76  void set_beta( Real beta )
77  { _beta = beta; }
78 
80 };
81 
82 class NewmarkSolverTest : public CppUnit::TestCase,
84 {
85 public:
87 
88 #ifdef LIBMESH_HAVE_SOLVER
93 #endif
94 
96 
97 public:
98 
100  {
101  this->run_test_with_exact_soln<ConstantSecondOrderODE<SecondOrderScalarSystemSecondOrderTimeSolverBase>>(0.5,10);
102  }
103 
105  {
106  // For \beta = 1/6, we have the "linear acceleration method" for which
107  // we should be able to exactly integrate linear (in time) acceleration
108  // functions.
109  this->set_beta(Real(1)/Real(6));
110  this->run_test_with_exact_soln<LinearTimeSecondOrderODE<SecondOrderScalarSystemSecondOrderTimeSolverBase>>(0.5,10);
111  }
112 
114  {
115  this->run_test_with_exact_soln<ConstantSecondOrderODE<SecondOrderScalarSystemFirstOrderTimeSolverBase>>(0.5,10);
116  }
117 
119  {
120  // For \beta = 1/6, we have the "linear acceleration method" for which
121  // we should be able to exactly integrate linear (in time) acceleration
122  // functions.
123  this->set_beta(Real(1)/Real(6));
124  this->run_test_with_exact_soln<LinearTimeSecondOrderODE<SecondOrderScalarSystemFirstOrderTimeSolverBase>>(0.5,10);
125  }
126 
127 };
128 
129 template<typename TimeSolverType>
130 class ThetaSolverTestBase : public TimeSolverTestImplementation<TimeSolverType>
131 {
132 public:
134  : TimeSolverTestImplementation<TimeSolverType>(),
135  _theta(1.0)
136  {}
137 
138 protected:
139 
140  virtual void aux_time_solver_init( TimeSolverType & time_solver )
141  { time_solver.theta = _theta; }
142 
143  void set_theta( Real theta )
144  { _theta = theta; }
145 
146  Real _theta;
147 };
148 
149 class EulerSolverSecondOrderTest : public CppUnit::TestCase,
150  public ThetaSolverTestBase<EulerSolver>
151 {
152 public:
154 
155 #ifdef LIBMESH_HAVE_SOLVER
157 #endif
158 
160 
161 public:
162 
164  {
165  this->set_theta(0.5);
166  this->run_test_with_exact_soln<ConstantSecondOrderODE<SecondOrderScalarSystemFirstOrderTimeSolverBase>>(0.5,10);
167  }
168 
169 };
170 
171 class Euler2SolverSecondOrderTest : public CppUnit::TestCase,
172  public ThetaSolverTestBase<Euler2Solver>
173 {
174 public:
176 
177 #ifdef LIBMESH_HAVE_SOLVER
179 #endif
180 
182 
183 public:
185  {
186  this->set_theta(0.5);
187  this->run_test_with_exact_soln<ConstantSecondOrderODE<SecondOrderScalarSystemFirstOrderTimeSolverBase>>(0.5,10);
188  }
189 };
190 
NewmarkSolverTest::CPPUNIT_TEST_SUITE_END
CPPUNIT_TEST_SUITE_END()
EulerSolverSecondOrderTest::testEulerSolverConstantSecondOrderODE
void testEulerSolverConstantSecondOrderODE()
Definition: second_order_unsteady_solver_test.C:163
libMesh::Number
Real Number
Definition: libmesh_common.h:195
NewmarkSolverTest::testNewmarkSolverConstantSecondOrderODESecondOrderStyle
void testNewmarkSolverConstantSecondOrderODESecondOrderStyle()
Definition: second_order_unsteady_solver_test.C:99
NewmarkSolverTestBase
Definition: second_order_unsteady_solver_test.C:62
LinearTimeSecondOrderODE
Implements ODE: 1.0\ddot{u} = 6.0*t+2.0, u(0) = 0,.
Definition: second_order_unsteady_solver_test.C:40
ConstantSecondOrderODE
Implements ODE: 3.14\ddot{u} = 2.71, u(0) = 0,.
Definition: second_order_unsteady_solver_test.C:16
time_solver_test_common.h
Euler2SolverSecondOrderTest::CPPUNIT_TEST_SUITE
CPPUNIT_TEST_SUITE(Euler2SolverSecondOrderTest)
NewmarkSolverTestBase::aux_time_solver_init
virtual void aux_time_solver_init(NewmarkSolver &time_solver) override
Definition: second_order_unsteady_solver_test.C:72
ThetaSolverTestBase::_theta
Real _theta
Definition: first_order_unsteady_solver_test.C:69
ConstantSecondOrderODE::F
virtual Number F(FEMContext &, unsigned int) override
Definition: second_order_unsteady_solver_test.C:25
EulerSolverSecondOrderTest
Definition: second_order_unsteady_solver_test.C:149
ThetaSolverTestBase
Definition: first_order_unsteady_solver_test.C:53
TimeSolverTestImplementation
Definition: time_solver_test_common.h:16
NewmarkSolverTest::testNewmarkSolverLinearTimeSecondOrderODESecondOrderStyle
void testNewmarkSolverLinearTimeSecondOrderODESecondOrderStyle()
Definition: second_order_unsteady_solver_test.C:104
NewmarkSolverTest
Definition: second_order_unsteady_solver_test.C:82
Euler2SolverSecondOrderTest::CPPUNIT_TEST
CPPUNIT_TEST(testEuler2SolverConstantSecondOrderODE)
LinearTimeSecondOrderODE::C
virtual Number C(FEMContext &, unsigned int) override
Definition: second_order_unsteady_solver_test.C:52
NewmarkSolverTest::testNewmarkSolverConstantSecondOrderODEFirstOrderStyle
void testNewmarkSolverConstantSecondOrderODEFirstOrderStyle()
Definition: second_order_unsteady_solver_test.C:113
NewmarkSolverTestBase::_beta
Real _beta
Definition: second_order_unsteady_solver_test.C:79
EulerSolverSecondOrderTest::CPPUNIT_TEST
CPPUNIT_TEST(testEulerSolverConstantSecondOrderODE)
CPPUNIT_TEST_SUITE_REGISTRATION
CPPUNIT_TEST_SUITE_REGISTRATION(NewmarkSolverTest)
NewmarkSolverTestBase::set_beta
void set_beta(Real beta)
Definition: second_order_unsteady_solver_test.C:76
NewmarkSolverTestBase::NewmarkSolverTestBase
NewmarkSolverTestBase()
Definition: second_order_unsteady_solver_test.C:65
NewmarkSolverTest::CPPUNIT_TEST_SUITE
CPPUNIT_TEST_SUITE(NewmarkSolverTest)
LinearTimeSecondOrderODE::F
virtual Number F(FEMContext &context, unsigned int) override
Definition: second_order_unsteady_solver_test.C:49
ThetaSolverTestBase::ThetaSolverTestBase
ThetaSolverTestBase()
Definition: second_order_unsteady_solver_test.C:133
LinearTimeSecondOrderODE::M
virtual Number M(FEMContext &, unsigned int) override
Definition: second_order_unsteady_solver_test.C:55
Euler2SolverSecondOrderTest::CPPUNIT_TEST_SUITE_END
CPPUNIT_TEST_SUITE_END()
LinearTimeSecondOrderODE::LinearTimeSecondOrderODE
LinearTimeSecondOrderODE(EquationSystems &es, const std::string &name_in, const unsigned int number_in)
Definition: second_order_unsteady_solver_test.C:43
ConstantSecondOrderODE::u
virtual Number u(Real t) override
Definition: second_order_unsteady_solver_test.C:34
ConstantSecondOrderODE::M
virtual Number M(FEMContext &, unsigned int) override
Definition: second_order_unsteady_solver_test.C:31
ThetaSolverTestBase::aux_time_solver_init
virtual void aux_time_solver_init(TimeSolverType &time_solver)
Definition: second_order_unsteady_solver_test.C:140
NewmarkSolverTest::CPPUNIT_TEST
CPPUNIT_TEST(testNewmarkSolverConstantSecondOrderODESecondOrderStyle)
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
ConstantSecondOrderODE::C
virtual Number C(FEMContext &, unsigned int) override
Definition: second_order_unsteady_solver_test.C:28
LinearTimeSecondOrderODE::u
virtual Number u(Real t) override
Definition: second_order_unsteady_solver_test.C:58
Euler2SolverSecondOrderTest
Definition: second_order_unsteady_solver_test.C:171
EulerSolverSecondOrderTest::CPPUNIT_TEST_SUITE_END
CPPUNIT_TEST_SUITE_END()
NewmarkSolverTest::testNewmarkSolverLinearTimeSecondOrderODEFirstOrderStyle
void testNewmarkSolverLinearTimeSecondOrderODEFirstOrderStyle()
Definition: second_order_unsteady_solver_test.C:118
ConstantSecondOrderODE::ConstantSecondOrderODE
ConstantSecondOrderODE(EquationSystems &es, const std::string &name_in, const unsigned int number_in)
Definition: second_order_unsteady_solver_test.C:19
Euler2SolverSecondOrderTest::testEuler2SolverConstantSecondOrderODE
void testEuler2SolverConstantSecondOrderODE()
Definition: second_order_unsteady_solver_test.C:184
EulerSolverSecondOrderTest::CPPUNIT_TEST_SUITE
CPPUNIT_TEST_SUITE(EulerSolverSecondOrderTest)
ThetaSolverTestBase::set_theta
void set_theta(Real theta)
Definition: second_order_unsteady_solver_test.C:143