Bt = PP[0:V.dim(), V.dim():W.dim()] d = spdiags(1.0 / Xdiag, 0, len(Xdiag), len(Xdiag)) dBt = (d * Bt).tocsr() plt.spy(dBt) plt.show() BQB = Bt.transpose() * dBt dBt = PETSc.Mat().createAIJ(size=dBt.shape, csr=(dBt.indptr, dBt.indices, dBt.data)) print dBt.size BQB = PETSc.Mat().createAIJ(size=BQB.tocsr().shape, csr=(BQB.tocsr().indptr, BQB.tocsr().indices, BQB.tocsr().data)) # parameters['linear_algebra_backend'] = 'PETSc' kspBQB = NSprecondSetup.Ksp(BQB) elif Solver == "PCD": N = FacetNormal(mesh) h = CellSize(mesh) h_avg = avg(h) alpha = 10.0 gamma = 10.0 (pQ) = TrialFunction(Q) (qQ) = TestFunction(Q) print MU Mass = assemble(inner(pQ, qQ) * dx) L = MU * (inner(grad(qQ), grad(pQ)) * dx(mesh)) # O = - dot(u_k, n)*pQ('+')*qQ*ds(mesh) - dot(u_k, n)*(pQ('+') - pQ('-'))*qQ('-')*dS(mesh) pp = Function(Q)
Mass = assemble(inner(u,v)*dx) B = assemble(-div(v)*p*dx) bc = DirichletBC(V,Expression(("0.0","0.0")), boundary) #bc.apply(Mass) Mass = Mass.sparray() MassD = Mass.diagonal() del Mass B = B.sparray() d = spdiags(1.0/MassD, 0, len(MassD), len(MassD)) QB = d*B L = B.transpose()*QB L = PETSc.Mat().createAIJ(size=L.shape,csr=(L.indptr, L.indices, L.data)) QB = PETSc.Mat().createAIJ(size=QB.shape,csr=(QB.indptr, QB.indices, QB.data)) KspL = NSsetup.Ksp(L) elif Solver == "PCD": (pQ) = TrialFunction(Q) (qQ) = TestFunction(Q) print MU Mass = assemble(inner(pQ,qQ)*dx) L = assemble(inner(grad(pQ),grad(qQ))*dx) fp = MU*inner(grad(qQ), grad(pQ))*dx+inner((u_k[0]*grad(pQ)[0]+u_k[1]*grad(pQ)[1]),qQ)*dx + (1./2)*div(u_k)*inner(pQ,qQ)*dx - (1./2)*(u_k[0]*n[0]+u_k[1]*n[1])*inner(pQ,qQ)*ds L = CP.Assemble(L) Mass = CP.Assemble(Mass) # print L SolutionTime = 0 while eps > tol and iter < maxiter: iter += 1