15#ifdef DEAL_II_WITH_TRILINOS
23# include <boost/io/ios_state.hpp>
26# include <Epetra_Import.h>
27# include <Epetra_Map.h>
28# include <Epetra_MpiComm.h>
41#ifdef DEAL_II_WITH_TRILINOS
45 namespace EpetraWrappers
60 vector.vector->Map().LID(
63# ifndef DEAL_II_WITH_64BIT_INDICES
65 ExcAccessToNonLocalElement(index,
66 vector.vector->Map().NumMyElements(),
67 vector.vector->Map().MinMyGID(),
68 vector.vector->Map().MaxMyGID()));
71 ExcAccessToNonLocalElement(index,
72 vector.vector->Map().NumMyElements(),
73 vector.vector->Map().MinMyGID64(),
74 vector.vector->Map().MaxMyGID64()));
77 return (*(vector.vector))[0][local_index];
87# ifdef DEAL_II_HAVE_CXX20
92 : vector(new Epetra_FEVector(
93 Epetra_Map(0, 0, 0,
Utilities::Trilinos::comm_self())))
99 : vector(new Epetra_FEVector(V.trilinos_vector()))
106 : vector(new Epetra_FEVector(
107 parallel_partitioner.make_trilinos_map(communicator, false)))
115 const bool omit_zeroing_entries)
117 Epetra_Map input_map =
119 if (
vector->Map().SameAs(input_map) ==
false)
120 vector = std::make_unique<Epetra_FEVector>(input_map);
121 else if (omit_zeroing_entries ==
false)
123 const int ierr =
vector->PutScalar(0.);
133 reinit(V.locally_owned_elements(),
134 V.get_mpi_communicator(),
135 omit_zeroing_entries);
147 const auto &map =
vector.Map();
149 for (
unsigned int i = 0; i < indices.
size(); ++i)
152 const auto trilinos_i =
154 elements[i] =
vector[0][trilinos_i];
167 if (
vector->Map().SameAs(V.trilinos_vector().Map()))
168 *
vector = V.trilinos_vector();
171 if (
size() == V.size())
173 Epetra_Import data_exchange(
vector->Map(),
174 V.trilinos_vector().Map());
177 vector->Import(V.trilinos_vector(), data_exchange, Insert);
181 vector = std::make_unique<Epetra_FEVector>(V.trilinos_vector());
196 const int ierr =
vector->PutScalar(s);
208 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
209 &communication_pattern)
213 if (communication_pattern ==
nullptr)
219 V.get_stored_elements().size()) ||
223 V.get_stored_elements(),
224 dynamic_cast<const Epetra_MpiComm &
>(
vector->Comm()).Comm());
230 std::dynamic_pointer_cast<const CommunicationPattern>(
231 communication_pattern);
234 ExcMessage(
"The communication pattern is not of type "
235 "LinearAlgebra::EpetraWrappers::CommunicationPattern."));
241 Epetra_FEVector source_vector(import_map.TargetMap());
242 double *values = source_vector.Values();
243 std::copy(V.begin(), V.end(), values);
246 vector->Export(source_vector, import_map, Insert);
248 vector->Export(source_vector, import_map, Add);
250 vector->Export(source_vector, import_map, Epetra_Max);
252 vector->Export(source_vector, import_map, Epetra_Min);
283 *
this *= 1. / factor;
298 if (
vector->Map().SameAs(V.trilinos_vector().Map()))
300 const int ierr =
vector->Update(1., V.trilinos_vector(), 1.);
308 Epetra_Import data_exchange(
vector->Map(), V.trilinos_vector().Map());
309 const int ierr =
vector->Import(V.trilinos_vector(),
311 Epetra_AddLocalAlso);
343 const int ierr =
vector->Dot(V.trilinos_vector(), &result);
359 const unsigned local_size(
vector->MyLength());
360 for (
unsigned int i = 0; i < local_size; ++i)
376 const int ierr =
vector->Update(a, V.trilinos_vector(), 1.);
444 if (
vector->Map().SameAs(V.trilinos_vector().Map()) ==
false)
445 this->
sadd(0., a, V);
449 int ierr =
vector->Update(a, V.trilinos_vector(), 0.);
459 const double *start_ptr = (*vector)[0];
461 const bool local_all_zero = std::all_of(start_ptr,
463 numbers::value_is_zero<double>);
492 int ierr =
vector->Norm1(&norm);
506 int ierr =
vector->Norm2(&norm);
518 int ierr =
vector->NormInf(&norm);
541# ifndef DEAL_II_WITH_64BIT_INDICES
542 return vector->GlobalLength();
544 return vector->GlobalLength64();
553 return vector->MyLength();
561 const Epetra_MpiComm *epetra_comm =
562 dynamic_cast<const Epetra_MpiComm *
>(&(
vector->Comm()));
564 return epetra_comm->GetMpiComm();
575 if (
vector->Map().LinearMap())
577# ifndef DEAL_II_WITH_64BIT_INDICES
581 vector->Map().MaxMyGID64() + 1);
584 else if (
vector->Map().NumMyElements() > 0)
587# ifndef DEAL_II_WITH_64BIT_INDICES
588 unsigned int *vector_indices =
589 reinterpret_cast<unsigned int *
>(
vector->Map().MyGlobalElements());
594 is.
add_indices(vector_indices, vector_indices + n_indices);
608 const Epetra_FEVector &
626 const unsigned int precision,
627 const bool scientific,
628 const bool across)
const
631 boost::io::ios_flags_saver restore_flags(out);
636 int leading_dimension;
637 int ierr =
vector->ExtractView(&val, &leading_dimension);
640 out.precision(precision);
642 out.setf(std::ios::scientific, std::ios::floatfield);
644 out.setf(std::ios::fixed, std::ios::floatfield);
647 for (
int i = 0; i <
vector->MyLength(); ++i)
648 out << val[i] <<
' ';
650 for (
int i = 0; i <
vector->MyLength(); ++i)
651 out << val[i] << std::endl;
664 return sizeof(*this) +
Epetra_Map make_trilinos_map(const MPI_Comm communicator=MPI_COMM_WORLD, const bool overlapping=false) const
void add_range(const size_type begin, const size_type end)
void add_indices(const ForwardIterator &begin, const ForwardIterator &end)
bool has_ghost_elements() const
Vector & operator-=(const Vector &V)
void equ(const double a, const Vector &V)
Vector & operator=(const Vector &V)
MPI_Comm get_mpi_communicator() const
void compress(const VectorOperation::values operation)
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
std::unique_ptr< Epetra_FEVector > vector
const Epetra_FEVector & trilinos_vector() const
void import_elements(const ReadWriteVector< double > &V, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
void sadd(const double s, const double a, const Vector &V)
Vector & operator/=(const double factor)
virtual size_type size() const override
size_type locally_owned_size() const
::IndexSet locally_owned_elements() const
Vector & operator+=(const Vector &V)
void scale(const Vector &scaling_factors)
void create_epetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
double mean_value() const
Vector & operator*=(const double factor)
::IndexSet source_stored_elements
double operator*(const Vector &V) const
std::shared_ptr< const CommunicationPattern > epetra_comm_pattern
std::size_t memory_consumption() const
void reinit(const IndexSet ¶llel_partitioner, const MPI_Comm communicator, const bool omit_zeroing_entries=false)
virtual void extract_subvector_to(const ArrayView< const types::global_dof_index > &indices, const ArrayView< double > &elements) const override
double linfty_norm() const
double add_and_dot(const double a, const Vector &V, const Vector &W)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
#define DEAL_II_NAMESPACE_CLOSE
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
static ::ExceptionBase & ExcIO()
static ::ExceptionBase & ExcGhostsPresent()
static ::ExceptionBase & ExcZero()
static ::ExceptionBase & ExcTrilinosError(int arg1)
static ::ExceptionBase & ExcNotImplemented()
#define Assert(cond, exc)
#define AssertIsFinite(number)
static ::ExceptionBase & ExcDifferentParallelPartitioning()
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcInternalError()
static ::ExceptionBase & ExcDimensionMismatch(std::size_t arg1, std::size_t arg2)
static ::ExceptionBase & ExcMessage(std::string arg1)
#define AssertThrow(cond, exc)
bool logical_and(const bool t, const MPI_Comm mpi_communicator)