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

Solving the 2D ‘nonlinear 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 ‘nonlinear advection equation’.

\[ Q_t + \left ( \frac{Q^2}{\sqrt{2}} \right )_x + \left ( \frac{Q^2}{\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 sine distribution.

Definition in file HYP2DNonlinearAdvectionXY.cpp.

Function Documentation

◆ main()

int main ( )

Definition at line 66 of file HYP2DNonlinearAdvectionXY.cpp.

67{
68 cout << "\n";
69 cout << "=== Hyperbolic: 2D nonlinear advection at an angle ==\n";
70 cout << "\n";
71
72 std::string dirname("./DATA");
73 mkdir( dirname.c_str(), S_IRWXU );
74 std::string filename_stub( "./DATA/HYP_2D_nlin_adv_xy" );
75
76 // define the domain/mesh
77 const double west = -1.0;
78 const double east = 1.0;
79 const double south = -1.0;
80 const double north = 1.0;
81 const unsigned N = 151;
82 DenseVector<double> faces_x = Utility::uniform_node_vector( west, east, N );
83 DenseVector<double> faces_y = Utility::uniform_node_vector( south, north, N );
84
85 Example::NlinAdv conservative_problem;
86 TwoD_TVDLF_Mesh NlinAdv_mesh( faces_x, faces_y, &conservative_problem, Example::Q_init );
87 NlinAdv_mesh.set_limiter( 0 );
88
89 double asym( 0.0 );
90 unsigned loop_counter( 0 );
91 DenseVector<double> x1( 2, 0.0 );
92 x1[ 0 ] = 0.75;
93 x1[ 1 ] = 0.75;
94 DenseVector<double> x2( 2, 0.0 );
95 x2[ 0 ] = -0.75;
96 x2[ 1 ] = -0.75;
97 do
98 {
99 NlinAdv_mesh.update( 0.49 );
100 NlinAdv_mesh.dump_gnu( filename_stub + Utility::stringify( loop_counter ) + "_gnu.dat" );
101
102 asym = std::max( asym, std::abs( NlinAdv_mesh.get_point_values( x1 )[0] + NlinAdv_mesh.get_point_values( x2 )[0] ) );
103 ++loop_counter;
104 }
105 while ( ( NlinAdv_mesh.get_time() < 0.4 ) && ( loop_counter < 1000 ) );
106
107 // problem should be antisymmetric about x = 1/2
108 if ( ( asym > 1.e-9 ) || ( loop_counter >= 1000 ) )
109 {
110 cout << "\033[1;31;48m * FAILED \033[0m\n";
111 cout << "asymmetry = " << asym << "\n";
112 cout << "loop counter = " << loop_counter << "\n";
113 return 1;
114 }
115 else
116 {
117 cout << "\033[1;32;48m * PASSED \033[0m\n";
118 return 0;
119 }
120
121} // end of main()
An DenseVector class – a dense vector object.
Definition: DenseVector.h:34
std::string stringify(const int &val)
Return an integer value as a string - useful for file naming.
Definition: Utility.cpp:193
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::dump_gnu(), CppNoddy::TwoD_TVDLF_Mesh::get_point_values(), CppNoddy::TwoD_TVDLF_Mesh::get_time(), CppNoddy::TwoD_TVDLF_Mesh::set_limiter(), CppNoddy::Utility::stringify(), CppNoddy::Utility::uniform_node_vector(), and CppNoddy::TwoD_TVDLF_Mesh::update().

© 2012

R.E. Hewitt