Select Git revision
LinearSolverModule.cpp
-
Stéphane Del Pino authored
Now modules can/must register the operators they provide
Stéphane Del Pino authoredNow modules can/must register the operators they provide
ItemArrayUtils.hpp 1.55 KiB
#ifndef ITEM_ARRAY_UTILS_HPP
#define ITEM_ARRAY_UTILS_HPP
#include <utils/Messenger.hpp>
#include <mesh/Connectivity.hpp>
#include <mesh/ItemArray.hpp>
#include <mesh/Synchronizer.hpp>
#include <mesh/SynchronizerManager.hpp>
#include <iostream>
template <typename DataType, ItemType item_type, typename ConnectivityPtr>
void
synchronize(ItemArray<DataType, item_type, ConnectivityPtr>& item_array)
{
static_assert(not std::is_const_v<DataType>, "cannot synchronize ItemArray of const data");
if (parallel::size() > 1) {
auto& manager = SynchronizerManager::instance();
const IConnectivity* connectivity = item_array.connectivity_ptr().get();
Synchronizer& synchronizer = manager.getConnectivitySynchronizer(connectivity);
synchronizer.synchronize(item_array);
}
}
template <typename DataType, ItemType item_type, typename ConnectivityPtr>
bool
isSynchronized(ItemArray<const DataType, item_type, ConnectivityPtr> item_array)
{
bool is_synchronized = true;
if (parallel::size() > 1) {
ItemArray<std::remove_const_t<DataType>, item_type> item_array_copy = copy(item_array);
synchronize(item_array_copy);
for (ItemIdT<item_type> item_id = 0; item_id < item_array_copy.numberOfItems(); ++item_id) {
for (size_t i = 0; i < item_array.sizeOfArrays(); ++i) {
if (item_array_copy[item_id][i] != item_array[item_id][i]) {
is_synchronized = false;
}
}
}
is_synchronized = parallel::allReduceAnd(is_synchronized);
}
return is_synchronized;
}
#endif // ITEM_ARRAY_UTILS_HPP