CppNoddy  0.92
All Classes Namespaces Files Functions Variables Typedefs Enumerator Friends Macros Modules Pages
HYP2DLinearAdvectionXY.cpp
Go to the documentation of this file.
1/// \file HYP2DLinearAdvectionXY.cpp
2/// \ingroup Tests
3/// \ingroup HYP_2D
4/// Solving the 2D advection equation
5/// \f[ Q_t + \left ( \frac{Q}{\sqrt{2}} \right )_x + \left ( \frac{Q}{\sqrt{2}} \right )_y= 0 \quad \mbox{where} \quad Q=Q(x,y,t) \f]
6/// using a TVD Lax-Friedrichs scheme
7/// for \f$ (x,y)\in[-1,1]\times[-1,1]\f$. The initial condition is a step.
8
9#include <TwoD_HYP_bundle.h>
10
11namespace CppNoddy
12{
13 namespace Example
14 {
15
16 /// Define the system
17 class NlinAdv : public TwoD_Hyperbolic_System
18 {
19
20 public:
21
22 /// Two dimemsional scalar linear advection problem
24 {}
25
27 {
28 f[ 0 ] = q[ 0 ] / sqrt( 2. );
29 }
30
32 {
33 f[ 0 ] = q[ 0 ] / sqrt( 2. );
34 }
35
36 /// Bound the wave speed
38 {
39 // maximum wave speed
40 c[ 0 ] = c[ 1 ] = 1.0;
41 }
42
43 };
44
45 /// Set the initial state of the system
46 void Q_init( const double &x, const double &y, DenseVector<double> &q )
47 {
48 if ( ( std::abs( x ) < 0.25 ) && ( std::abs( y ) < 0.25 ) )
49 {
50 q[ 0 ] = 1.0;
51 }
52 else
53 {
54 q[ 0 ] = 0.0;
55 }
56 }
57 } //end Example namespace
58
59} //end CppNoddy namespace
60
61
62using namespace CppNoddy;
63using namespace std;
64
65int main()
66{
67
68 cout << "\n";
69 cout << "=== Hyperbolic: 2D linear advection at an angle =====\n";
70 cout << "\n";
71
72 // define the domain/mesh
73 const double west = 1.0;
74 const double east = -1.0;
75 const double south = -1.0;
76 const double north = 1.0;
77 const unsigned N = 51;
78 DenseVector<double> faces_x = Utility::uniform_node_vector( east, west, N );
79 DenseVector<double> faces_y = Utility::uniform_node_vector( south, north, N );
80
81 Example::NlinAdv conservative_problem;
82 TwoD_TVDLF_Mesh NlinAdv_mesh( faces_x, faces_y, &conservative_problem, Example::Q_init );
83 NlinAdv_mesh.set_limiter( 1 );
84
85 double asym( 0.0 );
86 unsigned loop_counter( 0 );
87 DenseVector<double> x1( 2, 0.0 );
88 x1[ 0 ] = 0.2;
89 x1[ 1 ] = 0.4;
90 DenseVector<double> x2( 2, 0.0 );
91 x2[ 0 ] = 0.4;
92 x2[ 1 ] = 0.2;
93 do
94 {
95 NlinAdv_mesh.update( 0.49 );
96 asym = std::max( asym, std::abs( NlinAdv_mesh.get_point_values( x1 )[0] - NlinAdv_mesh.get_point_values( x2 )[0] ) );
97 ++loop_counter;
98 }
99 while ( ( NlinAdv_mesh.get_time() < 1.0 ) && ( loop_counter < 20 ) );
100
101 // problem should be antisymmetric about y = x
102 if ( ( asym > 5.e-10 ) || ( loop_counter >= 1000 ) )
103 {
104 cout << "\033[1;31;48m * FAILED \033[0m\n";
105 cout << "asymmetry = " << asym << "\n";
106 cout << "loop counter = " << loop_counter << "\n";
107 return 1;
108 }
109 else
110 {
111 cout << "\033[1;32;48m * PASSED \033[0m\n";
112 return 0;
113 }
114
115} // end of main()
@ f
Definition: BVPBerman.cpp:15
int main()
A shorter bundled include file for hyperbolic problems.
An DenseVector class – a dense vector object.
Definition: DenseVector.h:34
void flux_fn_y(const DenseVector< double > &x, const DenseVector< double > &q, DenseVector< double > &f) const
A virtual flux function for the y-derivative.
NlinAdv()
Two dimemsional scalar linear advection problem.
void flux_fn_x(const DenseVector< double > &x, const DenseVector< double > &q, DenseVector< double > &f) const
A virtual flux function for the x-derivative.
void max_charac_speed(const DenseVector< double > &x, const DenseVector< double > &q, DenseVector< double > &c) const
Bound the wave speed.
A class to represent a two-dimensional hyperbolic system of equations.
DenseVector< double > get_point_values(const DenseVector< double > &x)
Get the vector of unknowns at a point in the 2D mesh.
const double & get_time() const
Get a const reference to the time value for the current mesh.
double update(const double &CFL, const double &max_dt=std::numeric_limits< long double >::max())
Update the mesh object.
void set_limiter(const unsigned &id)
Set the limiter type to be applied in the slope values.
void Q_init(const double &x, DenseVector< double > &q)
Set the initial state of the system.
DenseVector< double > uniform_node_vector(const double &lower, const double &upper, const std::size_t &N)
Return a DENSE vector with the nodal points of a uniform mesh distributed between the upper/lower bou...
Definition: Utility.cpp:113
A collection of OO numerical routines aimed at simple (typical) applied problems in continuum mechani...

© 2012

R.E. Hewitt