20 #include "libmesh/numeric_vector.h"
21 #include "libmesh/distributed_vector.h"
22 #include "libmesh/laspack_vector.h"
23 #include "libmesh/eigen_sparse_vector.h"
24 #include "libmesh/petsc_vector.h"
25 #include "libmesh/trilinos_epetra_vector.h"
26 #include "libmesh/shell_matrix.h"
27 #include "libmesh/tensor_tools.h"
28 #include "libmesh/enum_solver_package.h"
29 #include "libmesh/int_range.h"
49 std::unique_ptr<NumericVector<T>>
53 switch (solver_package)
56 #ifdef LIBMESH_HAVE_LASPACK
58 return std::make_unique<LaspackVector<T>>(comm, AUTOMATIC);
61 #ifdef LIBMESH_HAVE_PETSC
63 return std::make_unique<PetscVector<T>>(comm, AUTOMATIC);
66 #ifdef LIBMESH_TRILINOS_HAVE_EPETRA
68 return std::make_unique<EpetraVector<T>>(comm, AUTOMATIC);
71 #ifdef LIBMESH_HAVE_EIGEN
73 return std::make_unique<EigenSparseVector<T>>(comm, AUTOMATIC);
77 return std::make_unique<DistributedVector<T>>(comm, AUTOMATIC);
85 const std::vector<numeric_index_type> & dof_indices)
89 for (
auto i : index_range(dof_indices))
90 this->set (dof_indices[i], v[i]);
97 const std::vector<numeric_index_type> & dof_indices)
99 libmesh_assert_equal_to (V.
size(), dof_indices.size());
102 for (
auto i : index_range(dof_indices))
103 this->set (dof_indices[i], V(i));
108 template <
typename T>
110 const Real threshold)
const
112 libmesh_assert(this->compatible(other_vector));
114 int first_different_i = std::numeric_limits<int>::max();
117 while (first_different_i==std::numeric_limits<int>::max()
118 && i<last_local_index())
120 if (
std::abs((*
this)(i) - other_vector(i)) > threshold)
121 first_different_i = i;
127 this->comm().min(first_different_i);
129 if (first_different_i == std::numeric_limits<int>::max())
132 return first_different_i;
136 template <
typename T>
138 const Real threshold)
const
140 libmesh_assert(this->compatible(other_vector));
142 int first_different_i = std::numeric_limits<int>::max();
147 if (
std::abs((*
this)(i) - other_vector(i)) > threshold *
149 first_different_i = i;
153 while (first_different_i==std::numeric_limits<int>::max()
154 && i<last_local_index());
157 this->comm().min(first_different_i);
159 if (first_different_i == std::numeric_limits<int>::max())
162 return first_different_i;
166 template <
typename T>
168 const Real threshold)
const
170 libmesh_assert(this->compatible(other_vector));
172 int first_different_i = std::numeric_limits<int>::max();
175 const Real my_norm = this->linfty_norm();
177 const Real abs_threshold = std::max(my_norm, other_norm) * threshold;
181 if (
std::abs((*
this)(i) - other_vector(i) ) > abs_threshold)
182 first_different_i = i;
186 while (first_different_i==std::numeric_limits<int>::max()
187 && i<last_local_index());
190 this->comm().min(first_different_i);
192 if (first_different_i == std::numeric_limits<int>::max())
195 return first_different_i;
308 libmesh_assert (this->readable());
314 for (
const auto & index : indices)
317 this->comm().sum(norm);
325 libmesh_assert (this->readable());
331 for (
const auto & index : indices)
334 this->comm().sum(norm);
342 libmesh_assert (this->readable());
348 for (
const auto & index : indices)
355 this->comm().max(norm);
365 libmesh_assert(this->compatible(v));
368 for (
const auto i : make_range(this->first_local_index(), this->last_local_index()))
371 this->comm().sum(norm);
378 template <
typename T>
380 const std::vector<numeric_index_type> & dof_indices)
384 for (
auto i : index_range(dof_indices))
385 this->add (dof_indices[i], v[i]);
390 template <
typename T>
392 const std::vector<numeric_index_type> & dof_indices)
396 const std::size_t n = dof_indices.size();
397 libmesh_assert_equal_to(v.
size(), n);
399 this->add (dof_indices[i], v(i));
404 template <
typename T>
408 libmesh_assert(this->compatible(v));
415 template <
typename T>
422 template <
typename T>
425 return this->readable() && v.
readable() &&
426 this->size() == v.
size() &&
virtual void insert(const T *v, const std::vector< numeric_index_type > &dof_indices)
将 v 的条目插入到 *this 中,位置由 dof_indices 指定。请注意,此方法的库实现是线程安全的。
bool closed()
Checks that the library has been closed.
virtual int compare(const NumericVector< T > &other_vector, const Real threshold=TOLERANCE) const
比较 this 与 other_vector 的等效性,(在给定的 threshold 内) 如果等效则返回 -1 ,或者返回第一个索引,其中 abs(a[i]-b[i]) 超过阈值。 ...
virtual Real subset_linfty_norm(const std::set< numeric_index_type > &indices) const
获取指定条目的向量的最大绝对值,即指定条目的 -范数。
virtual numeric_index_type size() const =0
获取向量的大小。
virtual void add_vector(const T *v, const std::vector< numeric_index_type > &dof_indices)
计算 ,其中 v 是一个指针, 每个 dof_indices[i] 指定了要添加的值 v[i] 的位置。 这应该在子类中进行重写以提高效率。请注意,此方法的库实现是线程安全的。 ...
bool readable() const
检查该向量是否能够用于全局操作。
ADRealEigenVector< T, D, asd > sqrt(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的平方根。
virtual void vector_mult_add(NumericVector< T > &dest, const NumericVector< T > &arg) const =0
将矩阵与 arg 相乘并将结果添加到 dest 中。
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的绝对值。
dof_id_type numeric_index_type
virtual Real subset_l1_norm(const std::set< numeric_index_type > &indices) const
获取指定条目的向量的 -范数,即指定条目的绝对值之和。
virtual int local_relative_compare(const NumericVector< T > &other_vector, const Real threshold=TOLERANCE) const
比较该向量与另一个向量的局部相对差异。
static std::unique_ptr< NumericVector< T > > build(const Parallel::Communicator &comm, const SolverPackage solver_package=libMesh::default_solver_package())
构建一个 NumericVector 对象。
virtual numeric_index_type first_local_index() const =0
获取实际存储在该处理器上的第一个向量元素的索引。
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
virtual numeric_index_type local_size() const =0
获取向量的本地大小,即 index_stop - index_start。
bool initialized()
Checks that library initialization has been done.
ADRealEigenVector< T, D, asd > norm(const ADRealEigenVector< T, D, asd > &)
计算自动微分实数向量的范数。
通用的Shell矩阵,即一个仅定义其对向量的作用的矩阵。此类包含必须在派生类中重写的纯虚拟成员。
virtual numeric_index_type last_local_index() const =0
获取实际存储在该处理器上的最后一个向量元素的索引+1。
bool compatible(const NumericVector< T > &v) const
检查该向量和向量 v 是否能够一起用于全局操作。
virtual Real linfty_norm() const =0
获取向量的 -范数,即向量的最大绝对值。
virtual Real subset_l2_norm(const std::set< numeric_index_type > &indices) const
获取指定条目的向量的 -范数,即指定条目平方和的平方根。
Real l2_norm_diff(const NumericVector< T > &other_vec) const
获取 -范数的向量差值 , 其中 是 this。