Added function grid_equal() to compare two UnstructuredGrid instances.

This commit is contained in:
Joakim Hove 2014-04-20 10:17:31 +02:00
parent f9249b1d5d
commit 8260d945fa
5 changed files with 369 additions and 0 deletions

View File

@ -152,6 +152,7 @@ list (APPEND TEST_SOURCE_FILES
tests/test_propertysystem.cpp
tests/test_dgbasis.cpp
tests/test_cartgrid.cpp
tests/test_ug.cpp
tests/test_cubic.cpp
tests/test_event.cpp
tests/test_nonuniformtablelinear.cpp
@ -201,6 +202,7 @@ list (APPEND TEST_DATA_FILES
tests/wells_manager_data_wellSTOP.data
tests/wells_group.data
tests/TESTTIMER.DATA
tests/CORNERPOINT_ACTNUM.DATA
)
# originally generated with the command:

View File

@ -21,6 +21,7 @@
#define OPM_GRID_HEADER_INCLUDED
#include <stddef.h>
#include <stdbool.h>
/**
* \file
@ -299,6 +300,11 @@ allocate_grid(size_t ndims ,
struct UnstructuredGrid *
read_grid(const char *fname);
bool
grid_equal(const struct UnstructuredGrid * grid1 , const struct UnstructuredGrid * grid2);
#ifdef __cplusplus
}
#endif

View File

@ -540,3 +540,92 @@ read_grid(const char *fname)
return G;
}
/**
Ahhh - the joys of comparing floating point numbers ....
http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
*/
static int memcmp_double(const double * p1 , const double *p2 , size_t num_elements) {
if (memcmp(p1 , p2 , num_elements * sizeof * p1) == 0)
return 0;
else {
const double epsilon = 1e-5;
for (size_t index = 0; index < num_elements; index++) {
double diff = abs(p1[index] - p2[index]);
if (diff != 0) {
double sum = abs(p1[index]) + abs(p2[index]);
if (diff > sum * epsilon)
return 1;
}
}
return 0;
}
}
bool
grid_equal(const struct UnstructuredGrid * grid1 , const struct UnstructuredGrid * grid2) {
if ((grid1->dimensions == grid2->dimensions) &&
(grid1->number_of_cells == grid2->number_of_cells) &&
(grid1->number_of_faces == grid2->number_of_faces) &&
(grid1->number_of_nodes == grid2->number_of_nodes)) {
// Exact integer comparisons
{
if (memcmp(grid1->face_nodepos , grid2->face_nodepos , (grid1->number_of_faces + 1) * sizeof * grid1->face_nodepos) != 0)
return false;
if (memcmp(grid1->face_nodes , grid2->face_nodes , grid1->face_nodepos[grid1->number_of_faces] * sizeof * grid1->face_nodes) != 0)
return false;
if (memcmp(grid1->face_cells , grid2->face_cells , 2 * grid1->number_of_faces * sizeof * grid1->face_cells) != 0)
return false;
if (memcmp(grid1->cell_faces , grid2->cell_faces , grid1->cell_facepos[grid1->number_of_cells] * sizeof * grid1->cell_faces) != 0)
return false;
if (memcmp(grid1->cell_facepos , grid2->cell_facepos , (grid1->number_of_cells + 1) * sizeof * grid1->cell_facepos) != 0)
return false;
if (grid1->global_cell && grid2->global_cell) {
if (memcmp(grid1->global_cell , grid2->global_cell , grid1->number_of_cells * sizeof * grid1->global_cell) != 0)
return false;
} else if (grid1->global_cell != grid2->global_cell)
return false;
if (grid1->cell_facetag && grid2->cell_facetag) {
if (memcmp(grid1->cell_facetag , grid2->cell_facetag , grid1->cell_facepos[grid1->number_of_cells] * sizeof * grid1->cell_facetag) != 0)
return false;
} else if (grid1->cell_facetag != grid2->cell_facetag)
return false;
}
// Floating point comparisons.
{
if (memcmp_double( grid1->node_coordinates , grid2->node_coordinates , grid1->dimensions * grid1->number_of_nodes) != 0)
return false;
if (memcmp_double( grid1->face_centroids , grid2->face_centroids , grid1->dimensions * grid1->number_of_faces) != 0)
return false;
if (memcmp_double( grid1->face_areas , grid2->face_areas , grid1->number_of_faces) != 0)
return false;
if (memcmp_double( grid1->face_normals , grid2->face_normals , grid1->dimensions * grid1->number_of_faces) != 0)
return false;
if (memcmp_double( grid1->cell_centroids , grid2->cell_centroids , grid1->dimensions * grid1->number_of_cells) != 0)
return false;
if (memcmp_double( grid1->cell_volumes , grid2->cell_volumes , grid1->number_of_cells) != 0)
return false;
}
return true;
} else
return false;
}

View File

@ -0,0 +1,206 @@
RUNSPEC
DIMENS
10 10 5 /
GRID
COORD
0.00000000E+00 0.00000000E+00 0.00000000E+00 0.00000000E+00
0.00000000E+00 0.20000000E+02 0.10000000E+02 0.00000000E+00
0.00000000E+00 0.10000000E+02 0.00000000E+00 0.20000000E+02
0.20000000E+02 0.00000000E+00 0.00000000E+00 0.20000000E+02
0.00000000E+00 0.20000000E+02 0.30000000E+02 0.00000000E+00
0.00000000E+00 0.30000000E+02 0.00000000E+00 0.20000000E+02
0.40000000E+02 0.00000000E+00 0.00000000E+00 0.40000000E+02
0.00000000E+00 0.20000000E+02 0.50000000E+02 0.00000000E+00
0.00000000E+00 0.50000000E+02 0.00000000E+00 0.20000000E+02
0.60000000E+02 0.00000000E+00 0.00000000E+00 0.60000000E+02
0.00000000E+00 0.20000000E+02 0.70000000E+02 0.00000000E+00
0.00000000E+00 0.70000000E+02 0.00000000E+00 0.20000000E+02
0.80000000E+02 0.00000000E+00 0.00000000E+00 0.80000000E+02
0.00000000E+00 0.20000000E+02 0.90000000E+02 0.00000000E+00
0.00000000E+00 0.90000000E+02 0.00000000E+00 0.20000000E+02
0.10000000E+03 0.00000000E+00 0.00000000E+00 0.10000000E+03
0.00000000E+00 0.20000000E+02 0.00000000E+00 0.12000000E+02
0.00000000E+00 0.00000000E+00 0.12000000E+02 0.20000000E+02
0.10000000E+02 0.12000000E+02 0.00000000E+00 0.10000000E+02
0.12000000E+02 0.20000000E+02 0.20000000E+02 0.12000000E+02
0.00000000E+00 0.20000000E+02 0.12000000E+02 0.20000000E+02
0.30000000E+02 0.12000000E+02 0.00000000E+00 0.30000000E+02
0.12000000E+02 0.20000000E+02 0.40000000E+02 0.12000000E+02
0.00000000E+00 0.40000000E+02 0.12000000E+02 0.20000000E+02
0.50000000E+02 0.12000000E+02 0.00000000E+00 0.50000000E+02
0.12000000E+02 0.20000000E+02 0.60000000E+02 0.12000000E+02
0.00000000E+00 0.60000000E+02 0.12000000E+02 0.20000000E+02
0.70000000E+02 0.12000000E+02 0.00000000E+00 0.70000000E+02
0.12000000E+02 0.20000000E+02 0.80000000E+02 0.12000000E+02
0.00000000E+00 0.80000000E+02 0.12000000E+02 0.20000000E+02
0.90000000E+02 0.12000000E+02 0.00000000E+00 0.90000000E+02
0.12000000E+02 0.20000000E+02 0.10000000E+03 0.12000000E+02
0.00000000E+00 0.10000000E+03 0.12000000E+02 0.20000000E+02
0.00000000E+00 0.24000000E+02 0.00000000E+00 0.00000000E+00
0.24000000E+02 0.20000000E+02 0.10000000E+02 0.24000000E+02
0.00000000E+00 0.10000000E+02 0.24000000E+02 0.20000000E+02
0.20000000E+02 0.24000000E+02 0.00000000E+00 0.20000000E+02
0.24000000E+02 0.20000000E+02 0.30000000E+02 0.24000000E+02
0.00000000E+00 0.30000000E+02 0.24000000E+02 0.20000000E+02
0.40000000E+02 0.24000000E+02 0.00000000E+00 0.40000000E+02
0.24000000E+02 0.20000000E+02 0.50000000E+02 0.24000000E+02
0.00000000E+00 0.50000000E+02 0.24000000E+02 0.20000000E+02
0.60000000E+02 0.24000000E+02 0.00000000E+00 0.60000000E+02
0.24000000E+02 0.20000000E+02 0.70000000E+02 0.24000000E+02
0.00000000E+00 0.70000000E+02 0.24000000E+02 0.20000000E+02
0.80000000E+02 0.24000000E+02 0.00000000E+00 0.80000000E+02
0.24000000E+02 0.20000000E+02 0.90000000E+02 0.24000000E+02
0.00000000E+00 0.90000000E+02 0.24000000E+02 0.20000000E+02
0.10000000E+03 0.24000000E+02 0.00000000E+00 0.10000000E+03
0.24000000E+02 0.20000000E+02 0.00000000E+00 0.36000000E+02
0.00000000E+00 0.00000000E+00 0.36000000E+02 0.20000000E+02
0.10000000E+02 0.36000000E+02 0.00000000E+00 0.10000000E+02
0.36000000E+02 0.20000000E+02 0.20000000E+02 0.36000000E+02
0.00000000E+00 0.20000000E+02 0.36000000E+02 0.20000000E+02
0.30000000E+02 0.36000000E+02 0.00000000E+00 0.30000000E+02
0.36000000E+02 0.20000000E+02 0.40000000E+02 0.36000000E+02
0.00000000E+00 0.40000000E+02 0.36000000E+02 0.20000000E+02
0.50000000E+02 0.36000000E+02 0.00000000E+00 0.50000000E+02
0.36000000E+02 0.20000000E+02 0.60000000E+02 0.36000000E+02
0.00000000E+00 0.60000000E+02 0.36000000E+02 0.20000000E+02
0.70000000E+02 0.36000000E+02 0.00000000E+00 0.70000000E+02
0.36000000E+02 0.20000000E+02 0.80000000E+02 0.36000000E+02
0.00000000E+00 0.80000000E+02 0.36000000E+02 0.20000000E+02
0.90000000E+02 0.36000000E+02 0.00000000E+00 0.90000000E+02
0.36000000E+02 0.20000000E+02 0.10000000E+03 0.36000000E+02
0.00000000E+00 0.10000000E+03 0.36000000E+02 0.20000000E+02
0.00000000E+00 0.48000000E+02 0.00000000E+00 0.00000000E+00
0.48000000E+02 0.20000000E+02 0.10000000E+02 0.48000000E+02
0.00000000E+00 0.10000000E+02 0.48000000E+02 0.20000000E+02
0.20000000E+02 0.48000000E+02 0.00000000E+00 0.20000000E+02
0.48000000E+02 0.20000000E+02 0.30000000E+02 0.48000000E+02
0.00000000E+00 0.30000000E+02 0.48000000E+02 0.20000000E+02
0.40000000E+02 0.48000000E+02 0.00000000E+00 0.40000000E+02
0.48000000E+02 0.20000000E+02 0.50000000E+02 0.48000000E+02
0.00000000E+00 0.50000000E+02 0.48000000E+02 0.20000000E+02
0.60000000E+02 0.48000000E+02 0.00000000E+00 0.60000000E+02
0.48000000E+02 0.20000000E+02 0.70000000E+02 0.48000000E+02
0.00000000E+00 0.70000000E+02 0.48000000E+02 0.20000000E+02
0.80000000E+02 0.48000000E+02 0.00000000E+00 0.80000000E+02
0.48000000E+02 0.20000000E+02 0.90000000E+02 0.48000000E+02
0.00000000E+00 0.90000000E+02 0.48000000E+02 0.20000000E+02
0.10000000E+03 0.48000000E+02 0.00000000E+00 0.10000000E+03
0.48000000E+02 0.20000000E+02 0.00000000E+00 0.60000000E+02
0.00000000E+00 0.00000000E+00 0.60000000E+02 0.20000000E+02
0.10000000E+02 0.60000000E+02 0.00000000E+00 0.10000000E+02
0.60000000E+02 0.20000000E+02 0.20000000E+02 0.60000000E+02
0.00000000E+00 0.20000000E+02 0.60000000E+02 0.20000000E+02
0.30000000E+02 0.60000000E+02 0.00000000E+00 0.30000000E+02
0.60000000E+02 0.20000000E+02 0.40000000E+02 0.60000000E+02
0.00000000E+00 0.40000000E+02 0.60000000E+02 0.20000000E+02
0.50000000E+02 0.60000000E+02 0.00000000E+00 0.50000000E+02
0.60000000E+02 0.20000000E+02 0.60000000E+02 0.60000000E+02
0.00000000E+00 0.60000000E+02 0.60000000E+02 0.20000000E+02
0.70000000E+02 0.60000000E+02 0.00000000E+00 0.70000000E+02
0.60000000E+02 0.20000000E+02 0.80000000E+02 0.60000000E+02
0.00000000E+00 0.80000000E+02 0.60000000E+02 0.20000000E+02
0.90000000E+02 0.60000000E+02 0.00000000E+00 0.90000000E+02
0.60000000E+02 0.20000000E+02 0.10000000E+03 0.60000000E+02
0.00000000E+00 0.10000000E+03 0.60000000E+02 0.20000000E+02
0.00000000E+00 0.72000000E+02 0.00000000E+00 0.00000000E+00
0.72000000E+02 0.20000000E+02 0.10000000E+02 0.72000000E+02
0.00000000E+00 0.10000000E+02 0.72000000E+02 0.20000000E+02
0.20000000E+02 0.72000000E+02 0.00000000E+00 0.20000000E+02
0.72000000E+02 0.20000000E+02 0.30000000E+02 0.72000000E+02
0.00000000E+00 0.30000000E+02 0.72000000E+02 0.20000000E+02
0.40000000E+02 0.72000000E+02 0.00000000E+00 0.40000000E+02
0.72000000E+02 0.20000000E+02 0.50000000E+02 0.72000000E+02
0.00000000E+00 0.50000000E+02 0.72000000E+02 0.20000000E+02
0.60000000E+02 0.72000000E+02 0.00000000E+00 0.60000000E+02
0.72000000E+02 0.20000000E+02 0.70000000E+02 0.72000000E+02
0.00000000E+00 0.70000000E+02 0.72000000E+02 0.20000000E+02
0.80000000E+02 0.72000000E+02 0.00000000E+00 0.80000000E+02
0.72000000E+02 0.20000000E+02 0.90000000E+02 0.72000000E+02
0.00000000E+00 0.90000000E+02 0.72000000E+02 0.20000000E+02
0.10000000E+03 0.72000000E+02 0.00000000E+00 0.10000000E+03
0.72000000E+02 0.20000000E+02 0.00000000E+00 0.84000000E+02
0.00000000E+00 0.00000000E+00 0.84000000E+02 0.20000000E+02
0.10000000E+02 0.84000000E+02 0.00000000E+00 0.10000000E+02
0.84000000E+02 0.20000000E+02 0.20000000E+02 0.84000000E+02
0.00000000E+00 0.20000000E+02 0.84000000E+02 0.20000000E+02
0.30000000E+02 0.84000000E+02 0.00000000E+00 0.30000000E+02
0.84000000E+02 0.20000000E+02 0.40000000E+02 0.84000000E+02
0.00000000E+00 0.40000000E+02 0.84000000E+02 0.20000000E+02
0.50000000E+02 0.84000000E+02 0.00000000E+00 0.50000000E+02
0.84000000E+02 0.20000000E+02 0.60000000E+02 0.84000000E+02
0.00000000E+00 0.60000000E+02 0.84000000E+02 0.20000000E+02
0.70000000E+02 0.84000000E+02 0.00000000E+00 0.70000000E+02
0.84000000E+02 0.20000000E+02 0.80000000E+02 0.84000000E+02
0.00000000E+00 0.80000000E+02 0.84000000E+02 0.20000000E+02
0.90000000E+02 0.84000000E+02 0.00000000E+00 0.90000000E+02
0.84000000E+02 0.20000000E+02 0.10000000E+03 0.84000000E+02
0.00000000E+00 0.10000000E+03 0.84000000E+02 0.20000000E+02
0.00000000E+00 0.96000000E+02 0.00000000E+00 0.00000000E+00
0.96000000E+02 0.20000000E+02 0.10000000E+02 0.96000000E+02
0.00000000E+00 0.10000000E+02 0.96000000E+02 0.20000000E+02
0.20000000E+02 0.96000000E+02 0.00000000E+00 0.20000000E+02
0.96000000E+02 0.20000000E+02 0.30000000E+02 0.96000000E+02
0.00000000E+00 0.30000000E+02 0.96000000E+02 0.20000000E+02
0.40000000E+02 0.96000000E+02 0.00000000E+00 0.40000000E+02
0.96000000E+02 0.20000000E+02 0.50000000E+02 0.96000000E+02
0.00000000E+00 0.50000000E+02 0.96000000E+02 0.20000000E+02
0.60000000E+02 0.96000000E+02 0.00000000E+00 0.60000000E+02
0.96000000E+02 0.20000000E+02 0.70000000E+02 0.96000000E+02
0.00000000E+00 0.70000000E+02 0.96000000E+02 0.20000000E+02
0.80000000E+02 0.96000000E+02 0.00000000E+00 0.80000000E+02
0.96000000E+02 0.20000000E+02 0.90000000E+02 0.96000000E+02
0.00000000E+00 0.90000000E+02 0.96000000E+02 0.20000000E+02
0.10000000E+03 0.96000000E+02 0.00000000E+00 0.10000000E+03
0.96000000E+02 0.20000000E+02 0.00000000E+00 0.10800000E+03
0.00000000E+00 0.00000000E+00 0.10800000E+03 0.20000000E+02
0.10000000E+02 0.10800000E+03 0.00000000E+00 0.10000000E+02
0.10800000E+03 0.20000000E+02 0.20000000E+02 0.10800000E+03
0.00000000E+00 0.20000000E+02 0.10800000E+03 0.20000000E+02
0.30000000E+02 0.10800000E+03 0.00000000E+00 0.30000000E+02
0.10800000E+03 0.20000000E+02 0.40000000E+02 0.10800000E+03
0.00000000E+00 0.40000000E+02 0.10800000E+03 0.20000000E+02
0.50000000E+02 0.10800000E+03 0.00000000E+00 0.50000000E+02
0.10800000E+03 0.20000000E+02 0.60000000E+02 0.10800000E+03
0.00000000E+00 0.60000000E+02 0.10800000E+03 0.20000000E+02
0.70000000E+02 0.10800000E+03 0.00000000E+00 0.70000000E+02
0.10800000E+03 0.20000000E+02 0.80000000E+02 0.10800000E+03
0.00000000E+00 0.80000000E+02 0.10800000E+03 0.20000000E+02
0.90000000E+02 0.10800000E+03 0.00000000E+00 0.90000000E+02
0.10800000E+03 0.20000000E+02 0.10000000E+03 0.10800000E+03
0.00000000E+00 0.10000000E+03 0.10800000E+03 0.20000000E+02
0.00000000E+00 0.12000000E+03 0.00000000E+00 0.00000000E+00
0.12000000E+03 0.20000000E+02 0.10000000E+02 0.12000000E+03
0.00000000E+00 0.10000000E+02 0.12000000E+03 0.20000000E+02
0.20000000E+02 0.12000000E+03 0.00000000E+00 0.20000000E+02
0.12000000E+03 0.20000000E+02 0.30000000E+02 0.12000000E+03
0.00000000E+00 0.30000000E+02 0.12000000E+03 0.20000000E+02
0.40000000E+02 0.12000000E+03 0.00000000E+00 0.40000000E+02
0.12000000E+03 0.20000000E+02 0.50000000E+02 0.12000000E+03
0.00000000E+00 0.50000000E+02 0.12000000E+03 0.20000000E+02
0.60000000E+02 0.12000000E+03 0.00000000E+00 0.60000000E+02
0.12000000E+03 0.20000000E+02 0.70000000E+02 0.12000000E+03
0.00000000E+00 0.70000000E+02 0.12000000E+03 0.20000000E+02
0.80000000E+02 0.12000000E+03 0.00000000E+00 0.80000000E+02
0.12000000E+03 0.20000000E+02 0.90000000E+02 0.12000000E+03
0.00000000E+00 0.90000000E+02 0.12000000E+03 0.20000000E+02
0.10000000E+03 0.12000000E+03 0.00000000E+00 0.10000000E+03
0.12000000E+03 0.20000000E+02
/
ZCORN
400*0.00
400*0.40E+01
400*0.80E+01
400*1.20E+02
400*1.60E+02
400*2.00E+02
/
ACTNUM
200*0 100*1 200*0 /
EDIT

66
tests/test_ug.cpp Normal file
View File

@ -0,0 +1,66 @@
/* Copyright 2014 Statoil ASA
* This file is licensed under GPL3, see http://www.opm-project.org/
*/
#include <config.h>
/* --- Boost.Test boilerplate --- */
#if HAVE_DYNAMIC_BOOST_TEST
#define BOOST_TEST_DYN_LINK
#endif
#define NVERBOSE // Suppress own messages when throw()ing
#define BOOST_TEST_MODULE TEST_UG
#include <boost/test/unit_test.hpp>
#include <boost/test/floating_point_comparison.hpp>
/* --- our own headers --- */
#include <algorithm>
#include <vector>
#include <opm/core/grid.h>
#include <opm/core/grid/cornerpoint_grid.h> /* compute_geometry */
#include <opm/core/grid/GridManager.hpp> /* compute_geometry */
#include <opm/parser/eclipse/Parser/Parser.hpp>
#include <opm/parser/eclipse/Deck/Deck.hpp>
using namespace std;
BOOST_AUTO_TEST_CASE(Equal) {
const std::string filename1 = "CORNERPOINT_ACTNUM.DATA";
const char *deck2Data =
"RUNSPEC\n"
"\n"
"DIMENS\n"
" 10 10 10 /\n"
"GRID\n"
"DXV\n"
"10*0.25 /\n"
"DYV\n"
"10*0.25 /\n"
"DZV\n"
"10*0.25 /\n"
"TOPS\n"
"100*0.25 /\n"
"EDIT\n"
"\n";
Opm::ParserPtr parser(new Opm::Parser() );
Opm::DeckConstPtr deck1 = parser->parseFile( filename1 );
Opm::DeckConstPtr deck2 = parser->parseString( deck2Data );
Opm::GridManager grid1(deck1);
Opm::GridManager grid2(deck2);
const UnstructuredGrid* cgrid1 = grid1.c_grid();
const UnstructuredGrid* cgrid2 = grid2.c_grid();
BOOST_CHECK( grid_equal( cgrid1 , cgrid1 ));
BOOST_CHECK( grid_equal( cgrid2 , cgrid2 ));
BOOST_CHECK( !grid_equal( cgrid1 , cgrid2 ));
}