首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FEniCS: UMFPACK报告正在求解的矩阵是奇异的

FEniCS: UMFPACK报告正在求解的矩阵是奇异的
EN

Stack Overflow用户
提问于 2013-09-22 17:20:13
回答 1查看 330关注 0票数 0

我在第一个子域中用stokes方程,在第二个子域中创建了一个混合泊松方程(darcy)。我使用UnitSquare,子域1应该是从0到0,5和子域2从0,5到1。

但是现在我得到了以下错误:

求解线性变分问题。与调用数值有关的UMFPACK问题*警告: UMFPACK报告正在求解的矩阵是奇异的。警告: UMFPACK报告正在求解的矩阵是奇异的。断言vmax>=vmin,“空范围,请指定vmin和/或vmax”断言错误:空范围,请指定vmin和/或vmax

有人能帮忙吗?谢谢!

以下是代码:

代码语言:javascript
复制
enter code here


#-*- coding: utf-8 -*-

from dolfin import *

import numpy as np

# Define mesh
mesh = UnitSquare(32,32)

#Subdomain 1
# Gitter übergeben
subdomains = CellFunction("uint", mesh)

# Klasse des Teilgebiets
class Domain_1(SubDomain):
   def inside(self, x, on_boundary):
       return between(x[0], (0, 0.5)) # Koordinatenangabe des Teilgebiets

# Objekt der Klasse erstellen
sub_domain1 = Domain_1()
sub_domain1.mark(subdomains,0)

# Definition Funktionenräume
U = FunctionSpace(mesh, "CG", 2)
V = FunctionSpace(mesh, "CG", 1)
W = U*V

# Definition Trial- und Testfunktion
(u, p) = TrialFunctions(W)
(v, q) = TestFunctions(W)

# boundary condition
p_in = 1
p_out = 0
noslip = DirichletBC(W.sub(0), (0),

                      "on_boundary && \

                      (x[1] <= DOLFIN_EPS | x[1] >= 0.5-DOLFIN_EPS)")

inflow = DirichletBC(W.sub(1), p_in, "x[0] <= 0.0 + DOLFIN_EPS*1000")
outflow = DirichletBC(W.sub(1), p_out, "x[0] >= 0.5 - DOLFIN_EPS*1000")

bcp = [noslip,inflow, outflow]

# Definition f
f = Expression("0")

# Variationsformulierung
a = inner(grad(u), grad(v))*dx + div(v)*p*dx(0) + q*div(u)*dx(0)
L = inner(f,v)*dx(0)

# Lösung berechnen
w = Function(W)
problem = LinearVariationalProblem(a, L, w, bcp)
solver = LinearVariationalSolver(problem)
solver.solve()
(u, p) = w.split()

# Subdomain 2
# Gitter übergeben
subdomains = CellFunction("uint", mesh)

# Klasse des Teilgebiets
class Domain_2(SubDomain):
   def inside(self,x,on_boundary):
       return between(x[0], (0.5,1.0)) # Koordinatenangabe des Teilgebiets

# Objekt der Klasse erstellen
sub_domain2 = Domain_2()
sub_domain2.mark(subdomains,1)

# Define function spaces and mixed (product) space
BDM = FunctionSpace(mesh, "BDM", 1)
DG = FunctionSpace(mesh, "DG", 0)
CG = FunctionSpace(mesh, "CG", 1)
W = MixedFunctionSpace([BDM, DG, CG])

# Define trial and test functions
(sigma, u, p) = TrialFunctions(W)
(tau, v, q) = TestFunctions(W)

#Define pressure boundary condition
p_in = 1
p_out = 0
noslip = DirichletBC(W.sub(1), (0),
                      "on_boundary && \
                      (x[1] <= 0.5 + DOLFIN_EPS | x[1] >= 1.0-DOLFIN_EPS)")

inflow = DirichletBC(W.sub(2), p_in, "x[0] <= 0.5 + DOLFIN_EPS*1000")
outflow = DirichletBC(W.sub(2), p_out, "x[0] >= 1.0 - DOLFIN_EPS*1000")
bcp = [noslip,inflow, outflow]

# Define f
#f = Expression("0")
f = Expression("10*exp(-(pow(x[0] - 0.5, 2) + pow(x[1] - 0.5, 2)) / 0.02)")

# Define variational form
a = (dot(sigma, tau) + div(tau)*u + div(sigma)*v)*dx(1) + inner(p,q)*dx(1) + u*q*dx(1)
L = f*v*dx(1)

# Compute solution
w = Function(W)
problem = LinearVariationalProblem(a, L, w, bcp)
solver = LinearVariationalSolver(problem)
solver.solve()
(sigma, u, p) = w.split()

# plot

plot(u, axes = True, interactive=True, title = "u")
plot(p, axes = True, interactive=True, title = "p")

这学期我忘了dx(0)。但这不是问题所在。

在代码的第一部分(Stokes)中,我试图以以下方式编写无滑移条件:

代码语言:javascript
复制
# Randbedingungen

def top_bottom(x, on_boundary):
    return x[1] > 1.0 - DOLFIN_EPS or x[1] < DOLFIN_EPS

noslip = Constant((0.0,0.0))  

bc0 = DirichletBC(W.sub(0), noslip, top_bottom)

p_in = 1
p_out = 0

inflow = DirichletBC(W.sub(1), p_in, "x[0] <= 0.0 + DOLFIN_EPS*1000")
outflow = DirichletBC(W.sub(1), p_out, "x[0] >= 0.5 - DOLFIN_EPS*1000")

bcp = [bc0, inflow, outflow]

# Definition f

f = Expression("(0.0, 0.0)")

# Variationsformulierung Stokes
a = inner(grad(u), grad(v))*dx(0) + div(v)*p*dx(0) + q*div(u)*dx(0)
L = inner(f,v)*dx(0)

但是现在我得到了以下错误:

代码语言:javascript
复制
Shape mismatch: line 56, in <module> L = inner(f,v)*dx(0

有人能帮忙吗?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-10-11 11:44:07

我认为这里有几个错误。在代码的第一部分,我认为你是用泰勒-胡德元素来解斯托克斯方程。如果我们是这样的话,那你应该是:

U=VectorFunctionSpace(网格,"CG",2)

同样在守则的这一部分:

A=内部(梯度(U),梯度(V))*dx+ div(v)*p*dx(0) + q*div(u)*dx(0)

L=内(f,v)*dx(0)

我不知道你为什么在第一学期不使用dx(0)。我鼓励您查看演示:http://fenicsproject.org/documentation/dolfin/dev/python/demo/index.html,您可能会得到一些更多的提示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18946605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档