CppNoddy  0.92
Loading...
Searching...
No Matches
Classes | Namespaces | Functions
HYP2DLinearAdvectionXY.cpp File Reference

Solving the 2D advection equation. More...

#include <TwoD_HYP_bundle.h>

Go to the source code of this file.

Classes

class  CppNoddy::Example::NlinAdv
 Define the system. More...
 

Namespaces

namespace  CppNoddy
 A collection of OO numerical routines aimed at simple (typical) applied problems in continuum mechanics.
 
namespace  CppNoddy::Example
 

Functions

void CppNoddy::Example::Q_init (const double &x, const double &y, DenseVector< double > &q)
 Set the initial state of the system. More...
 
int main ()
 

Detailed Description

Solving the 2D advection equation.

\[ 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) \]

using a TVD Lax-Friedrichs scheme for $ (x,y)\in[-1,1]\times[-1,1]$. The initial condition is a step.

Definition in file HYP2DLinearAdvectionXY.cpp.

Function Documentation

◆ main()

int main ( )

Definition at line 65 of file HYP2DLinearAdvectionXY.cpp.

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()
An DenseVector class – a dense vector object.
Definition: DenseVector.h:34
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

References CppNoddy::TwoD_TVDLF_Mesh::get_point_values(), CppNoddy::TwoD_TVDLF_Mesh::get_time(), CppNoddy::TwoD_TVDLF_Mesh::set_limiter(), CppNoddy::Utility::uniform_node_vector(), and CppNoddy::TwoD_TVDLF_Mesh::update().

© 2012

R.E. Hewitt