libmesh解析
本工作只是尝试解析原libmesh的代码,供学习使用
 全部  命名空间 文件 函数 变量 类型定义 枚举 枚举值 友元 
Public 成员函数 | Private 属性 | 所有成员列表
libMesh::WrappedPetsc< T > 模板结构体 参考

#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,它们在内部是引用计数指针, 并且可能不会在浅复制时执行正确的操作。 更多...
 
WrappedPetscoperator= (const WrappedPetsc &)=delete
 
 WrappedPetsc (WrappedPetsc &&other) noexcept
 移动构造函数。我们几乎可以默认它,但我们需要将other.obj设置为nullptr, 以便在随后Destroy()时它仅仅是一个空操作,而不会破坏引用计数或尝试双重释放内存。 更多...
 
WrappedPetscoperator= (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 属性

obj
 

详细描述

template<typename T>
struct libMesh::WrappedPetsc< T >

在文件 wrapped_petsc.h33 行定义.

构造及析构函数说明

template<typename T>
libMesh::WrappedPetsc< T >::WrappedPetsc ( )
inline

默认构造函数。这应该模拟我们通常编写的方式,例如: KSP ksp; 然后可以在不同的PETSc例程中使用ksp。也就是说, obj未初始化为任何特定值。

在文件 wrapped_petsc.h41 行定义.

template<typename T>
libMesh::WrappedPetsc< T >::WrappedPetsc ( obj_in)
inline

构造函数,用于将obj初始化为特定的传入值。这模拟了我们通过 IS is = NULL; 明确创建PETSc对象的代码。从技术上讲,可以在此处传递任何指针值, 但通常只有传递nullptr才有意义。

参数
obj_in初始PETSc对象的指针(通常为nullptr)。

在文件 wrapped_petsc.h50 行定义.

50 : obj(obj_in) {}
template<typename T>
libMesh::WrappedPetsc< T >::~WrappedPetsc ( )
inline

析构函数。只调用destroy()函数。

在文件 wrapped_petsc.h55 行定义.

56  {
57  destroy();
58  }
void destroy()
必须特例化以调用适当的XXXDestroy()例程,以便实例化WrappedPetsc&lt;T&gt;对象。
template<typename T>
libMesh::WrappedPetsc< T >::WrappedPetsc ( const WrappedPetsc< T > &  other)
delete

复制构造函数和复制赋值运算符。这些被删除了,因为我认为我们不能 安全地浅复制PETSc对象,如KSP和Vec,它们在内部是引用计数指针, 并且可能不会在浅复制时执行正确的操作。

template<typename T>
libMesh::WrappedPetsc< T >::WrappedPetsc ( WrappedPetsc< T > &&  other)
inlinenoexcept

移动构造函数。我们几乎可以默认它,但我们需要将other.obj设置为nullptr, 以便在随后Destroy()时它仅仅是一个空操作,而不会破坏引用计数或尝试双重释放内存。

在文件 wrapped_petsc.h84 行定义.

85  : obj(other.obj)
86  {
87  other.obj = nullptr;
88  }

成员函数说明

template<>
void libMesh::WrappedPetsc< Vec >::destroy ( )

在文件 wrapped_petsc.C55 行定义.

55 { VecDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< KSP >::destroy ( )

在文件 wrapped_petsc.C56 行定义.

56 { KSPDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< IS >::destroy ( )

在文件 wrapped_petsc.C57 行定义.

57 { ISDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< Mat >::destroy ( )

在文件 wrapped_petsc.C58 行定义.

58 { MatDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< VecScatter >::destroy ( )

在文件 wrapped_petsc.C59 行定义.

59 { VecScatterDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< PetscViewer >::destroy ( )

在文件 wrapped_petsc.C60 行定义.

60 { PetscViewerDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< MatNullSpace >::destroy ( )

在文件 wrapped_petsc.C61 行定义.

61 { MatNullSpaceDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< DM >::destroy ( )

在文件 wrapped_petsc.C62 行定义.

62 { DMDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< MatPartitioning >::destroy ( )

在文件 wrapped_petsc.C63 行定义.

63 { MatPartitioningDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< SNES >::destroy ( )

在文件 wrapped_petsc.C64 行定义.

64 { SNESDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< PC >::destroy ( )

在文件 wrapped_petsc.C65 行定义.

65 { PCDestroy(&obj); }
template<>
void libMesh::WrappedPetsc< PetscSection >::destroy ( )

在文件 wrapped_petsc.C66 行定义.

66 { PetscSectionDestroy(&obj); }
template<typename T>
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().

template<typename T>
T* libMesh::WrappedPetsc< T >::get ( )
inline

获取托管对象的指针。 这用于模拟以下代码: KSP ksp; KSPCreate(comm, &ksp); 因为在这种上下文中,取包装对象的地址是没有意义的。

返回
指向托管对象的指针。

在文件 wrapped_petsc.h109 行定义.

参考自 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().

109 { return &obj; }
template<typename T>
libMesh::WrappedPetsc< T >::operator bool ( ) const
inline

用户定义的转换为bool的函数。这旨在模拟以下代码: IS is = nullptr; ...

if (!is) ... 请注意,此比较实际上涉及到obj本身,而不是&obj。

返回
如果托管对象不为nullptr,则返回true;否则返回false。

在文件 wrapped_petsc.h137 行定义.

137 { return obj != nullptr; }
template<typename T>
libMesh::WrappedPetsc< T >::operator T ( ) const
inline

用户定义的转换函数。即使将“this”对象视为const,我们也提供对底层T对象的非const访问, 因为通常即使是“逻辑上const”的PETSc API通常也需要非const参数。

返回
T对象的副本。

在文件 wrapped_petsc.h116 行定义.

参考 libMesh::WrappedPetsc< T >::obj.

116 { return obj; }
template<typename T>
T& libMesh::WrappedPetsc< T >::operator* ( )
inline

"解引用"运算符。返回对托管对象的引用。这在某些情况下是必需的,例如 使用C风格强制转换时: KSP ksp; ...

PetscObjectSetOptionsPrefix((PetscObject)(*ksp), "balance_");

返回
对托管对象的引用。

在文件 wrapped_petsc.h126 行定义.

126 { return obj; }
template<typename T>
WrappedPetsc& libMesh::WrappedPetsc< T >::operator= ( const WrappedPetsc< T > &  )
delete
template<typename T>
WrappedPetsc& libMesh::WrappedPetsc< T >::operator= ( WrappedPetsc< T > &&  other)
inlinenoexcept

移动赋值运算符。使用移动构造并交换惯用法,而不是默认方式, 因为我们希望确保我们的移动构造函数使传入的对象保持在可以Destroy()的状态。

在文件 wrapped_petsc.h94 行定义.

95  {
96  WrappedPetsc tmp(std::move(other));
97  std::swap(tmp, *this);
98  return *this;
99  }
WrappedPetsc()
默认构造函数。这应该模拟我们通常编写的方式,例如: KSP ksp; 然后可以在不同的PETSc例程中使用ksp。也就是说, obj未初始化为任何特定值。
Definition: wrapped_petsc.h:41
template<typename T>
void libMesh::WrappedPetsc< T >::reset_to_zero ( )
inline

调用destroy()并将托管对象设置为nullptr。据我所知,PETSc的各种 XXXDestroy()例程不会将obj设置为nullptr,因此我们在包装类的 析构函数中也不这样做,但有些情况下,同时调用相关的XXXDestroy() 函数并重置指针是有用的,因此需要此函数。

在文件 wrapped_petsc.h66 行定义.

67  {
68  destroy();
69  obj = nullptr;
70  }
void destroy()
必须特例化以调用适当的XXXDestroy()例程,以便实例化WrappedPetsc&lt;T&gt;对象。

类成员变量说明

template<typename T>
T libMesh::WrappedPetsc< T >::obj
private

该结构体的文档由以下文件生成: