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 Member Functions | Private Attributes | List of all members
libMesh::PetscVector< T > Class Template Referencefinal

This class provides a nice interface to PETSc's Vec object. More...

#include <petsc_vector.h>

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

Public Member Functions

 PetscVector (const Parallel::Communicator &comm_in, const ParallelType type=AUTOMATIC)
 Dummy-Constructor.
 
 PetscVector (const Parallel::Communicator &comm_in, const numeric_index_type n, const ParallelType type=AUTOMATIC)
 Constructor.
 
 PetscVector (const Parallel::Communicator &comm_in, const numeric_index_type n, const numeric_index_type n_local, const ParallelType type=AUTOMATIC)
 Constructor.
 
 PetscVector (const Parallel::Communicator &comm_in, const numeric_index_type N, const numeric_index_type n_local, const std::vector< numeric_index_type > &ghost, const ParallelType type=AUTOMATIC)
 Constructor.
 
 PetscVector (Vec v, const Parallel::Communicator &comm_in)
 Constructor.
 
PetscVector< T > & operator= (const PetscVector< T > &v)
 Copy assignment operator.
 
 PetscVector (PetscVector &&)=delete
 This class manages a C-style struct (Vec) manually, so we don't want to allow any automatic copy/move functions to be generated, and we can't default the destructor.
 
 PetscVector (const PetscVector &)=delete
 
PetscVectoroperator= (PetscVector &&)=delete
 
virtual ~PetscVector ()
 
virtual void close () override
 Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across processors.
 
virtual void clear () noexcept override
 clear() is called from the destructor, so it should not throw.
 
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 type=AUTOMATIC) override
 Change the dimension of the vector to n.
 
virtual void init (const numeric_index_type N, const bool fast=false, const ParallelType type=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
 
numeric_index_type map_global_to_local_index (const numeric_index_type i) const
 
virtual T operator() (const numeric_index_type i) const override
 
virtual void get (const std::vector< numeric_index_type > &index, T *values) const override
 Access multiple components at once.
 
PetscScalar * get_array ()
 Get read/write access to the raw PETSc Vector data array.
 
const PetscScalar * get_array_read () const
 Get read only access to the raw PETSc Vector data array.
 
void restore_array ()
 Restore the data array.
 
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 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 T *v, const std::vector< numeric_index_type > &dof_indices) override
 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].
 
virtual void add_vector (const NumericVector< T > &v, const SparseMatrix< T > &A) override
 Computes \( \vec{u} \leftarrow \vec{u} + A \vec{v} \), i.e.
 
virtual void add_vector_transpose (const NumericVector< T > &v, const SparseMatrix< T > &A) override
 Computes \( \vec{u} \leftarrow \vec{u} + A^T \vec{v} \), i.e.
 
void add_vector_conjugate_transpose (const NumericVector< T > &v, const SparseMatrix< T > &A)
 \( U \leftarrow U + A^H v \).
 
virtual void insert (const T *v, const std::vector< numeric_index_type > &dof_indices) override
 Inserts the entries of v in *this at the locations specified by v.
 
virtual void scale (const T factor) override
 Scale each element of the vector by the given factor.
 
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 abs () override
 Sets \( u_i \leftarrow |u_i| \) for each entry in the vector.
 
virtual T dot (const NumericVector< T > &v) const override
 
indefinite_dot (const NumericVector< T > &v) const
 
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 print_matlab (const std::string &name="") const override
 Print the contents of the vector in Matlab's sparse matrix format.
 
virtual void create_subvector (NumericVector< T > &subvector, const std::vector< numeric_index_type > &rows, bool supplying_global_rows=true) const override
 Fills in subvector from this vector using the indices in rows.
 
virtual void swap (NumericVector< T > &v) override
 Swaps the contents of this with v.
 
virtual std::size_t max_allowed_id () const override
 
Vec vec ()
 
Vec vec () const
 
virtual std::unique_ptr< NumericVector< T > > get_subvector (const std::vector< numeric_index_type > &rows) override
 Creates a view into this vector using the indices in rows.
 
virtual void restore_subvector (std::unique_ptr< NumericVector< T > > subvector, const std::vector< numeric_index_type > &rows) override
 Restores a view into this vector using the indices in rows.
 
void localize_to_one (std::vector< Real > &v_local, const processor_id_type timpi_mpi_var(pid)) const
 
void localize_to_one (std::vector< Complex > &v_local, const processor_id_type pid) const
 
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
 
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} \).
 
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.
 
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 read_matlab (const std::string &filename)
 Read the contents of the vector from the Matlab-script format used by PETSc.
 
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

typedef std::unordered_map< numeric_index_type, numeric_index_typeGlobalToLocalMap
 Type for map that maps global to local ghost cells.
 

Private Member Functions

void _get_array (bool read_only) const
 Queries the array (and the local form if the vector is ghosted) from PETSc.
 
void _restore_array () const
 Restores the array (and the local form if the vector is ghosted) to PETSc.
 
template<NormType N>
Real norm () const
 

Private Attributes

Vec _vec
 Actual PETSc vector datatype to hold vector entries.
 
std::atomic< bool > _array_is_present
 If true, the actual PETSc array of the values of the vector is currently accessible.
 
bool _array_is_present
 
numeric_index_type _first
 First local index.
 
numeric_index_type _last
 Last local index.
 
numeric_index_type _local_size
 Size of the local values from _get_array()
 
Vec _local_form
 PETSc vector datatype to hold the local form of a ghosted vector.
 
const PetscScalar * _read_only_values
 Pointer to the actual PETSc array of the values of the vector.
 
PetscScalar * _values
 Pointer to the actual PETSc array of the values of the vector.
 
std::mutex _petsc_get_restore_array_mutex
 Mutex for _get_array and _restore_array.
 
GlobalToLocalMap _global_to_local_map
 Map that maps global to local ghost cells (will be empty if not in ghost cell mode).
 
bool _destroy_vec_on_exit
 This boolean value should only be set to false for the constructor which takes a PETSc Vec object.
 
bool _values_manually_retrieved
 Whether or not the data array has been manually retrieved using get_array() or get_array_read()
 
bool _values_read_only
 Whether or not the data array is for read only access.
 

Detailed Description

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

This class provides a nice interface to PETSc's Vec object.

All overridden virtual functions are documented in numeric_vector.h.

Author
Benjamin S. Kirk
Date
2002

NumericVector interface to PETSc Vec.

Definition at line 73 of file petsc_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.

◆ GlobalToLocalMap

template<typename T >
typedef std::unordered_map<numeric_index_type,numeric_index_type> libMesh::PetscVector< T >::GlobalToLocalMap
private

Type for map that maps global to local ghost cells.

Definition at line 448 of file petsc_vector.h.

Constructor & Destructor Documentation

