25 #include "libmesh/dense_subvector.h"
26 #include "libmesh/dense_vector.h"
27 #include "libmesh/laspack_vector.h"
28 #include "libmesh/laspack_matrix.h"
29 #include "libmesh/int_range.h"
31 #ifdef LIBMESH_HAVE_LASPACK
39 libmesh_assert (this->
closed());
56 libmesh_assert (this->
closed());
58 return static_cast<Real>(l1Norm_V(const_cast<QVector*>(&_vec)));
66 libmesh_assert (this->
closed());
68 return static_cast<Real>(l2Norm_V(const_cast<QVector*>(&_vec)));
76 libmesh_assert (this->
closed());
78 return static_cast<Real>(MaxNorm_V(const_cast<QVector*>(&_vec)));
86 libmesh_assert (this->
closed());
99 libmesh_assert (this->
closed());
108 template <
typename T>
111 libmesh_assert_equal_to(size(), v.
size());
114 const bool was_closed = this->_is_closed;
120 this->set(i, (*
this)(i) * v(i));
125 this->_is_closed = was_closed;
133 template <
typename T>
136 libmesh_assert_equal_to(size(), v.
size());
139 const bool was_closed = this->_is_closed;
145 this->set(i, (*
this)(i) / v(i));
150 this->_is_closed = was_closed;
158 template <
typename T>
164 const bool was_closed = this->_is_closed;
172 libmesh_assert_not_equal_to (v, T(0));
174 this->set(i, 1. / v);
180 this->_is_closed = was_closed;
186 template <
typename T>
192 const bool was_closed = this->_is_closed;
205 this->_is_closed = was_closed;
210 template <
typename T>
214 const bool was_closed = this->_is_closed;
225 this->_is_closed = was_closed;
232 template <
typename T>
240 template <
typename T>
244 const LaspackVector * v = cast_ptr<const LaspackVector *>(&v_in);
247 const bool was_closed = this->_is_closed;
251 libmesh_assert_equal_to (this->size(), v->
size());
253 for (
auto i : make_range(v->
size()))
254 this->add (i, a*(*v)(i));
257 this->_is_closed = was_closed;
263 template <
typename T>
275 AddAsgn_VV (&_vec, Mul_QV(const_cast<QMatrix*>(&mat->_QMat),
276 const_cast<QVector*>(&vec->
_vec)));
280 template <
typename T>
284 libmesh_not_implemented();
289 template <
typename T>
294 Asgn_VV(&_vec, Mul_SV (factor, &_vec));
297 template <
typename T>
308 template <
typename T>
317 return Mul_VV (const_cast<QVector*>(&(this->_vec)),
318 const_cast<QVector*>(&(v->
_vec)));
323 template <
typename T>
328 libmesh_assert (this->
closed());
330 V_SetAllCmp (&_vec, s);
337 template <
typename T>
343 cast_ptr<const LaspackVector<T> *>(&v_in);
354 template <
typename T>
359 libmesh_assert (v.
closed());
360 libmesh_assert_equal_to (this->size(), v.
size());
363 Asgn_VV (const_cast<QVector*>(&_vec),
364 const_cast<QVector*
>(&v.
_vec)
368 this->_is_closed =
true;
376 template <
typename T>
384 if (this->size() == v.size())
385 for (
auto i : index_range(v))
389 libmesh_error_msg(
"this->size() = " << this->size() <<
" must be equal to v.size() = " << v.size());
395 template <
typename T>
400 cast_ptr<LaspackVector<T> *>(&v_local_in);
402 libmesh_assert(v_local);
409 template <
typename T>
411 const std::vector<numeric_index_type> & libmesh_dbg_var(send_list))
const
415 cast_ptr<LaspackVector<T> *>(&v_local_in);
417 libmesh_assert(v_local);
418 libmesh_assert_less_equal (send_list.size(), v_local->
size());
425 template <
typename T>
427 const std::vector<numeric_index_type> & indices)
const
430 v_local.resize(indices.size());
432 for (
auto i : index_range(v_local))
433 v_local[i] = (*
this)(indices[i]);
438 template <
typename T>
441 const std::vector<numeric_index_type> & libmesh_dbg_var(send_list))
443 libmesh_assert_equal_to (first_local_idx, 0);
444 libmesh_assert_equal_to (last_local_idx+1, this->size());
446 libmesh_assert_less_equal (send_list.size(), this->size());
449 this->_is_closed =
true;
455 template <
typename T>
459 v_local.resize(this->size());
461 for (
auto i : index_range(v_local))
462 v_local[i] = (*this)(i);
467 template <
typename T>
471 libmesh_assert_equal_to (pid, 0);
473 this->localize (v_local);
478 template <
typename T>
482 libmesh_not_implemented();
485 template <
typename T>
489 libmesh_not_implemented();
492 template <
typename T>
497 return -std::numeric_limits<Real>::max();
511 template <
typename T>
516 return std::numeric_limits<Real>::max();
536 #endif // #ifdef LIBMESH_HAVE_LASPACK
virtual void add_vector(const NumericVector< T > &v, const SparseMatrix< T > &A) override
将一个向量添加到该向量并将结果存储在其中。
virtual bool closed() const
检查向量是否已经关闭并准备好进行计算。
bool closed()
Checks that the library has been closed.
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 numeric_index_type size() const =0
获取向量的大小。
LaspackVector< T > & operator=(const LaspackVector< T > &v)
Copy assignment operator.
virtual void pointwise_mult(const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
对向量的每个元素执行逐元素乘法。
virtual NumericVector< T > & operator+=(const NumericVector< T > &v) override
将另一个向量的元素按元素加到该向量。
virtual NumericVector< T > & operator*=(const NumericVector< T > &v) override
将该向量的元素按元素与另一个向量的元素相乘。
uint8_t processor_id_type
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的绝对值。
这是一个通用的稀疏矩阵类。该类包含了必须在派生类中覆盖的纯虚拟成员。 使用一个公共的基类允许从不同的求解器包中以不同的格式统一访问稀疏矩阵。
virtual Real max() const override
返回向量的最大元素。
virtual Real l2_norm() const override
返回向量的 L2 范数。
dof_id_type numeric_index_type
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 void localize_to_one(std::vector< T > &v_local, const processor_id_type proc_id=0) const override
将向量本地化到指定处理器。
这个类为基于laspackc的串行向量数据结构提供了一个很好的接口。 所有被覆盖的虚函数都记录在numeric_vector.h中。
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual void conjugate() override
计算向量中所有元素的复共轭。
virtual Real linfty_norm() const override
返回向量的 Linfinity 范数。
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 向量数据类型。
LaspackMatrix类封装了Laspack库中的QMatrix对象。 目前,Laspack仅支持实数数据类型,因此这个类是对 SparseMatrix<T> 的全特化,其中 T = Real。 所...
virtual void reciprocal() override
计算向量中所有元素的倒数(1/x)。
virtual Real l1_norm() const override
返回向量的 L1 范数。
virtual void pointwise_divide(const NumericVector< T > &vec1, const NumericVector< T > &vec2) override
对向量的每个元素执行逐元素除法。