16 #include <deal.II/base/std_cxx14/memory.h>
18 #include <deal.II/lac/trilinos_epetra_vector.h>
20 #ifdef DEAL_II_WITH_TRILINOS
22 # ifdef DEAL_II_WITH_MPI
24 # include <deal.II/base/index_set.h>
26 # include <deal.II/lac/read_write_vector.h>
28 # include <boost/io/ios_state.hpp>
30 # include <Epetra_Import.h>
31 # include <Epetra_Map.h>
32 # include <Epetra_MpiComm.h>
37 DEAL_II_NAMESPACE_OPEN
41 namespace EpetraWrappers
45 , vector(new Epetra_FEVector(
46 Epetra_Map(0, 0, 0,
Utilities::Trilinos::comm_self())))
53 , vector(new Epetra_FEVector(V.trilinos_vector()))
59 const MPI_Comm &communicator)
61 , vector(new Epetra_FEVector(
62 parallel_partitioner.make_trilinos_map(communicator, false)))
69 const MPI_Comm &communicator,
70 const bool omit_zeroing_entries)
72 Epetra_Map input_map =
74 if (
vector->Map().SameAs(input_map) ==
false)
75 vector = std_cxx14::make_unique<Epetra_FEVector>(input_map);
76 else if (omit_zeroing_entries ==
false)
78 const int ierr =
vector->PutScalar(0.);
88 const bool omit_zeroing_entries)
91 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
95 const Vector &down_V = dynamic_cast<const Vector &>(V);
99 omit_zeroing_entries);
117 Epetra_Import data_exchange(
vector->Map(),
140 const int ierr =
vector->PutScalar(s);
153 std::shared_ptr<const CommunicationPatternBase> communication_pattern)
157 if (communication_pattern ==
nullptr)
168 dynamic_cast<const Epetra_MpiComm &>(
vector->Comm()).Comm());
174 std::dynamic_pointer_cast<const CommunicationPattern>(
175 communication_pattern);
179 std::string(
"The communication pattern is not of type ") +
180 "LinearAlgebra::EpetraWrappers::CommunicationPattern."));
186 Epetra_FEVector source_vector(
import.TargetMap());
187 double * values = source_vector.Values();
188 std::copy(V.
begin(), V.
end(), values);
191 vector->Export(source_vector,
import, Insert);
193 vector->Export(source_vector,
import, Add);
195 vector->Export(source_vector,
import, Epetra_Max);
197 vector->Export(source_vector,
import, Epetra_Min);
220 *
this *= 1. / factor;
231 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
235 const Vector &down_V = dynamic_cast<const Vector &>(V);
248 # if DEAL_II_TRILINOS_VERSION_GTE(11, 11, 0)
249 Epetra_Import data_exchange(
vector->Map(),
253 Epetra_AddLocalAlso);
260 Epetra_MultiVector dummy(
vector->Map(), 1,
false);
261 Epetra_Import data_exchange(dummy.Map(),
268 ierr =
vector->Update(1.0, dummy, 1.0);
292 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
296 const Vector &down_V = dynamic_cast<const Vector &>(V);
316 const unsigned local_size(
vector->MyLength());
317 for (
unsigned int i = 0; i < local_size; ++i)
327 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
331 const Vector &down_V = dynamic_cast<const Vector &>(V);
350 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
353 Assert(dynamic_cast<const Vector *>(&W) !=
nullptr,
357 const Vector &down_V = dynamic_cast<const Vector &>(V);
359 const Vector &down_W = dynamic_cast<const Vector &>(W);
367 const int ierr =
vector->Update(
381 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
386 const Vector &down_V = dynamic_cast<const Vector &>(V);
398 Assert(dynamic_cast<const Vector *>(&scaling_factors) !=
nullptr,
402 const Vector &down_scaling_factors =
403 dynamic_cast<const Vector &>(scaling_factors);
407 const int ierr =
vector->Multiply(1.0,
421 Assert(dynamic_cast<const Vector *>(&V) !=
nullptr,
425 const Vector &down_V = dynamic_cast<const Vector &>(V);
428 this->
sadd(0., a, V);
445 double * start_ptr = (*vector)[0];
446 const double *ptr = start_ptr, *eptr = start_ptr +
vector->MyLength();
447 unsigned int flag = 0;
459 const Epetra_MpiComm *mpi_comm =
460 dynamic_cast<const Epetra_MpiComm *>(&
vector->Map().Comm());
464 return num_nonzero == 0;
487 int ierr =
vector->Norm1(&norm);
500 int ierr =
vector->Norm2(&norm);
513 int ierr =
vector->NormInf(&norm);
537 # ifndef DEAL_II_WITH_64BIT_INDICES
538 return vector->GlobalLength();
540 return vector->GlobalLength64();
549 const Epetra_MpiComm *epetra_comm =
550 dynamic_cast<const Epetra_MpiComm *>(&(
vector->Comm()));
552 return epetra_comm->GetMpiComm();
563 if (
vector->Map().LinearMap())
565 # ifndef DEAL_II_WITH_64BIT_INDICES
569 vector->Map().MaxMyGID64() + 1);
572 else if (
vector->Map().NumMyElements() > 0)
574 const size_type n_indices =
vector->Map().NumMyElements();
575 # ifndef DEAL_II_WITH_64BIT_INDICES
576 unsigned int *vector_indices =
577 reinterpret_cast<unsigned int *>(
vector->Map().MyGlobalElements());
579 size_type *vector_indices =
580 reinterpret_cast<size_type *>(
vector->Map().MyGlobalElements64());
582 is.
add_indices(vector_indices, vector_indices + n_indices);
591 const Epetra_FEVector &
609 const unsigned int precision,
610 const bool scientific,
611 const bool across)
const
614 boost::io::ios_flags_saver restore_flags(out);
619 int leading_dimension;
620 int ierr =
vector->ExtractView(&val, &leading_dimension);
624 out.precision(precision);
626 out.setf(std::ios::scientific, std::ios::floatfield);
628 out.setf(std::ios::fixed, std::ios::floatfield);
631 for (
int i = 0; i <
vector->MyLength(); ++i)
632 out << val[i] <<
' ';
634 for (
int i = 0; i <
vector->MyLength(); ++i)
635 out << val[i] << std::endl;
648 return sizeof(*this) +
650 (
sizeof(double) +
sizeof(TrilinosWrappers::types::int_type));
657 const MPI_Comm &mpi_comm)
668 DEAL_II_NAMESPACE_CLOSE