In [21]:
from dolfin import *
import numpy as np
import matplotlib.pylab as plt
from scipy.sparse import csc_matrix, spdiags
mesh = UnitSquareMesh(2,2)
parameters['reorder_dofs_serial'] = False
V = VectorFunctionSpace(mesh,"CG",2)
Q = FunctionSpace(mesh,"CG",1)
W = V*Q
(u, p) = TrialFunctions(W)
(v, q) = TestFunctions(W)
print V.dim(), Q.dim()
In [22]:
def boundary(x, on_boundary):
return on_boundary
bc = DirichletBC(W.sub(0),Expression(("0","0")), boundary)
parameters['linear_algebra_backend'] = 'uBLAS'
BQB = assemble(inner(u,v)*dx+ div(v)*p*dx+div(u)*q*dx)
bc.apply(BQB)
BQB=BQB.sparray()
In [23]:
Q = BQB[0:np.max(range(V.dim()))+1,0:np.max(range(V.dim()))+1]
In [24]:
Qdiag = Q.diagonal()
In [25]:
B = BQB[np.max(range(V.dim()))+1:np.max(range(W.dim()))+1,0:np.max(range(V.dim()))+1]
Bt = BQB[0:np.max(range(V.dim()))+1,np.max(range(V.dim()))+1:np.max(range(W.dim()))+1]
In [27]:
d = spdiags(1.0/Qdiag, 0, len(Qdiag), len(Qdiag))
B*D*BT
In [19]:
row_divide_col_reduce(Bt,Qdiag)