当前位置: 首页 > 工具软件 > FEniCS > 使用案例 >

Fenics 非线性求解器问题

祁修平
2023-12-01
   关于使用fenics写程序,有时会求解非线性问题。非线性项采用内部的Newton_solver迭代有时会出错,尤其是有限元次数较高时。
   下面是修改方法,参考http://www.karlin.mff.cuni.cz/~hron/fenics-tutorial/stokes/doc.html

原代码:solve(F == 0, w, bc, solver_parameters={“newton_solver”:{“relative_tolerance”:1e-6}})

出错如下:
*** -------------------------------------------------------------------------
*** DOLFIN encountered an error. If you are not able to resolve this issue
*** using the information listed below, you can ask for help at
***
***     fenics-support@googlegroups.com
***
*** Remember to include the error message listed below and, if possible,
*** include a *minimal* running example to reproduce the error.
***
*** -------------------------------------------------------------------------*
*** Error:   Unable to successfully call PETSc function 'KSPSolve'.
*** Reason:  PETSc error code is: 56 (Error in external library).
*** Where:   This error was encountered inside /build/dolfin-GfMsdO/dolfin-2019.1.0/dolfin/la/PETScKrylovSolver.cpp.

修改原代码为:

 J = derivative(F, w)
 problem=NonlinearVariationalProblem(F,w,bc,J)
 solver=NonlinearVariationalSolver(problem)
 
 prm = solver.parameters
 prm['nonlinear_solver'] = 'newton'
 prm['newton_solver']['absolute_tolerance'] = 1E-12
 prm['newton_solver']['relative_tolerance'] = 1e-12
 prm['newton_solver']['maximum_iterations'] = 50
 prm['newton_solver']['linear_solver'] = 'mumps'

solver.solve()

这样,线性求解使用直接求解“mumps”,非线性部分还是采用的newton_solver节省了计算时间。

 类似资料: