Numpy FEniCS离散化后运行GMRes时出现名称错误

Numpy FEniCS离散化后运行GMRes时出现名称错误,numpy,Numpy,我用FEniCS离散了一个扩散方程,如下所示: def DiscretiseEquation(h): mesh = UnitSquareMesh(h, h) V = FunctionSpace(mesh, 'Lagrange', 1) def on_boundary(x, on_boundary): return on_boundary bc_value = Constant(0.0) boundary_condition = DirichletBC(V, bc_va

我用FEniCS离散了一个扩散方程,如下所示:

def DiscretiseEquation(h):
    mesh = UnitSquareMesh(h, h)
    V = FunctionSpace(mesh, 'Lagrange', 1)

def on_boundary(x, on_boundary):
    return on_boundary

bc_value = Constant(0.0)
boundary_condition = DirichletBC(V, bc_value, on_boundary)

class RandomDiffusionField(Expression):
    def __init__(self, m, n, element):
        self._rand_field = np.exp(-np.random.randn(m, n))
        self._m = m
        self._n = n
        self._ufl_element = element

    def eval(self, value, x):

        x_index = np.int(np.floor(self._m * x[0]))
        y_index = np.int(np.floor(self._n * x[1]))

        i = min(x_index, self._m - 1)
        j = min(y_index, self._n - 1)

        value[0] = self._rand_field[i, j]

    def value_shape(self):
        return(1, )

class RandomRhs(Expression):

    def __init__(self, m, n, element):
        self._rand_field = np.random.randn(m, n)
        self._m = m
        self._n = n
        self._ufl_element = element

    def eval(self, value, x):

        x_index = np.int(np.floor(self._m * x[0]))
        y_index = np.int(np.floor(self._n * x[1]))

        i = min(x_index, self._m - 1)
        j = min(y_index, self._n - 1)

        value[0] = self._rand_field[i, j]

    def value_shape(self):
        return (1, )

u = TrialFunction(V)
v = TestFunction(V)

random_field = RandomDiffusionField(100, 100, element=V.ufl_element())
zero = Expression("0", element=V.ufl_element())
one = Expression("1", element=V.ufl_element())
diffusion = as_matrix(((random_field, zero), (zero, one)))

a = inner(diffusion * grad(u), grad(v)) * dx
L = RandomRhs(h, h, element=V.ufl_element()) * v * dx

A = assemble(a)
b = assemble(L)
boundary_condition.apply(A, b)
A = as_backend_type(A).mat()
(indptr, indices, data) = A.getValuesCSR()
mat = csr_matrix((data, indices, indptr), shape=A.size)
rhs = b.array()

#Solving
x = spsolve(mat, rhs)

#Conversion to a FEniCS function
u = Function(V)
u.vector()[:] = x
我正在正常运行GMRES解算器。回调参数是我定义的一个单独的迭代计数器

DiscretiseEquation(100)
A = mat
b = rhs
x, info = gmres(A, b, callback = IterCount())
例程返回NameError,指出未定义“mat”:

    NameError                                 Traceback (most recent call last)
    <ipython-input-18-e096b2eea097> in <module>()
         1 DiscretiseEquation(200)
   ----> 2 A = mat
         3 b = rhs
         4 x_200, info_200 = gmres(A, b, callback = IterCount())
         5 gmres_res =  closure_variables["residuals"]

   NameError: name 'mat' is not defined
namererror回溯(最近一次调用)
在()
1离散方程(200)
---->2 A=垫
3 b=rhs
4 x_200,info_200=gmres(A,b,callback=IterCount())
5 gmres_res=闭合变量[“残差”]
名称错误:未定义名称“mat”

据我所知,它应该在调用DiscretiseEquation函数时定义?

当您请求错误帮助时,请显示足够多的错误堆栈,以便我们知道错误发生的位置<代码>离散化方程式不返回任何内容。那是故意的吗?是的,那是故意的。我已经用完整的错误信息编辑了我的原始帖子。我打算使用'mat'和'rhs'值作为各种Krylov解算器(GMRES、CG、MINRES)的'A'和'b'参数。这就是错误:NameError Traceback(最近一次调用last)in()1 DiscretiseEquation(200)-->2 A=mat 3 b=rhs 4 x_200,info_200=gmres(A,b,callback=IterCount())5 gmres_res=closure_变量[“residuals”]名称错误:名称“mat”未定义大代码块定义了
A
mat
(作为
csr
)。我不知道A=mat相对于那些线的位置。Krylov解算器正在解Ax=b。据我所知,FEniCS离散化(mat和rhs)生成的矩阵和rhs项对应于要在解算器ie x=gmres(A,b)中使用的“A”和“b”参数。我问的是Python代码中变量的定义,而不是解算器在做什么<代码>名称错误表示在执行
A=mat
时,
mat
尚未定义。要么在
mat=…
语句之前执行此操作,要么在不同的命名空间中执行此操作。这是一个简单的Python编码问题,而不是高级的FEniCS问题。