关于使用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节省了计算时间。