Skip to content
Snippets Groups Projects
Commit 60af96d6 authored by Stéphane Del Pino's avatar Stéphane Del Pino
Browse files

Merge branch 'fix/parallel-checker' into 'develop'

Fix parallel checker for SubItem{Value,Array}

See merge request !196
parents 77c2f6ed 3933b63a
No related branches found
No related tags found
1 merge request!196Fix parallel checker for SubItem{Value,Array}
......@@ -292,6 +292,31 @@ class ParallelChecker
}
}
template <ItemType item_type, ItemType sub_item_type>
Array<const typename ConnectivityMatrix::IndexType>
_getSubItemValues(const std::shared_ptr<const IConnectivity>& i_connectivity)
{
switch (i_connectivity->dimension()) {
case 1: {
const Connectivity<1>& connectivity = dynamic_cast<const Connectivity<1>&>(*i_connectivity);
return connectivity.getMatrix(item_type, sub_item_type).values();
}
case 2: {
const Connectivity<2>& connectivity = dynamic_cast<const Connectivity<2>&>(*i_connectivity);
return connectivity.getMatrix(item_type, sub_item_type).values();
}
case 3: {
const Connectivity<3>& connectivity = dynamic_cast<const Connectivity<3>&>(*i_connectivity);
return connectivity.getMatrix(item_type, sub_item_type).values();
}
// LCOV_EXCL_START
default: {
throw UnexpectedError("unexpected connectivity dimension");
}
// LCOV_EXCL_STOP
}
}
template <ItemType item_type>
Array<const int>
_getItemOwner(const std::shared_ptr<const IConnectivity>& i_connectivity) const
......@@ -371,12 +396,12 @@ class ParallelChecker
}
HighFive::DataSet item_numbers = file.getDataSet(item_number_path + "/numbers");
group.createHardLink("numbers", item_numbers);
group.createHardLink(std::string(itemName(item_type)) + "_numbers", item_numbers);
}
template <typename ItemOfItem>
void
_writeSubItemRowsMap(const std::shared_ptr<const IConnectivity> i_connectivity,
_writeSubItemMatrix(const std::shared_ptr<const IConnectivity> i_connectivity,
HighFive::File file,
HighFive::Group group)
{
......@@ -391,10 +416,14 @@ class ParallelChecker
HighFive::Group subitem_of_item_row_map_group = file.createGroup(subitem_of_item_row_map_path);
this->_writeArray(subitem_of_item_row_map_group, "rows_map",
this->_getSubItemRowsMap<item_type, sub_item_type>(i_connectivity));
this->_writeArray(subitem_of_item_row_map_group, "sub_item_index",
this->_getSubItemValues<item_type, sub_item_type>(i_connectivity));
}
HighFive::DataSet subitem_of_item_row_map = file.getDataSet(subitem_of_item_row_map_path + "/rows_map");
group.createHardLink("rows_map", subitem_of_item_row_map);
HighFive::DataSet subitem_of_item_index = file.getDataSet(subitem_of_item_row_map_path + "/sub_item_index");
group.createHardLink("sub_item_index", subitem_of_item_index);
}
template <typename DataType, ItemType item_type>
......@@ -432,7 +461,10 @@ class ParallelChecker
<< rang::fg::reset << ")\n";
is_comparable = false;
}
std::vector reference_data_shape = group.getDataSet(reference_name).getSpace().getDimensions();
auto data_group = group.getGroup("data");
std::vector reference_data_shape = data_group.getDataSet(reference_name).getSpace().getDimensions();
if (reference_data_shape.size() != data_shape.size()) {
std::cout << rang::fg::cyan << " | " << rang::fgB::red << "different data shape kind: reference ("
<< rang::fgB::yellow << reference_data_shape.size() << "d array" << rang::fgB::red << ") / target ("
......@@ -554,7 +586,9 @@ class ParallelChecker
group.createAttribute("item_type", std::string{itemName(item_type)});
group.createAttribute("data_type", demangle<DataType>());
this->_writeArray(group, name, item_value.arrayView());
auto data_group = group.createGroup("data");
this->_writeArray(data_group, name, item_value.arrayView());
this->_writeItemNumbers<item_type>(i_connectivity, file, group);
......@@ -593,7 +627,8 @@ class ParallelChecker
group.createAttribute("item_type", std::string{itemName(item_type)});
group.createAttribute("data_type", demangle<DataType>());
this->_writeTable(group, name, item_array.tableView());
auto data_group = group.createGroup("data");
this->_writeTable(data_group, name, item_array.tableView());
this->_writeItemNumbers<item_type>(i_connectivity, file, group);
......@@ -637,10 +672,12 @@ class ParallelChecker
group.createAttribute("data_type", demangle<DataType>());
this->_writeArray(group, name, subitem_value_per_item.arrayView());
auto data_group = group.createGroup("data");
this->_writeArray(data_group, name, subitem_value_per_item.arrayView());
this->_writeItemNumbers<item_type>(i_connectivity, file, group);
this->_writeSubItemRowsMap<ItemOfItem>(i_connectivity, file, group);
this->_writeItemNumbers<sub_item_type>(i_connectivity, file, group);
this->_writeSubItemMatrix<ItemOfItem>(i_connectivity, file, group);
++m_tag;
......@@ -682,10 +719,12 @@ class ParallelChecker
group.createAttribute("data_type", demangle<DataType>());
this->_writeTable(group, name, subitem_value_per_item.tableView());
auto data_group = group.createGroup("data");
this->_writeTable(data_group, name, subitem_value_per_item.tableView());
this->_writeItemNumbers<item_type>(i_connectivity, file, group);
this->_writeSubItemRowsMap<ItemOfItem>(i_connectivity, file, group);
this->_writeItemNumbers<sub_item_type>(i_connectivity, file, group);
this->_writeSubItemMatrix<ItemOfItem>(i_connectivity, file, group);
++m_tag;
......@@ -720,8 +759,12 @@ class ParallelChecker
std::vector<size_t>{item_value.numberOfItems()}, i_connectivity,
group);
Array<const int> reference_item_numbers = this->_readArray<int>(group, "numbers");
Array<const DataType> reference_item_value = this->_readArray<DataType>(group, reference_name);
Array<const int> reference_item_numbers =
this->_readArray<int>(group, std::string{itemName(item_type)} + "_numbers");
auto data_group = group.getGroup("data");
Array<const DataType> reference_item_value = this->_readArray<DataType>(data_group, reference_name);
Array<const int> item_numbers = this->_getItemNumber<item_type>(i_connectivity);
......@@ -846,8 +889,12 @@ class ParallelChecker
item_array.sizeOfArrays()},
i_connectivity, group);
Array<const int> reference_item_numbers = this->_readArray<int>(group, "numbers");
Table<const DataType> reference_item_array = this->_readTable<DataType>(group, reference_name);
Array<const int> reference_item_numbers =
this->_readArray<int>(group, std::string{itemName(item_type)} + "_numbers");
auto data_group = group.getGroup("data");
Table<const DataType> reference_item_array = this->_readTable<DataType>(data_group, reference_name);
Array<const int> item_numbers = this->_getItemNumber<item_type>(i_connectivity);
......@@ -980,12 +1027,19 @@ class ParallelChecker
constexpr ItemType sub_item_type = ItemOfItem::sub_item_type;
using IndexType = typename ConnectivityMatrix::IndexType;
Array<const int> reference_item_numbers = this->_readArray<int>(group, "numbers");
Array<const int> reference_item_numbers =
this->_readArray<int>(group, std::string{itemName(item_type)} + "_numbers");
Array<const int> reference_sub_item_numbers =
this->_readArray<int>(group, std::string{itemName(sub_item_type)} + "_numbers");
Array<const IndexType> reference_subitem_rows_map = this->_readArray<IndexType>(group, "rows_map");
Array<const IndexType> reference_subitem_index = this->_readArray<IndexType>(group, "sub_item_index");
auto data_group = group.getGroup("data");
Array<const DataType> reference_subitem_value_per_item = this->_readArray<DataType>(group, reference_name);
Array<const DataType> reference_subitem_value_per_item = this->_readArray<DataType>(data_group, reference_name);
Array<const int> item_numbers = this->_getItemNumber<item_type>(i_connectivity);
Array<const int> sub_item_numbers = this->_getItemNumber<sub_item_type>(i_connectivity);
Array<const IndexType> sub_item_row_map = this->_getSubItemRowsMap<item_type, sub_item_type>(i_connectivity);
using ItemId = ItemIdT<item_type>;
......@@ -1019,6 +1073,8 @@ class ParallelChecker
}
this->_checkGlobalNumberOfItems<item_type>(i_connectivity, reference_item_numbers.size());
auto item_to_sub_item_matrix = i_connectivity->getMatrix(item_type, sub_item_type);
Array<const int> owner = this->_getItemOwner<item_type>(i_connectivity);
bool has_own_differences = false;
......@@ -1030,6 +1086,8 @@ class ParallelChecker
const size_t index_end_in_reference = reference_subitem_rows_map[reference_item_index + 1];
bool item_is_same = true;
if ((item_type > sub_item_type) or (static_cast<size_t>(owner[item_id]) == parallel::rank())) {
if ((index_end_in_reference - index_begin_in_reference) != subitem_value_per_item[item_id].size()) {
item_is_same = false;
} else {
......@@ -1040,6 +1098,21 @@ class ParallelChecker
}
}
}
} else {
std::map<int, size_t> sub_item_number_to_index;
for (size_t index = index_begin_in_reference; index < index_end_in_reference; ++index) {
sub_item_number_to_index[reference_sub_item_numbers[reference_subitem_index[index]]] = index;
}
auto sub_item_list = item_to_sub_item_matrix[item_id];
for (size_t i_sub_item = 0; i_sub_item < sub_item_list.size(); ++i_sub_item) {
auto sub_item_id = sub_item_list[i_sub_item];
auto index = sub_item_number_to_index.at(sub_item_numbers[sub_item_id]);
if (reference_subitem_value_per_item[index] != subitem_value_per_item[item_id][i_sub_item]) {
item_is_same = false;
}
}
}
if (not item_is_same) {
is_same = false;
if (static_cast<size_t>(owner[item_id]) == parallel::rank()) {
......@@ -1147,12 +1220,19 @@ class ParallelChecker
constexpr ItemType sub_item_type = ItemOfItem::sub_item_type;
using IndexType = typename ConnectivityMatrix::IndexType;
Array<const int> reference_item_numbers = this->_readArray<int>(group, "numbers");
Array<const int> reference_item_numbers =
this->_readArray<int>(group, std::string{itemName(item_type)} + "_numbers");
Array<const int> reference_sub_item_numbers =
this->_readArray<int>(group, std::string{itemName(sub_item_type)} + "_numbers");
Array<const IndexType> reference_subitem_rows_map = this->_readArray<IndexType>(group, "rows_map");
Array<const IndexType> reference_subitem_index = this->_readArray<IndexType>(group, "sub_item_index");
Table<const DataType> reference_subitem_array_per_item = this->_readTable<DataType>(group, reference_name);
auto data_group = group.getGroup("data");
Table<const DataType> reference_subitem_array_per_item = this->_readTable<DataType>(data_group, reference_name);
Array<const int> item_numbers = this->_getItemNumber<item_type>(i_connectivity);
Array<const int> sub_item_numbers = this->_getItemNumber<sub_item_type>(i_connectivity);
Array<const IndexType> sub_item_row_map = this->_getSubItemRowsMap<item_type, sub_item_type>(i_connectivity);
using ItemId = ItemIdT<item_type>;
......@@ -1186,6 +1266,8 @@ class ParallelChecker
}
this->_checkGlobalNumberOfItems<item_type>(i_connectivity, reference_item_numbers.size());
auto item_to_sub_item_matrix = i_connectivity->getMatrix(item_type, sub_item_type);
Array<const int> owner = this->_getItemOwner<item_type>(i_connectivity);
bool has_own_differences = false;
......@@ -1197,6 +1279,8 @@ class ParallelChecker
const size_t index_end_in_reference = reference_subitem_rows_map[reference_item_index + 1];
bool item_is_same = true;
if ((item_type > sub_item_type) or (static_cast<size_t>(owner[item_id]) == parallel::rank())) {
if ((index_end_in_reference - index_begin_in_reference) != subitem_array_per_item[item_id].numberOfRows()) {
item_is_same = false;
} else {
......@@ -1209,6 +1293,23 @@ class ParallelChecker
}
}
}
} else {
std::map<int, size_t> sub_item_number_to_index;
for (size_t index = index_begin_in_reference; index < index_end_in_reference; ++index) {
sub_item_number_to_index[reference_sub_item_numbers[reference_subitem_index[index]]] = index;
}
auto sub_item_list = item_to_sub_item_matrix[item_id];
for (size_t i_sub_item = 0; i_sub_item < sub_item_list.size(); ++i_sub_item) {
auto sub_item_id = sub_item_list[i_sub_item];
auto index = sub_item_number_to_index.at(sub_item_numbers[sub_item_id]);
for (size_t i = 0; i < subitem_array_per_item.sizeOfArrays(); ++i) {
if (reference_subitem_array_per_item[index][i] != subitem_array_per_item[item_id][i_sub_item][i]) {
item_is_same = false;
}
}
}
}
if (not item_is_same) {
is_same = false;
if (static_cast<size_t>(owner[item_id]) == parallel::rank()) {
......
This diff is collapsed.
......@@ -108,8 +108,8 @@ TEST_CASE("ParallelChecker_write", "[dev]")
HighFive::Group group_var0 = file.getGroup("values/" + std::to_string(tag));
REQUIRE(group_var0.getNumberObjects() == 2);
REQUIRE(group_var0.exist("numbers"));
REQUIRE(group_var0.exist(var_name));
REQUIRE(group_var0.exist(std::string{itemName(item_type)} + "_numbers"));
REQUIRE(group_var0.exist("data/" + var_name));
REQUIRE(group_var0.getNumberAttributes() == 7);
REQUIRE(group_var0.hasAttribute("filename"));
......@@ -366,11 +366,13 @@ TEST_CASE("ParallelChecker_write", "[dev]")
HighFive::File file(ParallelChecker::instance().filename(), HighFive::File::ReadOnly);
HighFive::Group group_var0 = file.getGroup("values/" + std::to_string(tag));
REQUIRE(group_var0.getNumberObjects() == 3);
REQUIRE(group_var0.getNumberObjects() == 5);
REQUIRE(group_var0.exist("numbers"));
REQUIRE(group_var0.exist(std::string{itemName(item_type)} + "_numbers"));
REQUIRE(group_var0.exist(std::string{itemName(sub_item_type)} + "_numbers"));
REQUIRE(group_var0.exist("sub_item_index"));
REQUIRE(group_var0.exist("rows_map"));
REQUIRE(group_var0.exist(var_name));
REQUIRE(group_var0.exist("data/" + var_name));
REQUIRE(group_var0.getNumberAttributes() == 8);
REQUIRE(group_var0.hasAttribute("filename"));
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment