list(APPEND CMAKE_REQUIRED_INCLUDES ${MPI_CXX_INCLUDE_PATH})
list(APPEND CMAKE_REQUIRED_LIBRARIES ${Trilinos_LIBRARIES} ${MPI_LIBRARIES})
+ list(APPEND CMAKE_REQUIRED_FLAGS ${TRILINOS_CXX_FLAGS})
# For the case of Trilinos being compiled with openmp support the
# following Tpetra test needs -fopenmp to succeed. Make sure that we
"
#include <cstdint>
#include <Tpetra_Vector.hpp>
- int
- main()
+ int main()
{
using LO = int;
- using GO = ${_global_index_type};
+ using GO = std::make_signed_t<${_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);
list(APPEND CMAKE_REQUIRED_INCLUDES ${MPI_CXX_INCLUDE_PATH})
list(APPEND CMAKE_REQUIRED_LIBRARIES ${Trilinos_LIBRARIES} ${MPI_LIBRARIES})
+ list(APPEND CMAKE_REQUIRED_FLAGS ${TRILINOS_CXX_FLAGS})
CHECK_CXX_SOURCE_COMPILES(
"
const bool overlapping = false) const;
# ifdef DEAL_II_TRILINOS_WITH_TPETRA
- Tpetra::Map<int, types::global_dof_index>
+ Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>
make_tpetra_map(const MPI_Comm &communicator = MPI_COMM_WORLD,
const bool overlapping = false) const;
# endif
* used directly.
*/
void
- import(
- const Tpetra::Vector<Number, int, types::global_dof_index> &tpetra_vector,
- const IndexSet & locally_owned_elements,
- VectorOperation::values operation,
- const MPI_Comm & mpi_comm,
- const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
- &communication_pattern);
+ import(const Tpetra::
+ Vector<Number, int, std::make_signed_t<types::global_dof_index>>
+ & tpetra_vector,
+ const IndexSet & locally_owned_elements,
+ VectorOperation::values operation,
+ const MPI_Comm & mpi_comm,
+ const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
+ &communication_pattern);
# endif
/**
template <typename Number>
void
ReadWriteVector<Number>::import(
- const Tpetra::Vector<Number, int, types::global_dof_index> &vector,
- const IndexSet & source_elements,
- VectorOperation::values operation,
- const MPI_Comm & mpi_comm,
+ const Tpetra::
+ Vector<Number, int, std::make_signed_t<types::global_dof_index>> &vector,
+ const IndexSet & source_elements,
+ VectorOperation::values operation,
+ const MPI_Comm & mpi_comm,
const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
&communication_pattern)
{
"LinearAlgebra::TpetraWrappers::CommunicationPattern."));
}
- Tpetra::Export<int, types::global_dof_index> tpetra_export(
- tpetra_comm_pattern->get_tpetra_export());
+ Tpetra::Export<int, std::make_signed_t<types::global_dof_index>>
+ tpetra_export(tpetra_comm_pattern->get_tpetra_export());
- Tpetra::Vector<Number, int, types::global_dof_index> target_vector(
- tpetra_export.getSourceMap());
+ Tpetra::Vector<Number, int, std::make_signed_t<types::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, types::global_dof_index> &
+ const Tpetra::Import<int, std::make_signed_t<types::global_dof_index>> &
get_tpetra_import() const;
/**
* Return the underlying Tpetra::Export object.
*/
- const Tpetra::Export<int, types::global_dof_index> &
+ const Tpetra::Export<int, std::make_signed_t<types::global_dof_index>> &
get_tpetra_export() const;
private:
/**
* Shared pointer to the Tpetra::Import object used.
*/
- std::unique_ptr<Tpetra::Import<int, types::global_dof_index>>
+ std::unique_ptr<
+ Tpetra::Import<int, std::make_signed_t<types::global_dof_index>>>
tpetra_import;
/**
* Shared pointer to the Tpetra::Export object used.
*/
- std::unique_ptr<Tpetra::Export<int, types::global_dof_index>>
+ std::unique_ptr<
+ Tpetra::Export<int, std::make_signed_t<types::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, types::global_dof_index> &
- trilinos_vector() const;
+ const Tpetra::
+ Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
+ trilinos_vector() const;
/**
* Return a (modifiable) reference to the underlying Trilinos
* Tpetra::Vector class.
*/
- Tpetra::Vector<Number, int, types::global_dof_index> &
+ Tpetra::Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
trilinos_vector();
/**
/**
* Pointer to the actual Tpetra vector object.
*/
- std::unique_ptr<Tpetra::Vector<Number, int, types::global_dof_index>>
+ std::unique_ptr<
+ Tpetra::
+ Vector<Number, int, std::make_signed_t<types::global_dof_index>>>
vector;
/**
template <typename Number>
Vector<Number>::Vector()
: Subscriptor()
- , vector(new Tpetra::Vector<Number, int, types::global_dof_index>(
- Teuchos::RCP<Tpetra::Map<int, types::global_dof_index>>(
- new Tpetra::Map<int, types::global_dof_index>(
+ , 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>>(
0,
0,
Utilities::Trilinos::tpetra_comm_self()))))
template <typename Number>
Vector<Number>::Vector(const Vector<Number> &V)
: Subscriptor()
- , vector(new Tpetra::Vector<Number, int, types::global_dof_index>(
+ , vector(new Tpetra::Vector<Number,
+ int,
+ std::make_signed_t<types::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, types::global_dof_index>(
- Teuchos::rcp(new Tpetra::Map<int, types::global_dof_index>(
- parallel_partitioner.make_tpetra_map(communicator, false)))))
+ , 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)))))
{}
const MPI_Comm &communicator,
const bool omit_zeroing_entries)
{
- Tpetra::Map<int, types::global_dof_index> input_map =
+ Tpetra::Map<int, std::make_signed_t<types::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, types::global_dof_index>>(Teuchos::rcp(
- new Tpetra::Map<int, types::global_dof_index>(input_map)));
+ 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>>(
+ input_map)));
else if (omit_zeroing_entries == false)
{
vector->putScalar(0.);
{
if (size() == V.size())
{
- Tpetra::Import<int, types::global_dof_index> data_exchange(
- vector->getMap(), V.trilinos_vector().getMap());
+ Tpetra::Import<int, std::make_signed_t<types::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, types::global_dof_index>>(
+ Tpetra::Vector<Number,
+ int,
+ std::make_signed_t<types::global_dof_index>>>(
V.trilinos_vector());
}
"LinearAlgebra::TpetraWrappers::CommunicationPattern."));
}
- Tpetra::Export<int, types::global_dof_index> tpetra_export(
- tpetra_comm_pattern->get_tpetra_export());
- Tpetra::Vector<Number, int, types::global_dof_index> source_vector(
- tpetra_export.getSourceMap());
-
- source_vector.template sync<Kokkos::HostSpace>();
- auto x_2d = source_vector.template getLocalView<Kokkos::HostSpace>();
- auto x_1d = Kokkos::subview(x_2d, Kokkos::ALL(), 0);
- source_vector.template modify<Kokkos::HostSpace>();
- const size_t localLength = source_vector.getLocalLength();
- auto values_it = V.begin();
- for (size_t k = 0; k < localLength; ++k)
- x_1d(k) = *values_it++;
- source_vector.template sync<
- typename Tpetra::Vector<Number, int, types::global_dof_index>::
- device_type::memory_space>();
+ 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());
+
+ {
+ source_vector.template sync<Kokkos::HostSpace>();
+ auto x_2d = source_vector.template getLocalView<Kokkos::HostSpace>();
+ auto x_1d = Kokkos::subview(x_2d, Kokkos::ALL(), 0);
+ source_vector.template modify<Kokkos::HostSpace>();
+ const size_t localLength = source_vector.getLocalLength();
+ auto values_it = V.begin();
+ 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>();
+ }
if (operation == VectorOperation::insert)
vector->doExport(source_vector, tpetra_export, Tpetra::REPLACE);
else if (operation == VectorOperation::add)
// TODO: Tpetra doesn't have a combine mode that also updates local
// elements, maybe there is a better workaround.
- Tpetra::Vector<Number, int, types::global_dof_index> dummy(
- vector->getMap(), false);
- Tpetra::Import<int, types::global_dof_index> data_exchange(
- down_V.trilinos_vector().getMap(), dummy.getMap());
+ 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());
dummy.doImport(down_V.trilinos_vector(),
data_exchange,
vector_1d(k) += a;
}
vector->template sync<
- typename Tpetra::Vector<Number, int, types::global_dof_index>::
- device_type::memory_space>();
+ typename Tpetra::
+ Vector<Number, int, std::make_signed_t<types::global_dof_index>>::
+ device_type::memory_space>();
}
template <typename Number>
- const Tpetra::Vector<Number, int, types::global_dof_index> &
- Vector<Number>::trilinos_vector() const
+ const Tpetra::
+ Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
+ Vector<Number>::trilinos_vector() const
{
return *vector;
}
template <typename Number>
- Tpetra::Vector<Number, int, types::global_dof_index> &
+ Tpetra::Vector<Number, int, std::make_signed_t<types::global_dof_index>> &
Vector<Number>::trilinos_vector()
{
return *vector;
LinearAlgebra::TpetraWrappers::Vector<NumberType> &V)
{
// Extract local indices in the vector.
- Tpetra::Vector<NumberType, int, types::global_dof_index> vector =
- V.trilinos_vector();
+ Tpetra::Vector<NumberType, int, std::make_signed_t<types::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, types::global_dof_index>::
- device_type::memory_space>();
+ typename Tpetra::
+ Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>::
+ device_type::memory_space>();
}
LinearAlgebra::TpetraWrappers::Vector<NumberType> &V)
{
// Extract local indices in the vector.
- Tpetra::Vector<NumberType, int, types::global_dof_index> vector =
- V.trilinos_vector();
+ Tpetra::Vector<NumberType, int, std::make_signed_t<types::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, types::global_dof_index>::
- device_type::memory_space>();
+ typename Tpetra::
+ Vector<NumberType, int, std::make_signed_t<types::global_dof_index>>::
+ device_type::memory_space>();
}
const types::global_dof_index i)
{
// Extract local indices in the vector.
- Tpetra::Vector<NumberType, int, types::global_dof_index> vector =
- V.trilinos_vector();
+ Tpetra::Vector<NumberType, int, std::make_signed_t<types::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, types::global_dof_index>
+Tpetra::Map<int, std::make_signed_t<types::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, types::global_dof_index>(
+ return Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
size(),
n_elements(),
0,
);
else
{
- const std::vector<size_type> indices = get_index_vector();
- std::vector<types::global_dof_index> int_indices(indices.size());
+ const std::vector<size_type> indices = get_index_vector();
+ std::vector<std::make_signed_t<types::global_dof_index>> int_indices(
+ indices.size());
std::copy(indices.begin(), indices.end(), int_indices.begin());
- const Teuchos::ArrayView<types::global_dof_index> arr_view(int_indices);
- return Tpetra::Map<int, types::global_dof_index>(
+ 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>>(
size(),
arr_view,
0,
{
comm = std::make_shared<const MPI_Comm>(communicator);
- auto vector_space_vector_map =
- Teuchos::rcp(new Tpetra::Map<int, types::global_dof_index>(
+ auto vector_space_vector_map = Teuchos::rcp(
+ new Tpetra::Map<int, std::make_signed_t<types::global_dof_index>>(
vector_space_vector_index_set.make_tpetra_map(*comm, false)));
- auto read_write_vector_map =
- Teuchos::rcp(new Tpetra::Map<int, types::global_dof_index>(
+ auto read_write_vector_map = Teuchos::rcp(
+ new Tpetra::Map<int, std::make_signed_t<types::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, types::global_dof_index>>(
- read_write_vector_map, vector_space_vector_map);
- tpetra_export =
- std::make_unique<Tpetra::Export<int, types::global_dof_index>>(
- read_write_vector_map, vector_space_vector_map);
+ 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);
}
- const Tpetra::Import<int, types::global_dof_index> &
+ const Tpetra::Import<int, std::make_signed_t<types::global_dof_index>> &
CommunicationPattern::get_tpetra_import() const
{
return *tpetra_import;
- const Tpetra::Export<int, types::global_dof_index> &
+ const Tpetra::Export<int, std::make_signed_t<types::global_dof_index>> &
CommunicationPattern::get_tpetra_export() const
{
return *tpetra_export;