25 #include "libmesh/dense_subvector.h"
26 #include "libmesh/dense_vector.h"
27 #include "libmesh/eigen_sparse_vector.h"
28 #include "libmesh/eigen_sparse_matrix.h"
29 #include "libmesh/int_range.h"
31 #ifdef LIBMESH_HAVE_EIGEN
39 libmesh_assert (this->
closed());
50 libmesh_assert (this->
closed());
53 return _vec.lpNorm<1>();
61 libmesh_assert (this->
closed());
64 return _vec.lpNorm<2>();
72 libmesh_assert (this->
closed());
75 return _vec.lpNorm<Eigen::Infinity>();
83 libmesh_assert (this->
closed());
98 libmesh_assert (this->
closed());
109 template <
typename T>
112 libmesh_assert (this->
closed());
113 libmesh_assert_equal_to(size(), v_in.
size());
117 _vec = _vec.cwiseProduct(v._vec);
124 template <
typename T>
127 libmesh_assert (this->
closed());
128 libmesh_assert_equal_to(size(), v_in.
size());
132 _vec = _vec.cwiseQuotient(v._vec);
140 template <
typename T>
148 libmesh_assert_not_equal_to ((*
this)(i), T(0));
151 _vec = _vec.cwiseInverse();
156 template <
typename T>
159 _vec = _vec.conjugate();
164 template <
typename T>
167 _vec += EigenSV::Constant(this->size(), v);
173 template <
typename T>
185 template <
typename T>
197 template <
typename T>
205 libmesh_assert(e_vec);
208 _vec += mat->_mat*e_vec->
_vec;
213 template <
typename T>
221 libmesh_assert(e_vec);
224 _vec += mat->_mat.transpose()*e_vec->
_vec;
229 template <
typename T>
239 template <
typename T>
252 template <
typename T>
261 return _vec.dot(v->
_vec);
266 template <
typename T>
271 libmesh_assert (this->
closed());
280 template <
typename T>
286 cast_ptr<const EigenSparseVector<T> *>(&v_in);
297 template <
typename T>
302 libmesh_assert (v.
closed());
303 libmesh_assert_equal_to (this->size(), v.
size());
307 this->_is_closed =
true;
314 template <
typename T>
322 if (this->size() == v.size())
323 for (
auto i : index_range(v))
327 libmesh_error_msg(
"this->size() = " << this->size() <<
" must be equal to v.size() = " << v.size());
333 template <
typename T>
338 cast_ptr<EigenSparseVector<T> *>(&v_local_in);
340 libmesh_assert(v_local);
347 template <
typename T>
349 const std::vector<numeric_index_type> & libmesh_dbg_var(send_list))
const
353 cast_ptr<EigenSparseVector<T> *>(&v_local_in);
355 libmesh_assert(v_local);
356 libmesh_assert_less_equal (send_list.size(), v_local->
size());
363 template <
typename T>
365 const std::vector<numeric_index_type> & indices)
const
368 v_local.resize(indices.size());
370 for (
auto i : index_range(v_local))
371 v_local[i] = (*
this)(indices[i]);
376 template <
typename T>
379 const std::vector<numeric_index_type> & libmesh_dbg_var(send_list))
381 libmesh_assert_equal_to (first_local_idx, 0);
382 libmesh_assert_equal_to (last_local_idx+1, this->size());
384 libmesh_assert_less_equal (send_list.size(), this->size());
386 this->_is_closed =
true;
391 template <
typename T>
395 v_local.resize(this->size());
397 for (
auto i : index_range(v_local))
398 v_local[i] = (*this)(i);
403 template <
typename T>
407 libmesh_assert_equal_to (pid, 0);
409 this->localize (v_local);
414 template <
typename T>
418 libmesh_not_implemented();
421 template <
typename T>
425 libmesh_not_implemented();
429 template <
typename T>
434 return -std::numeric_limits<Real>::max();
436 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
452 template <
typename T>
457 return std::numeric_limits<Real>::max();
459 #ifdef LIBMESH_USE_COMPLEX_NUMBERS
481 #endif // #ifdef LIBMESH_HAVE_EIGEN
virtual bool closed() const
检查向量是否已经关闭并准备好进行计算。
bool closed()
Checks that the library has been closed.
EigenSparseMatrix 类包装了来自 Eigen 库的稀疏矩阵对象。
virtual Real linfty_norm() const override
获取向量的 -范数,即向量的最大绝对值。
virtual void localize(std::vector< T > &v_local) const override
创建全局向量的副本并存储在本地向量 v_local 中。
virtual void conjugate() override
反转向量中每个条目的虚部。
virtual void pointwise_divide(const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
计算该向量与另一个向量的逐点除法。
virtual void pointwise_mult(const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
比较该向量与另一个向量的全局相对差异。
virtual T sum() const override
获取向量中所有值的总和。
virtual void add_vector(const NumericVector< T > &v, const SparseMatrix< T > &A) override
计算 , 即将 SparseMatrix A 和 NumericVector v 的乘积添加到 this。
DataType _vec
Actual Eigen::SparseVector<> we are wrapping.
virtual void reciprocal() override
计算每个向量条目的分量倒数, 。
virtual numeric_index_type size() const =0
获取向量的大小。
virtual NumericVector< T > & operator-=(const NumericVector< T > &v) override
将 v 从 *this 减去, 。等价于 u.add(-1, v)。
virtual Real min() const override
获取向量中的最小值,或者在复数情况下获取最小的实部。
uint8_t processor_id_type
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的绝对值。
这是一个通用的稀疏矩阵类。该类包含了必须在派生类中覆盖的纯虚拟成员。 使用一个公共的基类允许从不同的求解器包中以不同的格式统一访问稀疏矩阵。
virtual Real l2_norm() const override
获取向量的 -范数,即条目平方和的平方根。
dof_id_type numeric_index_type
virtual Real max() const override
获取向量中的最大值,或者在复数情况下获取最大的实部。
virtual NumericVector< T > & operator/=(const NumericVector< T > &v_in) override
计算此向量条目与另一个向量的分量除法, 。
virtual numeric_index_type size() const override
获取向量的大小。
EigenSparseVector< T > & operator=(const EigenSparseVector< T > &v)
Copy assignment operator.
virtual NumericVector< T > & operator*=(const NumericVector< T > &v_in) override
计算此向量条目与另一个向量的条目之间的分量乘法, 。
virtual void add_vector_transpose(const NumericVector< T > &v, const SparseMatrix< T > &A) override
计算 , 即将矩阵 A 的转置与 NumericVector v 的乘积添加到 this。
virtual void abs() override
设置 ,对向量中的每个条目进行绝对值操作。
virtual void localize_to_one(std::vector< T > &v_local, const processor_id_type proc_id=0) const override
在处理器 proc_id 上创建全局向量的本地副本。 默认情况下,数据发送到处理器 0。此方法对于从一个处理器输出数据非常有用。
virtual void scale(const T factor) override
缩放向量的每个元素。
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual Real l1_norm() const override
获取向量的 -范数,即条目的绝对值之和。
virtual void add(const numeric_index_type i, const T value) override
将 value 添加到由 i 指定的向量条目。 请注意,此方法的库实现是线程安全的, 例如,将在写入向量之前锁定 _numeric_vector_mutex 。
bool initialized()
Checks that library initialization has been done.
virtual T dot(const NumericVector< T > &v) const override
计算 ,即 (*this) 与向量 v 的点积。
virtual NumericVector< T > & operator+=(const NumericVector< T > &v) override
将向量加上 v , 。等价于 u.add(1, v)。
This class provides a nice interface to the Eigen C++-based data structures for serial vectors...