8 #ifndef OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_UNIT_TEST_HPP_ 9 #define OPENFPM_NUMERICS_SRC_FINITEDIFFERENCE_EQ_UNIT_TEST_HPP_ 11 #define BOOST_TEST_DYN_LINK 12 #include <boost/test/unit_test.hpp> 14 #include "Laplacian.hpp" 15 #include "FiniteDifference/eq.hpp" 16 #include "FiniteDifference/sum.hpp" 17 #include "FiniteDifference/mul.hpp" 18 #include "Grid/grid_dist_id.hpp" 19 #include "Decomposition/CartDecomposition.hpp" 20 #include "Vector/Vector.hpp" 21 #include "Solvers/umfpack_solver.hpp" 22 #include "data_type/aggregate.hpp" 23 #include "FiniteDifference/FDScheme.hpp" 25 constexpr
unsigned int x = 0;
26 constexpr
unsigned int y = 1;
27 constexpr
unsigned int z = 2;
28 constexpr
unsigned int V = 0;
30 BOOST_AUTO_TEST_SUITE( eq_test_suite )
37 static const unsigned int dims = 2;
40 static const unsigned int nvar = 3;
43 static const bool boundary[];
61 static const int grid_type = STAGGERED_GRID;
64 const bool lid_nn::boundary[] = {NON_PERIODIC,NON_PERIODIC};
73 typedef void const_field;
75 static float val() {
return 1.0;}
79 constexpr
unsigned int v[] = {0,1};
80 constexpr
unsigned int P = 2;
81 constexpr
unsigned int ic = 2;
146 template<
typename solver_type,
typename l
id_nn>
void lid_driven_cavity_2d()
156 constexpr
int velocity = 0;
157 constexpr
int pressure = 1;
166 long int sz[] = {256,64};
168 szu[0] = (size_t)sz[0];
169 szu[1] = (size_t)sz[1];
191 fd.impose(
ic_eq(),0.0, EQ_3, {0,0},{sz[0]-2,sz[1]-2},
true);
192 fd.impose(
Prs(), 0.0, EQ_3, {0,0},{0,0});
195 fd.impose(
vx_eq(),0.0, EQ_1, {1,0},{sz[0]-2,sz[1]-2});
196 fd.impose(
vy_eq(),0.0, EQ_2, {0,1},{sz[0]-2,sz[1]-2});
200 fd.impose(
v_x(),0.0, EQ_1, {0,0},{0,sz[1]-2});
201 fd.impose(
avg_vy_f(),0.0, EQ_2 , {-1,0},{-1,sz[1]-1});
203 fd.impose(
v_x(),0.0, EQ_1, {sz[0]-1,0},{sz[0]-1,sz[1]-2});
204 fd.impose(
avg_vy(),1.0, EQ_2, {sz[0]-1,0},{sz[0]-1,sz[1]-1});
207 fd.impose(
avg_vx_f(),0.0, EQ_1, {0,-1},{sz[0]-1,-1});
208 fd.impose(
v_y(), 0.0, EQ_2, {0,0},{sz[0]-2,0});
210 fd.impose(
avg_vx(),0.0, EQ_1, {0,sz[1]-1},{sz[0]-1,sz[1]-1});
211 fd.impose(
v_y(), 0.0, EQ_2, {0,sz[1]-1},{sz[0]-2,sz[1]-1});
220 fd.impose(
Prs(), 0.0, EQ_3, {-1,-1},{sz[0]-1,-1});
221 fd.impose(
Prs(), 0.0, EQ_3, {-1,sz[1]-1},{sz[0]-1,sz[1]-1});
222 fd.impose(
Prs(), 0.0, EQ_3, {-1,0},{-1,sz[1]-2});
223 fd.impose(
Prs(), 0.0, EQ_3, {sz[0]-1,0},{sz[0]-1,sz[1]-2});
226 fd.impose(
v_x(), 0.0, EQ_1, {-1,-1},{-1,sz[1]-1});
227 fd.impose(
v_y(), 0.0, EQ_2, {-1,-1},{sz[0]-1,-1});
230 auto x = solver.solve(fd.getA(),fd.getB());
236 fd.template copy<velocity,pressure>(x,{0,0},{sz[0]-1,sz[1]-1},g_dist);
238 std::string s = std::string(demangle(
typeid(solver_type).name()));
243 g_dist.write(s +
"lid_driven_cavity_p" + std::to_string(v_cl.
getProcessingUnits()) +
"_grid");
245 #if !(defined(SE_CLASS3) || defined(TEST_COVERAGE_MODE)) 249 g_dist2.
load(
"test/lid_driven_cavity_reference.hdf5");
251 auto it2 = g_dist2.getDomainIterator();
258 test &= fabs(g_dist2.template getProp<velocity>(p)[0] - g_dist.template getProp<velocity>(p)[0]) < 3.5e-5;
259 test &= fabs(g_dist2.template getProp<velocity>(p)[1] - g_dist.template getProp<velocity>(p)[1]) < 3.5e-5;
261 test &= fabs(g_dist2.template getProp<pressure>(p) - g_dist.template getProp<pressure>(p)) < 3.0e-4;
265 std::cout << g_dist2.template getProp<velocity>(p)[0] <<
" " << g_dist.template getProp<velocity>(p)[0] << std::endl;
266 std::cout << g_dist2.template getProp<velocity>(p)[1] <<
" " << g_dist.template getProp<velocity>(p)[1] << std::endl;
268 std::cout << g_dist2.template getProp<pressure>(p) <<
" " << g_dist.template getProp<pressure>(p) << std::endl;
276 BOOST_REQUIRE_EQUAL(test,
true);
283 BOOST_AUTO_TEST_CASE(lid_driven_cavity)
285 #if defined(HAVE_EIGEN) && defined(HAVE_SUITESPARSE) 286 lid_driven_cavity_2d<umfpack_solver<double>,
lid_nn>();
290 BOOST_AUTO_TEST_SUITE_END()
Derivative second order on h (spacing)
[Definition of the system]
It ancapsulate the minus operation.
Sparse Matrix implementation stub object when OpenFPM is compiled with no linear algebra support.
Class that contain Padding information on each direction positive and Negative direction.
Implementation of VCluster class.
It model an expression expr1 * expr2.
This class decompose a space into sub-sub-domains and distribute them across processors.
Sparse Matrix implementation.
This is a distributed grid.
[Definition of the system]
size_t getProcessingUnits()
Get the total number of processors.
This class represent an N-dimensional box.
It model an expression expr1 + ... exprn.
Test structure used for several test.
void load(const std::string &filename)
Reload the grid from HDF5 file.