21 #ifndef LIBMESH_LASPACK_VECTOR_H
22 #define LIBMESH_LASPACK_VECTOR_H
26 #include "libmesh/libmesh_common.h"
28 #ifdef LIBMESH_HAVE_LASPACK
31 #include "libmesh/numeric_vector.h"
45 template <
typename T>
class LaspackLinearSolver;
46 template <
typename T>
class SparseMatrix;
56 class LaspackVector final :
public NumericVector<T>
69 const ParallelType = AUTOMATIC);
82 const ParallelType = AUTOMATIC);
97 const ParallelType = AUTOMATIC);
114 const std::vector<numeric_index_type> & ghost,
115 const ParallelType = AUTOMATIC);
125 LaspackVector<T> &
operator= (
const LaspackVector<T> & v);
142 virtual void close ()
override;
148 virtual void clear ()
override;
154 virtual void zero ()
override;
161 virtual std::unique_ptr<NumericVector<T>>
zero_clone ()
const override;
167 virtual std::unique_ptr<NumericVector<T>>
clone ()
const override;
180 const bool fast=
false,
181 const ParallelType ptype=AUTOMATIC)
override;
192 const bool fast=
false,
193 const ParallelType ptype=AUTOMATIC)
override;
207 const std::vector<numeric_index_type> & ghost,
208 const bool fast =
false,
209 const ParallelType = AUTOMATIC)
override;
218 virtual void init (
const NumericVector<T> & other,
219 const bool fast =
false)
override;
228 virtual NumericVector<T> &
operator= (
const T s)
override;
237 virtual NumericVector<T> &
operator= (
const NumericVector<T> & v)
override;
246 virtual NumericVector<T> &
operator= (
const std::vector<T> & v)
override;
254 virtual Real min ()
const override;
261 virtual Real max ()
const override;
269 virtual T
sum ()
const override;
337 virtual NumericVector<T> &
operator += (
const NumericVector<T> & v)
override;
345 virtual NumericVector<T> &
operator -= (
const NumericVector<T> & v)
override;
353 virtual NumericVector<T> &
operator *= (
const NumericVector<T> & v)
override;
361 virtual NumericVector<T> &
operator /= (
const NumericVector<T> & v)
override;
394 virtual void add (
const T s)
override;
401 virtual void add (
const NumericVector<T> & v)
override;
409 virtual void add (
const T a,
const NumericVector<T> & v)
override;
415 using NumericVector<T>::add_vector;
423 virtual void add_vector (
const NumericVector<T> & v,
const SparseMatrix<T> & A)
override;
431 virtual void add_vector_transpose (
const NumericVector<T> & v,
const SparseMatrix<T> & A)
override;
438 virtual void scale (
const T factor)
override;
443 virtual void abs()
override;
451 virtual T
dot(
const NumericVector<T> & v)
const override;
458 virtual void localize (std::vector<T> & v_local)
const override;
465 virtual void localize (NumericVector<T> & v_local)
const override;
473 virtual void localize (NumericVector<T> & v_local,
const std::vector<numeric_index_type> & send_list)
const override;
481 virtual void localize (std::vector<T> & v_local,
const std::vector<numeric_index_type> & indices)
const override;
506 virtual void pointwise_mult (
const NumericVector<T> & vec1,
const NumericVector<T> & vec2)
override;
514 virtual void pointwise_divide (
const NumericVector<T> & vec1,
const NumericVector<T> & vec2)
override;
521 virtual void swap (NumericVector<T> & v)
override;
550 template <
typename T>
553 const ParallelType ptype)
563 template <
typename T>
567 const ParallelType ptype)
570 this->
init(n, n,
false, ptype);
577 template <
typename T>
582 const ParallelType ptype)
585 this->
init(n, n_local,
false, ptype);
592 template <
typename T>
597 const std::vector<numeric_index_type> & ghost,
598 const ParallelType ptype)
601 this->
init(N, n_local, ghost,
false, ptype);
608 template <
typename T>
626 template <
typename T>
631 const ParallelType ptype)
634 libmesh_assert_equal_to (n, n_local);
636 this->_type = SERIAL;
645 std::string foo{
"Vec-"};
646 foo += std::to_string(cnt++);
649 V_Constr(&_vec, const_cast<char *>(foo.c_str()), n, Normal, _LPTrue);
654 this->_is_closed =
true;
665 template <
typename T>
669 const ParallelType ptype)
671 this->init(n,n,fast,ptype);
675 template <
typename T>
679 const std::vector<numeric_index_type> & libmesh_dbg_var(ghost),
681 const ParallelType ptype)
683 libmesh_assert(ghost.empty());
684 this->init(n,n_local,fast,ptype);
700 template <
typename T>
707 this->_is_closed =
true;
713 template <
typename T>
724 this->_is_closed =
false;
730 template <
typename T>
inline
734 libmesh_assert (this->
closed());
736 V_SetAllCmp (&_vec, 0.);
741 template <
typename T>
747 cloned_vector->
init(*
this);
749 return std::unique_ptr<NumericVector<T>>(cloned_vector);
754 template <
typename T>
760 cloned_vector->
init(*
this,
true);
762 *cloned_vector = *
this;
764 return std::unique_ptr<NumericVector<T>>(cloned_vector);
769 template <
typename T>
780 template <
typename T>
791 template <
typename T>
802 template <
typename T>
813 template <
typename T>
818 libmesh_assert_less (i, this->size());
820 std::scoped_lock lock(this->_numeric_vector_mutex);
821 V_SetCmp (&_vec, i+1, value);
824 this->_is_closed =
false;
830 template <
typename T>
835 libmesh_assert_less (i, this->size());
837 std::scoped_lock lock(this->_numeric_vector_mutex);
838 V_AddCmp (&_vec, i+1, value);
841 this->_is_closed =
false;
847 template <
typename T>
852 libmesh_assert ( ((i >= this->first_local_index()) &&
853 (i < this->last_local_index())) );
856 return static_cast<T
>(V_GetCmp(const_cast<QVector*>(&_vec), i+1));
861 template <
typename T>
869 std::swap(_vec.Name, v._vec.Name);
870 std::swap(_vec.Dim, v._vec.Dim);
871 std::swap(_vec.Instance, v._vec.Instance);
872 std::swap(_vec.LockLevel, v._vec.LockLevel);
873 std::swap(_vec.Multipl, v._vec.Multipl);
874 std::swap(_vec.OwnData, v._vec.OwnData);
879 std::swap(_vec.Cmp, v._vec.Cmp);
884 template <
typename T>
889 return std::numeric_limits<std::size_t>::max();
896 #endif // #ifdef LIBMESH_HAVE_LASPACK
897 #endif // LIBMESH_LASPACK_VECTOR_H
virtual void add_vector(const NumericVector< T > &v, const SparseMatrix< T > &A) override
将一个向量添加到该向量并将结果存储在其中。
bool closed()
Checks that the library has been closed.
virtual void swap(NumericVector< T > &v) override
交换两个向量的内容。
virtual void init(const numeric_index_type N, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC) override
使用给定的全局大小和局部大小初始化向量。
virtual void close() override
Close the vector.
virtual numeric_index_type size() const override
返回向量的大小(全局维度)。
virtual NumericVector< T > & operator-=(const NumericVector< T > &v) override
将另一个向量的元素按元素从该向量中减去。
virtual void abs() override
计算向量的每个元素的绝对值。
virtual void scale(const T factor) override
缩放向量的所有元素,将它们乘以指定的标量因子。
virtual void add_vector_transpose(const NumericVector< T > &v, const SparseMatrix< T > &A) override
将一个向量的转置添加到该向量并将结果存储在其中。
virtual T dot(const NumericVector< T > &v) const override
计算向量与另一个向量的点积。
virtual void set(const numeric_index_type i, const T value) override
设置指定索引处的元素值。
virtual numeric_index_type size() const =0
获取向量的大小。
LaspackVector< T > & operator=(const LaspackVector< T > &v)
Copy assignment operator.
LaspackVector(const Parallel::Communicator &comm, const ParallelType=AUTOMATIC)
Dummy-Constructor.
virtual void pointwise_mult(const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
对向量的每个元素执行逐元素乘法。
virtual T operator()(const numeric_index_type i) const override
返回指定索引处向量的值。
virtual NumericVector< T > & operator+=(const NumericVector< T > &v) override
将另一个向量的元素按元素加到该向量。
virtual NumericVector< T > & operator*=(const NumericVector< T > &v) override
将该向量的元素按元素与另一个向量的元素相乘。
virtual void init(const numeric_index_type n, const numeric_index_type n_local, const bool fast=false, const ParallelType ptype=AUTOMATIC)=0
更改向量的维度为 n 。如果可能的话 ,该向量的保留内存保持不变。 如果 n==0 ,所有内存都将被释放。因此,如果要调整向量的大小并释放不需要的内存, 必须首先调用 init(0) ,然后调用 ini...
uint8_t processor_id_type
virtual std::size_t max_allowed_id() const override
获取允许的最大ID(索引)。
virtual std::unique_ptr< NumericVector< T > > zero_clone() const override
创建并返回一个指向该对象的零克隆的 unique_ptr。
virtual std::unique_ptr< NumericVector< T > > clone() const override
创建并返回一个指向该对象的克隆的 unique_ptr。
virtual Real max() const override
返回向量的最大元素。
virtual Real l2_norm() const override
返回向量的 L2 范数。
dof_id_type numeric_index_type
bool _is_initialized
Flag that tells if init() has been called.
virtual void add(const numeric_index_type i, const T value) override
将指定值添加到指定索引处的元素。
virtual Real min() const override
返回向量的最小元素。
virtual void localize(std::vector< T > &v_local) const override
将向量的元素本地化,以便在不同处理器之间交换。
virtual numeric_index_type last_local_index() const override
返回向量的最后一个局部索引。
virtual void localize_to_one(std::vector< T > &v_local, const processor_id_type proc_id=0) const override
将向量本地化到指定处理器。
virtual numeric_index_type first_local_index() const override
返回向量的第一个局部索引。
这个类为基于laspackc的串行向量数据结构提供了一个很好的接口。 所有被覆盖的虚函数都记录在numeric_vector.h中。
virtual void zero() override
Set all elements of the vector to zero.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void conjugate() override
计算向量中所有元素的复共轭。
virtual Real linfty_norm() const override
返回向量的 Linfinity 范数。
virtual numeric_index_type local_size() const =0
获取向量的本地大小,即 index_stop - index_start。
virtual numeric_index_type local_size() const override
返回向量的局部大小(局部维度)。
virtual void clear() override
Clear the vector.
ParallelType type() const
获取向量的类型。
bool initialized()
Checks that library initialization has been done.
virtual NumericVector< T > & operator/=(const NumericVector< T > &v) override
将该向量的元素按元素除以另一个向量的元素。
virtual T sum() const override
返回向量的所有元素之和。
QVector _vec
用于保存向量条目的实际 Laspack 向量数据类型。
virtual void reciprocal() override
计算向量中所有元素的倒数(1/x)。
virtual Real l1_norm() const override
返回向量的 L1 范数。
virtual ~LaspackVector()
LaspackVector 对象的析构函数。
virtual void pointwise_divide(const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
对向量的每个元素执行逐元素除法。