#include <wrapped_petsc.h>
Public 成员函数 | |
WrappedPetsc () | |
默认构造函数。这应该模拟我们通常编写的方式,例如: KSP ksp; 然后可以在不同的PETSc例程中使用ksp。也就是说, obj未初始化为任何特定值。 更多... | |
WrappedPetsc (T obj_in) | |
构造函数,用于将obj初始化为特定的传入值。这模拟了我们通过 IS is = NULL; 明确创建PETSc对象的代码。从技术上讲,可以在此处传递任何指针值, 但通常只有传递nullptr才有意义。 更多... | |
~WrappedPetsc () | |
析构函数。只调用destroy()函数。 更多... | |
void | reset_to_zero () |
调用destroy()并将托管对象设置为nullptr。据我所知,PETSc的各种 XXXDestroy()例程不会将obj设置为nullptr,因此我们在包装类的 析构函数中也不这样做,但有些情况下,同时调用相关的XXXDestroy() 函数并重置指针是有用的,因此需要此函数。 更多... | |
WrappedPetsc (const WrappedPetsc &other)=delete | |
复制构造函数和复制赋值运算符。这些被删除了,因为我认为我们不能 安全地浅复制PETSc对象,如KSP和Vec,它们在内部是引用计数指针, 并且可能不会在浅复制时执行正确的操作。 更多... | |
WrappedPetsc & | operator= (const WrappedPetsc &)=delete |
WrappedPetsc (WrappedPetsc &&other) noexcept | |
移动构造函数。我们几乎可以默认它,但我们需要将other.obj设置为nullptr, 以便在随后Destroy()时它仅仅是一个空操作,而不会破坏引用计数或尝试双重释放内存。 更多... | |
WrappedPetsc & | operator= (WrappedPetsc &&other) noexcept |
移动赋值运算符。使用移动构造并交换惯用法,而不是默认方式, 因为我们希望确保我们的移动构造函数使传入的对象保持在可以Destroy()的状态。 更多... | |
T * | get () |
获取托管对象的指针。 这用于模拟以下代码: KSP ksp; KSPCreate(comm, &ksp); 因为在这种上下文中,取包装对象的地址是没有意义的。 更多... | |
operator T () const | |
用户定义的转换函数。即使将“this”对象视为const,我们也提供对底层T对象的非const访问, 因为通常即使是“逻辑上const”的PETSc API通常也需要非const参数。 更多... | |
T & | operator* () |
"解引用"运算符。返回对托管对象的引用。这在某些情况下是必需的,例如 使用C风格强制转换时: KSP ksp; ... 更多... | |
operator bool () const | |
用户定义的转换为bool的函数。这旨在模拟以下代码: IS is = nullptr; ... 更多... | |
void | destroy () |
必须特例化以调用适当的XXXDestroy()例程,以便实例化WrappedPetsc<T>对象。 更多... | |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
template<> | |
void | destroy () |
Private 属性 | |
T | obj |
在文件 wrapped_petsc.h 第 33 行定义.
|
inline |
默认构造函数。这应该模拟我们通常编写的方式,例如: KSP ksp; 然后可以在不同的PETSc例程中使用ksp。也就是说, obj未初始化为任何特定值。
在文件 wrapped_petsc.h 第 41 行定义.
|
inline |
构造函数,用于将obj初始化为特定的传入值。这模拟了我们通过 IS is = NULL; 明确创建PETSc对象的代码。从技术上讲,可以在此处传递任何指针值, 但通常只有传递nullptr才有意义。
obj_in | 初始PETSc对象的指针(通常为nullptr)。 |
在文件 wrapped_petsc.h 第 50 行定义.
|
inline |
|
delete |
复制构造函数和复制赋值运算符。这些被删除了,因为我认为我们不能 安全地浅复制PETSc对象,如KSP和Vec,它们在内部是引用计数指针, 并且可能不会在浅复制时执行正确的操作。
|
inlinenoexcept |
移动构造函数。我们几乎可以默认它,但我们需要将other.obj设置为nullptr, 以便在随后Destroy()时它仅仅是一个空操作,而不会破坏引用计数或尝试双重释放内存。
在文件 wrapped_petsc.h 第 84 行定义.
void libMesh::WrappedPetsc< Vec >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 55 行定义.
void libMesh::WrappedPetsc< KSP >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 56 行定义.
void libMesh::WrappedPetsc< IS >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 57 行定义.
void libMesh::WrappedPetsc< Mat >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 58 行定义.
void libMesh::WrappedPetsc< VecScatter >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 59 行定义.
void libMesh::WrappedPetsc< PetscViewer >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 60 行定义.
void libMesh::WrappedPetsc< MatNullSpace >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 61 行定义.
void libMesh::WrappedPetsc< DM >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 62 行定义.
void libMesh::WrappedPetsc< MatPartitioning >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 63 行定义.
void libMesh::WrappedPetsc< SNES >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 64 行定义.
void libMesh::WrappedPetsc< PC >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 65 行定义.
void libMesh::WrappedPetsc< PetscSection >::destroy | ( | ) |
在文件 wrapped_petsc.C 第 66 行定义.
void libMesh::WrappedPetsc< T >::destroy | ( | ) |
必须特例化以调用适当的XXXDestroy()例程,以便实例化WrappedPetsc<T>对象。
我们可以尝试在destroy()中进行额外的错误检查,如下所示,但请注意: 1.) destroy()在析构函数中调用,有时会在堆栈展开期间调用。 如果XXXDestroy()返回错误代码,那么我们唯一的选择就是立即终止程序, 这将导致无法从异常中恢复。 2.) 在即将被Destroy()的PETSc对象上调用非Destroy()函数通常是不安全的, 也就是说,我们将不得不检查nullptr等情况,这将导致更复杂的代码。
在错误检查方面的一个可能的方法,立即中止错误:
MPI_Comm comm; PetscObjectGetComm((PetscObject)(&obj), &comm); PetscErrorCode ierr = Type ## Destroy(&obj); CHKERRABORT(comm, ierr);
参考自 libMesh::WrappedPetsc< Mat >::reset_to_zero() , 以及 libMesh::WrappedPetsc< Mat >::~WrappedPetsc().
|
inline |
获取托管对象的指针。 这用于模拟以下代码: KSP ksp; KSPCreate(comm, &ksp); 因为在这种上下文中,取包装对象的地址是没有意义的。
在文件 wrapped_petsc.h 第 109 行定义.
参考自 libMesh::PetscMatrix< T >::_get_submatrix(), libMesh::PetscVector< T >::create_subvector(), libMesh::PetscVector< T >::localize(), libMesh::PetscVector< T >::localize_to_one(), libMesh::PetscMatrix< T >::print_matlab() , 以及 libMesh::PetscVector< T >::print_matlab().
|
inline |
用户定义的转换为bool的函数。这旨在模拟以下代码: IS is = nullptr; ...
if (!is) ... 请注意,此比较实际上涉及到obj本身,而不是&obj。
在文件 wrapped_petsc.h 第 137 行定义.
|
inline |
用户定义的转换函数。即使将“this”对象视为const,我们也提供对底层T对象的非const访问, 因为通常即使是“逻辑上const”的PETSc API通常也需要非const参数。
在文件 wrapped_petsc.h 第 116 行定义.
参考 libMesh::WrappedPetsc< T >::obj.
|
inline |
"解引用"运算符。返回对托管对象的引用。这在某些情况下是必需的,例如 使用C风格强制转换时: KSP ksp; ...
PetscObjectSetOptionsPrefix((PetscObject)(*ksp), "balance_");
在文件 wrapped_petsc.h 第 126 行定义.
|
delete |
|
inlinenoexcept |
移动赋值运算符。使用移动构造并交换惯用法,而不是默认方式, 因为我们希望确保我们的移动构造函数使传入的对象保持在可以Destroy()的状态。
在文件 wrapped_petsc.h 第 94 行定义.
|
inline |
调用destroy()并将托管对象设置为nullptr。据我所知,PETSc的各种 XXXDestroy()例程不会将obj设置为nullptr,因此我们在包装类的 析构函数中也不这样做,但有些情况下,同时调用相关的XXXDestroy() 函数并重置指针是有用的,因此需要此函数。
在文件 wrapped_petsc.h 第 66 行定义.
|
private |