libMesh
Loading...
Searching...
No Matches
Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Types | Private Attributes | List of all members
libMesh::DistributedVector< T > Class Template Referencefinal

This class provides a simple parallel, distributed vector datatype which is specific to libmesh. More...

#include <distributed_vector.h>

Inheritance diagram for libMesh::DistributedVector< T >:
[legend]

Public Member Functions

 DistributedVector (const Parallel::Communicator &comm, const ParallelType=AUTOMATIC)
 Dummy-Constructor.
 
 DistributedVector (const Parallel::Communicator &comm, const numeric_index_type n, const ParallelType ptype=AUTOMATIC)
 Constructor.
 
 DistributedVector (const Parallel::Communicator &comm, const numeric_index_type n, const numeric_index_type n_local, const ParallelType ptype=AUTOMATIC)
 Constructor.
 
 DistributedVector (const Parallel::Communicator &comm, const numeric_index_type N, const numeric_index_type n_local, const std::vector< numeric_index_type > &ghost, const ParallelType ptype=AUTOMATIC)
 Constructor.
 
DistributedVectoroperator= (const DistributedVector &)
 Copy assignment operator.
 
 DistributedVector (DistributedVector &&)=default
 The 5 special functions can be defaulted for this class, as it does not manage any memory itself.
 
 DistributedVector (const DistributedVector &)=default
 
DistributedVectoroperator= (DistributedVector &&)=default
 
virtual ~DistributedVector ()=default
 
virtual void close () override
 Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across processors.
 
virtual void clear () override
 Restores the NumericVector<T> to a pristine state.
 
virtual void zero () override
 Set all entries to zero.
 
virtual std::unique_ptr< NumericVector< T > > zero_clone () const override
 
virtual std::unique_ptr< NumericVector< T > > clone () const override
 
virtual void init (const numeric_index_type N, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC) override
 Change the dimension of the vector to n.
 
virtual void init (const numeric_index_type N, const bool fast=false, const ParallelType ptype=AUTOMATIC) override
 Call init() with n_local = N.
 
virtual void init (const numeric_index_type N, const numeric_index_type n_local, const std::vector< numeric_index_type > &ghost, const bool fast=false, const ParallelType=AUTOMATIC) override
 Create a vector that holds the local indices plus those specified in the ghost argument.
 
virtual void init (const NumericVector< T > &other, const bool fast=false) override
 Creates a vector that has the same dimension and storage type as other, including ghost dofs.
 
virtual NumericVector< T > & operator= (const T s) override
 Sets all entries of the vector to the value s.
 
virtual NumericVector< T > & operator= (const NumericVector< T > &v) override
 This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.
 
virtual NumericVector< T > & operator= (const std::vector< T > &v) override
 Sets (*this)(i) = v(i) for each entry of the vector.
 
virtual Real min () const override
 
virtual Real max () const override
 
virtual T sum () const override
 
virtual Real l1_norm () const override
 
virtual Real l2_norm () const override
 
virtual Real linfty_norm () const override
 
virtual numeric_index_type size () const override
 
virtual numeric_index_type local_size () const override
 
virtual numeric_index_type first_local_index () const override
 
virtual numeric_index_type last_local_index () const override
 
virtual T operator() (const numeric_index_type i) const override
 
virtual NumericVector< T > & operator+= (const NumericVector< T > &v) override
 Adds v to *this, \( \vec{u} \leftarrow \vec{u} + \vec{v} \).
 
virtual NumericVector< T > & operator-= (const NumericVector< T > &v) override
 Subtracts v from *this, \( \vec{u} \leftarrow \vec{u} - \vec{v} \).
 
virtual NumericVector< T > & operator*= (const NumericVector< T > &v) override
 Computes the component-wise multiplication of this vector's entries by another's, \( u_i \leftarrow u_i v_i \, \forall i\).
 
virtual NumericVector< T > & operator/= (const NumericVector< T > &v) override
 Computes the component-wise division of this vector's entries by another's, \( u_i \leftarrow \frac{u_i}{v_i} \, \forall i\).
 
virtual void reciprocal () override
 Computes the component-wise reciprocal, \( u_i \leftarrow \frac{1}{u_i} \, \forall i\).
 
virtual void conjugate () override
 Negates the imaginary component of each entry in the vector.
 
virtual void set (const numeric_index_type i, const T value) override
 Sets v(i) = value.
 
virtual void add (const numeric_index_type i, const T value) override
 Adds value to the vector entry specified by i.
 
virtual void add (const T s) override
 Adds s to each entry of the vector, \( u_i \leftarrow u_i + s \).
 
virtual void add (const NumericVector< T > &V) override
 Adds v to this, \( \vec{u} \leftarrow \vec{u} + \vec{v} \).
 
virtual void add (const T a, const NumericVector< T > &v) override
 Vector addition with a scalar multiple, \( \vec{u} \leftarrow \vec{u} + a\vec{v} \).
 
virtual void add_vector (const NumericVector< T > &, const SparseMatrix< T > &) override
 Computes \( \vec{u} \leftarrow \vec{u} + A \vec{v} \), i.e.
 
virtual void add_vector_transpose (const NumericVector< T > &, const SparseMatrix< T > &) override
 Computes \( \vec{u} \leftarrow \vec{u} + A^T \vec{v} \), i.e.
 
virtual void scale (const T factor) override
 Scale each element of the vector by the given factor.
 
virtual void abs () override
 Sets \( u_i \leftarrow |u_i| \) for each entry in the vector.
 
virtual T dot (const NumericVector< T > &V) const override
 
virtual void localize (std::vector< T > &v_local) const override
 Creates a copy of the global vector in the local vector v_local.
 
virtual void localize (NumericVector< T > &v_local) const override
 Same, but fills a NumericVector<T> instead of a std::vector.
 
virtual void localize (NumericVector< T > &v_local, const std::vector< numeric_index_type > &send_list) const override
 Creates a local vector v_local containing only information relevant to this processor, as defined by the send_list.
 
virtual void localize (std::vector< T > &v_local, const std::vector< numeric_index_type > &indices) const override
 Fill in the local std::vector "v_local" with the global indices given in "indices".
 
virtual void localize (const numeric_index_type first_local_idx, const numeric_index_type last_local_idx, const std::vector< numeric_index_type > &send_list) override
 Updates a local vector with selected values from neighboring processors, as defined by send_list.
 
virtual void localize_to_one (std::vector< T > &v_local, const processor_id_type proc_id=0) const override
 Creates a local copy of the global vector in v_local only on processor proc_id.
 
virtual void pointwise_mult (const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
 Computes \( u_i \leftarrow u_i v_i \) (summation not implied) i.e.
 
virtual void pointwise_divide (const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
 Computes \( u_i \leftarrow \frac{v_{1,i}}{v_{2,i}} \) (summation not implied) i.e.
 
virtual void swap (NumericVector< T > &v) override
 Swaps the contents of this with v.
 
virtual std::size_t max_allowed_id () const override
 
virtual bool initialized () const
 
ParallelType type () const
 
ParallelTypetype ()
 
bool is_effectively_serial () const
 
bool is_effectively_ghosted () const
 
void set_type (ParallelType t)
 Allow the user to change the ParallelType of the NumericVector under some circumstances.
 
virtual bool closed () const
 
virtual Real subset_l1_norm (const std::set< numeric_index_type > &indices) const
 
virtual Real subset_l2_norm (const std::set< numeric_index_type > &indices) const
 
virtual Real subset_linfty_norm (const std::set< numeric_index_type > &indices) const
 
Real l2_norm_diff (const NumericVector< T > &other_vec) const
 
Real l1_norm_diff (const NumericVector< T > &other_vec) const
 
virtual T el (const numeric_index_type i) const
 
virtual void get (const std::vector< numeric_index_type > &index, T *values) const
 Access multiple components at once.
 
void get (const std::vector< numeric_index_type > &index, std::vector< T > &values) const
 Access multiple components at once.
 
NumericVector< T > & operator*= (const T a)
 Scales the vector by a, \( \vec{u} \leftarrow a\vec{u} \).
 
NumericVector< T > & operator/= (const T a)
 Scales the vector by 1/a, \( \vec{u} \leftarrow \frac{1}{a}\vec{u} \).
 
virtual void add_vector (const T *v, const std::vector< numeric_index_type > &dof_indices)
 Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a pointer and each dof_indices[i] specifies where to add value v[i].
 
void add_vector (const std::vector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a std::vector and each dof_indices[i] specifies where to add value v[i].
 
void add_vector (const NumericVector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a NumericVector and each dof_indices[i] specifies where to add value v(i).
 
void add_vector (const DenseVector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a DenseVector and each dof_indices[i] specifies where to add value v(i).
 
void add_vector (const NumericVector< T > &v, const ShellMatrix< T > &A)
 Computes \( \vec{u} \leftarrow \vec{u} + A \vec{v} \), i.e.
 
virtual void insert (const T *v, const std::vector< numeric_index_type > &dof_indices)
 Inserts the entries of v in *this at the locations specified by v.
 
void insert (const std::vector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Inserts the entries of v in *this at the locations specified by v.
 
void insert (const NumericVector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Inserts the entries of v in *this at the locations specified by v.
 
void insert (const DenseVector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Inserts the entries of v in *this at the locations specified by v.
 
void insert (const DenseSubVector< T > &v, const std::vector< numeric_index_type > &dof_indices)
 Inserts the entries of v in *this at the locations specified by v.
 
virtual int compare (const NumericVector< T > &other_vector, const Real threshold=TOLERANCE) const
 
virtual int local_relative_compare (const NumericVector< T > &other_vector, const Real threshold=TOLERANCE) const
 
virtual int global_relative_compare (const NumericVector< T > &other_vector, const Real threshold=TOLERANCE) const
 
virtual void print (std::ostream &os=libMesh::out) const
 Prints the local contents of the vector, by default to libMesh::out.
 
void print (std::ostream &os) const
 
virtual void print_global (std::ostream &os=libMesh::out) const
 Prints the global contents of the vector, by default to libMesh::out.
 
void print_global (std::ostream &os) const
 
virtual void print_matlab (const std::string &filename="") const
 Print the contents of the vector in Matlab's sparse matrix format.
 
virtual void read_matlab (const std::string &filename)
 Read the contents of the vector from the Matlab-script format used by PETSc.
 
virtual void create_subvector (NumericVector< T > &, const std::vector< numeric_index_type > &, bool=true) const
 Fills in subvector from this vector using the indices in rows.
 
virtual std::unique_ptr< NumericVector< T > > get_subvector (const std::vector< numeric_index_type > &)
 Creates a view into this vector using the indices in rows.
 
virtual void restore_subvector (std::unique_ptr< NumericVector< T > >, const std::vector< numeric_index_type > &)
 Restores a view into this vector using the indices in rows.
 
bool readable () const
 
bool compatible (const NumericVector< T > &v) const
 
const Parallel::Communicatorcomm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 

Static Public Member Functions

static std::unique_ptr< NumericVector< T > > build (const Parallel::Communicator &comm, SolverPackage solver_package=libMesh::default_solver_package(), ParallelType parallel_type=AUTOMATIC)
 Builds a NumericVector on the processors in communicator comm using the linear solver package specified by solver_package.
 
static std::string get_info ()
 Gets a string containing the reference information.
 
static void print_info (std::ostream &out_stream=libMesh::out)
 Prints the reference information, by default to libMesh::out.
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects.
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info().
 
static void disable_print_counter_info ()
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information.
 

Protected Member Functions

void increment_constructor_count (const std::string &name) noexcept
 Increments the construction counter.
 
void increment_destructor_count (const std::string &name) noexcept
 Increments the destruction counter.
 

Protected Attributes

bool _is_closed
 Flag which tracks whether the vector's values are consistent on all processors after insertion or addition of values has occurred on some or all processors.
 
bool _is_initialized
 true once init() has been called.
 
ParallelType _type
 Type of vector.
 
std::mutex _numeric_vector_mutex
 Mutex for performing thread-safe operations.
 
const Parallel::Communicator_communicator
 

Static Protected Attributes

static Counts _counts
 Actually holds the data.
 
static Threads::atomic< unsigned int_n_objects
 The number of objects.
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting.
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called.
 

Private Types

enum  UnclosedState { DO_NOTHING = 0 , ADD_VALUES , SET_VALUES , INVALID_UNCLOSEDSTATE }
 Whether we are adding or setting remote values or neither - this determines behavior at the next close();. More...
 

Private Attributes

std::vector< T > _values
 Actual vector datatype to hold vector entries.
 
std::vector< std::pair< numeric_index_type, T > > _remote_values
 Entries to add or set on remote processors during the next close()
 
UnclosedState _unclosed_state
 The current state of this vector, if it is unclosed.
 
numeric_index_type _global_size
 The global vector size.
 
numeric_index_type _local_size
 The local vector size.
 
numeric_index_type _first_local_index
 The first component stored locally.
 
numeric_index_type _last_local_index
 The last component (+1) stored locally.
 

Detailed Description

template<typename T>
class libMesh::DistributedVector< T >

This class provides a simple parallel, distributed vector datatype which is specific to libmesh.

Offers some collective communication capabilities.

Note
The class will sill function without MPI, but only on one processor. All overridden virtual functions are documented in numeric_vector.h.
Author
Benjamin S. Kirk
Date
2003

Definition at line 54 of file distributed_vector.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 119 of file reference_counter.h.

Member Enumeration Documentation

◆ UnclosedState

template<typename T >
enum libMesh::DistributedVector::UnclosedState
private

Whether we are adding or setting remote values or neither - this determines behavior at the next close();.

Enumerator
DO_NOTHING 
ADD_VALUES 
SET_VALUES 
INVALID_UNCLOSEDSTATE 

Definition at line 253 of file distributed_vector.h.

Constructor & Destructor Documentation

◆ DistributedVector() [1/6]

template<typename T >
libMesh::DistributedVector< T >::DistributedVector ( const Parallel::Communicator comm,
const ParallelType  ptype = AUTOMATIC 
)
inlineexplicit

Dummy-Constructor.

Dimension=0

Definition at line 289 of file distributed_vector.h.

290 :
291 NumericVector<T>(comm_in, ptype),
293 _global_size (0),
294 _local_size (0),
297{
298 this->_type = ptype;
299}
numeric_index_type _first_local_index
The first component stored locally.
UnclosedState _unclosed_state
The current state of this vector, if it is unclosed.
numeric_index_type _last_local_index
The last component (+1) stored locally.
numeric_index_type _global_size
The global vector size.
numeric_index_type _local_size
The local vector size.
ParallelType _type
Type of vector.

References libMesh::NumericVector< T >::_type.

◆ DistributedVector() [2/6]

template<typename T >
libMesh::DistributedVector< T >::DistributedVector ( const Parallel::Communicator comm,
const numeric_index_type  n,
const ParallelType  ptype = AUTOMATIC 
)
inlineexplicit

Constructor.

Set dimension to n and initialize all elements with zero.

Definition at line 305 of file distributed_vector.h.

308 : NumericVector<T>(comm_in, ptype)
309{
310 this->init(n, n, false, ptype);
311}
virtual void init(const numeric_index_type N, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC) override
Change the dimension of the vector to n.

References libMesh::DistributedVector< T >::init().

◆ DistributedVector() [3/6]

template<typename T >
libMesh::DistributedVector< T >::DistributedVector ( const Parallel::Communicator comm,
const numeric_index_type  n,
const numeric_index_type  n_local,
const ParallelType  ptype = AUTOMATIC 
)
inline

Constructor.

Set local dimension to n_local, the global dimension to n, and initialize all elements with zero.

Definition at line 317 of file distributed_vector.h.

321 : NumericVector<T>(comm_in, ptype)
322{
323 this->init(n, n_local, false, ptype);
324}

References libMesh::DistributedVector< T >::init().

◆ DistributedVector() [4/6]

template<typename T >
libMesh::DistributedVector< T >::DistributedVector ( const Parallel::Communicator comm,
const numeric_index_type  N,
const numeric_index_type  n_local,
const std::vector< numeric_index_type > &  ghost,
const ParallelType  ptype = AUTOMATIC 
)
inline

Constructor.

Set local dimension to n_local, the global dimension to n, but additionally reserve memory for the indices specified by the ghost argument.

Definition at line 330 of file distributed_vector.h.

335 : NumericVector<T>(comm_in, ptype)
336{
337 this->init(n, n_local, ghost, false, ptype);
338}

References libMesh::DistributedVector< T >::init().

◆ DistributedVector() [5/6]

template<typename T >
libMesh::DistributedVector< T >::DistributedVector ( DistributedVector< T > &&  )
default

The 5 special functions can be defaulted for this class, as it does not manage any memory itself.

◆ DistributedVector() [6/6]

template<typename T >
libMesh::DistributedVector< T >::DistributedVector ( const DistributedVector< T > &  )
default

◆ ~DistributedVector()

template<typename T >
virtual libMesh::DistributedVector< T >::~DistributedVector ( )
virtualdefault

Member Function Documentation

◆ abs()

template<typename T >
void libMesh::DistributedVector< T >::abs ( )
overridevirtual

Sets \( u_i \leftarrow |u_i| \) for each entry in the vector.

Implements libMesh::NumericVector< T >.

Definition at line 281 of file distributed_vector.C.

282{
283 libmesh_assert (this->initialized());
284 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
285
286 for (auto & val : _values)
287 val = std::abs(val);
288}
std::vector< T > _values
Actual vector datatype to hold vector entries.
virtual void abs() override
Sets for each entry in the vector.
virtual bool initialized() const
libmesh_assert(ctx)

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ add() [1/4]

template<typename T >
void libMesh::DistributedVector< T >::add ( const numeric_index_type  i,
const T  value 
)
inlineoverridevirtual

Adds value to the vector entry specified by i.

Note that library implementations of this method are thread safe, e.g. we will lock _numeric_vector_mutex before writing to the vector

Implements libMesh::NumericVector< T >.

Definition at line 625 of file distributed_vector.h.

626{
627 libmesh_assert (this->initialized());
628 libmesh_assert_equal_to (_values.size(), _local_size);
629 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
630 libmesh_assert_less (i, size());
631
632 std::scoped_lock lock(this->_numeric_vector_mutex);
633
634 if (i >= first_local_index() && i < last_local_index())
635 {
637 }
638 else
639 {
640 _remote_values.emplace_back(i, value);
642 }
643
644 this->_is_closed = false;
645}
std::vector< std::pair< numeric_index_type, T > > _remote_values
Entries to add or set on remote processors during the next close()
virtual numeric_index_type first_local_index() const override
virtual numeric_index_type last_local_index() const override
virtual numeric_index_type size() const override
std::mutex _numeric_vector_mutex
Mutex for performing thread-safe operations.
bool _is_closed
Flag which tracks whether the vector's values are consistent on all processors after insertion or add...
static const bool value
Definition xdr_io.C:55

References libMesh::initialized(), libMesh::libmesh_assert(), and value.

◆ add() [2/4]

template<typename T >
void libMesh::DistributedVector< T >::add ( const NumericVector< T > &  v)
overridevirtual

Adds v to this, \( \vec{u} \leftarrow \vec{u} + \vec{v} \).

Equivalent to calling operator+=().

Implements libMesh::NumericVector< T >.

Definition at line 241 of file distributed_vector.C.

242{
243 libmesh_assert (this->initialized());
244 libmesh_assert_equal_to (_values.size(), _local_size);
245 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
246
247 add (1., v);
248}
virtual void add(const numeric_index_type i, const T value) override
Adds value to the vector entry specified by i.

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ add() [3/4]

template<typename T >
void libMesh::DistributedVector< T >::add ( const T  a,
const NumericVector< T > &  v 
)
overridevirtual

Vector addition with a scalar multiple, \( \vec{u} \leftarrow \vec{u} + a\vec{v} \).

Equivalent to calling operator+=().

Implements libMesh::NumericVector< T >.

Definition at line 253 of file distributed_vector.C.

254{
255 libmesh_assert (this->initialized());
256 libmesh_assert_equal_to (_values.size(), _local_size);
257 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
258
259 // Make sure the NumericVector passed in is really a DistributedVector
260 const DistributedVector<T> * v = cast_ptr<const DistributedVector<T> *>(&v_in);
261 libmesh_error_msg_if(!v, "Cannot add different types of NumericVectors.");
262
263 for (auto i : index_range(_values))
264 _values[i] += a * v->_values[i];
265}
auto index_range(const T &sizable)
Helper function that returns an IntRange<std::size_t> representing all the indices of the passed-in v...
Definition int_range.h:153

References libMesh::DistributedVector< T >::_values, libMesh::index_range(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ add() [4/4]

template<typename T >
void libMesh::DistributedVector< T >::add ( const T  s)
overridevirtual

Adds s to each entry of the vector, \( u_i \leftarrow u_i + s \).

Implements libMesh::NumericVector< T >.

Definition at line 228 of file distributed_vector.C.

229{
230 libmesh_assert (this->initialized());
231 libmesh_assert_equal_to (_values.size(), _local_size);
232 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
233
234 for (auto & val : _values)
235 val += v;
236}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ add_vector() [1/6]

template<typename T >
void libMesh::NumericVector< T >::add_vector ( const DenseVector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineinherited

Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a DenseVector and each dof_indices[i] specifies where to add value v(i).

This method is guaranteed to be thread safe as long as library implementations of NumericVector are used

Definition at line 1008 of file numeric_vector.h.

1010{
1011 libmesh_assert(v.size() == dof_indices.size());
1012 if (!v.empty())
1013 this->add_vector(&v(0), dof_indices);
1014}
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
Computes , where v is a pointer and each dof_indices[i] specifies where to add value v[i].

References libMesh::DenseVector< T >::empty(), libMesh::libmesh_assert(), and libMesh::DenseVector< T >::size().

◆ add_vector() [2/6]

template<typename T >
virtual void libMesh::DistributedVector< T >::add_vector ( const NumericVector< T > &  v,
const SparseMatrix< T > &  A 
)
inlineoverridevirtual

Computes \( \vec{u} \leftarrow \vec{u} + A \vec{v} \), i.e.

adds the product of a SparseMatrix A and a NumericVector v to this.

Implements libMesh::NumericVector< T >.

Definition at line 195 of file distributed_vector.h.

197 { libmesh_not_implemented(); }

◆ add_vector() [3/6]

template<typename T >
void libMesh::NumericVector< T >::add_vector ( const NumericVector< T > &  v,
const ShellMatrix< T > &  A 
)
inherited

Computes \( \vec{u} \leftarrow \vec{u} + A \vec{v} \), i.e.

adds the product of a ShellMatrix A and a NumericVector v to this.

Definition at line 716 of file numeric_vector.C.

718{
719 libmesh_assert(this->compatible(v));
720
721 a.vector_mult_add(*this,v);
722}
bool compatible(const NumericVector< T > &v) const

References libMesh::libmesh_assert().

◆ add_vector() [4/6]

template<typename T >
void libMesh::NumericVector< T >::add_vector ( const NumericVector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inherited

Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a NumericVector and each dof_indices[i] specifies where to add value v(i).

This method is guaranteed to be thread-safe as long as library implementations of NumericVector are used

Definition at line 702 of file numeric_vector.C.

704{
705 libmesh_assert(v.readable());
706
707 const std::size_t n = dof_indices.size();
708 libmesh_assert_equal_to(v.size(), n);
709 for (numeric_index_type i=0; i != n; i++)
710 this->add (dof_indices[i], v(i));
711}
virtual void add(const numeric_index_type i, const T value)=0
Adds value to the vector entry specified by i.
dof_id_type numeric_index_type
Definition id_types.h:99

◆ add_vector() [5/6]

template<typename T >
void libMesh::NumericVector< T >::add_vector ( const std::vector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineinherited

Computes \( \vec{u} \leftarrow \vec{u} + \vec{v} \), where v is a std::vector and each dof_indices[i] specifies where to add value v[i].

This method is guaranteed to be thread safe as long as library implementations of NumericVector are used

Definition at line 996 of file numeric_vector.h.

998{
999 libmesh_assert(v.size() == dof_indices.size());
1000 if (!v.empty())
1001 this->add_vector(v.data(), dof_indices);
1002}

References libMesh::libmesh_assert().

◆ add_vector() [6/6]

template<typename T >
void libMesh::NumericVector< T >::add_vector ( const T *  v,
const std::vector< numeric_index_type > &  dof_indices 
)
virtualinherited

◆ add_vector_transpose()

template<typename T >
virtual void libMesh::DistributedVector< T >::add_vector_transpose ( const NumericVector< T > &  v,
const SparseMatrix< T > &  A 
)
inlineoverridevirtual

Computes \( \vec{u} \leftarrow \vec{u} + A^T \vec{v} \), i.e.

adds the product of the transpose of a SparseMatrix A and a NumericVector v to this.

Implements libMesh::NumericVector< T >.

Definition at line 199 of file distributed_vector.h.

201 { libmesh_not_implemented(); }

◆ build()

template<typename T >
std::unique_ptr< NumericVector< T > > libMesh::NumericVector< T >::build ( const Parallel::Communicator comm,
SolverPackage  solver_package = libMesh::default_solver_package(),
ParallelType  parallel_type = AUTOMATIC 
)
staticinherited

Builds a NumericVector on the processors in communicator comm using the linear solver package specified by solver_package.

Definition at line 61 of file numeric_vector.C.

64{
65 // Build the appropriate vector
66 switch (solver_package)
67 {
68
69#ifdef LIBMESH_HAVE_LASPACK
70 case LASPACK_SOLVERS:
71 return std::make_unique<LaspackVector<T>>(comm, parallel_type);
72#endif
73
74#ifdef LIBMESH_HAVE_PETSC
75 case PETSC_SOLVERS:
76 return std::make_unique<PetscVector<T>>(comm, parallel_type);
77#endif
78
79#ifdef LIBMESH_TRILINOS_HAVE_EPETRA
81 return std::make_unique<EpetraVector<T>>(comm, parallel_type);
82#endif
83
84#ifdef LIBMESH_HAVE_EIGEN
85 case EIGEN_SOLVERS:
86 return std::make_unique<EigenSparseVector<T>>(comm, parallel_type);
87#endif
88
89 default:
90 return std::make_unique<DistributedVector<T>>(comm, parallel_type);
91 }
92}
const Parallel::Communicator & comm() const

References libMesh::EIGEN_SOLVERS, libMesh::LASPACK_SOLVERS, libMesh::PETSC_SOLVERS, and libMesh::TRILINOS_SOLVERS.

Referenced by libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::System::add_vector(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::DiagonalMatrix< T >::DiagonalMatrix(), AssembleOptimization::equality_constraints(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::CondensedEigenSystem::get_eigenpair(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::StaticCondensation::init(), main(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), LinearElasticityWithContact::move_mesh(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), MeshFunctionTest::read_variable_info_from_output_data(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::ClawSystem::solve_conservation_law(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), DiagonalMatrixTest::testNumerics(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectScalarCoarsening(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_assembly(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), and libMesh::RBConstruction::update_residual_terms().

◆ clear()

template<typename T >
void libMesh::DistributedVector< T >::clear ( )
inlineoverridevirtual

Restores the NumericVector<T> to a pristine state.

Reimplemented from libMesh::NumericVector< T >.

Definition at line 466 of file distributed_vector.h.

467{
468 _values.clear();
469 _remote_values.clear();
470
472
477
478 this->_is_closed = this->_is_initialized = false;
479}
bool _is_initialized
true once init() has been called.

◆ clone()

template<typename T >
std::unique_ptr< NumericVector< T > > libMesh::DistributedVector< T >::clone ( ) const
inlineoverridevirtual
Returns
A copy of this vector wrapped in a smart pointer.
Note
This must be overridden in the derived classes.

Implements libMesh::NumericVector< T >.

Definition at line 517 of file distributed_vector.h.

518{
519 std::unique_ptr<NumericVector<T>> cloned_vector =
520 std::make_unique<DistributedVector<T>>(this->comm());
521 cloned_vector->init(*this, true);
522 *cloned_vector = *this;
523 return cloned_vector;
524}

◆ close()

template<typename T >
void libMesh::DistributedVector< T >::close ( )
inlineoverridevirtual

Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across processors.

Implements libMesh::NumericVector< T >.

Definition at line 399 of file distributed_vector.C.

400{
401 libmesh_assert (this->initialized());
402
403 parallel_object_only();
404
405 bool have_remote_values = !_remote_values.empty();
406 this->comm().max(have_remote_values);
407
408 if (have_remote_values)
409 {
410 bool someone_is_setting = (_unclosed_state == SET_VALUES);
411 this->comm().max(someone_is_setting);
412
413#ifndef NDEBUG
414 // If *I* have remote values, I must know what to do with them.
415 if (!_remote_values.empty())
418
419 // If *anyone* had remote values, we must be doing something,
420 // and all ranks must agree on what we're doing.
421 bool someone_is_adding = (_unclosed_state == ADD_VALUES);
422 this->comm().max(someone_is_adding);
423
424 libmesh_assert_not_equal_to(someone_is_setting, someone_is_adding);
425#endif
426
427 // We want to traverse in id order later, but we can't compare
428 // values with default < in the case where Number==complex.
429 std::sort(_remote_values.begin(), _remote_values.end(),
430 [](auto a, auto b)
431 { return a.first < b.first; });
432
433 std::vector<numeric_index_type> last_local_indices;
434 this->comm().allgather(_last_local_index, last_local_indices);
435
436 std::map<processor_id_type, std::vector<std::pair<numeric_index_type,T>>>
437 updates_to_send;
438
439 processor_id_type p = 0;
440 for (auto [i, v] : _remote_values)
441 {
442 while (i >= last_local_indices[p])
443 {
444 libmesh_assert_less(p, this->n_processors());
445 ++p;
446 }
447 updates_to_send[p].emplace_back(i, v);
448 }
449 _remote_values.clear();
450
451 auto action_functor =
452 [this, someone_is_setting]
454 const std::vector<std::pair<numeric_index_type,T>> & incoming_values)
455 {
456 for (auto [i, v] : incoming_values)
457 {
458 libmesh_assert_greater_equal(i, _first_local_index);
459 libmesh_assert_less(i, _last_local_index);
460 if (someone_is_setting)
462 else
464 }
465 };
466
468 (this->comm(), updates_to_send, action_functor);
469
471 }
472
473 this->_is_closed = true;
474}
void max(const T &r, T &o, Request &req) const
void allgather(const T &send_data, std::vector< T, A > &recv_data) const
processor_id_type n_processors() const
static const Real b
void push_parallel_vector_data(const Communicator &comm, MapToVectors &&data, const ActionFunctor &act_on_data)
uint8_t processor_id_type
Definition id_types.h:104

References b, libMesh::initialized(), libMesh::libmesh_assert(), and TIMPI::push_parallel_vector_data().

◆ closed()

template<typename T >
virtual bool libMesh::NumericVector< T >::closed ( ) const
inlinevirtualinherited

◆ comm()

const Parallel::Communicator & libMesh::ParallelObject::comm ( ) const
inlineinherited
Returns
A reference to the Parallel::Communicator object used by this mesh.

Definition at line 97 of file parallel_object.h.

98 { return _communicator; }
const Parallel::Communicator & _communicator

References libMesh::ParallelObject::_communicator.

Referenced by libMesh::__libmesh_petsc_diff_solver_jacobian(), libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::__libmesh_petsc_diff_solver_residual(), libMesh::ExactSolution::_compute_error(), libMesh::UniformRefinementEstimator::_estimate_error(), libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_get_diagonal(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult(), libMesh::SlepcEigenSolver< T >::_petsc_shell_matrix_mult(), libMesh::PetscLinearSolver< T >::_petsc_shell_matrix_mult_add(), libMesh::DofMap::add_constraints_to_send_list(), add_cube_convex_hull_to_mesh(), libMesh::PetscDMWrapper::add_dofs_helper(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::TransientRBConstruction::add_IC_to_RB_space(), libMesh::RBEIMEvaluation::add_interpolation_data(), libMesh::CondensedEigenSystem::add_matrices(), libMesh::EigenSystem::add_matrices(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::System::add_matrix(), libMesh::RBConstruction::add_scaled_matrix_and_vector(), libMesh::System::add_vector(), libMesh::MeshTools::Modification::all_tri(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::RBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::allocate_data_structures(), libMesh::TransientRBConstruction::assemble_affine_expansion(), libMesh::AdvectionSystem::assemble_claw_rhs(), libMesh::FEMSystem::assemble_qoi(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::MeshCommunication::assign_global_indices(), libMesh::Partitioner::assign_partitioning(), libMesh::MeshTools::Generation::build_extrusion(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::PetscDMWrapper::build_section(), libMesh::PetscDMWrapper::build_sf(), libMesh::MeshBase::cache_elem_data(), libMesh::DofMap::check_dirichlet_bcid_consistency(), libMesh::MeshTetInterface::check_hull_integrity(), libMesh::MeshBase::complete_preparation(), libMesh::RBConstruction::compute_Fq_representor_innerprods(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::RBConstruction::compute_output_dual_innerprods(), libMesh::RBConstruction::compute_residual_dual_norm_slow(), libMesh::RBSCMConstruction::compute_SCM_bounds_on_training_set(), libMesh::DofMap::computed_sparsity_already(), libMesh::Problem_Interface::computeJacobian(), libMesh::Problem_Interface::computePreconditioner(), PetscSolverConfiguration::configure_solver(), libMesh::ContinuationSystem::ContinuationSystem(), libMesh::MeshBase::copy_constraint_rows(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::CondensedEigenSystem::copy_super_to_sub(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::MeshTools::create_bounding_box(), libMesh::DofMap::create_dof_constraints(), libMesh::MeshTools::create_nodal_bounding_box(), libMesh::MeshRefinement::create_parent_error_vector(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::MeshTools::create_subdomain_bounding_box(), libMesh::PetscMatrix< T >::create_submatrix_nosort(), create_wrapped_function(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::MeshBase::detect_interior_parents(), libMesh::RBEIMEvaluation::distribute_bfs(), DMlibMeshFunction(), DMlibMeshJacobian(), DMlibMeshSetSystem_libMesh(), DMVariableBounds_libMesh(), libMesh::DTKSolutionTransfer::DTKSolutionTransfer(), libMesh::MeshRefinement::eliminate_unrefined_patches(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_interiors(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_nodes(), libMesh::RBEIMConstruction::enrich_eim_approximation_on_sides(), libMesh::TransientRBConstruction::enrich_RB_space(), libMesh::EpetraVector< T >::EpetraVector(), AssembleOptimization::equality_constraints(), libMesh::AdjointRefinementEstimator::estimate_error(), libMesh::ExactErrorEstimator::estimate_error(), libMesh::JumpErrorEstimator::estimate_error(), libMesh::PatchRecoveryErrorEstimator::estimate_error(), libMesh::WeightedPatchRecoveryErrorEstimator::estimate_error(), libMesh::SmoothnessEstimator::estimate_smoothness(), libMesh::MeshRefinement::flag_elements_by_elem_fraction(), libMesh::MeshRefinement::flag_elements_by_error_fraction(), libMesh::MeshRefinement::flag_elements_by_error_tolerance(), libMesh::MeshRefinement::flag_elements_by_mean_stddev(), libMesh::MeshRefinement::flag_elements_by_nelem_target(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::DofMap::gather_constraints(), libMesh::MeshfreeInterpolation::gather_remote_data(), libMesh::CondensedEigenSystem::get_eigenpair(), libMesh::RBEIMEvaluation::get_eim_basis_function_node_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_side_value(), libMesh::RBEIMEvaluation::get_eim_basis_function_value(), libMesh::MeshBase::get_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::ImplicitSystem::get_linear_solver(), libMesh::RBEIMConstruction::get_max_abs_value(), libMesh::RBEIMConstruction::get_node_max_abs_value(), libMesh::RBEIMEvaluation::get_parametrized_function_node_value(), libMesh::RBEIMEvaluation::get_parametrized_function_side_value(), libMesh::RBEIMEvaluation::get_parametrized_function_value(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::RBEIMConstruction::get_random_point(), libMesh::MeshTetInterface::improve_hull_integrity(), AssembleOptimization::inequality_constraints(), AssembleOptimization::inequality_constraints_jacobian(), libMesh::StaticCondensation::init(), libMesh::TimeSolver::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::LocationMap< T >::init(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), libMesh::PetscDMWrapper::init_and_attach_petscdm(), ElasticitySystem::init_data(), libMesh::AdvectionSystem::init_data(), libMesh::ClawSystem::init_data(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::OptimizationSystem::initialize_equality_constraints_storage(), libMesh::OptimizationSystem::initialize_inequality_constraints_storage(), libMesh::RBEIMConstruction::initialize_parametrized_functions_in_training_set(), libMesh::RBEIMConstruction::inner_product(), integrate_function(), libMesh::MeshTools::Modification::interpolate_surface(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_equal_connectivity(), libMesh::MeshTools::libmesh_assert_equal_points(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_constraint_rows(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_flags(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_p_levels(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshTools::libmesh_assert_valid_unique_ids(), libMesh::libmesh_petsc_linesearch_shellfunc(), libMesh::libmesh_petsc_preconditioner_apply(), libMesh::libmesh_petsc_snes_mffd_interface(), libMesh::libmesh_petsc_snes_postcheck(), libMesh::MeshRefinement::limit_level_mismatch_at_edge(), libMesh::MeshRefinement::limit_level_mismatch_at_node(), libMesh::MeshRefinement::limit_overrefined_boundary(), libMesh::MeshRefinement::limit_underrefined_boundary(), libMesh::LinearImplicitSystem::LinearImplicitSystem(), main(), libMesh::MeshCommunication::make_elems_parallel_consistent(), libMesh::MeshCommunication::make_new_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_new_nodes_parallel_consistent(), libMesh::MeshCommunication::make_node_bcids_parallel_consistent(), libMesh::MeshCommunication::make_node_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_proc_ids_parallel_consistent(), libMesh::MeshCommunication::make_node_unique_ids_parallel_consistent(), libMesh::MeshCommunication::make_nodes_parallel_consistent(), libMesh::MeshCommunication::make_p_levels_parallel_consistent(), libMesh::TransientRBConstruction::mass_matrix_scaled_matvec(), libMesh::FEMSystem::mesh_position_set(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), LinearElasticityWithContact::move_mesh(), libMesh::DistributedMesh::n_active_elem(), libMesh::MeshTools::n_active_levels(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::DofMap::n_constrained_dofs(), libMesh::MeshBase::n_constraint_rows(), libMesh::DofMap::n_dofs(), libMesh::DofMap::n_dofs_per_processor(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::CondensedEigenSystem::n_global_non_condensed_dofs(), libMesh::MeshTools::n_levels(), MixedOrderTest::n_neighbor_links(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::SparsityPattern::Build::n_nonzeros(), libMesh::MeshTools::n_p_levels(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_distribute_bfs(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::RBEIMConstruction::node_inner_product(), libMesh::PetscVector< T >::operator=(), libMesh::MeshBase::operator==(), libMesh::DistributedMesh::parallel_max_elem_id(), libMesh::DistributedMesh::parallel_max_node_id(), libMesh::DistributedMesh::parallel_max_unique_id(), libMesh::ReplicatedMesh::parallel_max_unique_id(), libMesh::DistributedMesh::parallel_n_elem(), libMesh::DistributedMesh::parallel_n_nodes(), libMesh::SparsityPattern::Build::parallel_sync(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshTools::paranoid_n_levels(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::petsc_auto_fieldsplit(), LaplaceSystem::postprocess(), PoissonSystem::postprocess(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Partitioner::processor_pairs_to_interface_nodes(), libMesh::InterMeshProjection::project_system_vectors(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), FEMParameters::read(), libMesh::EquationSystems::read(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::RBEIMEvaluation::read_in_interior_basis_functions(), libMesh::RBEIMEvaluation::read_in_node_basis_functions(), libMesh::RBEIMEvaluation::read_in_side_basis_functions(), libMesh::RBEvaluation::read_in_vectors_from_multiple_files(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), MeshFunctionTest::read_variable_info_from_output_data(), libMesh::MeshBase::recalculate_n_partitions(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::BoundaryInfo::remove_edge_id(), libMesh::BoundaryInfo::remove_node_id(), libMesh::BoundaryInfo::remove_shellface_id(), libMesh::BoundaryInfo::remove_side_id(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), LinearElasticityWithContact::residual_and_jacobian(), OverlappingAlgebraicGhostingTest::run_ghosting_test(), OverlappingCouplingGhostingTest::run_sparsity_pattern_test(), scale_mesh_and_plot(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::send_and_insert_dof_values(), libMesh::TransientRBConstruction::set_error_temporal_data(), libMesh::Partitioner::set_interface_node_processor_ids_BFS(), libMesh::Partitioner::set_interface_node_processor_ids_linear(), libMesh::Partitioner::set_interface_node_processor_ids_petscpartitioner(), libMesh::Partitioner::set_node_processor_ids(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::Partitioner::set_parent_processor_ids(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::PetscDiffSolver::setup_petsc_data(), libMesh::RBEIMEvaluation::side_distribute_bfs(), libMesh::RBEIMEvaluation::side_gather_bfs(), libMesh::RBEIMConstruction::side_inner_product(), libMesh::Partitioner::single_partition(), libMesh::LaplaceMeshSmoother::smooth(), libMesh::VariationalMeshSmoother::smooth(), libMesh::NoxNonlinearSolver< Number >::solve(), libMesh::ClawSystem::solve_conservation_law(), libMesh::split_mesh(), libMesh::RBEIMConstruction::store_eim_solutions_for_training_set(), libMesh::MeshBase::subdomain_ids(), libMesh::BoundaryInfo::sync(), libMesh::MeshBase::sync_subdomain_name_map(), ConstraintOperatorTest::test1DCoarseningNewNodes(), ConstraintOperatorTest::test1DCoarseningOperator(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), MeshfunctionDFEM::test_mesh_function_dfem(), MeshfunctionDFEM::test_mesh_function_dfem_grad(), MeshFunctionTest::test_p_level(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), DofMapTest::testBadElemFECombo(), SystemsTest::testBlockRestrictedVarNDofs(), BoundaryInfoTest::testBoundaryOnChildrenErrors(), CheckpointIOTest::testC0PolygonCheckpoint(), VolumeTest::testC0PolygonMethods(), CheckpointIOTest::testC0PolyhedronCheckpoint(), VolumeTest::testC0PolyhedronMethods(), ConstraintOperatorTest::testCoreform(), ConnectedComponentsTest::testEdge(), MeshInputTest::testExodusIGASidesets(), MeshTriangulationTest::testFoundCenters(), PointLocatorTest::testLocator(), BoundaryInfoTest::testMesh(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), PointLocatorTest::testPlanar(), MeshTriangulationTest::testPoly2TriEdge3ToTri7CenterFixup(), MeshTriangulationTest::testPoly2TriRefinementBase(), SystemsTest::testProjectCubeWithMeshFunction(), SystemsTest::testProjectScalarCoarsening(), BoundaryInfoTest::testRenumber(), BoundaryInfoTest::testSelectiveRenumber(), BoundaryMeshSubdomainTest::testSingleSubdomain(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshTriangulationTest::testTriangulatorInterp(), MeshTriangulationTest::testTriangulatorMeshedHoles(), MeshTriangulationTest::testTriangulatorRoundHole(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::RBConstruction::train_reduced_basis_with_POD(), libMesh::MeshfreeSolutionTransfer::transfer(), libMesh::MeshFunctionSolutionTransfer::transfer(), libMesh::Poly2TriTriangulator::triangulate(), libMesh::RBConstruction::truth_assembly(), libMesh::TransientRBConstruction::truth_assembly(), update_current_local_solution(), libMesh::TransientRBConstruction::update_RB_initial_condition_all_N(), libMesh::RBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_RB_system_matrices(), libMesh::TransientRBConstruction::update_residual_terms(), libMesh::RBConstruction::update_residual_terms(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::VTKIO::write_nodal_data(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), libMesh::RBEvaluation::write_out_vectors(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::TransientRBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::RBDataSerialization::RBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::TransientRBEvaluationSerialization::write_to_file(), libMesh::RBDataSerialization::RBEIMEvaluationSerialization::write_to_file(), and libMesh::RBDataSerialization::RBSCMEvaluationSerialization::write_to_file().

◆ compare()

template<typename T >
int libMesh::NumericVector< T >::compare ( const NumericVector< T > &  other_vector,
const Real  threshold = TOLERANCE 
) const
virtualinherited
Returns
-1 when this is equivalent to other_vector (up to the given threshold), or the first index where abs(a[i]-b[i]) exceeds the threshold.

Definition at line 153 of file numeric_vector.C.

155{
156 libmesh_assert(this->compatible(other_vector));
157
158 int first_different_i = std::numeric_limits<int>::max();
160
161 while (first_different_i==std::numeric_limits<int>::max()
162 && i<last_local_index())
163 {
164 if (std::abs((*this)(i) - other_vector(i)) > threshold)
165 first_different_i = i;
166 else
167 i++;
168 }
169
170 // Find the correct first differing index in parallel
171 this->comm().min(first_different_i);
172
173 if (first_different_i == std::numeric_limits<int>::max())
174 return -1;
175
176 return first_different_i;
177}
void min(const T &r, T &o, Request &req) const
virtual numeric_index_type last_local_index() const =0
virtual numeric_index_type first_local_index() const =0

References libMesh::libmesh_assert().

◆ compatible()

template<typename T >
bool libMesh::NumericVector< T >::compatible ( const NumericVector< T > &  v) const
inherited
Returns
whether or not this vector and the vector v are able to be read for global operations with one-another

Definition at line 734 of file numeric_vector.C.

735{
736 return this->readable() && v.readable() &&
737 this->size() == v.size() &&
738 this->local_size() == v.local_size() &&
739 this->first_local_index() == v.first_local_index() &&
740 this->last_local_index() == v.last_local_index();
741}
virtual numeric_index_type size() const =0
virtual numeric_index_type local_size() const =0

References libMesh::NumericVector< T >::first_local_index(), libMesh::NumericVector< T >::last_local_index(), libMesh::NumericVector< T >::local_size(), libMesh::NumericVector< T >::readable(), and libMesh::NumericVector< T >::size().

◆ conjugate()

template<typename T >
void libMesh::DistributedVector< T >::conjugate ( )
overridevirtual

Negates the imaginary component of each entry in the vector.

Implements libMesh::NumericVector< T >.

Definition at line 216 of file distributed_vector.C.

217{
218 // Replace values by complex conjugate
219 for (auto & val : _values)
220 val = libmesh_conj(val);
221}
T libmesh_conj(T a)

References libMesh::libmesh_conj().

◆ create_subvector()

template<typename T >
virtual void libMesh::NumericVector< T >::create_subvector ( NumericVector< T > &  ,
const std::vector< numeric_index_type > &  ,
bool  = true 
) const
inlinevirtualinherited

Fills in subvector from this vector using the indices in rows.

supplying_global_rows communicates whether the supplied vector of rows corresponds to all the rows that should be used in the subvector's index set, e.g. whether the rows correspond to the global collective. If the rows supplied are only the local indices, then supplying_global_rows should be set to false

This is currently only implemented for PetscVector and EigenSparseVector.

Reimplemented in libMesh::PetscVector< libMesh::Number >, libMesh::EigenSparseVector< T >, and libMesh::PetscVector< T >.

Definition at line 794 of file numeric_vector.h.

797 {
798 libmesh_not_implemented();
799 }

Referenced by libMesh::StaticCondensation::forward_elimination().

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 100 of file reference_counter.C.

101{
102 _enable_print_counter = false;
103 return;
104}
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.

References libMesh::ReferenceCounter::_enable_print_counter.

◆ dot()

template<typename T >
T libMesh::DistributedVector< T >::dot ( const NumericVector< T > &  v) const
overridevirtual
Returns
\( \vec{u} \cdot \vec{v} \), the dot product of (*this) with the vector v.

Uses the complex-conjugate of v in the complex-valued case.

Implements libMesh::NumericVector< T >.

Definition at line 295 of file distributed_vector.C.

296{
297 // This function must be run on all processors at once
298 parallel_object_only();
299
300 // Make sure the NumericVector passed in is really a DistributedVector
301 const DistributedVector<T> * v = cast_ptr<const DistributedVector<T> *>(&V);
302
303 // Make sure that the two vectors are distributed in the same way.
304 libmesh_assert_equal_to ( this->first_local_index(), v->first_local_index() );
305 libmesh_assert_equal_to ( this->last_local_index(), v->last_local_index() );
306
307 // The result of dotting together the local parts of the vector.
308 T local_dot = 0;
309
310 for (auto i : index_range(_values))
311 local_dot += this->_values[i] * v->_values[i];
312
313 // The local dot products are now summed via MPI
314 this->comm().sum(local_dot);
315
316 return local_dot;
317}

References libMesh::DistributedVector< T >::_values, libMesh::DistributedVector< T >::first_local_index(), libMesh::index_range(), and libMesh::DistributedVector< T >::last_local_index().

◆ el()

template<typename T >
virtual T libMesh::NumericVector< T >::el ( const numeric_index_type  i) const
inlinevirtualinherited
Returns
(*this)(i).

Definition at line 403 of file numeric_vector.h.

403{ return (*this)(i); }

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info().

Enabled by default.

Definition at line 94 of file reference_counter.C.

95{
97 return;
98}

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ first_local_index()

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::first_local_index ( ) const
inlineoverridevirtual
Returns
The index of the first vector element actually stored on this processor.
Note
The minimum for this index is 0.

Implements libMesh::NumericVector< T >.

Definition at line 556 of file distributed_vector.h.

557{
558 libmesh_assert (this->initialized());
559 libmesh_assert_equal_to (_values.size(), _local_size);
560 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
561
562 return _first_local_index;
563}

References libMesh::initialized(), and libMesh::libmesh_assert().

Referenced by libMesh::DistributedVector< T >::dot().

◆ get() [1/2]

template<typename T >
void libMesh::NumericVector< T >::get ( const std::vector< numeric_index_type > &  index,
std::vector< T > &  values 
) const
inlineinherited

Access multiple components at once.

values will be resized, if necessary, and filled. The default implementation calls operator() for each index, but some implementations may supply faster methods here.

Definition at line 981 of file numeric_vector.h.

983{
984 const std::size_t num = index.size();
985 values.resize(num);
986 if (!num)
987 return;
988
989 this->get(index, values.data());
990}
virtual void get(const std::vector< numeric_index_type > &index, T *values) const
Access multiple components at once.

◆ get() [2/2]

template<typename T >
void libMesh::NumericVector< T >::get ( const std::vector< numeric_index_type > &  index,
T *  values 
) const
inlinevirtualinherited

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48{
49#if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50
51 std::ostringstream oss;
52
53 oss << '\n'
54 << " ---------------------------------------------------------------------------- \n"
55 << "| Reference count information |\n"
56 << " ---------------------------------------------------------------------------- \n";
57
58 for (const auto & [name, cd] : _counts)
59 oss << "| " << name << " reference count information:\n"
60 << "| Creations: " << cd.first << '\n'
61 << "| Destructions: " << cd.second << '\n';
62
63 oss << " ---------------------------------------------------------------------------- \n";
64
65 return oss.str();
66
67#else
68
69 return "";
70
71#endif
72}
static Counts _counts
Actually holds the data.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.

References libMesh::ReferenceCounter::_counts.

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_subvector()

template<typename T >
virtual std::unique_ptr< NumericVector< T > > libMesh::NumericVector< T >::get_subvector ( const std::vector< numeric_index_type > &  )
inlinevirtualinherited

Creates a view into this vector using the indices in rows.

Calls to this API should always be paired with a call to restore_subvector, else any changes made in the subvector will not be reflected in (this) original vector.

This is currently only implemented for PetscVector and EigenSparseVector.

Reimplemented in libMesh::EigenSparseVector< T >, libMesh::PetscVector< T >, and libMesh::PetscVector< libMesh::Number >.

Definition at line 810 of file numeric_vector.h.

811 {
812 libmesh_not_implemented();
813 }

Referenced by libMesh::StaticCondensation::apply(), libMesh::CondensedEigenSystem::copy_sub_to_super(), libMesh::CondensedEigenSystem::copy_super_to_sub(), and NumericVectorTest< DerivedClass >::Subvectors().

◆ global_relative_compare()

template<typename T >
int libMesh::NumericVector< T >::global_relative_compare ( const NumericVector< T > &  other_vector,
const Real  threshold = TOLERANCE 
) const
virtualinherited
Returns
-1 when this is equivalent to other_vector (up to the given global relative threshold), or the first index where abs(a[i]-b[i])/max_j(a[j],b[j]) exceeds the threshold.

Definition at line 211 of file numeric_vector.C.

213{
214 libmesh_assert(this->compatible(other_vector));
215
216 int first_different_i = std::numeric_limits<int>::max();
218
219 const Real my_norm = this->linfty_norm();
220 const Real other_norm = other_vector.linfty_norm();
221 const Real abs_threshold = std::max(my_norm, other_norm) * threshold;
222
223 do
224 {
225 if (std::abs((*this)(i) - other_vector(i) ) > abs_threshold)
226 first_different_i = i;
227 else
228 i++;
229 }
230 while (first_different_i==std::numeric_limits<int>::max()
231 && i<last_local_index());
232
233 // Find the correct first differing index in parallel
234 this->comm().min(first_different_i);
235
236 if (first_different_i == std::numeric_limits<int>::max())
237 return -1;
238
239 return first_different_i;
240}
virtual Real linfty_norm() const =0
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

References libMesh::libmesh_assert(), libMesh::NumericVector< T >::linfty_norm(), and libMesh::Real.

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 183 of file reference_counter.h.

184{
185 libmesh_try
186 {
187 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
188 std::pair<unsigned int, unsigned int> & p = _counts[name];
189 p.first++;
190 }
191 libmesh_catch (...)
192 {
193 auto stream = libMesh::err.get();
194 stream->exceptions(stream->goodbit); // stream must not throw
195 libMesh::err << "Encountered unrecoverable error while calling "
196 << "ReferenceCounter::increment_constructor_count() "
197 << "for a(n) " << name << " object." << std::endl;
198 std::terminate();
199 }
200}
streamT * get()
Rather than implement every ostream/ios/ios_base function, we'll be lazy and make esoteric uses go th...
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition threads.C:30
OStreamProxy err

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), libMesh::ReferenceCountedObject< T >::ReferenceCountedObject(), and libMesh::ReferenceCountedObject< T >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectednoexceptinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 207 of file reference_counter.h.

208{
209 libmesh_try
210 {
211 Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
212 std::pair<unsigned int, unsigned int> & p = _counts[name];
213 p.second++;
214 }
215 libmesh_catch (...)
216 {
217 auto stream = libMesh::err.get();
218 stream->exceptions(stream->goodbit); // stream must not throw
219 libMesh::err << "Encountered unrecoverable error while calling "
220 << "ReferenceCounter::increment_destructor_count() "
221 << "for a(n) " << name << " object." << std::endl;
222 std::terminate();
223 }
224}

References libMesh::err, libMesh::BasicOStreamProxy< charT, traits >::get(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< T >::~ReferenceCountedObject().

◆ init() [1/4]

template<typename T >
void libMesh::DistributedVector< T >::init ( const numeric_index_type  n,
const bool  fast = false,
const ParallelType  ptype = AUTOMATIC 
)
inlineoverridevirtual

Call init() with n_local = N.

Implements libMesh::NumericVector< T >.

Definition at line 455 of file distributed_vector.h.

458{
459 this->init(n,n,fast,ptype);
460}

◆ init() [2/4]

template<typename T >
void libMesh::DistributedVector< T >::init ( const numeric_index_type  n,
const numeric_index_type  n_local,
const bool  fast = false,
const ParallelType  ptype = AUTOMATIC 
)
inlineoverridevirtual

Change the dimension of the vector to n.

The reserved memory for this vector remains unchanged if possible. If n==0, all memory is freed. Therefore, if you want to resize the vector and release the memory not needed, you have to first call init(0) and then init(n). This behaviour is analogous to that of the STL containers.

On fast==false, the vector is filled by zeros.

Implements libMesh::NumericVector< T >.

Definition at line 344 of file distributed_vector.h.

348{
349 // This function must be run on all processors at once
350 parallel_object_only();
351
352 libmesh_assert_less_equal (n_local, n);
353
354 if (ptype == AUTOMATIC)
355 {
356 if (n == n_local)
357 this->_type = SERIAL;
358 else
359 this->_type = PARALLEL;
360 }
361 else if (ptype == GHOSTED &&
362 n == n_local) // We can support GHOSTED with no ghosts...
363 this->_type = SERIAL;
364 else
365 this->_type = ptype;
366
367 libmesh_assert ((this->_type==SERIAL && n==n_local) ||
368 this->_type==PARALLEL);
369
370 // Clear the data structures if already initialized
371 if (this->initialized())
372 this->clear();
373
374 // Initialize data structures
376 _values.resize(n_local);
377 _remote_values.clear();
378 _local_size = n_local;
379 _global_size = n;
380
382
383#ifdef LIBMESH_HAVE_MPI
384
385 std::vector<numeric_index_type> local_sizes (this->n_processors(), 0);
386
387 local_sizes[this->processor_id()] = n_local;
388
389 this->comm().sum(local_sizes);
390
391 // _first_local_index is the sum of _local_size
392 // for all processor ids less than ours
393 for (auto p : make_range(this->processor_id()))
394 _first_local_index += local_sizes[p];
395
396
397# ifdef DEBUG
398 // Make sure all the local sizes sum up to the global
399 // size, otherwise there is big trouble!
400 numeric_index_type dbg_sum=0;
401
402 for (auto p : make_range(this->n_processors()))
403 dbg_sum += local_sizes[p];
404
405 libmesh_assert_equal_to (dbg_sum, n);
406
407# endif
408
409#else
410
411 // No other options without MPI!
412 libmesh_error_msg_if(n != n_local, "ERROR: MPI is required for n != n_local!");
413
414#endif
415
417
418 // Set the initialized flag
419 this->_is_initialized = true;
420 this->_is_closed = true;
421
422 // Zero the components unless directed otherwise
423 if (!fast)
424 this->zero();
425}
virtual void zero() override
Set all entries to zero.
virtual void clear() override
Restores the NumericVector<T> to a pristine state.
processor_id_type processor_id() const
IntRange< T > make_range(T beg, T end)
The 2-parameter make_range() helper function returns an IntRange<T> when both input parameters are of...
Definition int_range.h:176

References libMesh::AUTOMATIC, libMesh::GHOSTED, libMesh::initialized(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::PARALLEL, libMesh::SERIAL, and libMesh::zero.

Referenced by libMesh::DistributedVector< T >::DistributedVector(), libMesh::DistributedVector< T >::DistributedVector(), libMesh::DistributedVector< T >::DistributedVector(), and libMesh::DistributedVector< T >::localize().

◆ init() [3/4]

template<typename T >
void libMesh::DistributedVector< T >::init ( const numeric_index_type  n,
const numeric_index_type  n_local,
const std::vector< numeric_index_type > &  ghost,
const bool  fast = false,
const ParallelType  ptype = AUTOMATIC 
)
inlineoverridevirtual

Create a vector that holds the local indices plus those specified in the ghost argument.

Implements libMesh::NumericVector< T >.

Definition at line 430 of file distributed_vector.h.

435{
436 // TODO: we shouldn't ignore the ghost sparsity pattern
437 this->init(n, n_local, fast, ptype);
438}

◆ init() [4/4]

template<class T >
void libMesh::DistributedVector< T >::init ( const NumericVector< T > &  other,
const bool  fast = false 
)
overridevirtual

Creates a vector that has the same dimension and storage type as other, including ghost dofs.

Implements libMesh::NumericVector< T >.

Definition at line 445 of file distributed_vector.h.

447{
448 this->init(other.size(),other.local_size(),fast,other.type());
449}

References libMesh::NumericVector< T >::local_size(), libMesh::NumericVector< T >::size(), and libMesh::NumericVector< T >::type().

◆ initialized()

template<typename T >
virtual bool libMesh::NumericVector< T >::initialized ( ) const
inlinevirtualinherited

◆ insert() [1/5]

template<typename T >
void libMesh::NumericVector< T >::insert ( const DenseSubVector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineinherited

Inserts the entries of v in *this at the locations specified by v.

This method is guaranteed to be thread-safe as long as library implementations of NumericVector are used

Definition at line 1044 of file numeric_vector.h.

1046{
1047 libmesh_assert(v.size() == dof_indices.size());
1048 if (!v.empty())
1049 this->insert(&v(0), dof_indices);
1050}
virtual void insert(const T *v, const std::vector< numeric_index_type > &dof_indices)
Inserts the entries of v in *this at the locations specified by v.

References libMesh::DenseSubVector< T >::empty(), libMesh::libmesh_assert(), and libMesh::DenseSubVector< T >::size().

◆ insert() [2/5]

template<typename T >
void libMesh::NumericVector< T >::insert ( const DenseVector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineinherited

Inserts the entries of v in *this at the locations specified by v.

This method is guaranteed to be thread-safe as long as library implementations of NumericVector are used

Definition at line 1032 of file numeric_vector.h.

1034{
1035 libmesh_assert(v.size() == dof_indices.size());
1036 if (!v.empty())
1037 this->insert(&v(0), dof_indices);
1038}

References libMesh::DenseVector< T >::empty(), libMesh::libmesh_assert(), and libMesh::DenseVector< T >::size().

◆ insert() [3/5]

template<typename T >
void libMesh::NumericVector< T >::insert ( const NumericVector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inherited

Inserts the entries of v in *this at the locations specified by v.

This method is guaranteed to be thread-safe as long as library implementations of NumericVector are used

Definition at line 140 of file numeric_vector.C.

142{
143 libmesh_assert_equal_to (V.size(), dof_indices.size());
144 libmesh_assert (V.readable());
145
146 for (auto i : index_range(dof_indices))
147 this->set (dof_indices[i], V(i));
148}
virtual void set(const numeric_index_type i, const T value)=0
Sets v(i) = value.

◆ insert() [4/5]

template<typename T >
void libMesh::NumericVector< T >::insert ( const std::vector< T > &  v,
const std::vector< numeric_index_type > &  dof_indices 
)
inlineinherited

Inserts the entries of v in *this at the locations specified by v.

This method is guaranteed to be thread-safe as long as library implementations of NumericVector are used

Definition at line 1020 of file numeric_vector.h.

1022{
1023 libmesh_assert(v.size() == dof_indices.size());
1024 if (!v.empty())
1025 this->insert(v.data(), dof_indices);
1026}

References libMesh::libmesh_assert().

◆ insert() [5/5]

template<typename T >
void libMesh::NumericVector< T >::insert ( const T *  v,
const std::vector< numeric_index_type > &  dof_indices 
)
virtualinherited

Inserts the entries of v in *this at the locations specified by v.

Note that library implementations of this method are thread safe

Reimplemented in libMesh::PetscVector< libMesh::Number >, libMesh::PetscVector< T >, and libMesh::EpetraVector< T >.

Definition at line 128 of file numeric_vector.C.

130{
131 libmesh_assert (v);
132
133 for (auto i : index_range(dof_indices))
134 this->set (dof_indices[i], v[i]);
135}

References libMesh::index_range(), and libMesh::libmesh_assert().

Referenced by libMesh::StaticCondensation::backwards_substitution(), and Biharmonic::JR::bounds().

◆ is_effectively_ghosted()

template<typename T >
bool libMesh::NumericVector< T >::is_effectively_ghosted ( ) const
inlineinherited
Returns
Whether the vector is effectively ghosted, i.e. whether vector operations require handling of ghosted coefficients.

This is true for GHOSTED vectors in parallel, but in serial subclasses may return false here for GHOSTED vectors since every ghosted vector is effectively serial and thus may be able to take advantage of serial-specific code paths.

Definition at line 181 of file numeric_vector.h.

182 { return (this->n_processors()!=1) && (_type == GHOSTED); }

References libMesh::NumericVector< T >::_type, libMesh::GHOSTED, and libMesh::ParallelObject::n_processors().

Referenced by libMesh::PetscVector< T >::create_subvector().

◆ is_effectively_serial()

template<typename T >
bool libMesh::NumericVector< T >::is_effectively_serial ( ) const
inlineinherited
Returns
Whether the vector is effectively serial, i.e. whether all vector data is accessible on every processor.

This is true for explicitly SERIAL vectors, but also for vectors on serial (1-processor) communicators.

Definition at line 168 of file numeric_vector.h.

169 { return (this->n_processors()==1) || (_type == SERIAL); }

References libMesh::NumericVector< T >::_type, libMesh::ParallelObject::n_processors(), and libMesh::SERIAL.

Referenced by libMesh::PetscVector< T >::operator=().

◆ l1_norm()

template<typename T >
Real libMesh::DistributedVector< T >::l1_norm ( ) const
overridevirtual
Returns
The \( \ell_1 \)-norm of the vector, i.e. the sum of the absolute values of the entries.

Implements libMesh::NumericVector< T >.

Definition at line 70 of file distributed_vector.C.

71{
72 // This function must be run on all processors at once
73 parallel_object_only();
74
76 libmesh_assert_equal_to (_values.size(), _local_size);
77 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
78
79 Real local_l1 = 0.;
80
81 for (auto & val : _values)
82 local_l1 += std::abs(val);
83
84 this->comm().sum(local_l1);
85
86 return local_l1;
87}

References libMesh::initialized(), libMesh::libmesh_assert(), and libMesh::Real.

◆ l1_norm_diff()

template<class T >
Real libMesh::NumericVector< T >::l1_norm_diff ( const NumericVector< T > &  other_vec) const
inherited
Returns
The \( \ell_1 \)-norm of \( \vec{u} - \vec{v} \), where \( \vec{u} \) is this.

Definition at line 653 of file numeric_vector.C.

654{
655 libmesh_assert(this->compatible(v));
656
657 struct L1Differ {
658 const NumericVector<T> & v1, & v2;
659 Real norm;
660
661 L1Differ (const NumericVector<T> & v1in,
662 const NumericVector<T> & v2in) :
663 v1(v1in), v2(v2in), norm(0) {}
664
665 L1Differ (L1Differ & other, Threads::split) :
666 v1(other.v1), v2(other.v2), norm(0) {}
667
668 void operator()(const IntRange<numeric_index_type> & index_range) {
669 for (const auto i : index_range)
670 norm += libMesh::l1_norm_diff(v1(i), v2(i));
671 }
672
673 void join(const L1Differ & other) {
674 norm += other.norm;
675 }
676 };
677
678 L1Differ differ(*this, v);
679
681
682 this->comm().sum(differ.norm);
683
684 return differ.norm;
685}
auto norm(const T &a)
void parallel_reduce(const Range &range, Body &body, unsigned int n_threads=libMesh::n_threads())
Execute the provided reduction operation in parallel on the specified range.
The libMesh namespace provides an interface to certain functionality in the library.
auto l1_norm_diff(const NumericVector< T > &vec1, const NumericVector< T > &vec2)

References libMesh::index_range(), libMesh::l1_norm_diff(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::Threads::parallel_reduce(), and libMesh::Real.

Referenced by libMesh::l1_norm_diff().

◆ l2_norm()

template<typename T >
Real libMesh::DistributedVector< T >::l2_norm ( ) const
overridevirtual
Returns
The \( \ell_2 \)-norm of the vector, i.e. the square root of the sum of the squares of the entries.

Implements libMesh::NumericVector< T >.

Definition at line 92 of file distributed_vector.C.

93{
94 // This function must be run on all processors at once
95 parallel_object_only();
96
98 libmesh_assert_equal_to (_values.size(), _local_size);
99 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
100
101 Real local_l2 = 0.;
102
103 for (auto & val : _values)
104 local_l2 += TensorTools::norm_sq(val);
105
106 this->comm().sum(local_l2);
107
108 return std::sqrt(local_l2);
109}
auto norm_sq(const T &a)

References libMesh::initialized(), libMesh::libmesh_assert(), libMesh::TensorTools::norm_sq(), and libMesh::Real.

◆ l2_norm_diff()

template<class T >
Real libMesh::NumericVector< T >::l2_norm_diff ( const NumericVector< T > &  other_vec) const
inherited
Returns
The \( \ell_2 \)-norm of \( \vec{u} - \vec{v} \), where \( \vec{u} \) is this.

Definition at line 616 of file numeric_vector.C.

617{
618 libmesh_assert(this->compatible(v));
619
620 struct L2Differ {
621 const NumericVector<T> & v1, & v2;
623
624 L2Differ (const NumericVector<T> & v1in,
625 const NumericVector<T> & v2in) :
626 v1(v1in), v2(v2in), norm_sq(0) {}
627
628 L2Differ (L2Differ & other, Threads::split) :
629 v1(other.v1), v2(other.v2), norm_sq(0) {}
630
631 void operator()(const IntRange<numeric_index_type> & index_range) {
632 for (const auto i : index_range)
633 norm_sq += TensorTools::norm_sq(v1(i) - v2(i));
634 }
635
636 void join(const L2Differ & other) {
637 norm_sq += other.norm_sq;
638 }
639 };
640
641 L2Differ differ(*this, v);
642
644
645 this->comm().sum(differ.norm_sq);
646
647 return std::sqrt(differ.norm_sq);
648}

References libMesh::index_range(), libMesh::libmesh_assert(), libMesh::make_range(), libMesh::Threads::parallel_reduce(), and libMesh::Real.

◆ last_local_index()

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::last_local_index ( ) const
inlineoverridevirtual
Returns
The index+1 of the last vector element actually stored on this processor.
Note
The maximum for this index is size().

Implements libMesh::NumericVector< T >.

Definition at line 569 of file distributed_vector.h.

570{
571 libmesh_assert (this->initialized());
572 libmesh_assert_equal_to (_values.size(), _local_size);
573 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
574
575 return _last_local_index;
576}

References libMesh::initialized(), and libMesh::libmesh_assert().

Referenced by libMesh::DistributedVector< T >::dot().

◆ linfty_norm()

template<typename T >
Real libMesh::DistributedVector< T >::linfty_norm ( ) const
overridevirtual
Returns
The \( \ell_{\infty} \)-norm of the vector, i.e. the maximum absolute value of the entries of the vector.

Implements libMesh::NumericVector< T >.

Definition at line 114 of file distributed_vector.C.

115{
116 // This function must be run on all processors at once
117 parallel_object_only();
118
119 libmesh_assert (this->initialized());
120 libmesh_assert_equal_to (_values.size(), _local_size);
121 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
122
123 Real local_linfty = 0.;
124
125 for (auto & val : _values)
126 local_linfty = std::max(local_linfty,
127 static_cast<Real>(std::abs(val))
128 ); // Note we static_cast so that both
129 // types are the same, as required
130 // by std::max
131
132 this->comm().max(local_linfty);
133
134 return local_linfty;
135}
virtual Real max() const override

References libMesh::initialized(), libMesh::libmesh_assert(), and libMesh::Real.

◆ local_relative_compare()

template<typename T >
int libMesh::NumericVector< T >::local_relative_compare ( const NumericVector< T > &  other_vector,
const Real  threshold = TOLERANCE 
) const
virtualinherited
Returns
-1 when this is equivalent to other_vector, (up to the given local relative threshold), or the first index where abs(a[i]-b[i])/max(a[i],b[i]) exceeds the threshold.

Definition at line 181 of file numeric_vector.C.

183{
184 libmesh_assert(this->compatible(other_vector));
185
186 int first_different_i = std::numeric_limits<int>::max();
188
189 do
190 {
191 if (std::abs((*this)(i) - other_vector(i)) > threshold *
192 std::max(std::abs((*this)(i)), std::abs(other_vector(i))))
193 first_different_i = i;
194 else
195 i++;
196 }
197 while (first_different_i==std::numeric_limits<int>::max()
198 && i<last_local_index());
199
200 // Find the correct first differing index in parallel
201 this->comm().min(first_different_i);
202
203 if (first_different_i == std::numeric_limits<int>::max())
204 return -1;
205
206 return first_different_i;
207}

References libMesh::libmesh_assert().

◆ local_size()

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::local_size ( ) const
inlineoverridevirtual
Returns
The local size of the vector, i.e. index_stop - index_start.

Implements libMesh::NumericVector< T >.

Definition at line 543 of file distributed_vector.h.

544{
545 libmesh_assert (this->initialized());
546 libmesh_assert_equal_to (_values.size(), _local_size);
547 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
548
549 return _local_size;
550}

References libMesh::initialized(), and libMesh::libmesh_assert().

Referenced by libMesh::DistributedVector< T >::operator=().

◆ localize() [1/5]

template<typename T >
void libMesh::DistributedVector< T >::localize ( const numeric_index_type  first_local_idx,
const numeric_index_type  last_local_idx,
const std::vector< numeric_index_type > &  send_list 
)
overridevirtual

Updates a local vector with selected values from neighboring processors, as defined by send_list.

Implements libMesh::NumericVector< T >.

Definition at line 616 of file distributed_vector.C.

619{
620 // Only good for serial vectors
621 libmesh_assert_equal_to (this->size(), this->local_size());
622 libmesh_assert_greater (last_local_idx, first_local_idx);
623 libmesh_assert_less_equal (send_list.size(), this->size());
624 libmesh_assert_less (last_local_idx, this->size());
625
626 const numeric_index_type my_size = this->size();
627 const numeric_index_type my_local_size = (last_local_idx - first_local_idx + 1);
628
629 // Don't bother for serial cases
630 if ((first_local_idx == 0) &&
631 (my_local_size == my_size))
632 return;
633
634
635 // Build a parallel vector, initialize it with the local
636 // parts of (*this)
637 DistributedVector<T> parallel_vec(this->comm());
638
639 parallel_vec.init (my_size, my_local_size, true, PARALLEL);
640
641 // Copy part of *this into the parallel_vec
642 for (numeric_index_type i=first_local_idx; i<=last_local_idx; i++)
643 parallel_vec._values[i-first_local_idx] = _values[i];
644
645 // localize like normal
646 parallel_vec.localize (*this, send_list);
647}
virtual numeric_index_type local_size() const override

References libMesh::DistributedVector< T >::_values, libMesh::DistributedVector< T >::init(), libMesh::DistributedVector< T >::localize(), and libMesh::PARALLEL.

◆ localize() [2/5]

template<typename T >
void libMesh::DistributedVector< T >::localize ( NumericVector< T > &  v_local) const
overridevirtual

Same, but fills a NumericVector<T> instead of a std::vector.

Implements libMesh::NumericVector< T >.

Definition at line 479 of file distributed_vector.C.

481{
482 libmesh_assert (this->initialized());
483 libmesh_assert_equal_to (_values.size(), _local_size);
484 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
485
486 DistributedVector<T> * v_local = cast_ptr<DistributedVector<T> *>(&v_local_in);
487
488 v_local->_first_local_index = 0;
489
490 v_local->_global_size =
491 v_local->_local_size =
492 v_local->_last_local_index = size();
493
494 v_local->_is_initialized =
495 v_local->_is_closed = true;
496
497 // Call localize on the vector's values. This will help
498 // prevent code duplication
499 localize (v_local->_values);
500
501#ifndef LIBMESH_HAVE_MPI
502
503 libmesh_assert_equal_to (local_size(), size());
504
505#endif
506}
virtual void localize(std::vector< T > &v_local) const override
Creates a copy of the global vector in the local vector v_local.

References libMesh::DistributedVector< T >::_first_local_index, libMesh::DistributedVector< T >::_global_size, libMesh::NumericVector< T >::_is_closed, libMesh::NumericVector< T >::_is_initialized, libMesh::DistributedVector< T >::_last_local_index, libMesh::DistributedVector< T >::_local_size, libMesh::DistributedVector< T >::_values, libMesh::initialized(), and libMesh::libmesh_assert().

◆ localize() [3/5]

template<typename T >
void libMesh::DistributedVector< T >::localize ( NumericVector< T > &  v_local,
const std::vector< numeric_index_type > &  send_list 
) const
overridevirtual

Creates a local vector v_local containing only information relevant to this processor, as defined by the send_list.

Implements libMesh::NumericVector< T >.

Definition at line 511 of file distributed_vector.C.

513{
514 libmesh_assert (this->initialized());
515 libmesh_assert_equal_to (_values.size(), _local_size);
516 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
517
518 // TODO: We don't yet support the send list; this is inefficient:
519 localize (v_local_in);
520}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ localize() [4/5]

template<typename T >
void libMesh::DistributedVector< T >::localize ( std::vector< T > &  v_local) const
overridevirtual

Creates a copy of the global vector in the local vector v_local.

Implements libMesh::NumericVector< T >.

Definition at line 652 of file distributed_vector.C.

653{
654 // This function must be run on all processors at once
655 parallel_object_only();
656
657 libmesh_assert (this->initialized());
658 libmesh_assert_equal_to (_values.size(), _local_size);
659 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
660
661 v_local = this->_values;
662
663 this->comm().allgather (v_local);
664
665#ifndef LIBMESH_HAVE_MPI
666 libmesh_assert_equal_to (local_size(), size());
667#endif
668}

References libMesh::initialized(), and libMesh::libmesh_assert().

Referenced by libMesh::DistributedVector< T >::localize().

◆ localize() [5/5]

template<typename T >
void libMesh::DistributedVector< T >::localize ( std::vector< T > &  v_local,
const std::vector< numeric_index_type > &  indices 
) const
overridevirtual

Fill in the local std::vector "v_local" with the global indices given in "indices".

Note
The indices can be different on every processor, and the same index can be localized to more than one processor. The resulting v_local can be shorter than the original, and the entries will be in the order specified by indices.

Example:

*   On 4 procs *this = {a, b, c, d, e, f, g, h, i} is a parallel vector.
*   On each proc, the indices arrays are set up as:
*   proc0, indices = {1,2,4,5}
*   proc1, indices = {2,5,6,8}
*   proc2, indices = {2,3,6,7}
*   proc3, indices = {0,1,2,3}
*
*   After calling this version of localize, the v_local vectors are:
*   proc0, v_local = {b,c,e,f}
*   proc1, v_local = {c,f,g,i}
*   proc2, v_local = {c,d,g,h}
*   proc3, v_local = {a,b,c,d}
* 

This function is useful in parallel I/O routines, when you have a parallel vector of solution values which you want to write a subset of.

Implements libMesh::NumericVector< T >.

Definition at line 525 of file distributed_vector.C.

527{
528 // Resize v_local so there is enough room to hold all the local values.
529 v_local.resize(indices.size());
530
531 // We need to know who has the values we want, so get everyone's _local_size
532 std::vector<numeric_index_type> local_sizes;
533 this->comm().allgather (_local_size, local_sizes);
534
535 // Make a vector of partial sums of local sizes
536 std::vector<numeric_index_type> local_size_sums(this->n_processors());
537 local_size_sums[0] = local_sizes[0];
538 for (auto i : IntRange<numeric_index_type>(1, local_sizes.size()))
539 local_size_sums[i] = local_size_sums[i-1] + local_sizes[i];
540
541 // We now fill in 'requested_ids' based on the indices. Also keep
542 // track of the local index (in the indices vector) for each of
543 // these, since we need that when unpacking.
544 std::map<processor_id_type, std::vector<numeric_index_type>>
545 requested_ids, local_requested_ids;
546
547 // We'll use this typedef a couple of times below.
548 typedef typename std::vector<numeric_index_type>::iterator iter_t;
549
550 // For each index in indices, determine which processor it is on.
551 // This is an O(N*log(p)) algorithm that uses std::upper_bound().
552 // Note: upper_bound() returns an iterator to the first entry which is
553 // greater than the given value.
554 for (auto i : index_range(indices))
555 {
556 iter_t ub = std::upper_bound(local_size_sums.begin(),
557 local_size_sums.end(),
558 indices[i]);
559
560 processor_id_type on_proc = cast_int<processor_id_type>
561 (std::distance(local_size_sums.begin(), ub));
562
563 requested_ids[on_proc].push_back(indices[i]);
564 local_requested_ids[on_proc].push_back(i);
565 }
566
567 auto gather_functor =
568 [this]
569 (processor_id_type, const std::vector<dof_id_type> & ids,
570 std::vector<T> & values)
571 {
572 // The first send/receive we did was for indices, the second one will be
573 // for corresponding floating point values, so create storage for that now...
574 const std::size_t ids_size = ids.size();
575 values.resize(ids_size);
576
577 for (std::size_t i=0; i != ids_size; i++)
578 {
579 // The index of the requested value
580 const numeric_index_type requested_index = ids[i];
581
582 // Transform into local numbering, and get requested value.
583 values[i] = _values[requested_index - _first_local_index];
584 }
585 };
586
587 auto action_functor =
588 [& v_local, & local_requested_ids]
590 const std::vector<dof_id_type> &,
591 const std::vector<T> & values)
592 {
593 // Now write the received values to the appropriate place(s) in v_local
594 for (auto i : index_range(values))
595 {
596 libmesh_assert(local_requested_ids.count(pid));
597 libmesh_assert_less(i, local_requested_ids[pid].size());
598
599 // Get the index in v_local where this value needs to be inserted.
600 const numeric_index_type local_requested_index =
601 local_requested_ids[pid][i];
602
603 // Actually set the value in v_local
604 v_local[local_requested_index] = values[i];
605 }
606 };
607
608 const T * ex = nullptr;
610 (this->comm(), requested_ids, gather_functor, action_functor, ex);
611}
void pull_parallel_vector_data(const Communicator &comm, const MapToVectors &queries, GatherFunctor &gather_data, const ActionFunctor &act_on_data, const datum *example)

References libMesh::index_range(), libMesh::libmesh_assert(), and TIMPI::pull_parallel_vector_data().

◆ localize_to_one()

template<typename T >
void libMesh::DistributedVector< T >::localize_to_one ( std::vector< T > &  v_local,
const processor_id_type  proc_id = 0 
) const
overridevirtual

Creates a local copy of the global vector in v_local only on processor proc_id.

By default the data is sent to processor 0. This method is useful for outputting data from one processor.

Implements libMesh::NumericVector< T >.

Definition at line 673 of file distributed_vector.C.

675{
676 // This function must be run on all processors at once
677 parallel_object_only();
678
679 libmesh_assert (this->initialized());
680 libmesh_assert_equal_to (_values.size(), _local_size);
681 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
682
683 v_local = this->_values;
684
685 this->comm().gather (pid, v_local);
686
687#ifndef LIBMESH_HAVE_MPI
688 libmesh_assert_equal_to (local_size(), size());
689#endif
690}
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) const

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ max()

template<typename T >
Real libMesh::DistributedVector< T >::max ( ) const
inlineoverridevirtual
Returns
The maximum entry in the vector, or the maximum real part in the case of complex numbers.

Implements libMesh::NumericVector< T >.

Definition at line 674 of file distributed_vector.h.

675{
676 // This function must be run on all processors at once
677 parallel_object_only();
678
679 libmesh_assert (this->initialized());
680 libmesh_assert (this->closed());
681 libmesh_assert_equal_to (_values.size(), _local_size);
682 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
683
684 Real local_max = -std::numeric_limits<Real>::max();
685 for (auto v : _values)
686 local_max = std::max(libmesh_real(v), local_max);
687
688 this->comm().max(local_max);
689
690 return local_max;
691}
virtual bool closed() const
T libmesh_real(T a)

References libMesh::closed(), libMesh::initialized(), libMesh::libmesh_assert(), libMesh::libmesh_real(), and libMesh::Real.

◆ max_allowed_id()

template<typename T >
std::size_t libMesh::DistributedVector< T >::max_allowed_id ( ) const
inlineoverridevirtual
Returns
the max number of entries (across all procs) that the NumericVector can have.

Although we define numeric_index_type, and it is typically required that the NumericVector's underlying implementation's indices have size equal to sizeof(numeric_index_type), these two types can still have different signedness, which affects the maximum number of values which can be stored in the NumericVector.

Implements libMesh::NumericVector< T >.

Definition at line 716 of file distributed_vector.h.

717{
718 // Uses a std:vector<T>, so our indexing matches that
719 return std::numeric_limits<typename std::vector<T>::size_type>::max();
720}

◆ min()

template<typename T >
Real libMesh::DistributedVector< T >::min ( ) const
inlineoverridevirtual
Returns
The minimum entry in the vector, or the minimum real part in the case of complex numbers.

Implements libMesh::NumericVector< T >.

Definition at line 651 of file distributed_vector.h.

652{
653 // This function must be run on all processors at once
654 parallel_object_only();
655
656 libmesh_assert (this->initialized());
657 libmesh_assert (this->closed());
658 libmesh_assert_equal_to (_values.size(), _local_size);
659 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
660
661 Real local_min = std::numeric_limits<Real>::max();
662 for (auto v : _values)
663 local_min = std::min(libmesh_real(v), local_min);
664
665 this->comm().min(local_min);
666
667 return local_min;
668}
virtual Real min() const override

References libMesh::closed(), libMesh::initialized(), libMesh::libmesh_assert(), libMesh::libmesh_real(), and libMesh::Real.

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 85 of file reference_counter.h.

86 { return _n_objects; }
static Threads::atomic< unsigned int > _n_objects
The number of objects.

References libMesh::ReferenceCounter::_n_objects.

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ n_processors()

processor_id_type libMesh::ParallelObject::n_processors ( ) const
inlineinherited
Returns
The number of processors in the group.

Definition at line 103 of file parallel_object.h.

104 {
105 processor_id_type returnval =
106 cast_int<processor_id_type>(_communicator.size());
107 libmesh_assert(returnval); // We never have an empty comm
108 return returnval;
109 }
processor_id_type size() const

References libMesh::ParallelObject::_communicator, libMesh::libmesh_assert(), and libMesh::Parallel::Communicator::size().

Referenced by libMesh::Partitioner::_find_global_index_by_pid_map(), libMesh::BoundaryInfo::_find_id_maps(), libMesh::DofMap::add_constraints_to_send_list(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::DistributedMesh::add_node(), libMesh::System::add_vector(), libMesh::LaplaceMeshSmoother::allgather_graph(), libMesh::DofMap::allgather_recursive_constraints(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::AztecLinearSolver< T >::AztecLinearSolver(), libMesh::Partitioner::build_graph(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::UnstructuredMesh::copy_nodes_and_elements(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::UnstructuredMesh::create_pid_mesh(), libMesh::MeshTools::create_processor_bounding_box(), libMesh::DistributedMesh::DistributedMesh(), libMesh::EnsightIO::EnsightIO(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::MeshBase::get_info(), libMesh::StaticCondensation::init(), libMesh::SystemSubsetBySubdomain::init(), libMesh::PetscDMWrapper::init_petscdm(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::Nemesis_IO_Helper::initialize(), libMesh::DistributedMesh::insert_elem(), libMesh::NumericVector< T >::is_effectively_ghosted(), libMesh::NumericVector< T >::is_effectively_serial(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_new_node_procids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_topology_consistent_procids< Node >(), libMesh::MeshTools::libmesh_assert_valid_boundary_ids(), libMesh::MeshTools::libmesh_assert_valid_dof_ids(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::MeshTools::libmesh_assert_valid_refinement_flags(), libMesh::MeshBase::n_active_elem_on_proc(), libMesh::DofMap::n_dofs_per_processor(), libMesh::MeshBase::n_elem_on_proc(), libMesh::MeshBase::n_nodes_on_proc(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::MeshBase::partition(), libMesh::Partitioner::partition(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::Partitioner::partition_unpartitioned_elements(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::CheckpointIO::read_connectivity(), libMesh::XdrIO::read_header(), libMesh::CheckpointIO::read_nodes(), libMesh::System::read_parallel_data(), libMesh::System::read_SCALAR_dofs(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::System::read_serialized_vector(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::Partitioner::repartition(), OverlappingFunctorTest::run_partitioner_test(), libMesh::DofMap::scatter_constraints(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), WriteVecAndScalar::setupTests(), libMesh::RBEIMEvaluation::side_gather_bfs(), DistributedMeshTest::testRemoteElemError(), CheckpointIOTest::testSplitter(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::GMVIO::write_binary(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::System::write_parallel_data(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::XdrIO::write_serialized_nodes(), and libMesh::XdrIO::write_serialized_nodesets().

◆ operator()()

template<typename T >
T libMesh::DistributedVector< T >::operator() ( const numeric_index_type  i) const
inlineoverridevirtual
Returns
A copy of the ith entry of the vector.

Implements libMesh::NumericVector< T >.

Definition at line 582 of file distributed_vector.h.

583{
584 libmesh_assert (this->initialized());
585 libmesh_assert_equal_to (_values.size(), _local_size);
586 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
587 libmesh_assert ( ((i >= first_local_index()) &&
588 (i < last_local_index())) );
589
590 return _values[i - _first_local_index];
591}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ operator*=() [1/2]

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator*= ( const NumericVector< T > &  v)
overridevirtual

Computes the component-wise multiplication of this vector's entries by another's, \( u_i \leftarrow u_i v_i \, \forall i\).

Returns
A reference to *this.

Implements libMesh::NumericVector< T >.

Definition at line 170 of file distributed_vector.C.

171{
172 libmesh_assert_equal_to(size(), v.size());
173
174 const DistributedVector<T> & v_vec = cast_ref<const DistributedVector<T> &>(v);
175
176 for (auto i : index_range(_values))
177 _values[i] *= v_vec._values[i];
178
179 return *this;
180}

References libMesh::DistributedVector< T >::_values, libMesh::index_range(), and libMesh::NumericVector< T >::size().

◆ operator*=() [2/2]

template<typename T >
NumericVector< T > & libMesh::NumericVector< T >::operator*= ( const T  a)
inlineinherited

Scales the vector by a, \( \vec{u} \leftarrow a\vec{u} \).

Equivalent to u.scale(a)

Returns
A reference to *this.

Definition at line 448 of file numeric_vector.h.

448{ this->scale(a); return *this; }
virtual void scale(const T factor)=0
Scale each element of the vector by the given factor.

References libMesh::NumericVector< T >::scale().

◆ operator+=()

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator+= ( const NumericVector< T > &  v)
overridevirtual

Adds v to *this, \( \vec{u} \leftarrow \vec{u} + \vec{v} \).

Equivalent to u.add(1, v).

Returns
A reference to *this.

Implements libMesh::NumericVector< T >.

Definition at line 140 of file distributed_vector.C.

141{
142 libmesh_assert (this->closed());
143 libmesh_assert (this->initialized());
144 libmesh_assert_equal_to (_values.size(), _local_size);
145 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
146
147 add(1., v);
148
149 return *this;
150}

References libMesh::closed(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ operator-=()

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator-= ( const NumericVector< T > &  v)
overridevirtual

Subtracts v from *this, \( \vec{u} \leftarrow \vec{u} - \vec{v} \).

Equivalent to u.add(-1, v).

Returns
A reference to *this.

Implements libMesh::NumericVector< T >.

Definition at line 155 of file distributed_vector.C.

156{
157 libmesh_assert (this->closed());
158 libmesh_assert (this->initialized());
159 libmesh_assert_equal_to (_values.size(), _local_size);
160 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
161
162 add(-1., v);
163
164 return *this;
165}

References libMesh::closed(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ operator/=() [1/2]

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator/= ( const NumericVector< T > &  v)
overridevirtual

Computes the component-wise division of this vector's entries by another's, \( u_i \leftarrow \frac{u_i}{v_i} \, \forall i\).

Returns
A reference to *this.

Implements libMesh::NumericVector< T >.

Definition at line 185 of file distributed_vector.C.

186{
187 libmesh_assert_equal_to(size(), v.size());
188
189 const DistributedVector<T> & v_vec = cast_ref<const DistributedVector<T> &>(v);
190
191 for (auto i : index_range(_values))
192 _values[i] /= v_vec._values[i];
193
194 return *this;
195}

References libMesh::DistributedVector< T >::_values, libMesh::index_range(), and libMesh::NumericVector< T >::size().

◆ operator/=() [2/2]

template<typename T >
NumericVector< T > & libMesh::NumericVector< T >::operator/= ( const T  a)
inlineinherited

Scales the vector by 1/a, \( \vec{u} \leftarrow \frac{1}{a}\vec{u} \).

Equivalent to u.scale(1./a)

Returns
A reference to *this.

Definition at line 466 of file numeric_vector.h.

466{ this->scale(1./a); return *this; }

References libMesh::NumericVector< T >::scale().

◆ operator=() [1/5]

template<typename T >
DistributedVector< T > & libMesh::DistributedVector< T >::operator= ( const DistributedVector< T > &  v)

Copy assignment operator.

We cannot default this (although it essentially implements the default behavior) because the compiler-generated default attempts to automatically call the base class (NumericVector) copy assignment operator, which we have chosen to make pure virtual for other design reasons.

Definition at line 353 of file distributed_vector.C.

354{
355 this->_is_initialized = v._is_initialized;
356 this->_is_closed = v._is_closed;
357
358 _global_size = v._global_size;
359 _local_size = v._local_size;
360 _first_local_index = v._first_local_index;
361 _last_local_index = v._last_local_index;
362
363 if (v.local_size() == this->local_size())
364 _values = v._values;
365
366 else
367 libmesh_error_msg("v.local_size() = " << v.local_size() << " must be equal to this->local_size() = " << this->local_size());
368
369 return *this;
370}

References libMesh::DistributedVector< T >::_first_local_index, libMesh::DistributedVector< T >::_global_size, libMesh::NumericVector< T >::_is_closed, libMesh::NumericVector< T >::_is_initialized, libMesh::DistributedVector< T >::_last_local_index, libMesh::DistributedVector< T >::_local_size, libMesh::DistributedVector< T >::_values, and libMesh::DistributedVector< T >::local_size().

◆ operator=() [2/5]

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator= ( const NumericVector< T > &  v)
overridevirtual

This looks like a copy assignment operator, but note that, unlike normal copy assignment operators, it is pure virtual.

This function should be overridden in derived classes so that they can be copied correctly via references to the base class. This design usually isn't a good idea in general, but in this context it works because we usually don't have a mix of different kinds of NumericVectors active in the library at a single time.

Returns
A reference to *this as the base type.

Implements libMesh::NumericVector< T >.

Definition at line 339 of file distributed_vector.C.

340{
341 // Make sure the NumericVector passed in is really a DistributedVector
342 const DistributedVector<T> * v = cast_ptr<const DistributedVector<T> *>(&v_in);
343
344 *this = *v;
345
346 return *this;
347}

◆ operator=() [3/5]

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator= ( const std::vector< T > &  v)
overridevirtual

Sets (*this)(i) = v(i) for each entry of the vector.

Returns
A reference to *this as the base type.

Implements libMesh::NumericVector< T >.

Definition at line 376 of file distributed_vector.C.

377{
378 libmesh_assert (this->initialized());
379 libmesh_assert_equal_to (_values.size(), _local_size);
380 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
381
382 if (v.size() == local_size())
383 _values = v;
384
385 else if (v.size() == size())
386 for (auto i : index_range(*this))
387 _values[i-first_local_index()] = v[i];
388
389 else
390 libmesh_error_msg("Incompatible sizes in DistributedVector::operator=");
391
392 return *this;
393}

References libMesh::index_range(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ operator=() [4/5]

template<typename T >
NumericVector< T > & libMesh::DistributedVector< T >::operator= ( const T  s)
overridevirtual

Sets all entries of the vector to the value s.

Returns
A reference to *this.

Implements libMesh::NumericVector< T >.

Definition at line 323 of file distributed_vector.C.

324{
325 libmesh_assert (this->initialized());
326 libmesh_assert_equal_to (_values.size(), _local_size);
327 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
328
329 for (auto & val : _values)
330 val = s;
331
332 return *this;
333}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ operator=() [5/5]

template<typename T >
DistributedVector & libMesh::DistributedVector< T >::operator= ( DistributedVector< T > &&  )
default

◆ pointwise_divide()

template<typename T >
void libMesh::DistributedVector< T >::pointwise_divide ( const NumericVector< T > &  vec1,
const NumericVector< T > &  vec2 
)
overridevirtual

Computes \( u_i \leftarrow \frac{v_{1,i}}{v_{2,i}} \) (summation not implied) i.e.

the pointwise (component-wise) division of vec1 and vec2, and stores the result in *this.

Implements libMesh::NumericVector< T >.

Definition at line 704 of file distributed_vector.C.

706{
707 libmesh_not_implemented();
708}

◆ pointwise_mult()

template<typename T >
void libMesh::DistributedVector< T >::pointwise_mult ( const NumericVector< T > &  vec1,
const NumericVector< T > &  vec2 
)
overridevirtual

Computes \( u_i \leftarrow u_i v_i \) (summation not implied) i.e.

the pointwise (component-wise) product of vec1 and vec2, and stores the result in *this.

Implements libMesh::NumericVector< T >.

Definition at line 695 of file distributed_vector.C.

699{
700 libmesh_not_implemented();
701}

◆ print() [1/2]

void libMesh::NumericVector< Complex >::print ( std::ostream &  os) const
inlineinherited

Definition at line 1059 of file numeric_vector.h.

1060{
1061 libmesh_assert (this->initialized());
1062 os << "Size\tglobal = " << this->size()
1063 << "\t\tlocal = " << this->local_size() << std::endl;
1064
1065 // std::complex<>::operator<<() is defined, but use this form
1066 os << "#\tReal part\t\tImaginary part" << std::endl;
1067 for (auto i : index_range(*this))
1068 os << i << "\t"
1069 << (*this)(i).real() << "\t\t"
1070 << (*this)(i).imag() << std::endl;
1071}
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
boost::multiprecision::float128 imag(const boost::multiprecision::float128)

References libMesh::index_range(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ print() [2/2]

template<typename T >
void libMesh::NumericVector< T >::print ( std::ostream &  os = libMesh::out) const
inlinevirtualinherited

Prints the local contents of the vector, by default to libMesh::out.

Definition at line 1077 of file numeric_vector.h.

1078{
1079 libmesh_assert (this->initialized());
1080 os << "Size\tglobal = " << this->size()
1081 << "\t\tlocal = " << this->local_size() << std::endl;
1082
1083 os << "#\tValue" << std::endl;
1084 for (auto i : index_range(*this))
1085 os << i << "\t" << (*this)(i) << std::endl;
1086}

References libMesh::index_range(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ print_global() [1/2]

void libMesh::NumericVector< Complex >::print_global ( std::ostream &  os) const
inlineinherited

Definition at line 1092 of file numeric_vector.h.

1093{
1094 libmesh_assert (this->initialized());
1095
1096 std::vector<Complex> v(this->size());
1097 this->localize(v);
1098
1099 // Right now we only want one copy of the output
1100 if (this->processor_id())
1101 return;
1102
1103 os << "Size\tglobal = " << this->size() << std::endl;
1104 os << "#\tReal part\t\tImaginary part" << std::endl;
1105 for (auto i : make_range(v.size()))
1106 os << i << "\t"
1107 << v[i].real() << "\t\t"
1108 << v[i].imag() << std::endl;
1109}
virtual void localize(std::vector< T > &v_local) const =0
Creates a copy of the global vector in the local vector v_local.

References libMesh::initialized(), libMesh::libmesh_assert(), and libMesh::make_range().

◆ print_global() [2/2]

template<typename T >
void libMesh::NumericVector< T >::print_global ( std::ostream &  os = libMesh::out) const
inlinevirtualinherited

Prints the global contents of the vector, by default to libMesh::out.

Definition at line 1114 of file numeric_vector.h.

1115{
1116 libmesh_assert (this->initialized());
1117
1118 std::vector<T> v(this->size());
1119 this->localize(v);
1120
1121 // Right now we only want one copy of the output
1122 if (this->processor_id())
1123 return;
1124
1125 os << "Size\tglobal = " << this->size() << std::endl;
1126 os << "#\tValue" << std::endl;
1127 for (auto i : make_range(v.size()))
1128 os << i << "\t" << v[i] << std::endl;
1129}

References libMesh::initialized(), libMesh::libmesh_assert(), and libMesh::make_range().

◆ print_info()

void libMesh::ReferenceCounter::print_info ( std::ostream &  out_stream = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 81 of file reference_counter.C.

82{
84 out_stream << ReferenceCounter::get_info();
85}
static std::string get_info()
Gets a string containing the reference information.

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

Referenced by libMesh::LibMeshInit::~LibMeshInit().

◆ print_matlab()

template<typename T >
void libMesh::NumericVector< T >::print_matlab ( const std::string &  filename = "") const
virtualinherited

Print the contents of the vector in Matlab's sparse matrix format.

Optionally prints the vector to the file named name. If name is not specified it is dumped to the screen.

Reimplemented in libMesh::PetscVector< T >, and libMesh::PetscVector< libMesh::Number >.

Definition at line 245 of file numeric_vector.C.

246{
247 parallel_object_only();
248
249 libmesh_assert (this->initialized());
250
251 const numeric_index_type first_dof = this->first_local_index(),
252 end_dof = this->last_local_index();
253
254 // We'll print the vector from processor 0 to make sure
255 // it's serialized properly
256 if (this->processor_id() == 0)
257 {
258 std::unique_ptr<std::ofstream> file;
259
260 if (filename != "")
261 file = std::make_unique<std::ofstream>(filename.c_str());
262
263 std::ostream & os = (filename == "") ? libMesh::out : *file;
264
265 // Print a header similar to PETSC_VIEWER_ASCII_MATLAB
266 os << "%Vec Object: () " << this->n_processors() << " MPI processes\n"
267 << "% type: " << (this->n_processors() > 1 ? "mpi" : "seq") << "\n"
268 << "Vec = [\n";
269
270 for (numeric_index_type i : make_range(end_dof))
271 os << (*this)(i) << '\n';
272
273 std::vector<T> cbuf;
274 for (auto p : IntRange<processor_id_type>(1, this->n_processors()))
275 {
276 this->comm().receive(p, cbuf);
277
278 for (auto c : cbuf)
279 os << c << '\n';
280 }
281
282 os << "];\n" << std::endl;
283 }
284 else
285 {
286 std::vector<T> cbuf(end_dof - first_dof);
287
288 for (numeric_index_type i : make_range(end_dof - first_dof))
289 cbuf[i] = (*this)(first_dof+i);
290 this->comm().send(0,cbuf);
291 }
292}
Status receive(const unsigned int dest_processor_id, T &buf, const MessageTag &tag=any_tag) const
void send(const unsigned int dest_processor_id, const T &buf, const MessageTag &tag=no_tag) const
OStreamProxy out

References libMesh::initialized(), libMesh::libmesh_assert(), libMesh::make_range(), and libMesh::out.

Referenced by libMesh::RBConstruction::enrich_basis_from_rhs_terms().

◆ processor_id()

processor_id_type libMesh::ParallelObject::processor_id ( ) const
inlineinherited
Returns
The rank of this processor in the group.

Definition at line 114 of file parallel_object.h.

115 { return cast_int<processor_id_type>(_communicator.rank()); }
processor_id_type rank() const

References libMesh::ParallelObject::_communicator, and libMesh::Parallel::Communicator::rank().

Referenced by libMesh::BoundaryInfo::_find_id_maps(), libMesh::PetscDMWrapper::add_dofs_to_section(), libMesh::DistributedMesh::add_elem(), libMesh::BoundaryInfo::add_elements(), libMesh::DistributedMesh::add_node(), libMesh::MeshTools::Modification::all_tri(), libMesh::FEMSystem::assembly(), libMesh::Nemesis_IO::assert_symmetric_cmaps(), libMesh::Partitioner::assign_partitioning(), libMesh::Nemesis_IO_Helper::build_element_and_node_maps(), libMesh::Partitioner::build_graph(), libMesh::InfElemBuilder::build_inf_elem(), libMesh::BoundaryInfo::build_node_list_from_side_list(), libMesh::EquationSystems::build_parallel_elemental_solution_vector(), libMesh::EquationSystems::build_parallel_solution_vector(), libMesh::MeshFunction::check_found_elem(), libMesh::DistributedMesh::clear(), libMesh::DistributedMesh::clear_elems(), libMesh::ExodusII_IO_Helper::close(), libMesh::Nemesis_IO_Helper::compute_border_node_ids(), libMesh::Nemesis_IO_Helper::compute_communication_map_parameters(), libMesh::Nemesis_IO_Helper::compute_internal_and_border_elems_and_internal_nodes(), libMesh::RBConstruction::compute_max_error_bound(), libMesh::Nemesis_IO_Helper::compute_node_communication_maps(), libMesh::Nemesis_IO_Helper::compute_num_global_elem_blocks(), libMesh::Nemesis_IO_Helper::compute_num_global_nodesets(), libMesh::Nemesis_IO_Helper::compute_num_global_sidesets(), libMesh::Nemesis_IO_Helper::construct_nemesis_filename(), libMesh::ExodusII_IO::copy_elemental_solution(), libMesh::ExodusII_IO::copy_nodal_solution(), libMesh::ExodusII_IO::copy_scalar_solution(), libMesh::Nemesis_IO::copy_scalar_solution(), libMesh::MeshTools::correct_node_proc_ids(), libMesh::ExodusII_IO_Helper::create(), libMesh::MeshCommunication::delete_remote_elements(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DistributedMesh::DistributedMesh(), libMesh::DofMapBase::end_dof(), libMesh::DofMapBase::end_old_dof(), libMesh::EnsightIO::EnsightIO(), libMesh::GenericProjector< FFunctor, GFunctor, FValue, ProjectionAction >::SubFunctor::find_dofs_to_send(), libMesh::UnstructuredMesh::find_neighbors(), libMesh::DofMapBase::first_dof(), libMesh::DofMapBase::first_old_dof(), libMesh::RBEIMEvaluation::gather_bfs(), libMesh::Nemesis_IO_Helper::get_cmap_params(), libMesh::Nemesis_IO_Helper::get_eb_info_global(), libMesh::Nemesis_IO_Helper::get_elem_cmap(), libMesh::Nemesis_IO_Helper::get_elem_map(), libMesh::MeshBase::get_info(), libMesh::Nemesis_IO_Helper::get_init_global(), libMesh::Nemesis_IO_Helper::get_init_info(), libMesh::RBEIMEvaluation::get_interior_basis_functions_as_vecs(), libMesh::Nemesis_IO_Helper::get_loadbal_param(), libMesh::DofMap::get_local_constraints(), libMesh::MeshBase::get_local_constraints(), libMesh::Nemesis_IO_Helper::get_node_cmap(), libMesh::Nemesis_IO_Helper::get_node_map(), libMesh::Nemesis_IO_Helper::get_ns_param_global(), libMesh::Nemesis_IO_Helper::get_ss_param_global(), libMesh::SparsityPattern::Build::handle_vi_vj(), libMesh::LaplaceMeshSmoother::init(), libMesh::SystemSubsetBySubdomain::init(), HeatSystem::init_data(), libMesh::ExodusII_IO_Helper::initialize(), libMesh::ExodusII_IO_Helper::initialize_element_variables(), libMesh::ExodusII_IO_Helper::initialize_global_variables(), libMesh::ExodusII_IO_Helper::initialize_nodal_variables(), libMesh::DistributedMesh::insert_elem(), libMesh::MeshTools::Modification::interpolate_surface(), libMesh::SparsityPattern::Build::join(), libMesh::RBEvaluation::legacy_write_offline_data_to_files(), libMesh::RBSCMEvaluation::legacy_write_offline_data_to_files(), libMesh::TransientRBEvaluation::legacy_write_offline_data_to_files(), libMesh::MeshTools::libmesh_assert_consistent_distributed(), libMesh::MeshTools::libmesh_assert_consistent_distributed_nodes(), libMesh::MeshTools::libmesh_assert_contiguous_dof_ids(), libMesh::MeshTools::libmesh_assert_parallel_consistent_procids< Elem >(), libMesh::MeshTools::libmesh_assert_valid_neighbors(), libMesh::DistributedMesh::libmesh_assert_valid_parallel_object_ids(), main(), AugmentSparsityOnInterface::mesh_reinit(), libMesh::TriangulatorInterface::MeshedHole::MeshedHole(), libMesh::MeshBase::n_active_local_elem(), libMesh::BoundaryInfo::n_boundary_conds(), libMesh::MeshTools::n_connected_components(), libMesh::MeshBase::n_constraint_rows(), libMesh::BoundaryInfo::n_edge_conds(), libMesh::DofMapBase::n_local_dofs(), libMesh::MeshBase::n_local_elem(), libMesh::MeshBase::n_local_nodes(), libMesh::BoundaryInfo::n_nodeset_conds(), libMesh::BoundaryInfo::n_shellface_conds(), libMesh::RBEIMEvaluation::node_gather_bfs(), libMesh::DistributedMesh::own_node(), libMesh::BoundaryInfo::parallel_sync_node_ids(), libMesh::BoundaryInfo::parallel_sync_side_ids(), libMesh::MeshBase::print_constraint_rows(), libMesh::DofMap::print_dof_constraints(), libMesh::DofMap::process_mesh_constraint_rows(), libMesh::Nemesis_IO_Helper::put_cmap_params(), libMesh::Nemesis_IO_Helper::put_elem_cmap(), libMesh::Nemesis_IO_Helper::put_elem_map(), libMesh::Nemesis_IO_Helper::put_loadbal_param(), libMesh::Nemesis_IO_Helper::put_node_cmap(), libMesh::Nemesis_IO_Helper::put_node_map(), libMesh::XdrIO::read(), libMesh::Nemesis_IO::read(), libMesh::CheckpointIO::read(), libMesh::NameBasedIO::read(), libMesh::EquationSystems::read(), libMesh::EquationSystems::read(), libMesh::ExodusII_IO_Helper::read_elem_num_map(), libMesh::ExodusII_IO_Helper::read_global_values(), libMesh::CheckpointIO::read_header(), libMesh::ExodusII_IO::read_header(), libMesh::System::read_header(), libMesh::XdrIO::read_header(), libMesh::DynaIO::read_mesh(), libMesh::ExodusII_IO_Helper::read_node_num_map(), libMesh::System::read_parallel_data(), libMesh::RBConstruction::read_riesz_representors_from_files(), libMesh::TransientRBConstruction::read_riesz_representors_from_files(), libMesh::System::read_SCALAR_dofs(), libMesh::XdrIO::read_serialized_bc_names(), libMesh::XdrIO::read_serialized_bcs_helper(), libMesh::System::read_serialized_blocked_dof_objects(), libMesh::XdrIO::read_serialized_connectivity(), libMesh::System::read_serialized_data(), libMesh::XdrIO::read_serialized_nodes(), libMesh::XdrIO::read_serialized_nodesets(), libMesh::XdrIO::read_serialized_subdomain_names(), libMesh::System::read_serialized_vector(), libMesh::System::read_serialized_vectors(), libMesh::Nemesis_IO_Helper::read_var_names_impl(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::SimplexRefiner::refine_via_edges(), libMesh::StaticCondensationDofMap::reinit(), libMesh::DistributedMesh::renumber_dof_objects(), libMesh::DistributedMesh::renumber_nodes_and_elements(), libMesh::DofMap::scatter_constraints(), libMesh::CheckpointIO::select_split_config(), libMesh::DistributedMesh::set_next_unique_id(), libMesh::DofMap::set_nonlocal_dof_objects(), libMesh::PetscDMWrapper::set_point_range_in_section(), libMesh::RBEIMEvaluation::side_gather_bfs(), MeshFunctionTest::test_bad_gradient_var_with_out_of_mesh_value(), MeshFunctionTest::test_bad_hessian_var_with_out_of_mesh_value(), ExodusTest< elem_type >::test_read_gold(), ExodusTest< elem_type >::test_write(), ExodusC0PolyhedronTest::test_write_and_read_hexagonal_prism(), ExodusC0PolygonTest::test_write_and_read_pentagon(), MeshInputTest::testAbaqusRead(), MeshInputTest::testBadGmsh(), BoundaryInfoTest::testBoundaryIDs(), MeshInputTest::testCopyElementSolutionImpl(), MeshInputTest::testCopyElementVectorImpl(), MeshInputTest::testCopyNodalSolutionImpl(), DefaultCouplingTest::testCoupling(), PointNeighborCouplingTest::testCoupling(), MeshInputTest::testDynaFileMappings(), MeshInputTest::testDynaNoSplines(), MeshInputTest::testDynaReadElem(), MeshInputTest::testDynaReadPatch(), MeshInputTest::testExodusFileMappings(), MeshInputTest::testExodusIGASidesets(), MeshInputTest::testExodusWriteElementDataFromDiscontinuousNodalData(), MeshInputTest::testGmshBCIDOverlap(), MeshInputTest::testGoodGmsh(), MeshInputTest::testGoodSTL(), MeshInputTest::testGoodSTLBinary(), BoundaryInfoTest::testInternalBoundary(), MeshInputTest::testLowOrderEdgeBlocks(), BoundaryMeshSubdomainTest::testPerBoundarySubdomain(), SystemsTest::testProjectMatrix3D(), BoundaryInfoTest::testShellFaceConstraints(), MeshInputTest::testSingleElementImpl(), BoundaryMeshSubdomainTest::testSingleSubdomain(), WriteVecAndScalar::testSolution(), CheckpointIOTest::testSplitter(), MeshInputTest::testTetgenIO(), MeshSmootherTest::testVariationalSmoother(), libMesh::MeshTools::total_weight(), libMesh::NetGenMeshInterface::triangulate(), libMesh::Parallel::Packing< Elem * >::unpack(), libMesh::Parallel::Packing< Node * >::unpack(), libMesh::DistributedMesh::update_parallel_id_counts(), libMesh::DTKAdapter::update_variable_values(), libMesh::MeshTools::volume(), libMesh::STLIO::write(), libMesh::XdrIO::write(), libMesh::NameBasedIO::write(), libMesh::CheckpointIO::write(), libMesh::EquationSystems::write(), libMesh::EquationSystems::write(), libMesh::GMVIO::write_discontinuous_gmv(), libMesh::ExodusII_IO::write_element_data(), libMesh::ExodusII_IO::write_element_data_from_discontinuous_nodal_data(), libMesh::ExodusII_IO_Helper::write_element_values(), libMesh::ExodusII_IO_Helper::write_element_values_element_major(), libMesh::ExodusII_IO_Helper::write_elements(), libMesh::ExodusII_IO_Helper::write_elemset_data(), libMesh::ExodusII_IO_Helper::write_elemsets(), libMesh::ExodusII_IO::write_global_data(), libMesh::ExodusII_IO_Helper::write_global_values(), libMesh::System::write_header(), libMesh::ExodusII_IO::write_information_records(), libMesh::ExodusII_IO_Helper::write_information_records(), libMesh::ExodusII_IO_Helper::write_nodal_coordinates(), libMesh::ExodusII_IO::write_nodal_data(), libMesh::VTKIO::write_nodal_data(), libMesh::UCDIO::write_nodal_data(), libMesh::ExodusII_IO::write_nodal_data_common(), libMesh::ExodusII_IO::write_nodal_data_discontinuous(), libMesh::ExodusII_IO_Helper::write_nodal_values(), libMesh::ExodusII_IO_Helper::write_nodeset_data(), libMesh::ExodusII_IO_Helper::write_nodesets(), libMesh::Nemesis_IO_Helper::write_nodesets(), libMesh::RBEIMEvaluation::write_out_interior_basis_functions(), libMesh::RBEIMEvaluation::write_out_node_basis_functions(), libMesh::RBEIMEvaluation::write_out_side_basis_functions(), write_output_solvedata(), libMesh::System::write_parallel_data(), libMesh::RBConstruction::write_riesz_representors_to_files(), libMesh::System::write_SCALAR_dofs(), libMesh::XdrIO::write_serialized_bc_names(), libMesh::XdrIO::write_serialized_bcs_helper(), libMesh::System::write_serialized_blocked_dof_objects(), libMesh::XdrIO::write_serialized_connectivity(), libMesh::System::write_serialized_data(), libMesh::XdrIO::write_serialized_nodes(), libMesh::XdrIO::write_serialized_nodesets(), libMesh::XdrIO::write_serialized_subdomain_names(), libMesh::System::write_serialized_vector(), libMesh::System::write_serialized_vectors(), libMesh::ExodusII_IO_Helper::write_sideset_data(), libMesh::ExodusII_IO_Helper::write_sidesets(), libMesh::Nemesis_IO_Helper::write_sidesets(), libMesh::ExodusII_IO::write_timestep(), libMesh::ExodusII_IO_Helper::write_timestep(), and libMesh::ExodusII_IO::write_timestep_discontinuous().

◆ read_matlab()

template<typename T >
void libMesh::NumericVector< T >::read_matlab ( const std::string &  filename)
virtualinherited

Read the contents of the vector from the Matlab-script format used by PETSc.

If the size of the matrix in filename appears consistent with the existing partitioning of this then the existing parallel decomposition will be retained. If not, then this will be initialized with the size from the file, linearly partitioned onto the number of processors available.

Definition at line 297 of file numeric_vector.C.

298{
299 LOG_SCOPE("read_matlab()", "NumericVector");
300
301#ifndef LIBMESH_HAVE_CXX11_REGEX
302 libmesh_not_implemented(); // What is your compiler?!? Email us!
303 libmesh_ignore(filename);
304#else
305 parallel_object_only();
306
307 const bool gzipped_file = Utility::ends_with(filename, ".gz");
308
309 // If we don't already have this size, we'll need to reinit, and
310 // determine which entries each processor is in charge of.
311 std::vector<numeric_index_type> first_entries, end_entries;
312
313 numeric_index_type first_entry = 0,
314 end_entry = 0,
315 n = 0;
316
317 // We'll use an istream here; it might be an ifstream if we're
318 // opening a raw ASCII file or a gzstream if we're opening a
319 // compressed one.
320 std::unique_ptr<std::istream> file;
321
322 // First read through the file, saving size and entry data
323 std::vector<T> entries;
324
325 {
326 // We'll read the vector on processor 0 rather than try to juggle
327 // parallel I/O.
328 if (this->processor_id() == 0)
329 {
330 // We'll be using regular expressions to make ourselves slightly
331 // more robust to formatting.
332 const std::regex start_regex // assignment like "Vec_0x84000002_1 = ["
333 ("\\s*\\w+\\s*=\\s*\\[");
334 const std::regex end_regex // end of assignment
335 ("^[^%]*\\]");
336
337 if (gzipped_file)
338 {
339#ifdef LIBMESH_HAVE_GZSTREAM
340 auto inf = std::make_unique<igzstream>();
341 libmesh_assert(inf);
342 inf->open(filename.c_str(), std::ios::in);
343 file = std::move(inf);
344#else
345 libmesh_error_msg("ERROR: need gzstream to handle .gz files!!!");
346#endif
347 }
348 else
349 {
350 auto inf = std::make_unique<std::ifstream>();
351 libmesh_assert(inf);
352
353 std::string new_name = Utility::unzip_file(filename);
354
355 inf->open(new_name.c_str(), std::ios::in);
356 file = std::move(inf);
357 }
358
359 const std::string whitespace = " \t";
360
361 bool have_started = false;
362 bool have_ended = false;
363
364 for (std::string line; std::getline(*file, line);)
365 {
366 std::smatch sm;
367
368 // First, try to match an entry. This is the most common
369 // case so we won't rely on slow std::regex for it.
370 // stringstream is at least an improvement over that.
371 std::istringstream l(line);
372 T value;
373 l >> value;
374
375 if (!l.fail())
376 {
377 libmesh_error_msg_if
378 (!have_started, "Confused by premature entries in vector file " << filename);
379
380 entries.push_back(value);
381 ++n;
382 }
383
384 else if (std::regex_search(line, start_regex))
385 have_started = true;
386
387 else if (std::regex_search(line, end_regex))
388 {
389 have_ended = true;
390 break;
391 }
392 }
393
394 libmesh_error_msg_if
395 (!have_started, "Confused by missing assignment-beginning in vector file " << filename);
396
397 libmesh_error_msg_if
398 (!have_ended, "Confused by missing assignment-ending in vector file " << filename);
399 }
400
401 this->comm().broadcast(n);
402
403 if (this->initialized() &&
404 n == this->size())
405 {
406 first_entry = this->first_local_index(),
407 end_entry = this->last_local_index();
408 }
409 else
410 {
411 // Determine which rows/columns each processor will be in charge of
412 first_entry = this->processor_id() * n / this->n_processors(),
413 end_entry = (this->processor_id()+1) * n / this->n_processors();
414 }
415
416 this->comm().gather(0, first_entry, first_entries);
417 this->comm().gather(0, end_entry, end_entries);
418
419 } // Done reading entry data and broadcasting vector size
420
421 // If we're not already initialized compatibly with the file then
422 // we'll initialize here
423 bool need_init = !this->initialized() ||
424 (this->size() != n) ||
425 (this->local_size() != end_entry - first_entry);
426
427 this->comm().max(need_init);
428
429 if (need_init)
430 this->init(n, end_entry - first_entry);
431
432 // Set the vector values last. The iota call here is inefficient
433 // but it's probably better than calling a single virtual function
434 // per index.
435 if (this->processor_id() == 0)
436 for (auto p : make_range(this->n_processors()))
437 {
438 const numeric_index_type first_entry_p = first_entries[p];
439 const numeric_index_type n_local = end_entries[p] - first_entry_p;
440 std::vector<numeric_index_type> indices(n_local);
441 std::iota(indices.begin(), indices.end(), first_entry_p);
442 this->insert(entries.data() + first_entries[p],
443 indices);
444 }
445
446 this->close();
447#endif
448}
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
virtual void close()=0
Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across ...
virtual void init(const numeric_index_type n, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC)=0
Change the dimension of the vector to n.
bool ends_with(std::string_view superstring, std::string_view suffix)
Look for a substring at the very end of a string.
Definition utility.C:213
std::string unzip_file(std::string_view name)
Create an unzipped copy of a bz2 or xz file, returning the name of the now-unzipped file that can be ...
Definition utility.C:164
void libmesh_ignore(const Args &...)

References libMesh::Utility::ends_with(), and libMesh::libmesh_ignore().

◆ readable()

template<typename T >
bool libMesh::NumericVector< T >::readable ( ) const
inherited
Returns
whether or not this vector is able to be read for global operations

Definition at line 727 of file numeric_vector.C.

728{
729 return this->initialized() && this->closed();
730}

References libMesh::closed(), and libMesh::initialized().

Referenced by libMesh::NumericVector< Number >::build(), and libMesh::NumericVector< T >::compatible().

◆ reciprocal()

template<typename T >
void libMesh::DistributedVector< T >::reciprocal ( )
overridevirtual

Computes the component-wise reciprocal, \( u_i \leftarrow \frac{1}{u_i} \, \forall i\).

Implements libMesh::NumericVector< T >.

Definition at line 201 of file distributed_vector.C.

202{
203 for (auto & val : _values)
204 {
205 // Don't divide by zero
206 libmesh_assert_not_equal_to (val, T(0));
207
208 val = 1. / val;
209 }
210}

◆ restore_subvector()

template<typename T >
virtual void libMesh::NumericVector< T >::restore_subvector ( std::unique_ptr< NumericVector< T > >  ,
const std::vector< numeric_index_type > &   
)
inlinevirtualinherited

Restores a view into this vector using the indices in rows.

The subvector should have been acquired from get_subvector() with the same rows.

This is currently only implemented for PetscVector and EigenSparseVector.

Reimplemented in libMesh::PetscVector< libMesh::Number >, libMesh::EigenSparseVector< T >, and libMesh::PetscVector< T >.

Definition at line 823 of file numeric_vector.h.

825 {
826 libmesh_not_implemented();
827 }

Referenced by libMesh::StaticCondensation::apply(), libMesh::CondensedEigenSystem::copy_sub_to_super(), and libMesh::CondensedEigenSystem::copy_super_to_sub().

◆ scale()

template<typename T >
void libMesh::DistributedVector< T >::scale ( const T  factor)
overridevirtual

Scale each element of the vector by the given factor.

Implements libMesh::NumericVector< T >.

Definition at line 270 of file distributed_vector.C.

271{
272 libmesh_assert (this->initialized());
273 libmesh_assert_equal_to (_values.size(), _local_size);
274 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
275
276 for (auto & val : _values)
277 val *= factor;
278}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ set()

template<typename T >
void libMesh::DistributedVector< T >::set ( const numeric_index_type  i,
const T  value 
)
inlineoverridevirtual

Sets v(i) = value.

Note that library implementations of this method are thread safe, e.g. we will lock _numeric_vector_mutex before writing to the vector

Implements libMesh::NumericVector< T >.

Definition at line 597 of file distributed_vector.h.

598{
599 libmesh_assert (this->initialized());
600 libmesh_assert_equal_to (_values.size(), _local_size);
601 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
602 libmesh_assert_less (i, size());
605
606 std::scoped_lock lock(this->_numeric_vector_mutex);
607 if (i >= first_local_index() && i < last_local_index())
608 {
610 }
611 else
612 {
613 _remote_values.emplace_back(i, value);
615 }
616
617 this->_is_closed = false;
618}

References libMesh::initialized(), libMesh::libmesh_assert(), and value.

◆ set_type()

template<typename T >
void libMesh::NumericVector< T >::set_type ( ParallelType  t)
inherited

Allow the user to change the ParallelType of the NumericVector under some circumstances.

If the NumericVector has not been initialized yet, then it is generally safe to change the ParallelType. otherwise, if the NumericVector has already been initialized with a specific type, we cannot change it without doing some extra copying/reinitialization work, and we currently throw an error if this is requested.

Definition at line 97 of file numeric_vector.C.

98{
99 // Check for no-op
100 if (_type == t)
101 return;
102
103 // If the NumericVector is not yet initialized, then it is generally
104 // safe to change the ParallelType, with minor restrictions.
105 if (!this->initialized())
106 {
107 // If ghosted vectors are not enabled and the user requested a
108 // GHOSTED vector, fall back on SERIAL.
109#ifndef LIBMESH_ENABLE_GHOSTED
110 if (t == GHOSTED)
111 {
112 _type = SERIAL;
113 return;
114 }
115#endif
116
117 _type = t;
118 return;
119 }
120
121 // If we made it here, then the NumericVector was already
122 // initialized and we don't currently allow the ParallelType to be
123 // changed, although this could potentially be added later.
124 libmesh_not_implemented();
125}

References libMesh::GHOSTED, libMesh::initialized(), and libMesh::SERIAL.

Referenced by libMesh::System::add_vector().

◆ size()

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::size ( ) const
inlineoverridevirtual
Returns
The size of the vector.

Implements libMesh::NumericVector< T >.

Definition at line 530 of file distributed_vector.h.

531{
532 libmesh_assert (this->initialized());
533 libmesh_assert_equal_to (_values.size(), _local_size);
534 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
535
536 return _global_size;
537}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ subset_l1_norm()

template<class T >
Real libMesh::NumericVector< T >::subset_l1_norm ( const std::set< numeric_index_type > &  indices) const
virtualinherited
Returns
The \( \ell_1 \)-norm of the vector, i.e. the sum of the absolute values for the specified entries in the vector.
Note
The indices must necessarily live on this processor.

Definition at line 559 of file numeric_vector.C.

560{
561 libmesh_assert (this->readable());
562
563 const NumericVector<T> & v = *this;
564
565 Real norm = 0;
566
567 for (const auto & index : indices)
568 norm += std::abs(v(index));
569
570 this->comm().sum(norm);
571
572 return norm;
573}
virtual void abs()=0
Sets for each entry in the vector.

References libMesh::libmesh_assert(), and libMesh::Real.

Referenced by libMesh::System::discrete_var_norm().

◆ subset_l2_norm()

template<class T >
Real libMesh::NumericVector< T >::subset_l2_norm ( const std::set< numeric_index_type > &  indices) const
virtualinherited
Returns
The \( \ell_2 \)-norm of the vector, i.e. the square root of the sum of the squares of the elements for the specified entries in the vector.
Note
The indices must necessarily live on this processor.

Definition at line 576 of file numeric_vector.C.

577{
578 libmesh_assert (this->readable());
579
580 const NumericVector<T> & v = *this;
581
582 Real norm = 0;
583
584 for (const auto & index : indices)
585 norm += TensorTools::norm_sq(v(index));
586
587 this->comm().sum(norm);
588
589 return std::sqrt(norm);
590}

References libMesh::libmesh_assert(), and libMesh::Real.

Referenced by libMesh::System::discrete_var_norm().

◆ subset_linfty_norm()

template<class T >
Real libMesh::NumericVector< T >::subset_linfty_norm ( const std::set< numeric_index_type > &  indices) const
virtualinherited
Returns
The maximum absolute value of the specified entries of this vector, which is the \( \ell_{\infty} \)-norm of a vector.
Note
The indices must necessarily live on this processor.

Definition at line 593 of file numeric_vector.C.

594{
595 libmesh_assert (this->readable());
596
597 const NumericVector<T> & v = *this;
598
599 Real norm = 0;
600
601 for (const auto & index : indices)
602 {
603 Real value = std::abs(v(index));
604 if (value > norm)
605 norm = value;
606 }
607
608 this->comm().max(norm);
609
610 return norm;
611}

References libMesh::libmesh_assert().

Referenced by libMesh::System::discrete_var_norm().

◆ sum()

template<typename T >
T libMesh::DistributedVector< T >::sum ( ) const
overridevirtual
Returns
The sum of all values in the vector.

Implements libMesh::NumericVector< T >.

Definition at line 48 of file distributed_vector.C.

49{
50 // This function must be run on all processors at once
51 parallel_object_only();
52
54 libmesh_assert_equal_to (_values.size(), _local_size);
55 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
56
57 T local_sum = 0.;
58
59 for (auto & val : _values)
60 local_sum += val;
61
62 this->comm().sum(local_sum);
63
64 return local_sum;
65}

References libMesh::initialized(), and libMesh::libmesh_assert().

◆ swap()

template<typename T >
void libMesh::DistributedVector< T >::swap ( NumericVector< T > &  v)
inlineoverridevirtual

Swaps the contents of this with v.

There should be enough indirection in subclasses to make this an O(1) header-swap operation.

Reimplemented from libMesh::NumericVector< T >.

Definition at line 696 of file distributed_vector.h.

697{
698 DistributedVector<T> & v = cast_ref<DistributedVector<T> &>(other);
699
700 std::swap(_global_size, v._global_size);
701 std::swap(_local_size, v._local_size);
702 std::swap(_first_local_index, v._first_local_index);
703 std::swap(_last_local_index, v._last_local_index);
704
705 std::swap(this->_is_initialized, v._is_initialized);
706 std::swap(this->_is_closed, v._is_closed);
707 std::swap(this->_unclosed_state, v._unclosed_state);
708
709 // This should be O(1) with any reasonable STL implementation
710 std::swap(_values, v._values);
711 std::swap(_remote_values, v._remote_values);
712}

References libMesh::DistributedVector< T >::_first_local_index, libMesh::DistributedVector< T >::_global_size, libMesh::NumericVector< T >::_is_closed, libMesh::NumericVector< T >::_is_initialized, libMesh::DistributedVector< T >::_last_local_index, libMesh::DistributedVector< T >::_local_size, libMesh::DistributedVector< T >::_remote_values, libMesh::DistributedVector< T >::_unclosed_state, and libMesh::DistributedVector< T >::_values.

◆ type() [1/2]

template<typename T >
ParallelType & libMesh::NumericVector< T >::type ( )
inlineinherited
Returns
The type (SERIAL, PARALLEL, GHOSTED) of the vector.
Deprecated:
because it is dangerous to change the ParallelType of an already-initialized NumericVector. See NumericVector::set_type() for a safer, non-deprecated setter.

Definition at line 192 of file numeric_vector.h.

192{ return _type; }

References libMesh::NumericVector< T >::_type.

◆ type() [2/2]

template<typename T >
ParallelType libMesh::NumericVector< T >::type ( ) const
inlineinherited

◆ zero()

template<typename T >
void libMesh::DistributedVector< T >::zero ( )
inlineoverridevirtual

Set all entries to zero.

Equivalent to v = 0, but more obvious and faster.

Implements libMesh::NumericVector< T >.

Definition at line 485 of file distributed_vector.h.

486{
487 libmesh_assert (this->initialized());
488 libmesh_assert_equal_to (_values.size(), _local_size);
489 libmesh_assert_equal_to ((_last_local_index - _first_local_index), _local_size);
490
491 // We should be closed
492 libmesh_assert (this->closed());
493 libmesh_assert_equal_to (_unclosed_state, DO_NOTHING);
495
496 std::fill (_values.begin(),
497 _values.end(),
498 0.);
499}

References libMesh::closed(), libMesh::initialized(), and libMesh::libmesh_assert().

◆ zero_clone()

template<typename T >
std::unique_ptr< NumericVector< T > > libMesh::DistributedVector< T >::zero_clone ( ) const
inlineoverridevirtual
Returns
A smart pointer to a copy of this vector with the same type, size, and partitioning, but with all zero entries.
Note
This must be overridden in the derived classes.

Implements libMesh::NumericVector< T >.

Definition at line 505 of file distributed_vector.h.

506{
507 std::unique_ptr<NumericVector<T>> cloned_vector =
508 std::make_unique<DistributedVector<T>>(this->comm());
509 cloned_vector->init(*this);
510 return cloned_vector;
511}

Member Data Documentation

◆ _communicator

const Parallel::Communicator& libMesh::ParallelObject::_communicator
protectedinherited

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

Actually holds the data.

Definition at line 124 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::get_info().

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 143 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _first_local_index

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::_first_local_index
private

◆ _global_size

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::_global_size
private

◆ _is_closed

template<typename T >
bool libMesh::NumericVector< T >::_is_closed
protectedinherited

◆ _is_initialized

template<typename T >
bool libMesh::NumericVector< T >::_is_initialized
protectedinherited

◆ _last_local_index

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::_last_local_index
private

◆ _local_size

template<typename T >
numeric_index_type libMesh::DistributedVector< T >::_local_size
private

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 137 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

◆ _numeric_vector_mutex

template<typename T >
std::mutex libMesh::NumericVector< T >::_numeric_vector_mutex
protectedinherited

Mutex for performing thread-safe operations.

Definition at line 883 of file numeric_vector.h.

◆ _remote_values

template<typename T >
std::vector<std::pair<numeric_index_type, T> > libMesh::DistributedVector< T >::_remote_values
private

Entries to add or set on remote processors during the next close()

Definition at line 247 of file distributed_vector.h.

Referenced by libMesh::DistributedVector< T >::swap().

◆ _type

template<typename T >
ParallelType libMesh::NumericVector< T >::_type
protectedinherited

◆ _unclosed_state

template<typename T >
UnclosedState libMesh::DistributedVector< T >::_unclosed_state
private

The current state of this vector, if it is unclosed.

Definition at line 261 of file distributed_vector.h.

Referenced by libMesh::DistributedVector< T >::swap().

◆ _values

template<typename T >
std::vector<T> libMesh::DistributedVector< T >::_values
private

The documentation for this class was generated from the following files: