add_flags(CMAKE_REQUIRED_FLAGS "${DEAL_II_CXX_FLAGS} ${DEAL_II_LINKER_FLAGS}")
if(DEAL_II_WITH_64BIT_INDICES)
- set(_global_index_type "std::uint64_t")
+ set(_global_index_type "std::int64_t")
else()
- set(_global_index_type "unsigned int")
+ set(_global_index_type "int")
endif()
CHECK_CXX_SOURCE_COMPILES(
int main()
{
using LO = int;
- using GO = std::make_signed_t<${_global_index_type}>;
+ using GO = ${_global_index_type};
using map_type = Tpetra::Map<LO, GO>;
Teuchos::RCP<const map_type> dummy_map = Teuchos::rcp(new map_type());
Tpetra::Vector<double, LO, GO> dummy_vector(dummy_map);
const bool overlapping = false) const;
# ifdef DEAL_II_TRILINOS_WITH_TPETRA
- Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>
+ Tpetra::Map<int, types::signed_global_dof_index>
make_tpetra_map(const MPI_Comm &communicator = MPI_COMM_WORLD,
const bool overlapping = false) const;
# endif
#include <deal.II/base/config.h>
#include <cstdint>
+#include <type_traits> // make_signed_t
DEAL_II_NAMESPACE_OPEN
using global_dof_index = unsigned int;
#endif
+ /**
+ * Signed version of global_dof_index.
+ * This is useful for interacting with Trilinos' Tpetra that only works well
+ * with a signed global ordinal type.
+ */
+ using signed_global_dof_index = std::make_signed_t<global_dof_index>;
+
/**
* An identifier that denotes the MPI type associated with
* types::global_dof_index.
* used directly.
*/
void
- import(const Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>>
- & tpetra_vector,
+ import(const Tpetra::Vector<Number, int, types::signed_global_dof_index>
+ & tpetra_vector,
const IndexSet & locally_owned_elements,
VectorOperation::values operation,
const MPI_Comm & mpi_comm,
template <typename Number>
void
ReadWriteVector<Number>::import(
- const Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>> &vector,
+ const Tpetra::Vector<Number, int, types::signed_global_dof_index> &vector,
const IndexSet & source_elements,
VectorOperation::values operation,
const MPI_Comm & mpi_comm,
"LinearAlgebra::TpetraWrappers::CommunicationPattern."));
}
- Tpetra::Export<int, std::make_signed_t<types::global_dof_index>>
- tpetra_export(tpetra_comm_pattern->get_tpetra_export());
+ Tpetra::Export<int, types::signed_global_dof_index> tpetra_export(
+ tpetra_comm_pattern->get_tpetra_export());
- Tpetra::Vector<Number, int, std::make_signed_t<types::global_dof_index>>
- target_vector(tpetra_export.getSourceMap());
+ Tpetra::Vector<Number, int, types::signed_global_dof_index> target_vector(
+ tpetra_export.getSourceMap());
target_vector.doImport(vector, tpetra_export, Tpetra::REPLACE);
const auto *new_values = target_vector.getData().get();
/**
* Return the underlying Tpetra::Import object.
*/
- const Tpetra::Import<int, std::make_signed_t<types::global_dof_index>> &
+ const Tpetra::Import<int, types::signed_global_dof_index> &
get_tpetra_import() const;
/**
* Return the underlying Tpetra::Export object.
*/
- const Tpetra::Export<int, std::make_signed_t<types::global_dof_index>> &
+ const Tpetra::Export<int, types::signed_global_dof_index> &
get_tpetra_export() const;
private:
/**
* Shared pointer to the Tpetra::Import object used.
*/
- std::unique_ptr<
- Tpetra::Import<int, std::make_signed_t<types::global_dof_index>>>
+ std::unique_ptr<Tpetra::Import<int, types::signed_global_dof_index>>
tpetra_import;
/**
* Shared pointer to the Tpetra::Export object used.
*/
- std::unique_ptr<
- Tpetra::Export<int, std::make_signed_t<types::global_dof_index>>>
+ std::unique_ptr<Tpetra::Export<int, types::signed_global_dof_index>>
tpetra_export;
};
} // end of namespace TpetraWrappers
* Return a const reference to the underlying Trilinos
* Tpetra::Vector class.
*/
- const Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
- trilinos_vector() const;
+ const Tpetra::Vector<Number, int, types::signed_global_dof_index> &
+ trilinos_vector() const;
/**
* Return a (modifiable) reference to the underlying Trilinos
* Tpetra::Vector class.
*/
- Tpetra::Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
+ Tpetra::Vector<Number, int, types::signed_global_dof_index> &
trilinos_vector();
/**
* Pointer to the actual Tpetra vector object.
*/
std::unique_ptr<
- Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>>>
+ Tpetra::Vector<Number, int, types::signed_global_dof_index>>
vector;
/**
template <typename Number>
Vector<Number>::Vector()
: Subscriptor()
- , vector(new Tpetra::Vector<Number,
- int,
- std::make_signed_t<types::global_dof_index>>(
- Teuchos::RCP<
- Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>>(
- new Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
+ , vector(new Tpetra::Vector<Number, int, types::signed_global_dof_index>(
+ Teuchos::RCP<Tpetra::Map<int, types::signed_global_dof_index>>(
+ new Tpetra::Map<int, types::signed_global_dof_index>(
0,
0,
Utilities::Trilinos::tpetra_comm_self()))))
template <typename Number>
Vector<Number>::Vector(const Vector<Number> &V)
: Subscriptor()
- , vector(new Tpetra::Vector<Number,
- int,
- std::make_signed_t<types::global_dof_index>>(
+ , vector(new Tpetra::Vector<Number, int, types::signed_global_dof_index>(
V.trilinos_vector(),
Teuchos::Copy))
{}
Vector<Number>::Vector(const IndexSet ¶llel_partitioner,
const MPI_Comm &communicator)
: Subscriptor()
- , vector(new Tpetra::Vector<Number,
- int,
- std::make_signed_t<types::global_dof_index>>(
- Teuchos::rcp(
- new Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
- parallel_partitioner.make_tpetra_map(communicator, false)))))
+ , vector(new Tpetra::Vector<Number, int, types::signed_global_dof_index>(
+ Teuchos::rcp(new Tpetra::Map<int, types::signed_global_dof_index>(
+ parallel_partitioner.make_tpetra_map(communicator, false)))))
{}
const MPI_Comm &communicator,
const bool omit_zeroing_entries)
{
- Tpetra::Map<int, std::make_signed_t<types::global_dof_index>> input_map =
+ Tpetra::Map<int, types::signed_global_dof_index> input_map =
parallel_partitioner.make_tpetra_map(communicator, false);
if (vector->getMap()->isSameAs(input_map) == false)
vector = std::make_unique<
- Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>>>(
+ Tpetra::Vector<Number, int, types::signed_global_dof_index>>(
Teuchos::rcp(
- new Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
- input_map)));
+ new Tpetra::Map<int, types::signed_global_dof_index>(input_map)));
else if (omit_zeroing_entries == false)
{
vector->putScalar(0.);
{
if (size() == V.size())
{
- Tpetra::Import<int, std::make_signed_t<types::global_dof_index>>
- data_exchange(vector->getMap(), V.trilinos_vector().getMap());
+ Tpetra::Import<int, types::signed_global_dof_index> data_exchange(
+ vector->getMap(), V.trilinos_vector().getMap());
vector->doImport(V.trilinos_vector(),
data_exchange,
}
else
vector = std::make_unique<
- Tpetra::Vector<Number,
- int,
- std::make_signed_t<types::global_dof_index>>>(
+ Tpetra::Vector<Number, int, types::signed_global_dof_index>>(
V.trilinos_vector());
}
"LinearAlgebra::TpetraWrappers::CommunicationPattern."));
}
- Tpetra::Export<int, std::make_signed_t<types::global_dof_index>>
- tpetra_export(tpetra_comm_pattern->get_tpetra_export());
- Tpetra::Vector<Number, int, std::make_signed_t<types::global_dof_index>>
- source_vector(tpetra_export.getSourceMap());
+ Tpetra::Export<int, types::signed_global_dof_index> tpetra_export(
+ tpetra_comm_pattern->get_tpetra_export());
+ Tpetra::Vector<Number, int, types::signed_global_dof_index> source_vector(
+ tpetra_export.getSourceMap());
{
source_vector.template sync<Kokkos::HostSpace>();
for (size_t k = 0; k < localLength; ++k)
x_1d(k) = *values_it++;
source_vector.template sync<
- typename Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>>::
- device_type::memory_space>();
+ typename Tpetra::Vector<Number, int, types::signed_global_dof_index>::
+ device_type::memory_space>();
}
if (operation == VectorOperation::insert)
vector->doExport(source_vector, tpetra_export, Tpetra::REPLACE);
// TODO: Tpetra doesn't have a combine mode that also updates local
// elements, maybe there is a better workaround.
- Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>>
- dummy(vector->getMap(), false);
- Tpetra::Import<int, std::make_signed_t<types::global_dof_index>>
- data_exchange(down_V.trilinos_vector().getMap(), dummy.getMap());
+ Tpetra::Vector<Number, int, types::signed_global_dof_index> dummy(
+ vector->getMap(), false);
+ Tpetra::Import<int, types::signed_global_dof_index> data_exchange(
+ down_V.trilinos_vector().getMap(), dummy.getMap());
dummy.doImport(down_V.trilinos_vector(),
data_exchange,
vector_1d(k) += a;
}
vector->template sync<
- typename Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>>::
- device_type::memory_space>();
+ typename Tpetra::Vector<Number, int, types::signed_global_dof_index>::
+ device_type::memory_space>();
}
template <typename Number>
- const Tpetra::
- Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
- Vector<Number>::trilinos_vector() const
+ const Tpetra::Vector<Number, int, types::signed_global_dof_index> &
+ Vector<Number>::trilinos_vector() const
{
return *vector;
}
template <typename Number>
- Tpetra::Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
+ Tpetra::Vector<Number, int, types::signed_global_dof_index> &
Vector<Number>::trilinos_vector()
{
return *vector;
LinearAlgebra::TpetraWrappers::Vector<NumberType> &V)
{
// Extract local indices in the vector.
- Tpetra::Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>
- vector = V.trilinos_vector();
+ Tpetra::Vector<NumberType, int, types::signed_global_dof_index> vector =
+ V.trilinos_vector();
TrilinosWrappers::types::int_type trilinos_i =
vector.getMap()->getLocalElement(
static_cast<TrilinosWrappers::types::int_type>(i));
vector.template modify<Kokkos::HostSpace>();
vector_1d(trilinos_i) += value;
vector.template sync<
- typename Tpetra::
- Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>::
- device_type::memory_space>();
+ typename Tpetra::Vector<NumberType, int, types::signed_global_dof_index>::
+ device_type::memory_space>();
}
LinearAlgebra::TpetraWrappers::Vector<NumberType> &V)
{
// Extract local indices in the vector.
- Tpetra::Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>
- vector = V.trilinos_vector();
+ Tpetra::Vector<NumberType, int, types::signed_global_dof_index> vector =
+ V.trilinos_vector();
TrilinosWrappers::types::int_type trilinos_i =
vector.getMap()->getLocalElement(
static_cast<TrilinosWrappers::types::int_type>(i));
vector.template modify<Kokkos::HostSpace>();
vector_1d(trilinos_i) = value;
vector.template sync<
- typename Tpetra::
- Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>::
- device_type::memory_space>();
+ typename Tpetra::Vector<NumberType, int, types::signed_global_dof_index>::
+ device_type::memory_space>();
}
const types::global_dof_index i)
{
// Extract local indices in the vector.
- Tpetra::Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>
- vector = V.trilinos_vector();
+ Tpetra::Vector<NumberType, int, types::signed_global_dof_index> vector =
+ V.trilinos_vector();
TrilinosWrappers::types::int_type trilinos_i =
vector.getMap()->getLocalElement(
static_cast<TrilinosWrappers::types::int_type>(i));
#ifdef DEAL_II_WITH_TRILINOS
# ifdef DEAL_II_TRILINOS_WITH_TPETRA
-Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>
+Tpetra::Map<int, types::signed_global_dof_index>
IndexSet::make_tpetra_map(const MPI_Comm &communicator,
const bool overlapping) const
{
const bool linear =
overlapping ? false : is_ascending_and_one_to_one(communicator);
if (linear)
- return Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
+ return Tpetra::Map<int, types::signed_global_dof_index>(
size(),
n_elements(),
0,
);
else
{
- const std::vector<size_type> indices = get_index_vector();
- std::vector<std::make_signed_t<types::global_dof_index>> int_indices(
- indices.size());
+ const std::vector<size_type> indices = get_index_vector();
+ std::vector<types::signed_global_dof_index> int_indices(indices.size());
std::copy(indices.begin(), indices.end(), int_indices.begin());
- const Teuchos::ArrayView<std::make_signed_t<types::global_dof_index>>
- arr_view(int_indices);
- return Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
+ const Teuchos::ArrayView<types::signed_global_dof_index> arr_view(
+ int_indices);
+ return Tpetra::Map<int, types::signed_global_dof_index>(
size(),
arr_view,
0,
{
comm = std::make_shared<const MPI_Comm>(communicator);
- auto vector_space_vector_map = Teuchos::rcp(
- new Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
+ auto vector_space_vector_map =
+ Teuchos::rcp(new Tpetra::Map<int, types::signed_global_dof_index>(
vector_space_vector_index_set.make_tpetra_map(*comm, false)));
- auto read_write_vector_map = Teuchos::rcp(
- new Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
+ auto read_write_vector_map =
+ Teuchos::rcp(new Tpetra::Map<int, types::signed_global_dof_index>(
read_write_vector_index_set.make_tpetra_map(*comm, true)));
// Target map is read_write_vector_map
// Source map is vector_space_vector_map. This map must have uniquely
// owned GID.
- tpetra_import = std::make_unique<
- Tpetra::Import<int, std::make_signed_t<types::global_dof_index>>>(
- read_write_vector_map, vector_space_vector_map);
- tpetra_export = std::make_unique<
- Tpetra::Export<int, std::make_signed_t<types::global_dof_index>>>(
- read_write_vector_map, vector_space_vector_map);
+ tpetra_import =
+ std::make_unique<Tpetra::Import<int, types::signed_global_dof_index>>(
+ read_write_vector_map, vector_space_vector_map);
+ tpetra_export =
+ std::make_unique<Tpetra::Export<int, types::signed_global_dof_index>>(
+ read_write_vector_map, vector_space_vector_map);
}
- const Tpetra::Import<int, std::make_signed_t<types::global_dof_index>> &
+ const Tpetra::Import<int, types::signed_global_dof_index> &
CommunicationPattern::get_tpetra_import() const
{
return *tpetra_import;
- const Tpetra::Export<int, std::make_signed_t<types::global_dof_index>> &
+ const Tpetra::Export<int, types::signed_global_dof_index> &
CommunicationPattern::get_tpetra_export() const
{
return *tpetra_export;