线性求解器的 PETSc 输入格式

计算科学 宠物 C
2021-12-07 12:15:29

我正在做一些相当大的努力来从 MATLAB 翻译我的一个代码。这是一种有限元代码,我还没有实现求解器,但是比较了在 MATLAB 和 C 之间简单组装全局系统的 CPU 时间,后者快了两个数量级以上......

无论如何,我不知道如何使用 PETSc,但会在接下来的几周内尝试学习它。只是阅读一些代码和文档,似乎很难为 PETSc 翻译我的代码。

我注意到有一个从“文件”中读取矩阵的选项(参见此处)。我只是想知道我是否像现在一样翻译我的代码,我可以将矩阵/rhs 保存到 .dat 文件或从那里读取的东西吗?我在 C 方面没有太多经验,所以我不知道这是否难以做到,尤其是对于像我这样的大型系统。

在我的代码中,我必须在每次牛顿迭代时求解一个线性系统(它是一个非线性系统),并将其与问题与时间相关的事实结合起来。在我的整个代码中,我需要 PETSc 的唯一一次是用于线性求解(诚然,这是很多线性求解......)。

如果我现在必须学习 PETSc 的语法,我只想知道这样我以后不会感到沮丧。

另一方面,到目前为止,我真的很惊讶 C 代码的速度有多快。也许我的 MATLAB 编码效率不高,但我一直在尽可能减少 for 循环。

1个回答

我建议查看一个与时间相关的示例,因为如果您在该级别制定,PETSc 可以提供更多诊断。例如,您可以使用 Rosenbrock 方法、加法 Runge-Kutta IMEX 方法或其他方法。有些涉及牛顿迭代,但这不是必需的,并不总是最好的方法。要使用这些方法,您可以从提供残差函数开始,f(t,u),如u˙=f(t,u),或者,gg(t,u,u˙)=0. PETSc 可以通过着色自动计算雅可比行列式,如果您后来决定组装雅可比行列式以提高效率,PETSc 可以检查您组装的内容是否正确并显示错误。如果您推出自己的时间积分和自己的牛顿,除非您自己编写,否则这些算法变体和调试功能将不可用。

用户手册解释了接口。另请参阅特定 API 文档的手册页手册页与示例交叉引用。一个很好的例子是Brusselator src/ts/examples/tutorials/ex25.c您可能还会发现教程中的幻灯片很有用。如果您遇到困难,请随时在此处或petsc-users邮件列表中提问。

即使在串行中,您使用文件系统的建议也会成为一个巨大的瓶颈。它极大地使工作流程复杂化,并且会限制您可以使用的方法。但是,如果您只想测试一次矩阵,您可以PetscBinaryWrite()从 MATLAB 使用并加载系统并使用src/ksp/ksp/examples/tutorials/ex10.c.