在FEniCS离散化后运行GMR时的NameError

时间:2017-03-24 11:50:52

标签: numpy

我使用FEniCS对扩散方程进行了如下离散:

@BindsOptionalOf

我正常运行GMRES解算器。回调参数是我定义的单独迭代计数器。

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

例程返回一个NameError,说明' mat'未定义:

DiscretiseEquation(100)
A = mat
b = rhs
x, info = gmres(A, b, callback = IterCount())

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

0 个答案:

没有答案