hello, everyone!
I’m trying to solve the equation distance to boundary. To reduce memory usage, use the GMRES processing method, and the corresponding code is:
u_0 = Function(V)
F = inner(grad(u), grad(v))*dx - f*v*dx
A, b = assemble_system(lhs(F), rhs(F), bc) solve(A, u_0.vector(), b, "gmres")
After running the code, it reminded me an error shown in the below figure( Unable to solve linear system using PETSc Krylov solver) . What is the problem and how could I solve it?
Thanks ahead!
Please provide a minimal working example that reproduces the error.
my code is :
from dolfin import *
import numpy as np
#set_log_level(DEBUG)
# Primero tienes que decirle al código dónde está tu malla. Por ejemplo,
# mesh_path podría ser algo como ../carpeta/malla.xml.gz
mesh_path = "DATOS.xml"
mesh = Mesh(mesh_path)
out = HDF5File(mesh.mpi_comm(), 'geometry_3d.h5', 'w')
out.write(mesh, 'mesh')
# Vamos a resolver la ecuación de Eikonal con el método de FEM más simple
# de todos. Primero definimos el espacio de elementos finitos Galerkin
# continuo (CG) de orden 2.
V = FunctionSpace(mesh, 'CG', 2)
# Instanciamos unas variables
u = TrialFunction(V)
v = TestFunction(V)
f = Constant(1.0)
# Tenemos que definir la frontera de la malla en donde se imponen las
# condiciones de borde. Para tu caso, hay que considerar toda la frontera.
class Boundary(SubDomain):
def inside(self, x, on_boundary):
return on_boundary
boundary = Boundary()
# Se define la condición de borde
bc = DirichletBC(V, Constant(0.0), boundary)
# Ignora este paso. Como el problema de Eikonal es no lineal, se necesita usar
# un método de Newton-Raphson para resolverlo. Es bueno tener un estimador
# inicial de la solución, y esta ecuación nos entrega eso.
u_0 = Function(V)
F = inner(grad(u), grad(v))*dx - f*v*dx
A, b = assemble_system(lhs(F), rhs(F), bc)
solve(A, u_0.vector(), b, "gmres")
#solve(lhs(F) == rhs(F), u_0, bc,solver_parameters)
# Ahora definimos la ecuación de Eikonal para u_0 en formulación variacional
F =((inner(grad(u_0), grad(u_0)))**0.5)*v*dx - f*v*dx
# La ecuación de Eikonal es muy inestable, así que le sumamos un término de
# estabilización. No es demasiado importante este paso para tu uso.
stab = Constant(mesh.hmax()/25)
F += stab*inner(grad(u_0), grad(v))*dx
# Resolvemos la ecuación
solve(F == 0, u_0, bc)
# Guardamos la solución en un archivo para visualizar en Paraview
distance_file = File("distance_to_boundary.pvd");
distance_file << u_0```
First of all; your code does not have the correct indentation.
Secondly, without the mesh one cannot reproduce the error.
Thirdly, you are solving a Poisson problem. Why not use CG + Hypre (boomeramg)?
This is what is done in:
See: How to solve variational problem by iteration methods - #2 by dokken for how to setup hypre in legacy dolfin.
But note:
Testing weak scalability of parallel solver: cg + hypre_amg - #4 by dokken