Petsc 的 xxxSetxxx 方法:自己的指针还是复制值?

计算科学 宠物
2021-12-01 22:04:23

在PETSC 中有很多xxxSetyyy 方法,例如MatSetLocalToGlobalMapping(A,rmap,cmap)。我想知道指向的 rmap 和 cmap (或者通常是 yyy,设置为 xxx)的内容是否被复制到 A(或 xxx)中的某个地方。换句话说,我应该在设置为'xxx'之后销毁'yyy'还是在'xxx'中完成使用'yyy'之前不应该?

其他示例包括 KSPSetPC、PCCompositeAddPC(PC pc,PCType type)、ISCreateGeneral、PCASMSetLocalSubdomains。我发现对于 PCASMSetLocalSubdomains,定义子域的 IS 被复制,因此我们可以在之后销毁它。另一方面,ISCreateGeneral 转发一个参数让用户指定 PetscCopyMode(Own_Pointer 或 Copy_Values)。

这些事情有什么一般规则吗?谢谢!

2个回答

当有PetscCopyMode参数时,行为是显式的。我们希望在每个实例中都是显式的,但这在界面中会变得非常麻烦。

Create () 返回一个新的引用,而Get () 返回一个借用的引用,应该使用Restore () 来返回。

异常出现在Set () 方法中。它们都应该引用对象,并且大多数都引用对象,例如 KSPSetPC(),但是由于此更改是最近才进行的(有时没有多大意义),因此存在一些例外情况。它们最终都将被记录/修复。请报告任何不一致之处。Get () 方法通常返回借用的引用,因为每次销毁对象非常麻烦。

通常,Set方法(和 PETSc)是按引用传递的,因此销毁已传递给方法的对象是不安全的。诸如此类的方法PCASMSetLocalSubdomains是例外,而不是规则。