◆ PetscVector() [1/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( const Parallel::Communicator comm_in,
const ParallelType  type = AUTOMATIC 
)
inlineexplicit

Dummy-Constructor.

Dimension=0

Definition at line 489 of file petsc_vector.h.

489 :
490 NumericVector<T>(comm_in, ptype),
491 _vec(nullptr),
492 _array_is_present(false),
493 _first(0),
494 _last(0),
495 _local_size(0),
496 _local_form(nullptr),
497 _read_only_values(nullptr),
498 _values(nullptr),
502 _values_read_only(false)
503{
504 this->_type = ptype;
505}
ParallelType _type
Type of vector.
Vec _local_form
PETSc vector datatype to hold the local form of a ghosted vector.
numeric_index_type _first
First local index.
bool _values_read_only
Whether or not the data array is for read only access.
bool _values_manually_retrieved
Whether or not the data array has been manually retrieved using get_array() or get_array_read()
PetscScalar * _values
Pointer to the actual PETSc array of the values of the vector.
numeric_index_type _local_size
Size of the local values from _get_array()
numeric_index_type _last
Last local index.
const PetscScalar * _read_only_values
Pointer to the actual PETSc array of the values of the vector.
std::atomic< bool > _array_is_present
If true, the actual PETSc array of the values of the vector is currently accessible.
GlobalToLocalMap _global_to_local_map
Map that maps global to local ghost cells (will be empty if not in ghost cell mode).
Vec _vec
Actual PETSc vector datatype to hold vector entries.
bool _destroy_vec_on_exit
This boolean value should only be set to false for the constructor which takes a PETSc Vec object.

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

◆ PetscVector() [2/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( const Parallel::Communicator comm_in,
const numeric_index_type  n,
const ParallelType  type = AUTOMATIC 
)
inlineexplicit

Constructor.

Set dimension to n and initialize all elements with zero.

Definition at line 511 of file petsc_vector.h.

513 :
514 NumericVector<T>(comm_in, ptype),
515 _vec(nullptr),
516 _array_is_present(false),
517 _first(0),
518 _last(0),
519 _local_size(0),
520 _local_form(nullptr),
521 _read_only_values(nullptr),
522 _values(nullptr),
526 _values_read_only(false)
527{
528 this->init(n, n, false, ptype);
529}
virtual void init(const numeric_index_type N, const numeric_index_type n_local, const bool fast=false, const ParallelType type=AUTOMATIC) override
Change the dimension of the vector to n.

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

◆ PetscVector() [3/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( const Parallel::Communicator comm_in,
const numeric_index_type  n,
const numeric_index_type  n_local,
const ParallelType  type = AUTOMATIC 
)
inline

Constructor.

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

Definition at line 535 of file petsc_vector.h.

538 :
539 NumericVector<T>(comm_in, ptype),
540 _vec(nullptr),
541 _array_is_present(false),
542 _first(0),
543 _last(0),
544 _local_size(0),
545 _local_form(nullptr),
546 _read_only_values(nullptr),
547 _values(nullptr),
551 _values_read_only(false)
552{
553 this->init(n, n_local, false, ptype);
554}

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

◆ PetscVector() [4/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( const Parallel::Communicator comm_in,
const numeric_index_type  N,
const numeric_index_type  n_local,
const std::vector< numeric_index_type > &  ghost,
const ParallelType  type = 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 560 of file petsc_vector.h.

564 :
565 NumericVector<T>(comm_in, ptype),
566 _vec(nullptr),
567 _array_is_present(false),
568 _first(0),
569 _last(0),
570 _local_size(0),
571 _local_form(nullptr),
572 _read_only_values(nullptr),
573 _values(nullptr),
577 _values_read_only(false)
578{
579 this->init(n, n_local, ghost, false, ptype);
580}

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

◆ PetscVector() [5/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( Vec  v,
const Parallel::Communicator comm_in 
)
inline

Constructor.

Creates a PetscVector assuming you already have a valid PETSc Vec object. In this case, v is NOT destroyed by the PetscVector constructor when this object goes out of scope. This allows ownership of v to remain with the original creator, and to simply provide additional functionality with the PetscVector.

Definition at line 588 of file petsc_vector.h.

589 :
590 NumericVector<T>(comm_in, AUTOMATIC),
591 _vec(v),
592 _array_is_present(false),
593 _first(0),
594 _last(0),
595 _local_size(0),
596 _local_form(nullptr),
597 _read_only_values(nullptr),
598 _values(nullptr),
602 _values_read_only(false)
603{
604 this->_is_closed = true;
605 this->_is_initialized = true;
606
607 /* We need to ask PETSc about the (local to global) ghost value
608 mapping and create the inverse mapping out of it. */
609 PetscInt petsc_local_size=0;
610 LibmeshPetscCall(VecGetLocalSize(_vec, &petsc_local_size));
611
612 // Get the vector type from PETSc.
613 VecType ptype;
614 LibmeshPetscCall(VecGetType(_vec, &ptype));
615
616 // PETSc supports some exotic types nowadays. Just use Vec sizes to
617 // determine whether we're SERIAL vs PARALLEL-or-GHOSTED.
618 PetscInt petsc_global_size = 0;
619 LibmeshPetscCall(VecGetSize(_vec, &petsc_global_size));
620
621 // If we have a parallel Vec with all its DoFs on one processor, we
622 // might be unable to tell on that processor that it's not a serial
623 // vector unless we communicate.
624 bool is_serial = (petsc_local_size == petsc_global_size);
625 comm_in.min(is_serial);
626
627#ifdef DEBUG
628 dof_id_type sum_of_local_sizes = petsc_local_size;
629 comm_in.sum(sum_of_local_sizes);
630 libmesh_assert_equal_to(sum_of_local_sizes,
631 cast_int<dof_id_type>(petsc_global_size));
632#endif
633
634#if PETSC_RELEASE_GREATER_EQUALS(3, 21, 0)
635 // Fande only implemented VecGhostGetGhostIS for VECMPI
636 if (std::strcmp(ptype, VECMPI) == 0)
637 {
638 IS ghostis;
639 LibmeshPetscCall(VecGhostGetGhostIS(_vec, &ghostis));
640
641 Vec localrep;
642 LibmeshPetscCall(VecGhostGetLocalForm(_vec, &localrep));
643
644 // If is a sparsely stored vector, set up our new mapping
645 // Only checking mapping is not enough to determine if a vec is ghosted
646 // We need to check if vec has a local representation
647 if (ghostis && localrep)
648 {
649 PetscInt ghost_size;
650 LibmeshPetscCall(ISGetSize(ghostis, &ghost_size));
651
652 const PetscInt * indices;
653 LibmeshPetscCall(ISGetIndices(ghostis, &indices));
654
655 for (const auto i : make_range(ghost_size))
656 _global_to_local_map[indices[i]] = i;
657 this->_type = GHOSTED;
658 LibmeshPetscCall(ISRestoreIndices(ghostis, &indices));
659 }
660 else
661 this->_type = PARALLEL;
662 }
663 else if (!is_serial)
664#else // PETSc < 3.21.0
665 if (!is_serial)
666#endif
667 {
668 ISLocalToGlobalMapping mapping = nullptr;
669 Vec localrep = nullptr;
670
671 // Non-VECMPI types won't even let us call VecGetLocalToGlobalMapping;
672 // we'll just assume for now that no such type is ghosted
673 if (std::strcmp(ptype, VECMPI) == 0)
674 {
675 LibmeshPetscCall(VecGetLocalToGlobalMapping(_vec, &mapping));
676 LibmeshPetscCall(VecGhostGetLocalForm(_vec,&localrep));
677 }
678
679 // If is a sparsely stored vector, set up our new mapping
680 // Only checking mapping is not enough to determine if a vec is ghosted
681 // We need to check if vec has a local representation
682 if (mapping && localrep)
683 {
684 const numeric_index_type my_local_size = static_cast<numeric_index_type>(petsc_local_size);
685 const numeric_index_type ghost_begin = static_cast<numeric_index_type>(petsc_local_size);
686 PetscInt n;
687 LibmeshPetscCall(ISLocalToGlobalMappingGetSize(mapping, &n));
688
689 const numeric_index_type ghost_end = static_cast<numeric_index_type>(n);
690 const PetscInt * indices;
691 LibmeshPetscCall(ISLocalToGlobalMappingGetIndices(mapping,&indices));
692
693 for (numeric_index_type i=ghost_begin; i<ghost_end; i++)
694 _global_to_local_map[indices[i]] = i-my_local_size;
695 this->_type = GHOSTED;
696 LibmeshPetscCall(ISLocalToGlobalMappingRestoreIndices(mapping, &indices));
697 }
698 else
699 this->_type = PARALLEL;
700
701 LibmeshPetscCall(VecGhostRestoreLocalForm(_vec,&localrep));
702 }
703 else
704 this->_type = SERIAL;
705}
bool _is_initialized
true once init() has been called.
bool _is_closed
Flag which tracks whether the vector's values are consistent on all processors after insertion or add...
dof_id_type numeric_index_type
Definition id_types.h:99
uint8_t dof_id_type
Definition id_types.h:67
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::PetscVector< T >::_global_to_local_map, libMesh::NumericVector< T >::_is_closed, libMesh::NumericVector< T >::_is_initialized, libMesh::NumericVector< T >::_type, libMesh::PetscVector< T >::_vec, libMesh::GHOSTED, libMesh::make_range(), libMesh::Parallel::Communicator::min(), libMesh::PARALLEL, libMesh::SERIAL, and libMesh::Parallel::Communicator::sum().

◆ PetscVector() [6/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( PetscVector< T > &&  )
delete

This class manages a C-style struct (Vec) manually, so we don't want to allow any automatic copy/move functions to be generated, and we can't default the destructor.

◆ PetscVector() [7/7]

template<typename T >
libMesh::PetscVector< T >::PetscVector ( const PetscVector< T > &  )
delete

◆ ~PetscVector()

template<typename T >
libMesh::PetscVector< T >::~PetscVector ( )
inlinevirtual

Definition at line 712 of file petsc_vector.h.

713{
714 this->clear ();
715}
virtual void clear() noexcept override
clear() is called from the destructor, so it should not throw.

Member Function Documentation

◆ _get_array()

template<typename T >
void libMesh::PetscVector< T >::_get_array ( bool  read_only) const
private

Queries the array (and the local form if the vector is ghosted) from PETSc.

Parameters
read_onlyWhether or not a read only copy of the raw data

Definition at line 1184 of file petsc_vector.C.

1185{
1186 libmesh_assert (this->initialized());
1187
1188 bool initially_array_is_present = _array_is_present.load(std::memory_order_acquire);
1189
1190 // If we already have a read/write array - and we're trying
1191 // to get a read only array - let's just use the read write
1192 if (initially_array_is_present && read_only && !_values_read_only)
1194
1195 // If the values have already been retrieved and we're currently
1196 // trying to get a non-read only view (ie read/write) and the
1197 // values are currently read only... then we need to restore
1198 // the array first... and then retrieve it again.
1199 if (initially_array_is_present && !read_only && _values_read_only)
1200 {
1202 initially_array_is_present = false;
1203 }
1204
1205 if (!initially_array_is_present)
1206 {
1207 std::scoped_lock lock(_petsc_get_restore_array_mutex);
1208 if (!_array_is_present.load(std::memory_order_relaxed))
1209 {
1210 if (!this->is_effectively_ghosted())
1211 {
1212 if (read_only)
1213 {
1214 LibmeshPetscCall(VecGetArrayRead(_vec, &_read_only_values));
1215 _values_read_only = true;
1216 }
1217 else
1218 {
1219 LibmeshPetscCall(VecGetArray(_vec, &_values));
1220 _values_read_only = false;
1221 }
1222 _local_size = this->local_size();
1223 }
1224 else
1225 {
1226 LibmeshPetscCall(VecGhostGetLocalForm (_vec,&_local_form));
1227
1228 if (read_only)
1229 {
1230 LibmeshPetscCall(VecGetArrayRead(_local_form, &_read_only_values));
1231 _values_read_only = true;
1232 }
1233 else
1234 {
1235 LibmeshPetscCall(VecGetArray(_local_form, &_values));
1236 _values_read_only = false;
1237 }
1238
1239 PetscInt my_local_size = 0;
1240 LibmeshPetscCall(VecGetLocalSize(_local_form, &my_local_size));
1241 _local_size = static_cast<numeric_index_type>(my_local_size);
1242 }
1243
1244 { // cache ownership range
1245 PetscInt petsc_first=0, petsc_last=0;
1246 LibmeshPetscCall(VecGetOwnershipRange (_vec, &petsc_first, &petsc_last));
1247 _first = static_cast<numeric_index_type>(petsc_first);
1248 _last = static_cast<numeric_index_type>(petsc_last);
1249 }
1250 _array_is_present.store(true, std::memory_order_release);
1251 }
1252 }
1253}
bool is_effectively_ghosted() const
virtual bool initialized() const
std::mutex _petsc_get_restore_array_mutex
Mutex for _get_array and _restore_array.
void _restore_array() const
Restores the array (and the local form if the vector is ghosted) to PETSc.
virtual numeric_index_type local_size() const override
libmesh_assert(ctx)

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

◆ _restore_array()

template<typename T >
void libMesh::PetscVector< T >::_restore_array ( ) const
private

Restores the array (and the local form if the vector is ghosted) to PETSc.

Definition at line 1258 of file petsc_vector.C.

1259{
1260 libmesh_error_msg_if(_values_manually_retrieved,
1261 "PetscVector values were manually retrieved but are being automatically restored!");
1262
1263 libmesh_assert (this->initialized());
1264 if (_array_is_present.load(std::memory_order_acquire))
1265 {
1266 std::scoped_lock lock(_petsc_get_restore_array_mutex);
1267 if (_array_is_present.load(std::memory_order_relaxed))
1268 {
1269 if (!this->is_effectively_ghosted())
1270 {
1272 LibmeshPetscCall(VecRestoreArrayRead (_vec, &_read_only_values));
1273 else
1274 LibmeshPetscCall(VecRestoreArray (_vec, &_values));
1275
1276 _values = nullptr;
1277 }
1278 else
1279 {
1281 LibmeshPetscCall(VecRestoreArrayRead (_local_form, &_read_only_values));
1282 else
1283 LibmeshPetscCall(VecRestoreArray (_local_form, &_values));
1284
1285 _values = nullptr;
1286 LibmeshPetscCall(VecGhostRestoreLocalForm (_vec,&_local_form));
1287 _local_form = nullptr;
1288 _local_size = 0;
1289 }
1290 _array_is_present.store(false, std::memory_order_release);
1291 }
1292 }
1293}

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

Referenced by libMesh::PetscVector< T >::create_subvector(), libMesh::PetscVector< T >::init(), and libMesh::PetscVector< T >::operator=().

◆ abs()

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

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

Implements libMesh::NumericVector< T >.

Definition at line 413 of file petsc_vector.C.

414{
415 parallel_object_only();
416
417 this->_restore_array();
418
419 LibmeshPetscCall(VecAbs(_vec));
420
421 libmesh_assert(this->comm().verify(
422 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
423
424 if (this->is_effectively_ghosted())
425 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
426}
ParallelType type() const
const Parallel::Communicator & comm() const

References libMesh::libmesh_assert().

◆ add() [1/4]

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

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 165 of file petsc_vector.C.

166{
167 this->_restore_array();
168 libmesh_assert_less (i, size());
169
170 PetscInt i_val = static_cast<PetscInt>(i);
171 PetscScalar petsc_value = PS(value);
172
173 std::scoped_lock lock(this->_numeric_vector_mutex);
174 LibmeshPetscCall(VecSetValues (_vec, 1, &i_val, &petsc_value, ADD_VALUES));
175
176 this->_is_closed = false;
177}
std::mutex _numeric_vector_mutex
Mutex for performing thread-safe operations.
virtual numeric_index_type size() const override
PetscScalar PS(T val)
static const bool value
Definition xdr_io.C:55

References libMesh::PS(), and value.

Referenced by main().

◆ add() [2/4]

template<typename T >
void libMesh::PetscVector< 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 305 of file petsc_vector.C.

306{
307 parallel_object_only();
308
309 this->add (1., v);
310}
virtual void add(const numeric_index_type i, const T value) override
Adds value to the vector entry specified by i.

◆ add() [3/4]

template<typename T >
void libMesh::PetscVector< 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 315 of file petsc_vector.C.

316{
317 parallel_object_only();
318
319 this->_restore_array();
320
321 // VecAXPY doesn't support &x==&y
322 if (this == &v_in)
323 {
324 this->scale(a_in+1);
325 return;
326 }
327
328 PetscScalar a = PS(a_in);
329
330 // Make sure the NumericVector passed in is really a PetscVector
331 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
332 v->_restore_array();
333
334 libmesh_assert_equal_to (this->size(), v->size());
335
336 LibmeshPetscCall(VecAXPY(_vec, a, v->vec()));
337
338 libmesh_assert(this->comm().verify(
339 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
340
341 if (this->is_effectively_ghosted())
342 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
343
344 this->_is_closed = true;
345}
virtual void scale(const T factor) override
Scale each element of the vector by the given factor.

◆ add() [4/4]

template<typename T >
void libMesh::PetscVector< 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 294 of file petsc_vector.C.

295{
296 this->_get_array(false);
297
298 for (numeric_index_type i=0; i<_local_size; i++)
299 _values[i] += PetscScalar(v_in);
300}
void _get_array(bool read_only) const
Queries the array (and the local form if the vector is ghosted) from PETSc.

◆ 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 >
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() [3/6]

template<typename T >
void libMesh::PetscVector< T >::add_vector ( const NumericVector< T > &  v,
const SparseMatrix< T > &  A 
)
overridevirtual

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 204 of file petsc_vector.C.

206{
207 parallel_object_only();
208
209 this->_restore_array();
210 // Make sure the data passed in are really of Petsc types
211 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
212 const PetscMatrixBase<T> * A = cast_ptr<const PetscMatrixBase<T> *>(&A_in);
213
214
215 // We shouldn't close() the matrix for you, as that would potentially modify the state of a const object.
216 if (!A->closed())
217 {
218 libmesh_warning("Matrix A must be assembled before calling PetscVector::add_vector(v, A).\n"
219 "Please update your code, as this warning will become an error in a future release.");
220 libmesh_deprecated();
221 const_cast<PetscMatrixBase<T> *>(A)->close();
222 }
223
224 // The const_cast<> is not elegant, but it is required since PETSc
225 // expects a non-const Mat.
226 LibmeshPetscCall(MatMultAdd(const_cast<PetscMatrixBase<T> *>(A)->mat(), v->_vec, _vec, _vec));
227}
virtual void close() override
Calls the NumericVector's internal assembly routines, ensuring that the values are consistent across ...

References libMesh::PetscVector< T >::_vec.

◆ 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.

◆ 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::PetscVector< T >::add_vector ( const T *  v,
const std::vector< numeric_index_type > &  dof_indices 
)
overridevirtual

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].

This should be overridden in subclasses for efficiency. Note that library implementations of this method are thread safe

Reimplemented from libMesh::NumericVector< T >.

Definition at line 182 of file petsc_vector.C.

184{
185 // If we aren't adding anything just return
186 if (dof_indices.empty())
187 return;
188
189 this->_restore_array();
190
191 const PetscInt * i_val = reinterpret_cast<const PetscInt *>(dof_indices.data());
192 const PetscScalar * petsc_value = pPS(v);
193
194 std::scoped_lock lock(this->_numeric_vector_mutex);
195 LibmeshPetscCall(VecSetValues (_vec, cast_int<PetscInt>(dof_indices.size()),
196 i_val, petsc_value, ADD_VALUES));
197
198 this->_is_closed = false;
199}
PetscScalar * pPS(T *ptr)

◆ add_vector_conjugate_transpose()

template<typename T >
void libMesh::PetscVector< T >::add_vector_conjugate_transpose ( const NumericVector< T > &  v,
const SparseMatrix< T > &  A 
)

\( U \leftarrow U + A^H v \).

Adds the product of the conjugate-transpose of SparseMatrix A and a NumericVector v to this.

Definition at line 260 of file petsc_vector.C.

262{
263 parallel_object_only();
264
265 this->_restore_array();
266 // Make sure the data passed in are really of Petsc types
267 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
268 const PetscMatrixBase<T> * A = cast_ptr<const PetscMatrixBase<T> *>(&A_in);
269
270 // We shouldn't close() the matrix for you, as that would potentially modify the state of a const object.
271 if (!A->closed())
272 {
273 libmesh_warning("Matrix A must be assembled before calling PetscVector::add_vector_conjugate_transpose(v, A).\n"
274 "Please update your code, as this warning will become an error in a future release.");
275 libmesh_deprecated();
276 const_cast<PetscMatrixBase<T> *>(A)->close();
277 }
278
279 // Store a temporary copy since MatMultHermitianTransposeAdd doesn't seem to work
280 // TODO: Find out why MatMultHermitianTransposeAdd doesn't work, might be a PETSc bug?
281 std::unique_ptr<NumericVector<Number>> this_clone = this->clone();
282
283 // The const_cast<> is not elegant, but it is required since PETSc
284 // expects a non-const Mat.
285 LibmeshPetscCall(MatMultHermitianTranspose(const_cast<PetscMatrixBase<T> *>(A)->mat(), v->_vec, _vec));
286
287 // Add the temporary copy to the matvec result
288 this->add(1., *this_clone);
289}
virtual std::unique_ptr< NumericVector< T > > clone() const override

◆ add_vector_transpose()

template<typename T >
void libMesh::PetscVector< T >::add_vector_transpose ( const NumericVector< T > &  v,
const SparseMatrix< T > &  A 
)
overridevirtual

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 232 of file petsc_vector.C.

234{
235 parallel_object_only();
236
237 this->_restore_array();
238 // Make sure the data passed in are really of Petsc types
239 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
240 const PetscMatrixBase<T> * A = cast_ptr<const PetscMatrixBase<T> *>(&A_in);
241
242
243 // We shouldn't close() the matrix for you, as that would potentially modify the state of a const object.
244 if (!A->closed())
245 {
246 libmesh_warning("Matrix A must be assembled before calling PetscVector::add_vector_transpose(v, A).\n"
247 "Please update your code, as this warning will become an error in a future release.");
248 libmesh_deprecated();
249 const_cast<PetscMatrixBase<T> *>(A)->close();
250 }
251
252 // The const_cast<> is not elegant, but it is required since PETSc
253 // expects a non-const Mat.
254 LibmeshPetscCall(MatMultTransposeAdd(const_cast<PetscMatrixBase<T> *>(A)->mat(), v->_vec, _vec, _vec));
255}

◆ 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}

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::PetscVector< T >::clear ( )
inlineoverridevirtualnoexcept

clear() is called from the destructor, so it should not throw.

Reimplemented from libMesh::NumericVector< T >.

Definition at line 929 of file petsc_vector.h.

930{
931 exceptionless_parallel_object_only();
932
933 if (this->initialized())
934 this->_restore_array();
935
936 if ((this->initialized()) && (this->_destroy_vec_on_exit))
937 {
938 // If we encounter an error here, print a warning but otherwise
939 // keep going since we may be recovering from an exception.
940 PetscErrorCode ierr = VecDestroy(&_vec);
941 if (ierr)
942 libmesh_warning("Warning: VecDestroy returned a non-zero error code which we ignored.");
943 }
944
945 this->_is_closed = this->_is_initialized = false;
946
947 _global_to_local_map.clear();
948}

References libMesh::initialized().

◆ clone()

template<typename T >
std::unique_ptr< NumericVector< T > > libMesh::PetscVector< 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 993 of file petsc_vector.h.

994{
995 std::unique_ptr<NumericVector<T>> cloned_vector =
996 std::make_unique<PetscVector<T>>(this->comm(), this->type());
997 cloned_vector->init(*this, true);
998 *cloned_vector = *this;
999 return cloned_vector;
1000}

Referenced by PetscVectorTest::testPetscOperations().

◆ close()

template<typename T >
void libMesh::PetscVector< 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 911 of file petsc_vector.h.

912{
913 parallel_object_only();
914
915 this->_restore_array();
916
917 VecAssemblyBeginEnd(this->comm(), _vec);
918
919 if (this->is_effectively_ghosted())
920 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
921
922 this->_is_closed = true;
923}

Referenced by libMesh::__libmesh_petsc_diff_solver_monitor(), libMesh::PetscNonlinearSolver< Number >::force_new_preconditioner(), libMesh::SlepcEigenSolver< T >::get_eigenpair(), libMesh::PetscVector< T >::localize(), main(), libMesh::PetscLinearSolver< T >::solve_base(), PetscVectorTest::testGetArray(), and PetscVectorTest::testPetscOperations().

◆ 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::PetscVector< T >::conjugate ( )
overridevirtual

Negates the imaginary component of each entry in the vector.

Implements libMesh::NumericVector< T >.

Definition at line 153 of file petsc_vector.C.

154{
155 parallel_object_only();
156
157
158 // We just call the PETSc VecConjugate
159 LibmeshPetscCall(VecConjugate(_vec));
160}

◆ create_subvector()

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

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 from libMesh::NumericVector< T >.

Definition at line 1052 of file petsc_vector.C.

1055{
1056 parallel_object_only();
1057
1058 libmesh_error_msg_if(
1059 subvector.is_effectively_ghosted(),
1060 "We do not support scattering parallel information to ghosts for subvectors");
1061
1062 this->_restore_array();
1063
1064 // PETSc data structures
1065
1066 // Make sure the passed in subvector is really a PetscVector
1067 PetscVector<T> * petsc_subvector = cast_ptr<PetscVector<T> *>(&subvector);
1068
1069 // If the petsc_subvector is already initialized, we assume that the
1070 // user has already allocated the *correct* amount of space for it.
1071 // If not, we use the appropriate PETSc routines to initialize it.
1072 if (!petsc_subvector->initialized())
1073 {
1074 if (this->is_effectively_serial())
1075 {
1076 libmesh_assert(this->comm().verify(rows.size()));
1077 LibmeshPetscCall(VecCreateSeq(this->comm().get(), rows.size(), &(petsc_subvector->_vec)));
1078
1079#ifdef LIBMESH_ENABLE_DEPRECATED
1080 // In the past we always created PARALLEL subvectors from
1081 // GHOSTED vectors, but this behavior must now be specified
1082 // downstream when it's desired, by setting the subvector
1083 // type in advance.
1084 petsc_subvector->_type = (this->type() == SERIAL) ? SERIAL : PARALLEL;
1085
1086 if (petsc_subvector->type() == AUTOMATIC &&
1087 this->type() != petsc_subvector->type())
1088 libmesh_deprecated();
1089#else
1090 // If the subvector already had a type, let's not change it.
1091 // If it was just at the default AUTOMATIC, let's pick the
1092 // true type from the supervector.
1093 if (petsc_subvector->type() == AUTOMATIC)
1094 petsc_subvector->_type = this->type();
1095#endif
1096 }
1097 else
1098 {
1099#ifndef LIBMESH_ENABLE_DEPRECATED
1100 // We're only supporting PARALLEL subvectors in parallel
1101 // so far, but we want to leave other possible API inputs
1102 // marked as invalid so we can add support for other
1103 // subvector types later.
1104 if (petsc_subvector->type() != PARALLEL &&
1105 (petsc_subvector->type() != AUTOMATIC ||
1106 this->type() != PARALLEL))
1107 libmesh_not_implemented_msg("Cannot yet create non-PARALLEL subvectors in parallel");
1108#endif
1109
1110 if (supplying_global_rows)
1111 // Initialize the petsc_subvector to have enough space to hold
1112 // the entries which will be scattered into it. Note: such an
1113 // init() function (where we let PETSc decide the number of local
1114 // entries) is not currently offered by the PetscVector
1115 // class. Should we differentiate here between sequential and
1116 // parallel vector creation based on this->n_processors() ?
1117 LibmeshPetscCall(VecCreateMPI(this->comm().get(),
1118 PETSC_DECIDE, // n_local
1119 cast_int<PetscInt>(rows.size()), // n_global
1120 &(petsc_subvector->_vec)));
1121 else
1122 LibmeshPetscCall(VecCreateMPI(this->comm().get(),
1123 cast_int<PetscInt>(rows.size()),
1124 PETSC_DETERMINE,
1125 &(petsc_subvector->_vec)));
1126
1127 // We created a parallel vector
1128 petsc_subvector->_type = PARALLEL;
1129 }
1130
1131 LibmeshPetscCall(VecSetFromOptions (petsc_subvector->_vec));
1132
1133
1134 // Mark the subvector as initialized
1135 petsc_subvector->_is_initialized = true;
1136 }
1137 else
1138 {
1139 petsc_subvector->_restore_array();
1140 }
1141
1142 std::vector<PetscInt> idx(rows.size());
1143 if (supplying_global_rows)
1144 std::iota (idx.begin(), idx.end(), 0);
1145 else
1146 {
1147 PetscInt start;
1148 LibmeshPetscCall(VecGetOwnershipRange(petsc_subvector->_vec, &start, nullptr));
1149 std::iota (idx.begin(), idx.end(), start);
1150 }
1151
1152 // Construct index sets
1153 WrappedPetsc<IS> parent_is;
1154 LibmeshPetscCall(ISCreateGeneral(this->comm().get(),
1155 cast_int<PetscInt>(rows.size()),
1156 numeric_petsc_cast(rows.data()),
1157 PETSC_USE_POINTER,
1158 parent_is.get()));
1159
1160 WrappedPetsc<IS> subvector_is;
1161 LibmeshPetscCall(ISCreateGeneral(this->comm().get(),
1162 cast_int<PetscInt>(rows.size()),
1163 idx.data(),
1164 PETSC_USE_POINTER,
1165 subvector_is.get()));
1166
1167 // Construct the scatter object
1168 WrappedPetsc<VecScatter> scatter;
1169 LibmeshPetscCall(VecScatterCreate(this->_vec,
1170 parent_is,
1171 petsc_subvector->_vec,
1172 subvector_is,
1173 scatter.get()));
1174
1175 // Actually perform the scatter
1176 VecScatterBeginEnd(this->comm(), scatter, this->_vec, petsc_subvector->_vec, INSERT_VALUES, SCATTER_FORWARD);
1177
1178 petsc_subvector->_is_closed = true;
1179}
processor_id_type size() const
bool is_effectively_serial() const
virtual void get(const std::vector< numeric_index_type > &index, T *values) const override
Access multiple components at once.
unsigned int idx(const ElemType type, const unsigned int nx, const unsigned int i, const unsigned int j)
A useful inline function which replaces the macros used previously.
PetscInt * numeric_petsc_cast(const numeric_index_type *p)

References libMesh::NumericVector< T >::_is_closed, libMesh::NumericVector< T >::_is_initialized, libMesh::PetscVector< T >::_restore_array(), libMesh::NumericVector< T >::_type, libMesh::PetscVector< T >::_vec, libMesh::AUTOMATIC, libMesh::WrappedPetsc< T >::get(), libMesh::NumericVector< T >::initialized(), libMesh::NumericVector< T >::is_effectively_ghosted(), libMesh::libmesh_assert(), libMesh::numeric_petsc_cast(), libMesh::PARALLEL, libMesh::SERIAL, and libMesh::NumericVector< T >::type().

◆ 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::PetscVector< 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 429 of file petsc_vector.C.

430{
431 parallel_object_only();
432
433 this->_restore_array();
434
435 // Error flag
436
437 // Return value
438 PetscScalar value=0.;
439
440 // Make sure the NumericVector passed in is really a PetscVector
441 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
442
443 // 2.3.x (at least) style. Untested for previous versions.
444 LibmeshPetscCall(VecDot(this->_vec, v->_vec, &value));
445
446 return static_cast<T>(value);
447}

◆ 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::PetscVector< 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 1039 of file petsc_vector.h.

1040{
1041 libmesh_assert (this->initialized());
1042
1043 numeric_index_type first = 0;
1044
1045 if (_array_is_present) // Can we use cached values?
1046 first = _first;
1047 else
1048 {
1049 PetscInt petsc_first=0, petsc_last=0;
1050 LibmeshPetscCall(VecGetOwnershipRange (_vec, &petsc_first, &petsc_last));
1051 first = static_cast<numeric_index_type>(petsc_first);
1052 }
1053
1054 return first;
1055}

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

Referenced by PetscVectorTest::testPetscOperations().

◆ 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::PetscVector< T >::get ( const std::vector< numeric_index_type > &  index,
T *  values 
) const
inlineoverridevirtual

Access multiple components at once.

values will not be reallocated; it should already have enough space. The default implementation calls operator() for each index, but some implementations may supply faster methods here.

Reimplemented from libMesh::NumericVector< T >.

Definition at line 1159 of file petsc_vector.h.

1161{
1162 this->_get_array(true);
1163
1164 const std::size_t num = index.size();
1165
1166 for (std::size_t i=0; i<num; i++)
1167 {
1168 const numeric_index_type local_index = this->map_global_to_local_index(index[i]);
1169#ifndef NDEBUG
1170 if (this->is_effectively_ghosted())
1171 libmesh_assert_less (local_index, _local_size);
1172#endif
1173 values[i] = static_cast<T>(_read_only_values[local_index]);
1174 }
1175}
numeric_index_type map_global_to_local_index(const numeric_index_type i) const

◆ get_array()

template<typename T >
PetscScalar * libMesh::PetscVector< T >::get_array ( )
inline

Get read/write access to the raw PETSc Vector data array.

Note
This is an advanced interface. In general you should avoid using it unless you know what you are doing!

Definition at line 1180 of file petsc_vector.h.

1181{
1182 _get_array(false);
1184
1185 return _values;
1186}

Referenced by PetscVectorTest::testGetArray().

◆ get_array_read()

template<typename T >
const PetscScalar * libMesh::PetscVector< T >::get_array_read ( ) const
inline

Get read only access to the raw PETSc Vector data array.

Note
This is an advanced interface. In general you should avoid using it unless you know what you are doing!

Definition at line 1191 of file petsc_vector.h.

1192{
1193 _get_array(true);
1195
1196 return _read_only_values;
1197}

Referenced by PetscVectorTest::testGetArray().

◆ 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 >
std::unique_ptr< NumericVector< T > > libMesh::PetscVector< T >::get_subvector ( const std::vector< numeric_index_type > &  )
overridevirtual

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 from libMesh::NumericVector< T >.

Definition at line 1297 of file petsc_vector.C.

1298{
1299 // Construct index set
1300 WrappedPetsc<IS> parent_is;
1301 LibmeshPetscCall(ISCreateGeneral(this->comm().get(),
1302 cast_int<PetscInt>(rows.size()),
1303 numeric_petsc_cast(rows.data()),
1304 PETSC_USE_POINTER,
1305 parent_is.get()));
1306
1307 Vec subvec;
1308 LibmeshPetscCall(VecGetSubVector(_vec, parent_is, &subvec));
1309
1310 this->_is_closed = false;
1311
1312 return std::make_unique<PetscVector<T>>(subvec, this->comm());
1313}

References libMesh::WrappedPetsc< T >::get(), and libMesh::numeric_petsc_cast().

◆ 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().

◆ indefinite_dot()

template<typename T >
T libMesh::PetscVector< T >::indefinite_dot ( const NumericVector< T > &  v) const
Returns
The dot product of (*this) with the vector v.
Note
Does not use the complex-conjugate of v in the complex-valued case.

Definition at line 450 of file petsc_vector.C.

451{
452 parallel_object_only();
453
454 this->_restore_array();
455
456 // Error flag
457
458 // Return value
459 PetscScalar value=0.;
460
461 // Make sure the NumericVector passed in is really a PetscVector
462 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
463
464 // 2.3.x (at least) style. Untested for previous versions.
465 LibmeshPetscCall(VecTDot(this->_vec, v->_vec, &value));
466
467 return static_cast<T>(value);
468}

References libMesh::PetscVector< T >::_vec, and value.

◆ init() [1/4]

template<typename T >
void libMesh::PetscVector< 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 790 of file petsc_vector.h.

793{
794 this->init(n,n,fast,ptype);
795}

◆ init() [2/4]

template<typename T >
void libMesh::PetscVector< 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 721 of file petsc_vector.h.

725{
726 parallel_object_only();
727
728 PetscInt petsc_n=static_cast<PetscInt>(n);
729
730 // Clear initialized vectors
731 if (this->initialized())
732 this->clear();
733
734 if (ptype == AUTOMATIC)
735 {
736 if (n == n_local)
737 this->_type = SERIAL;
738 else
739 this->_type = PARALLEL;
740 }
741 else
742 this->_type = ptype;
743
744 // We should have been given consistent settings
745 libmesh_assert ((this->_type==SERIAL && n==n_local) ||
746 (this->n_processors()==1 && n==n_local) ||
747 this->_type==PARALLEL);
748
749 // create a sequential vector if on only 1 processor, or if asked
750 if (this->_type == SERIAL || (this->n_processors() == 1))
751 {
752 LibmeshPetscCallA(PETSC_COMM_SELF, VecCreate(PETSC_COMM_SELF, &_vec));
753 LibmeshPetscCallA(PETSC_COMM_SELF, VecSetSizes(_vec, petsc_n, petsc_n));
754 LibmeshPetscCallA(PETSC_COMM_SELF, VecSetFromOptions (_vec));
755 }
756 // or create an MPI-enabled PARALLEL vector w/o ghosting if asked
757 else if (this->_type == PARALLEL)
758 {
759#ifdef LIBMESH_HAVE_MPI
760 PetscInt petsc_n_local=cast_int<PetscInt>(n_local);
761 libmesh_assert_less_equal (n_local, n);
762 // Use more generic function instead of VecCreateSeq/MPI
763 LibmeshPetscCall(VecCreate(this->comm().get(), &_vec));
764 LibmeshPetscCall(VecSetSizes(_vec, petsc_n_local, petsc_n));
765#else
766 libmesh_assert_equal_to (n_local, n);
767 LibmeshPetscCallA(PETSC_COMM_SELF, VecCreate(PETSC_COMM_SELF, &_vec));
768 LibmeshPetscCallA(PETSC_COMM_SELF, VecSetSizes(_vec, petsc_n, petsc_n));
769#endif
770 LibmeshPetscCall(VecSetFromOptions(_vec));
771 }
772 // or yell because we don't know what to do
773 else
774 libmesh_error_msg("Unsupported type " <<
776 " for parallel init with no ghost indices supplied");
777
778 this->_is_initialized = true;
779 this->_is_closed = true;
780
781
782 if (fast == false)
783 this->zero ();
784}
processor_id_type n_processors() const
virtual void zero() override
Set all entries to zero.
std::string enum_to_string(const T e)

References libMesh::AUTOMATIC, libMesh::Utility::enum_to_string(), libMesh::initialized(), libMesh::libmesh_assert(), libMesh::PARALLEL, libMesh::SERIAL, and libMesh::zero.

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

◆ init() [3/4]

template<typename T >
void libMesh::PetscVector< 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 801 of file petsc_vector.h.

806{
807 parallel_object_only();
808
809 if (this->comm().size() == 1)
810 {
811 libmesh_assert(ghost.empty());
812 this->init(n, n_local, fast, ptype);
813 return;
814 }
815
816 PetscInt petsc_n=static_cast<PetscInt>(n);
817 PetscInt petsc_n_local=static_cast<PetscInt>(n_local);
818 PetscInt petsc_n_ghost=static_cast<PetscInt>(ghost.size());
819
820 // If the mesh is not disjoint, every processor will either have
821 // all the dofs, none of the dofs, or some non-zero dofs at the
822 // boundary between processors.
823 //
824 // However we can't assert this, because someone might want to
825 // construct a GHOSTED vector which doesn't include neighbor element
826 // dofs. Boyce tried to do so in user code, and we're going to want
827 // to do so in System::project_vector().
828 //
829 // libmesh_assert(n_local == 0 || n_local == n || !ghost.empty());
830
831 libmesh_assert(sizeof(PetscInt) == sizeof(numeric_index_type));
832
833 PetscInt * petsc_ghost = ghost.empty() ? LIBMESH_PETSC_NULLPTR :
834 const_cast<PetscInt *>(reinterpret_cast<const PetscInt *>(ghost.data()));
835
836 // Clear initialized vectors
837 if (this->initialized())
838 this->clear();
839
840 libmesh_assert(ptype == AUTOMATIC || ptype == GHOSTED);
841 this->_type = GHOSTED;
842
843 /* Make the global-to-local ghost cell map. */
844 for (auto i : index_range(ghost))
845 {
846 _global_to_local_map[ghost[i]] = i;
847 }
848
849 /* Create vector. */
850 LibmeshPetscCall(VecCreateGhost (this->comm().get(), petsc_n_local, petsc_n,
851 petsc_n_ghost, petsc_ghost,
852 &_vec));
853
854 // Add a prefix so that we can at least distinguish a ghosted vector from a
855 // nonghosted vector when using a petsc option.
856 // PETSc does not fully support VecGhost on GPU yet. This change allows us to
857 // trigger a nonghosted vector to use GPU without bothering the ghosted vectors.
858 LibmeshPetscCall(PetscObjectAppendOptionsPrefix((PetscObject)_vec,"ghost_"));
859
860 LibmeshPetscCall(VecSetFromOptions (_vec));
861
862 this->_is_initialized = true;
863 this->_is_closed = true;
864
865 if (fast == false)
866 this->zero ();
867}
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::AUTOMATIC, libMesh::GHOSTED, libMesh::index_range(), libMesh::initialized(), libMesh::libmesh_assert(), and libMesh::zero.

◆ init() [4/4]

template<typename T >
void libMesh::PetscVector< T >::init ( const NumericVector< T > &  other,
const bool  fast = false 
)
inlineoverridevirtual

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

Implements libMesh::NumericVector< T >.

Definition at line 873 of file petsc_vector.h.

875{
876 parallel_object_only();
877
878 // Clear initialized vectors
879 if (this->initialized())
880 this->clear();
881
882 const PetscVector<T> & v = cast_ref<const PetscVector<T> &>(other);
883
884 // Other vector should restore array.
885 if (v.initialized())
886 {
887 v._restore_array();
888 }
889
890 this->_global_to_local_map = v._global_to_local_map;
891
892 // Even if we're initializing sizes based on an uninitialized or
893 // unclosed vector, *this* vector is being initialized now and is
894 // initially closed.
895 this->_is_closed = true; // v._is_closed;
896 this->_is_initialized = true; // v._is_initialized;
897
898 this->_type = v._type;
899
900 // We want to have a valid Vec, even if it's initially of size zero
901 LibmeshPetscCall(VecDuplicate (v._vec, &this->_vec));
902
903 if (fast == false)
904 this->zero ();
905}

References libMesh::PetscVector< T >::_global_to_local_map, libMesh::PetscVector< T >::_restore_array(), libMesh::NumericVector< T >::_type, libMesh::PetscVector< T >::_vec, libMesh::initialized(), libMesh::NumericVector< T >::initialized(), and libMesh::zero.

◆ 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::PetscVector< T >::insert ( const T *  v,
const std::vector< numeric_index_type > &  dof_indices 
)
overridevirtual

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

Note that library implementations of this method are thread safe

Reimplemented from libMesh::NumericVector< T >.

Definition at line 350 of file petsc_vector.C.

352{
353 if (dof_indices.empty())
354 return;
355
356 this->_restore_array();
357
358 PetscInt * idx_values = numeric_petsc_cast(dof_indices.data());
359 std::scoped_lock lock(this->_numeric_vector_mutex);
360 LibmeshPetscCall(VecSetValues (_vec, cast_int<PetscInt>(dof_indices.size()),
361 idx_values, pPS(v), INSERT_VALUES));
362
363 this->_is_closed = false;
364}

◆ 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::PetscVector< 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 74 of file petsc_vector.C.

75{
76 return PetscVector<T>::norm<NORM_1>();
77}

◆ 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::PetscVector< 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 79 of file petsc_vector.C.

80{
81 return PetscVector<T>::norm<NORM_2>();
82}

Referenced by libMesh::__libmesh_petsc_diff_solver_monitor().

◆ 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}
auto norm_sq(const T &a)

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::PetscVector< 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 1061 of file petsc_vector.h.

1062{
1063 libmesh_assert (this->initialized());
1064
1065 numeric_index_type last = 0;
1066
1067 if (_array_is_present) // Can we use cached values?
1068 last = _last;
1069 else
1070 {
1071 PetscInt petsc_first=0, petsc_last=0;
1072 LibmeshPetscCall(VecGetOwnershipRange (_vec, &petsc_first, &petsc_last));
1073 last = static_cast<numeric_index_type>(petsc_last);
1074 }
1075
1076 return last;
1077}

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

Referenced by PetscVectorTest::testPetscOperations().

◆ linfty_norm()

template<typename T >
Real libMesh::PetscVector< 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 84 of file petsc_vector.C.

85{
86 return PetscVector<T>::norm<NORM_INFINITY>();
87}

◆ 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::PetscVector< 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 1024 of file petsc_vector.h.

1025{
1026 libmesh_assert (this->initialized());
1027
1028 PetscInt petsc_size=0;
1029
1030 LibmeshPetscCall(VecGetLocalSize(_vec, &petsc_size));
1031
1032 return static_cast<numeric_index_type>(petsc_size);
1033}

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

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

◆ localize() [1/5]

template<typename T >
void libMesh::PetscVector< 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 695 of file petsc_vector.C.

698{
699 parallel_object_only();
700
701 this->_restore_array();
702
703 libmesh_assert_less_equal (send_list.size(), this->size());
704 libmesh_assert_less_equal (last_local_idx+1, this->size());
705
706 const numeric_index_type my_size = this->size();
707 const numeric_index_type my_local_size = (last_local_idx + 1 - first_local_idx);
708
709 // Don't bother for serial cases
710 // if ((first_local_idx == 0) &&
711 // (my_local_size == my_size))
712 // But we do need to stay in sync for degenerate cases
713 if (this->n_processors() == 1)
714 return;
715
716
717 // Build a parallel vector, initialize it with the local
718 // parts of (*this)
719 PetscVector<T> parallel_vec(this->comm(), PARALLEL);
720
721 parallel_vec.init (my_size, my_local_size, true, PARALLEL);
722
723
724 // Copy part of *this into the parallel_vec
725 {
726 // Create idx, idx[i] = i+first_local_idx;
727 std::vector<PetscInt> idx(my_local_size);
728 std::iota (idx.begin(), idx.end(), first_local_idx);
729
730 // Create the index set & scatter objects
731 WrappedPetsc<IS> is;
732 LibmeshPetscCall(ISCreateGeneral(this->comm().get(), my_local_size,
733 my_local_size ? idx.data() : nullptr, PETSC_USE_POINTER, is.get()));
734
735 WrappedPetsc<VecScatter> scatter;
736 LibmeshPetscCall(VecScatterCreate(_vec, is,
737 parallel_vec._vec, is,
738 scatter.get()));
739
740 // Perform the scatter
741 VecScatterBeginEnd(this->comm(), scatter, _vec, parallel_vec._vec, INSERT_VALUES, SCATTER_FORWARD);
742 }
743
744 // localize like normal
745 parallel_vec.close();
746 parallel_vec.localize (*this, send_list);
747 this->close();
748}
PetscErrorCode PetscInt const PetscInt IS * is

References libMesh::PetscVector< T >::_vec, libMesh::PetscVector< T >::close(), libMesh::WrappedPetsc< T >::get(), libMesh::PetscVector< T >::init(), libMesh::is, libMesh::PetscVector< T >::localize(), and libMesh::PARALLEL.

◆ localize() [2/5]

template<typename T >
void libMesh::PetscVector< 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 622 of file petsc_vector.C.

623{
624 parallel_object_only();
625
626 libmesh_assert(this->comm().verify(
627 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
628 libmesh_assert(this->comm().verify(
629 static_cast<typename std::underlying_type<ParallelType>::type>(v_local_in.type())));
630
631 v_local_in = *this;
632}

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

◆ localize() [3/5]

template<typename T >
void libMesh::PetscVector< 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 637 of file petsc_vector.C.

639{
640 this->localize(v_local_in);
641}
virtual void localize(std::vector< T > &v_local) const override
Creates a copy of the global vector in the local vector v_local.

◆ localize() [4/5]

template<typename T >
void libMesh::PetscVector< 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 753 of file petsc_vector.C.

754{
755 parallel_object_only();
756
757 this->_restore_array();
758
759 // This function must be run on all processors at once
760 parallel_object_only();
761
762 const PetscInt n = this->size();
763 const PetscInt nl = this->local_size();
764 PetscScalar * values;
765
766 v_local.clear();
767 v_local.resize(n, 0.);
768
769 LibmeshPetscCall(VecGetArray (_vec, &values));
770
772
773 for (PetscInt i=0; i<nl; i++)
774 v_local[i+ioff] = static_cast<T>(values[i]);
775
776 LibmeshPetscCall(VecRestoreArray (_vec, &values));
777
778 this->comm().sum(v_local);
779}
virtual numeric_index_type first_local_index() const override

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

◆ localize() [5/5]

template<typename T >
void libMesh::PetscVector< 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 646 of file petsc_vector.C.

648{
649 parallel_object_only();
650
651 // Error code used to check the status of all PETSc function calls.
652
653 // Create a sequential destination Vec with the right number of entries on each proc.
654 WrappedPetsc<Vec> dest;
655 LibmeshPetscCall(VecCreateSeq(PETSC_COMM_SELF, cast_int<PetscInt>(indices.size()), dest.get()));
656
657 // Create an IS using the libmesh routine. PETSc does not own the
658 // IS memory in this case, it is automatically cleaned up by the
659 // std::vector destructor.
660 PetscInt * idxptr =
661 indices.empty() ? nullptr : numeric_petsc_cast(indices.data());
662 WrappedPetsc<IS> is;
663 LibmeshPetscCall(ISCreateGeneral(this->comm().get(), cast_int<PetscInt>(indices.size()), idxptr,
664 PETSC_USE_POINTER, is.get()));
665
666 // Create the VecScatter object. "PETSC_NULL" means "use the identity IS".
667 WrappedPetsc<VecScatter> scatter;
668 LibmeshPetscCall(VecScatterCreate(_vec,
669 /*src is=*/is,
670 /*dest vec=*/dest,
671 /*dest is=*/LIBMESH_PETSC_NULLPTR,
672 scatter.get()));
673
674 // Do the scatter
675 VecScatterBeginEnd(this->comm(), scatter, _vec, dest, INSERT_VALUES, SCATTER_FORWARD);
676
677 // Get access to the values stored in dest.
678 PetscScalar * values;
679 LibmeshPetscCall(VecGetArray (dest, &values));
680
681 // Store values into the provided v_local. Make sure there is enough
682 // space reserved and then clear out any existing entries before
683 // inserting.
684 v_local.reserve(indices.size());
685 v_local.clear();
686 v_local.insert(v_local.begin(), values, values+indices.size());
687
688 // We are done using it, so restore the array.
689 LibmeshPetscCall(VecRestoreArray (dest, &values));
690}

References libMesh::WrappedPetsc< T >::get(), libMesh::is, and libMesh::numeric_petsc_cast().

◆ localize_to_one() [1/3]

void libMesh::PetscVector< Complex >::localize_to_one ( std::vector< Complex > &  v_local,
const processor_id_type  pid 
) const

Definition at line 870 of file petsc_vector.C.

872{
873 parallel_object_only();
874
875 this->_restore_array();
876
877 const PetscInt n = size();
878 const PetscInt nl = local_size();
879 PetscScalar * values;
880
881
882 v_local.resize(n);
883
884
885 for (PetscInt i=0; i<n; i++)
886 v_local[i] = 0.;
887
888 // only one processor
889 if (n_processors() == 1)
890 {
891 LibmeshPetscCall(VecGetArray (_vec, &values));
892
893 for (PetscInt i=0; i<n; i++)
894 v_local[i] = static_cast<Complex>(values[i]);
895
896 LibmeshPetscCall(VecRestoreArray (_vec, &values));
897 }
898
899 // otherwise multiple processors
900 else
901 {
903
904 /* in here the local values are stored, acting as send buffer for MPI
905 * initialize to zero, since we collect using MPI_SUM
906 */
907 std::vector<Real> real_local_values(n, 0.);
908 std::vector<Real> imag_local_values(n, 0.);
909
910 {
911 LibmeshPetscCall(VecGetArray (_vec, &values));
912
913 // provide my local share to the real and imag buffers
914 for (PetscInt i=0; i<nl; i++)
915 {
916 real_local_values[i+ioff] = static_cast<Complex>(values[i]).real();
917 imag_local_values[i+ioff] = static_cast<Complex>(values[i]).imag();
918 }
919
920 LibmeshPetscCall(VecRestoreArray (_vec, &values));
921 }
922
923 /* have buffers of the real and imaginary part of v_local.
924 * Once MPI_Reduce() collected all the real and imaginary
925 * parts in these std::vector<Real>, the values can be
926 * copied to v_local
927 */
928 std::vector<Real> real_v_local(n);
929 std::vector<Real> imag_v_local(n);
930
931 // collect entries from other proc's in real_v_local, imag_v_local
932 MPI_Reduce (real_local_values.data(),
933 real_v_local.data(), n,
934 Parallel::StandardType<Real>(),
935 Parallel::OpFunction<Real>::sum(),
936 pid, this->comm().get());
937
938 MPI_Reduce (imag_local_values.data(),
939 imag_v_local.data(), n,
940 Parallel::StandardType<Real>(),
941 Parallel::OpFunction<Real>::sum(),
942 pid, this->comm().get());
943
944 // copy real_v_local and imag_v_local to v_local
945 for (PetscInt i=0; i<n; i++)
946 v_local[i] = Complex(real_v_local[i], imag_v_local[i]);
947 }
948}
std::complex< Real > Complex
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
boost::multiprecision::float128 imag(const boost::multiprecision::float128)

◆ localize_to_one() [2/3]

void libMesh::PetscVector< Real >::localize_to_one ( std::vector< Real > &  v_local,
const processor_id_type   timpi_mpi_varpid 
) const

Definition at line 787 of file petsc_vector.C.

790{
791 parallel_object_only();
792
793 this->_restore_array();
794
795 const PetscInt n = size();
796 PetscScalar * values;
797
798 // only one processor
799 if (n_processors() == 1)
800 {
801 v_local.resize(n);
802
803 LibmeshPetscCall(VecGetArray (_vec, &values));
804
805 for (PetscInt i=0; i<n; i++)
806 v_local[i] = static_cast<Real>(values[i]);
807
808 LibmeshPetscCall(VecRestoreArray (_vec, &values));
809 }
810
811 // otherwise multiple processors
812#ifdef LIBMESH_HAVE_MPI
813 else
814 {
815 if (pid == 0) // optimized version for localizing to 0
816 {
817 WrappedPetsc<Vec> vout;
818 WrappedPetsc<VecScatter> ctx;
819
820 LibmeshPetscCall(VecScatterCreateToZero(_vec, ctx.get(), vout.get()));
821
822 VecScatterBeginEnd(this->comm(), ctx, _vec, vout, INSERT_VALUES, SCATTER_FORWARD);
823
824 if (processor_id() == 0)
825 {
826 v_local.resize(n);
827
828 LibmeshPetscCall(VecGetArray (vout, &values));
829
830 for (PetscInt i=0; i<n; i++)
831 v_local[i] = static_cast<Real>(values[i]);
832
833 LibmeshPetscCall(VecRestoreArray (vout, &values));
834 }
835 }
836 else
837 {
838 v_local.resize(n);
839
841 std::vector<Real> local_values (n, 0.);
842
843 {
844 LibmeshPetscCall(VecGetArray (_vec, &values));
845
846 const PetscInt nl = local_size();
847 for (PetscInt i=0; i<nl; i++)
848 local_values[i+ioff] = static_cast<Real>(values[i]);
849
850 LibmeshPetscCall(VecRestoreArray (_vec, &values));
851 }
852
853
854 MPI_Reduce (local_values.data(), v_local.data(), n,
855 Parallel::StandardType<Real>(),
856 Parallel::OpFunction<Real>::sum(), pid,
857 this->comm().get());
858 }
859 }
860#endif // LIBMESH_HAVE_MPI
861}
processor_id_type processor_id() const

References libMesh::ctx, libMesh::WrappedPetsc< T >::get(), and libMesh::Real.

◆ localize_to_one() [3/3]

template<typename T >
virtual void libMesh::PetscVector< 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 >.

◆ map_global_to_local_index()

template<typename T >
numeric_index_type libMesh::PetscVector< T >::map_global_to_local_index ( const numeric_index_type  i) const
inline
Returns
The local index corresponding to global index i.

If the index is not a ghost cell, this is done by subtraction the number of the first local index. If it is a ghost cell, it has to be looked up in the map.

Definition at line 1083 of file petsc_vector.h.

1084{
1085 libmesh_assert (this->initialized());
1086
1087 numeric_index_type first=0;
1088 numeric_index_type last=0;
1089
1090 if (_array_is_present) // Can we use cached values?
1091 {
1092 first = _first;
1093 last = _last;
1094 }
1095 else
1096 {
1097 PetscInt petsc_first=0, petsc_last=0;
1098 LibmeshPetscCall(VecGetOwnershipRange (_vec, &petsc_first, &petsc_last));
1099 first = static_cast<numeric_index_type>(petsc_first);
1100 last = static_cast<numeric_index_type>(petsc_last);
1101 }
1102
1103
1104 if ((i>=first) && (i<last))
1105 {
1106 return i-first;
1107 }
1108
1109 GlobalToLocalMap::const_iterator it = _global_to_local_map.find(i);
1110#ifndef NDEBUG
1111 const GlobalToLocalMap::const_iterator end = _global_to_local_map.end();
1112 if (it == end)
1113 {
1114 std::ostringstream error_message;
1115 error_message << "No index " << i << " in ghosted vector.\n"
1116 << "Vector contains [" << first << ',' << last << ")\n";
1117 GlobalToLocalMap::const_iterator b = _global_to_local_map.begin();
1118 if (b == end)
1119 {
1120 error_message << "And empty ghost array.\n";
1121 }
1122 else
1123 {
1124 error_message << "And ghost array {" << b->first;
1125 for (++b; b != end; ++b)
1126 error_message << ',' << b->first;
1127 error_message << "}\n";
1128 }
1129
1130 libmesh_error_msg(error_message.str());
1131 }
1133#endif
1134 return it->second+last-first;
1135}
static const Real b

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

◆ max()

template<typename T >
Real libMesh::PetscVector< 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 1230 of file petsc_vector.h.

1231{
1232 parallel_object_only();
1233
1234 this->_restore_array();
1235
1236 PetscInt index=0;
1237 PetscReal returnval=0.;
1238
1239 LibmeshPetscCall(VecMax (_vec, &index, &returnval));
1240
1241 // this return value is correct: VecMax returns a PetscReal
1242 return static_cast<Real>(returnval);
1243}

References libMesh::Real.

◆ max_allowed_id()

template<typename T >
std::size_t libMesh::PetscVector< 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 1276 of file petsc_vector.h.

1277{
1278 // The PetscInt type is used for indexing, it may be either a signed
1279 // 4-byte or 8-byte integer depending on how PETSc is configured.
1280 return std::numeric_limits<PetscInt>::max();
1281}

◆ min()

template<typename T >
Real libMesh::PetscVector< 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 1211 of file petsc_vector.h.

1212{
1213 parallel_object_only();
1214
1215 this->_restore_array();
1216
1217 PetscInt index=0;
1218 PetscReal returnval=0.;
1219
1220 LibmeshPetscCall(VecMin (_vec, &index, &returnval));
1221
1222 // this return value is correct: VecMin returns a PetscReal
1223 return static_cast<Real>(returnval);
1224}

References 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 }
uint8_t processor_id_type
Definition id_types.h:104

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().

◆ norm()

template<typename T >
template<NormType N>
Real libMesh::PetscVector< T >::norm ( ) const
private
Returns
A norm of the vector, where the type of norm to compute is determined by the template parameter N of the PETSc-defined type NormType. The valid template arguments are NORM_1, NORM_2 and NORM_INFINITY, as used to define l1_norm(), l2_norm() and linfty_norm().

Definition at line 60 of file petsc_vector.C.

61{
62 parallel_object_only();
63
64 this->_restore_array();
65 libmesh_assert(this->closed());
66
67 PetscReal value=0.;
68
69 LibmeshPetscCall(VecNorm (_vec, N, &value));
70
71 return static_cast<Real>(value);
72}
virtual bool closed() const

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

◆ operator()()

template<typename T >
T libMesh::PetscVector< 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 1141 of file petsc_vector.h.

1142{
1143 this->_get_array(true);
1144
1145 const numeric_index_type local_index = this->map_global_to_local_index(i);
1146
1147#ifndef NDEBUG
1148 if (this->is_effectively_ghosted())
1149 libmesh_assert_less (local_index, _local_size);
1150#endif
1151
1152 return static_cast<T>(_read_only_values[local_index]);
1153}

◆ operator*=() [1/2]

template<typename T >
NumericVector< T > & libMesh::PetscVector< 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 387 of file petsc_vector.C.

388{
389 parallel_object_only();
390
391
392 const PetscVector<T> * v_vec = cast_ptr<const PetscVector<T> *>(&v);
393
394 LibmeshPetscCall(VecPointwiseMult(_vec, _vec, v_vec->_vec));
395
396 return *this;
397}

References libMesh::PetscVector< T >::_vec.

◆ 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::PetscVector< 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 93 of file petsc_vector.C.

94{
95 parallel_object_only();
96
97 this->_restore_array();
98 libmesh_assert(this->closed());
99
100 this->add(1., v);
101
102 return *this;
103}

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

◆ operator-=()

template<typename T >
NumericVector< T > & libMesh::PetscVector< 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 109 of file petsc_vector.C.

110{
111 parallel_object_only();
112
113 this->_restore_array();
114 libmesh_assert(this->closed());
115
116 this->add(-1., v);
117
118 return *this;
119}

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

◆ operator/=() [1/2]

template<typename T >
NumericVector< T > & libMesh::PetscVector< 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 400 of file petsc_vector.C.

401{
402 parallel_object_only();
403
404
405 const PetscVector<T> * v_vec = cast_ptr<const PetscVector<T> *>(&v);
406
407 LibmeshPetscCall(VecPointwiseDivide(_vec, _vec, v_vec->_vec));
408
409 return *this;
410}

References libMesh::PetscVector< T >::_vec.

◆ 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 >
NumericVector< T > & libMesh::PetscVector< 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 500 of file petsc_vector.C.

501{
502 parallel_object_only();
503
504 // Make sure the NumericVector passed in is really a PetscVector
505 const PetscVector<T> * v = cast_ptr<const PetscVector<T> *>(&v_in);
506
507 *this = *v;
508
509 return *this;
510}

◆ operator=() [2/5]

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

Copy assignment operator.

Supported assignments based on ParallelType combination (note that we lump ghosted into parallel for this method documentation):

  • Assign from parallel to parallel
  • Assign from serial to serial
  • Assign from parallel to serial
    Returns
    A reference to *this as the derived type.

Definition at line 516 of file petsc_vector.C.

517{
518 enum AssignmentType { ParallelToSerial, SerialToParallel, SameToSame, Error };
519
520 parallel_object_only();
521 libmesh_assert(this->comm().verify(
522 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
523 libmesh_assert(this->comm().verify(
524 static_cast<typename std::underlying_type<ParallelType>::type>(v.type())));
525
526 if (this == &v)
527 return *this;
528
529 this->_restore_array();
530 v._restore_array();
531
532 libmesh_assert_equal_to (this->size(), v.size());
533 libmesh_assert (v.closed());
534
535 AssignmentType assign_type = Error;
536 if (this->is_effectively_serial() && !v.is_effectively_serial())
537 assign_type = ParallelToSerial;
538 else if (!this->is_effectively_serial() && v.is_effectively_serial())
539 assign_type = SerialToParallel;
540 else if (this->local_size() == v.local_size())
541 assign_type = SameToSame;
542
543 libmesh_assert(this->comm().verify(
544 static_cast<typename std::underlying_type<AssignmentType>::type>(assign_type)));
545
546 switch (assign_type)
547 {
548 case ParallelToSerial:
549 {
550 // scatter from parallel to serial
551 libmesh_assert(v.comm().size() > 1);
552 WrappedPetsc<VecScatter> scatter;
553 LibmeshPetscCall(VecScatterCreateToAll(v._vec, scatter.get(), nullptr));
554 VecScatterBeginEnd(v.comm(), scatter, v._vec, _vec, INSERT_VALUES, SCATTER_FORWARD);
555 break;
556 }
557 case SameToSame:
558 // serial to serial or parallel to parallel
559 LibmeshPetscCall(VecCopy(v._vec, _vec));
560 break;
561 case SerialToParallel:
562 libmesh_not_implemented_msg(
563 "Scattering from a serial vector on every rank to a parallel vector is not behavior we "
564 "define because we do not verify the serial vector is the same on each rank");
565 default:
566 libmesh_error_msg("Unhandled vector combination");
567 }
568
569 libmesh_assert(this->comm().verify(
570 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
571
572 if (this->is_effectively_ghosted())
573 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
574
575 this->_is_closed = true;
576
577 return *this;
578}

References libMesh::PetscVector< T >::_restore_array(), libMesh::PetscVector< T >::_vec, libMesh::NumericVector< T >::closed(), libMesh::ParallelObject::comm(), libMesh::WrappedPetsc< T >::get(), libMesh::NumericVector< T >::is_effectively_serial(), libMesh::libmesh_assert(), libMesh::PetscVector< T >::local_size(), libMesh::Parallel::Communicator::size(), libMesh::PetscVector< T >::size(), and libMesh::NumericVector< T >::type().

◆ operator=() [3/5]

template<typename T >
NumericVector< T > & libMesh::PetscVector< 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.

Case 1: The vector is the same size of The global vector. Only add the local components.

Case 2: The vector is the same size as our local piece. Insert directly to the local piece.

Implements libMesh::NumericVector< T >.

Definition at line 584 of file petsc_vector.C.

585{
586 parallel_object_only();
587
588 this->_get_array(false);
589
594 if (this->size() == v.size())
595 {
598 for (numeric_index_type i=0; i<last-first; i++)
599 _values[i] = PS(v[first + i]);
600 }
601
606 else
607 {
608 for (numeric_index_type i=0; i<_local_size; i++)
609 _values[i] = PS(v[i]);
610 }
611
612 // Make sure ghost dofs are up to date
613 if (this->is_effectively_ghosted())
614 this->close();
615
616 return *this;
617}
virtual numeric_index_type last_local_index() const override

References libMesh::PS().

◆ operator=() [4/5]

template<typename T >
NumericVector< T > & libMesh::PetscVector< 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 473 of file petsc_vector.C.

474{
475 parallel_object_only();
476
477 this->_restore_array();
478 libmesh_assert(this->closed());
479
480 PetscScalar s = PS(s_in);
481
482 if (this->size() != 0)
483 {
484 LibmeshPetscCall(VecSet(_vec, s));
485
486 libmesh_assert(this->comm().verify(
487 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
488
489 if (this->is_effectively_ghosted())
490 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
491 }
492
493 return *this;
494}

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

◆ operator=() [5/5]

template<typename T >
PetscVector & libMesh::PetscVector< T >::operator= ( PetscVector< T > &&  )
delete

◆ pointwise_divide()

template<typename T >
void libMesh::PetscVector< 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 979 of file petsc_vector.C.

981{
982 parallel_object_only();
983
984 this->_restore_array();
985
986 // Convert arguments to PetscVector*.
987 const PetscVector<T> * const vec1_petsc = cast_ptr<const PetscVector<T> *>(&vec1);
988 const PetscVector<T> * const vec2_petsc = cast_ptr<const PetscVector<T> *>(&vec2);
989
990 // Call PETSc function.
991 LibmeshPetscCall(VecPointwiseDivide(_vec, vec1_petsc->vec(), vec2_petsc->vec()));
992
993 libmesh_assert(this->comm().verify(
994 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
995
996 if (this->is_effectively_ghosted())
997 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
998
999 this->_is_closed = true;
1000}

References libMesh::libmesh_assert(), and libMesh::PetscVector< T >::vec().

◆ pointwise_mult()

template<typename T >
void libMesh::PetscVector< 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 955 of file petsc_vector.C.

957{
958 parallel_object_only();
959
960 this->_restore_array();
961
962 // Convert arguments to PetscVector*.
963 const PetscVector<T> * vec1_petsc = cast_ptr<const PetscVector<T> *>(&vec1);
964 const PetscVector<T> * vec2_petsc = cast_ptr<const PetscVector<T> *>(&vec2);
965
966 // Call PETSc function.
967 LibmeshPetscCall(VecPointwiseMult(_vec, vec1_petsc->vec(), vec2_petsc->vec()));
968
969 libmesh_assert(this->comm().verify(
970 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
971
972 if (this->is_effectively_ghosted())
973 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
974
975 this->_is_closed = true;
976}

References libMesh::libmesh_assert(), and libMesh::PetscVector< T >::vec().

◆ 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}

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::PetscVector< T >::print_matlab ( const std::string &  filename = "") const
overridevirtual

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 from libMesh::NumericVector< T >.

Definition at line 1003 of file petsc_vector.C.

1004{
1005 parallel_object_only();
1006
1007 this->_restore_array();
1008 libmesh_assert (this->closed());
1009
1010 // Create an ASCII file containing the matrix
1011 // if a filename was provided.
1012 if (name != "")
1013 {
1014 WrappedPetsc<PetscViewer> petsc_viewer;
1015
1016 LibmeshPetscCall(PetscViewerASCIIOpen(this->comm().get(),
1017 name.c_str(),
1018 petsc_viewer.get()));
1019
1020#if PETSC_VERSION_LESS_THAN(3,7,0)
1021 LibmeshPetscCall(PetscViewerSetFormat (petsc_viewer,
1022 PETSC_VIEWER_ASCII_MATLAB));
1023#else
1024 LibmeshPetscCall(PetscViewerPushFormat (petsc_viewer,
1025 PETSC_VIEWER_ASCII_MATLAB));
1026#endif
1027
1028 LibmeshPetscCall(VecView (_vec, petsc_viewer));
1029 }
1030
1031 // Otherwise the matrix will be dumped to the screen.
1032 else
1033 {
1034
1035#if PETSC_VERSION_LESS_THAN(3,7,0)
1036 LibmeshPetscCall(PetscViewerSetFormat (PETSC_VIEWER_STDOUT_WORLD,
1037 PETSC_VIEWER_ASCII_MATLAB));
1038#else
1039 LibmeshPetscCall(PetscViewerPushFormat (PETSC_VIEWER_STDOUT_WORLD,
1040 PETSC_VIEWER_ASCII_MATLAB));
1041#endif
1042
1043 LibmeshPetscCall(VecView (_vec, PETSC_VIEWER_STDOUT_WORLD));
1044 }
1045}

References libMesh::closed(), libMesh::WrappedPetsc< T >::get(), and libMesh::libmesh_assert().

◆ 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 max(const T &r, T &o, Request &req) const
void broadcast(T &data, const unsigned int root_id=0, const bool identical_sizes=false) const
void gather(const unsigned int root_id, const T &send_data, std::vector< T, A > &recv) 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::PetscVector< T >::reciprocal ( )
overridevirtual

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

Implements libMesh::NumericVector< T >.

Definition at line 141 of file petsc_vector.C.

142{
143 parallel_object_only();
144
145
146 // VecReciprocal has been in PETSc since at least 2.3.3 days
147 LibmeshPetscCall(VecReciprocal(_vec));
148}

◆ restore_array()

template<typename T >
void libMesh::PetscVector< T >::restore_array ( )
inline

Restore the data array.

Note
This MUST be called after get_array() or get_array_read() and before using any other interface functions on PetscVector.

Definition at line 1201 of file petsc_vector.h.

1202{
1203 // \note \p _values_manually_retrieved needs to be set to \p false
1204 // \e before calling \p _restore_array()!
1207}

Referenced by PetscVectorTest::testGetArray().

◆ restore_subvector()

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

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 from libMesh::NumericVector< T >.

Definition at line 1317 of file petsc_vector.C.

1319{
1320 auto * const petsc_subvector = cast_ptr<PetscVector<T> *>(subvector.get());
1321
1322 // Construct index set
1323 WrappedPetsc<IS> parent_is;
1324 LibmeshPetscCall(ISCreateGeneral(this->comm().get(),
1325 cast_int<PetscInt>(rows.size()),
1326 numeric_petsc_cast(rows.data()),
1327 PETSC_USE_POINTER,
1328 parent_is.get()));
1329
1330 Vec subvec = petsc_subvector->vec();
1331 LibmeshPetscCall(VecRestoreSubVector(_vec, parent_is, &subvec));
1332
1333 if (this->is_effectively_ghosted())
1334 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
1335
1336 this->_is_closed = true;
1337}

References libMesh::numeric_petsc_cast().

◆ scale()

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

Scale each element of the vector by the given factor.

Implements libMesh::NumericVector< T >.

Definition at line 369 of file petsc_vector.C.

370{
371 parallel_object_only();
372
373 this->_restore_array();
374
375 PetscScalar factor = PS(factor_in);
376
377 LibmeshPetscCall(VecScale(_vec, factor));
378
379 libmesh_assert(this->comm().verify(
380 static_cast<typename std::underlying_type<ParallelType>::type>(this->type())));
381
382 if (this->is_effectively_ghosted())
383 VecGhostUpdateBeginEnd(this->comm(), _vec, INSERT_VALUES, SCATTER_FORWARD);
384}

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

◆ set()

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

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 124 of file petsc_vector.C.

125{
126 this->_restore_array();
127 libmesh_assert_less (i, size());
128
129 PetscInt i_val = static_cast<PetscInt>(i);
130 PetscScalar petsc_value = PS(value);
131
132 std::scoped_lock lock(this->_numeric_vector_mutex);
133 LibmeshPetscCall(VecSetValues (_vec, 1, &i_val, &petsc_value, INSERT_VALUES));
134
135 this->_is_closed = false;
136}

References libMesh::PS(), and value.

Referenced by PetscVectorTest::testGetArray(), and PetscVectorTest::testPetscOperations().

◆ 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::PetscVector< T >::size ( ) const
inlineoverridevirtual
Returns
The size of the vector.

Implements libMesh::NumericVector< T >.

Definition at line 1006 of file petsc_vector.h.

1007{
1008 libmesh_assert (this->initialized());
1009
1010 PetscInt petsc_size=0;
1011
1012 if (!this->initialized())
1013 return 0;
1014
1015 LibmeshPetscCall(VecGetSize(_vec, &petsc_size));
1016
1017 return static_cast<numeric_index_type>(petsc_size);
1018}

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

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

◆ 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::PetscVector< T >::sum ( ) const
overridevirtual
Returns
The sum of all values in the vector.

Implements libMesh::NumericVector< T >.

Definition at line 44 of file petsc_vector.C.

45{
46 this->_restore_array();
47 libmesh_assert(this->closed());
48
49 PetscScalar value=0.;
50
51 LibmeshPetscCall(VecSum (_vec, &value));
52
53 return static_cast<T>(value);
54}

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

◆ swap()

template<typename T >
void libMesh::PetscVector< 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 1249 of file petsc_vector.h.

1250{
1251 parallel_object_only();
1252
1254
1255 PetscVector<T> & v = cast_ref<PetscVector<T> &>(other);
1256
1257 std::swap(_vec, v._vec);
1258 std::swap(_destroy_vec_on_exit, v._destroy_vec_on_exit);
1259 std::swap(_global_to_local_map, v._global_to_local_map);
1260
1261#ifdef LIBMESH_HAVE_CXX11_THREAD
1262 // Only truly atomic for v... but swap() doesn't really need to be thread safe!
1263 _array_is_present = v._array_is_present.exchange(_array_is_present);
1264#else
1265 std::swap(_array_is_present, v._array_is_present);
1266#endif
1267
1268 std::swap(_local_form, v._local_form);
1269 std::swap(_values, v._values);
1270}
virtual void swap(NumericVector< T > &v)
Swaps the contents of this with v.

References libMesh::PetscVector< T >::_array_is_present, libMesh::PetscVector< T >::_destroy_vec_on_exit, libMesh::PetscVector< T >::_global_to_local_map, libMesh::PetscVector< T >::_local_form, libMesh::PetscVector< T >::_values, libMesh::PetscVector< T >::_vec, and libMesh::NumericVector< T >::swap().

Referenced by update_current_local_solution().

◆ 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

◆ vec() [1/2]

template<typename T >
Vec libMesh::PetscVector< T >::vec ( )
inline

◆ vec() [2/2]

template<typename T >
Vec libMesh::PetscVector< T >::vec ( ) const
inline

Definition at line 351 of file petsc_vector.h.

351{ libmesh_assert (_vec); return _vec; }

References libMesh::PetscVector< T >::_vec, and libMesh::libmesh_assert().

◆ zero()

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

Set all entries to zero.

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

Implements libMesh::NumericVector< T >.

Definition at line 954 of file petsc_vector.h.

955{
956 parallel_object_only();
957
958 libmesh_assert(this->closed());
959
960 this->_restore_array();
961
962 PetscScalar z=0.;
963
964 if (!this->is_effectively_ghosted())
965 LibmeshPetscCall(VecSet (_vec, z));
966 else
967 {
968 /* Vectors that include ghost values require a special
969 handling. */
970 Vec loc_vec;
971 LibmeshPetscCall(VecGhostGetLocalForm (_vec,&loc_vec));
972 LibmeshPetscCall(VecSet (loc_vec, z));
973 LibmeshPetscCall(VecGhostRestoreLocalForm (_vec, &loc_vec));
974 }
975}

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

Referenced by libMesh::TaoOptimizationSolver< T >::solve().

◆ zero_clone()

template<typename T >
std::unique_ptr< NumericVector< T > > libMesh::PetscVector< 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 981 of file petsc_vector.h.

982{
983 std::unique_ptr<NumericVector<T>> cloned_vector =
984 std::make_unique<PetscVector<T>>(this->comm(), this->type());
985 cloned_vector->init(*this);
986 return cloned_vector;
987}

Member Data Documentation

◆ _array_is_present [1/2]

template<typename T >
std::atomic<bool> libMesh::PetscVector< T >::_array_is_present
mutableprivate

If true, the actual PETSc array of the values of the vector is currently accessible.

That means that the members _local_form and _values are valid.

Definition at line 373 of file petsc_vector.h.

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

◆ _array_is_present [2/2]

template<typename T >
bool libMesh::PetscVector< T >::_array_is_present
mutableprivate

Definition at line 375 of file petsc_vector.h.

◆ _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().

◆ _destroy_vec_on_exit

template<typename T >
bool libMesh::PetscVector< T >::_destroy_vec_on_exit
private

This boolean value should only be set to false for the constructor which takes a PETSc Vec object.

Definition at line 460 of file petsc_vector.h.

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

◆ _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

template<typename T >
numeric_index_type libMesh::PetscVector< T >::_first
mutableprivate

First local index.

Only valid when _array_is_present

Definition at line 383 of file petsc_vector.h.

◆ _global_to_local_map

template<typename T >
GlobalToLocalMap libMesh::PetscVector< T >::_global_to_local_map
private

Map that maps global to local ghost cells (will be empty if not in ghost cell mode).

Definition at line 454 of file petsc_vector.h.

Referenced by libMesh::PetscVector< T >::init(), libMesh::PetscVector< T >::PetscVector(), and libMesh::PetscVector< T >::swap().

◆ _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

template<typename T >
numeric_index_type libMesh::PetscVector< T >::_last
mutableprivate

Last local index.

Only valid when _array_is_present

Definition at line 390 of file petsc_vector.h.

◆ _local_form

template<typename T >
Vec libMesh::PetscVector< T >::_local_form
mutableprivate

PETSc vector datatype to hold the local form of a ghosted vector.

The contents of this field are only valid if the vector is ghosted and _array_is_present is true.

Definition at line 402 of file petsc_vector.h.

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

◆ _local_size

template<typename T >
numeric_index_type libMesh::PetscVector< T >::_local_size
mutableprivate

Size of the local values from _get_array()

Definition at line 395 of file petsc_vector.h.

◆ _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.

◆ _petsc_get_restore_array_mutex

template<typename T >
std::mutex libMesh::PetscVector< T >::_petsc_get_restore_array_mutex
mutableprivate

Mutex for _get_array and _restore_array.

This is part of the object to keep down thread contention when reading from multiple PetscVectors simultaneously

Definition at line 429 of file petsc_vector.h.

◆ _read_only_values

template<typename T >
const PetscScalar* libMesh::PetscVector< T >::_read_only_values
mutableprivate

Pointer to the actual PETSc array of the values of the vector.

This pointer is only valid if _array_is_present is true. We're using PETSc's VecGetArrayRead() function, which requires a constant PetscScalar *, but _get_array and _restore_array are const member functions, so _values also needs to be mutable (otherwise it is a "const PetscScalar * const" in that context).

Definition at line 412 of file petsc_vector.h.

◆ _type

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

◆ _values

template<typename T >
PetscScalar* libMesh::PetscVector< T >::_values
mutableprivate

Pointer to the actual PETSc array of the values of the vector.

This pointer is only valid if _array_is_present is true. We're using PETSc's VecGetArrayRead() function, which requires a constant PetscScalar *, but _get_array and _restore_array are const member functions, so _values also needs to be mutable (otherwise it is a "const PetscScalar * const" in that context).

Definition at line 422 of file petsc_vector.h.

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

◆ _values_manually_retrieved

template<typename T >
bool libMesh::PetscVector< T >::_values_manually_retrieved
mutableprivate

Whether or not the data array has been manually retrieved using get_array() or get_array_read()

Definition at line 466 of file petsc_vector.h.

◆ _values_read_only

template<typename T >
bool libMesh::PetscVector< T >::_values_read_only
mutableprivate

Whether or not the data array is for read only access.

Definition at line 471 of file petsc_vector.h.

◆ _vec

template<typename T >
Vec libMesh::PetscVector< T >::_vec
private

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