def apply(self, pc, x, y): ysave = x.duplicate() f = HiptmairSetup.BCapply(self.Fspace[0], self.BC[0], x, "dolfin") fVec = interpolate(f, self.Fspace[2]) self.BC[2].apply(fVec.vector()) uVec = HiptmairSetup.FuncToPETSc(fVec) u = uVec.duplicate() self.kspVector.solve(uVec, u) f = HiptmairSetup.BCapply(self.Fspace[2], self.BC[2], u, "dolfin") fMag = interpolate(f, self.Fspace[0]) self.BC[0].apply(fMag.vector()) xVec = HiptmairSetup.FuncToPETSc(fMag) xMag = HiptmairSetup.BCapply(self.Fspace[0], self.BC[0], x) uGrad = HiptmairSetup.TransGradOp(self.kspMass, self.B, xMag) xLag = HiptmairSetup.BCapply(self.Fspace[1], self.BC[1], uGrad) u = uGrad.duplicate() self.kspScalar.solve(xLag, u) uGrad = HiptmairSetup.BCapply(self.Fspace[1], self.BC[1], u) uGrad1 = HiptmairSetup.GradOp(self.kspMass, self.B, uGrad) xMag = HiptmairSetup.BCapply(self.Fspace[0], self.BC[0], uGrad1) xx = x.duplicate() xx.pointwiseMult(self.diag, x) # print xVec.array, xMag.array # sss y.array = xx.array + xVec.array + xMag.array
def foo(): NN = 2 * 4 parameters["form_compiler"]["quadrature_degree"] = -1 nn = int(2**(NN)) omega = 1 mesh = UnitSquareMesh(nn, nn) order = 1 parameters['reorder_dofs_serial'] = False Magnetic = FunctionSpace(mesh, "N1curl", order) Lagrange = FunctionSpace(mesh, "CG", order) W = Magnetic * Lagrange Magnetic = None #del Magnetic, Lagrange Vdim = W.sub(0).dim() Qdim = W.sub(1).dim() Wdim = W.dim() print "\n\nV: ", Vdim, "Q: ", Qdim, "W: ", Wdim, "\n\n" parameters['reorder_dofs_serial'] = False parameters['linear_algebra_backend'] = 'uBLAS' dim = 2 #@print_memory G, P = HiptmairSetup.HiptmairMatrixSetupBoundary(mesh, W.sub(0).dim(), W.sub(1).dim(), dim) G, P = HiptmairSetup.HiptmairBCsetupBoundary(G, P, mesh) a = 1
def MagneticSetup(Magnetic, Lagrange, u0, p0, CGtol,params): MO.PrintStr("Preconditioning Magnetic setup",3,"=") # parameters['linear_algebra_backend'] = 'uBLAS' if Magnetic.__str__().find("N1curl2") == -1: C, P = HiptmairSetup.HiptmairMatrixSetupBoundary(Magnetic.mesh(), Magnetic.dim(), Lagrange.dim(),Magnetic.mesh().geometry().dim()) G, P = HiptmairSetup.HiptmairBCsetupBoundary(C,P,Magnetic.mesh()) else: G = None P = None u = TrialFunction(Magnetic) v = TestFunction(Magnetic) p = TrialFunction(Lagrange) q = TestFunction(Lagrange) def boundary(x, on_boundary): return on_boundary bcp = DirichletBC(Lagrange, p0, boundary) bcu = DirichletBC(Magnetic, u0, boundary) tic() ScalarLaplacian, b1 = assemble_system(inner(grad(p),grad(q))*dx,inner(p0,q)*dx,bcp) VectorLaplacian, b2 = assemble_system(inner(grad(p),grad(q))*dx+inner(p,q)*dx,inner(p0,q)*dx,bcp) del b1, b2 print ("{:40}").format("Hiptmair Laplacians BC assembled, time: "), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) tic() VectorLaplacian = CP.Assemble(VectorLaplacian) ScalarLaplacian = CP.Assemble(ScalarLaplacian) print ("{:40}").format("PETSc Laplacians assembled, time: "), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) tic() if params[0] == 0: CurlCurlShift, b2 = assemble_system(params[1]*inner(curl(u),curl(v))*dx+inner(u,v)*dx,inner(u0,v)*dx,bcu) else: CurlCurlShift, b2 = assemble_system(params[0]*params[1]*inner(curl(u),curl(v))*dx+inner(u,v)*dx,inner(u0,v)*dx,bcu) CurlCurlShift = CP.Assemble(CurlCurlShift) print ("{:40}").format("Shifted Curl-Curl assembled, time: "), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) tic() kspVector, kspScalar, kspCGScalar, diag = HiptmairSetup.HiptmairKSPsetup(VectorLaplacian, ScalarLaplacian, CurlCurlShift, CGtol) del VectorLaplacian, ScalarLaplacian print ("{:40}").format("Hiptmair Setup time:"), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) return [G, P, kspVector, kspScalar, kspCGScalar, diag, CurlCurlShift]
def apply(self, pc, x, y): br = x.getSubVector(self.r_is) xr = br.duplicate() self.kspScalar.solve(br, xr) # print self.D.size x2 = x.getSubVector(self.p_is) y2 = x2.duplicate() y3 = x2.duplicate() xp = x2.duplicate() self.kspA.solve(x2,y2) self.Fp.mult(y2,y3) self.kspQ.solve(y3,xp) # self.kspF.solve(bu1-bu4-bu2,xu) bb = x.getSubVector(self.b_is) bb = bb - self.Dt*xr xb = bb.duplicate() #self.kspMX.solve(bb,xb) xb, its, self.HiptmairTime = HiptmairSetup.HiptmairApply(self.AA, bb, self.kspScalar, self.kspVector, self.G, self.P, self.tol) bu1 = x.getSubVector(self.u_is) bu2 = self.Bt*xp XX = bu1.duplicate() xu = XX.duplicate() self.kspF.solve(bu1-bu2,xu) #self.kspF.solve(bu1,xu) y.array = (np.concatenate([xu.array, xb.array,xp.array,xr.array]))
def apply(self, pc, x, y): br = x.getSubVector(self.r_is) xr = br.duplicate() self.kspCGScalar.solve(br, xr) x2 = x.getSubVector(self.p_is) print x2.size y2 = x2.duplicate() y3 = x2.duplicate() xp = x2.duplicate() self.kspA.solve(x2, y2) self.Fp.mult(y2, y3) self.kspQ.solve(y3, xp) bb = x.getSubVector(self.b_is) xb, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.A, bb, self.kspScalar, self.kspVector, self.G, self.P, self.tol) bu1 = x.getSubVector(self.u_is) bu2 = self.Bt * xp bu4 = self.Ct * xb xu = bu1.duplicate() self.kspF.solve(bu1 - bu2 - bu4, xu) y.array = (np.concatenate([xu.array, xb.array, xp.array, xr.array]))
def apply(self, pc, x, y): x1 = x.getSubVector(self.b_is) yy1 = x1.duplicate() x2 = x.getSubVector(self.r_is) yy2 = x2.duplicate() # tic() yy1, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.A, x1, self.kspScalar, self.kspVector, self.G, self.P, self.tol) # print "Hiptmair time: ", toc() self.HiptmairIts += its tic() self.kspCGScalar.solve(x2, yy2) self.CGtime = toc() x1 = x.getSubVector(self.u_is) y1 = x1.duplicate() y11 = x1.duplicate() y111 = x1.duplicate() x2 = x.getSubVector(self.p_is) y2 = x2.duplicate() y3 = x2.duplicate() y4 = x2.duplicate() self.kspA.solve(x2, y2) self.Fp.mult(y2, y3) self.kspQ.solve(y3, y4) self.Bt.mult(y4, y11) self.C.mult(yy1, y111) self.kspF.solve(x1 - y11 - y111, y1) y.array = (np.concatenate([y1.array, y4.array, yy1.array, yy2.array]))
def apply(self, pc, x, y): bu = x.getSubVector(self.u_is) invF = bu.duplicate() bp = x.getSubVector(self.p_is) outP = bp.duplicate() bb = x.getSubVector(self.b_is) invMX = bb.duplicate() br = x.getSubVector(self.r_is) invL = br.duplicate() if self.Schur == "Exact": self.kspS.solve(bp, outP) else: outP = FluidSchur([self.kspA, self.Fp, self.kspQ], bp) invMX, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, bb, self.kspScalar, self.kspVector, self.G, self.P, self.tol) self.kspScalar.solve(br, invL) xb1 = invMX.duplicate() xb2 = invMX.duplicate() xb3 = invMX.duplicate() xb4 = invMX.duplicate() self.D.multTranspose(invL, xb1) xb2, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, xb1, self.kspScalar, self.kspVector, self.G, self.P, self.tol) outB = -invMX - xb2 xr1 = invL.duplicate() outR = invL.duplicate() self.D.mult(-invMX, xr1) self.kspScalar(xr1, outR) xu1 = bu.duplicate() xu2 = bu.duplicate() outU = bu.duplicate() self.B.multTranspose(outP, xu1) self.C.multTranspose(outB, xu2) self.kspF.solve(bu + xu1 - xu2, outU) y.array = (np.concatenate( [outU.array, -outP.array, outB.array, outR.array]))
def apply(self, pc, x, y): br = x.getSubVector(self.r_is) xr = br.duplicate() self.kspCGScalar.solve(br, xr) # print self.D.size bp1 = self.Dt * xr bp2, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.A, bp1, self.kspScalar, self.kspVector, self.G, self.P, self.tol) bp3 = self.Ct * bp2 bp4 = bp3.duplicate() self.kspF.solve(bp3, bp4) bp5 = -self.B * bp4 x2 = x.getSubVector(self.p_is) y2 = x2.duplicate() y3 = x2.duplicate() xp = x2.duplicate() self.kspA.solve(x2 - bp5, y2) self.Fp.mult(y2, y3) self.kspQ.solve(y3, xp) bb = x.getSubVector(self.b_is) xb, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.A, bb - self.Dt * xr, self.kspScalar, self.kspVector, self.G, self.P, self.tol) bu1 = x.getSubVector(self.u_is) bu2 = self.Bt * xp bu3, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.A, xb, self.kspScalar, self.kspVector, self.G, self.P, self.tol) bu4 = self.Ct * xb bu5 = bu4.duplicate() self.kspF.solve(bu4, bu5) xu = bu5.duplicate() self.kspF.solve(bu1 - bu4 - bu2, xu) y.array = (np.concatenate([xu.array, xb.array, xp.array, xr.array]))
def apply(self, pc, x, y): br = x.getSubVector(self.r_is) xr = br.duplicate() self.kspScalar.solve(br, xr) # print self.D.size x2 = x.getSubVector(self.p_is) y2 = x2.duplicate() y3 = x2.duplicate() xp = x2.duplicate() self.kspA.solve(x2, y2) self.Fp.mult(y2, y3) self.kspQ.solve(y3, xp) # self.kspF.solve(bu1-bu4-bu2,xu) bb = x.getSubVector(self.b_is) xb = bb.duplicate() #self.kspMX.solve(bb,xb) xxr = bb.duplicate() # self.Dt.multTranspose(xr,xxr) xb, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, bb - xxr, self.kspScalar, self.kspVector, self.G, self.P, self.tol) bu1 = x.getSubVector(self.u_is) bu2 = bu1.duplicate() bu4 = bu1.duplicate() # if self.A.type == 'python': # bu = assemble(self.Bt) + assemble(self.Ct) # self.BC.apply(bu) # bu = IO.arrayToVec(bu.array()) # bu = bu.getSubVector(self.u_is) # else: # self.Bt.multTranspose(xp,bu2) # self.Ct.multTranspose(xb,bu4) XX = bu1.duplicate() xu = XX.duplicate() self.kspF.solve(bu1 - bu2 - bu4, xu) #self.kspF.solve(bu1,xu) y.array = (np.concatenate([xu.array, -xp.array, xb.array, xr.array]))
def apply(self, pc, x, y): # self.kspCurlCurl.setOperators(self.B) x1 = x.getSubVector(self.u_is) y1 = x1.duplicate() x2 = x.getSubVector(self.p_is) y2 = x2.duplicate() # tic() y1, its, self.HiptmairTime = HiptmairSetup.HiptmairApply(self.A, x1, self.kspScalar, self.kspVector, self.G, self.P, self.tol) # print "Hiptmair time: ", toc() self.HiptmairIts += its tic() self.kspCGScalar.solve(x2, y2) self.CGtime = toc() # print "Laplacian, its ", self.kspCGScalar.its, " time ", self.CGtime # print "CG time: ", toc() # print "Laplacian inner iterations: ", self.kspCGScalar.its y.array = (np.concatenate([y1.array, y2.array])) self.CGits += self.kspCGScalar.its
def apply(self, pc, x, y): bu = x.getSubVector(self.u_is) invF = bu.duplicate() bp = x.getSubVector(self.p_is) invS = bp.duplicate() bb = x.getSubVector(self.b_is) invMX = bb.duplicate() br = x.getSubVector(self.r_is) invL = br.duplicate() self.kspF.solve(bu, invF) if self.Schur == "True": self.kspS.solve(bp, invS) else: invS = FluidSchur([self.kspA, self.Fp, self.kspQ], bp) invMX, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, bb, self.kspScalar, self.kspVector, self.G, self.P, self.tol) self.kspScalar.solve(br, invL) xp1 = invS.duplicate() barF = invS.duplicate() self.B.mult(invF, xp1) if self.Schur == "True": self.kspS.solve(xp1, barF) else: barF = FluidSchur([self.kspA, self.Fp, self.kspQ], xp1) xu1 = invF.duplicate() barS = invF.duplicate() self.B.multTranspose(invS, xu1) self.kspF.solve(xu1, barS) # outR = (L(D*invMx)); xr1 = invL.duplicate() outR = invL.duplicate() self.D.mult(invMX, xr1) self.kspScalar(xr1, outR) # outB = (Mx(C*barS) + invMx + Mx(D'*invL)); xb1 = invMX.duplicate() xb2 = invMX.duplicate() xb3 = invMX.duplicate() xb4 = invMX.duplicate() self.G.mult(invL, xb2) self.C.mult(barS, xb3) xb4, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, xb3, self.kspScalar, self.kspVector, self.G, self.P, self.tol) outB = xb4 + invMX + xb2 # outP = barF - invS - Schur(B*F(C'*invMx)); xp1 = invF.duplicate() xp2 = invF.duplicate() xp3 = invS.duplicate() xp4 = invS.duplicate() self.C.multTranspose(invMX, xp1) self.kspF.solve(xp1, xp2) self.B.mult(xp2, xp3) if self.Schur == "True": self.kspS.solve(xp3, xp4) else: xp4 = FluidSchur([self.kspA, self.Fp, self.kspQ], xp3) outP = barF - invS - xp4 # outU = invF - F(B'*barF) + barS; xu1 = invF.duplicate() xu2 = invF.duplicate() self.B.multTranspose(barF, xu1) self.kspF.solve(xu1, xu2) outU = invF - xu2 + barS y.array = (np.concatenate( [outU.array, outP.array, outB.array, outR.array]))
def MagneticSetup(Magnetic, Lagrange, u0, p0, CGtol): MO.PrintStr("Preconditioning Magnetic setup", 3, "=") parameters['linear_algebra_backend'] = 'uBLAS' C, P = HiptmairSetup.HiptmairMatrixSetupBoundary( Magnetic.mesh(), Magnetic.dim(), Lagrange.dim(), Magnetic.mesh().geometry().dim()) G, P = HiptmairSetup.HiptmairBCsetupBoundary(C, P, Magnetic.mesh()) u = TrialFunction(Magnetic) v = TestFunction(Magnetic) p = TrialFunction(Lagrange) q = TestFunction(Lagrange) def boundary(x, on_boundary): return on_boundary bcp = DirichletBC(Lagrange, p0, boundary) bcu = DirichletBC(Magnetic, u0, boundary) tic() ScalarLaplacian, b1 = assemble_system( inner(grad(p), grad(q)) * dx, inner(p0, q) * dx, bcp) VectorLaplacian, b2 = assemble_system( inner(grad(p), grad(q)) * dx + inner(p, q) * dx, inner(p0, q) * dx, bcp) del b1, b2 print("{:40}" ).format("Hiptmair Laplacians BC assembled, time: "), " ==> ", ( "{:4f}").format( toc()), ("{:9}").format(" time: "), ("{:4}").format( time.strftime('%X %x %Z')[0:5]) tic() VectorLaplacian = PETSc.Mat().createAIJ( size=VectorLaplacian.sparray().shape, csr=(VectorLaplacian.sparray().indptr, VectorLaplacian.sparray().indices, VectorLaplacian.sparray().data)) ScalarLaplacian = PETSc.Mat().createAIJ( size=ScalarLaplacian.sparray().shape, csr=(ScalarLaplacian.sparray().indptr, ScalarLaplacian.sparray().indices, ScalarLaplacian.sparray().data)) print("{:40}").format("PETSc Laplacians assembled, time: "), " ==> ", ( "{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format( time.strftime('%X %x %Z')[0:5]) tic() CurlCurlShift, b2 = assemble_system( inner(curl(u), curl(v)) * dx + inner(u, v) * dx, inner(u0, v) * dx, bcu) CurlCurlShift = PETSc.Mat().createAIJ(size=CurlCurlShift.sparray().shape, csr=(CurlCurlShift.sparray().indptr, CurlCurlShift.sparray().indices, CurlCurlShift.sparray().data)) print("{:40}").format("Shifted Curl-Curl assembled, time: "), " ==> ", ( "{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format( time.strftime('%X %x %Z')[0:5]) tic() kspVector, kspScalar, kspCGScalar, diag = HiptmairSetup.HiptmairKSPsetup( VectorLaplacian, ScalarLaplacian, CurlCurlShift, CGtol) del VectorLaplacian, ScalarLaplacian print("{:40}").format("Hiptmair Setup time:"), " ==> ", ("{:4f}").format( toc()), ("{:9}").format(" time: "), ("{:4}").format( time.strftime('%X %x %Z')[0:5]) return [G, P, kspVector, kspScalar, kspCGScalar, diag, CurlCurlShift]
tic() Magnetic = FunctionSpace(mesh, "N1curl", order) Lagrange = FunctionSpace(mesh, "CG", order) W = Magnetic*Lagrange print ("{:40}").format("Function space setup, time: "), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) Vdim[xx-1] = Magnetic.dim() Qdim[xx-1] = Lagrange.dim() Wdim[xx-1] = W.dim() print "\n\nV: ",Vdim[xx-1],"Q: ",Qdim[xx-1],"W: ",Wdim[xx-1],"\n\n" parameters['reorder_dofs_serial'] = False DimSave[xx-1] = Magnetic.dim() print Magnetic.dim() parameters['linear_algebra_backend'] = 'uBLAS' C, P = HiptmairSetup.HiptmairMatrixSetupBoundary(mesh, Magnetic.dim(), Lagrange.dim(),dim) G, P = HiptmairSetup.HiptmairBCsetupBoundary(C,P,mesh) def boundary(x, on_boundary): return on_boundary bcb = DirichletBC(W.sub(0),u0, boundary) bcr = DirichletBC(W.sub(1), p0, boundary) bcs = [bcb,bcr] (v,q) = TestFunctions(W) (u,p) = TrialFunctions(W) a11 = inner(curl(u),curl(v))*dx
def apply(self, pc, x, y): if self.Options == 'BT': b = x.getSubVector(self.b_is) Mxb = b.duplicate() # self.kspMX.solve(b,Mxb) Mxb, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, b, self.kspScalar, self.kspVector, self.G, self.P, self.tol) r = x.getSubVector(self.r_is) Lr = r.duplicate() self.kspScalar.solve(r, Lr) DL = b.duplicate() self.Dt.multTranspose(Lr, DL) K = b.duplicate() K, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, DL, self.kspScalar, self.kspVector, self.G, self.P, self.tol) DM = r.duplicate() self.Dt.mult(Mxb, DM) E = r.duplicate() self.kspScalar.solve(DM, E) p = x.getSubVector(self.p_is) Sp2 = p.duplicate() Sp3 = p.duplicate() Sp = p.duplicate() self.kspA.solve(p, Sp2) self.Fp.mult(Sp2, Sp3) self.kspQ.solve(Sp3, Sp) u = x.getSubVector(self.u_is) Fu = u.duplicate() Cb = u.duplicate() Bp = u.duplicate() self.Ct.multTranspose(Mxb, Cb) self.Bt.multTranspose(Sp, Bp) self.kspF.solve(u - Cb + Bp, Fu) y.array = (np.concatenate( [Fu.array, -Sp.array, Mxb.array + K.array, E.array])) else: u = x.getSubVector(self.u_is) Fu = u.duplicate() self.kspF.solve(u, Fu) p = x.getSubVector(self.p_is) Sp2 = p.duplicate() Sp3 = p.duplicate() Sp = p.duplicate() self.kspA.solve(p, Sp2) self.Fp.mult(Sp2, Sp3) self.kspQ.solve(Sp3, Sp) b = x.getSubVector(self.b_is) Mxb = b.duplicate() Mxb, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, b, self.kspScalar, self.kspVector, self.G, self.P, self.tol) r = x.getSubVector(self.r_is) Lr = r.duplicate() self.kspScalar.solve(r, Lr) if self.Options == 'p4': Q = u.duplicate() else: Q1 = u.duplicate() self.Bt.multTranspose(Sp, Q1) Q = u.duplicate() self.kspF(Q1, Q) Y1 = u.duplicate() self.Ct.multTranspose(Mxb, Y1) Y = u.duplicate() self.kspF(Y1, Y) BF = p.duplicate() self.Bt.mult(Fu, BF) if self.Options == 'p3': H = p.duplicate() else: H1 = p.duplicate() H2 = p.duplicate() H = p.duplicate() self.kspA.solve(BF, H1) self.Fp.mult(H1, H2) self.kspQ.solve(H2, H) BY = p.duplicate() self.Bt.mult(Fu, BY) if self.Options == 'p3': J = p.duplicate() else: J1 = p.duplicate() J2 = p.duplicate() J = p.duplicate() self.kspA.solve(BY, J1) self.Fp.mult(J1, J2) self.kspQ.solve(J2, J) CF = b.duplicate() self.Ct.mult(Fu, CF) T, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, CF, self.kspScalar, self.kspVector, self.G, self.P, self.tol) if self.Options == 'p4': V = b.duplicate() else: CQ = b.duplicate() self.Ct.mult(Q, CQ) V, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, CQ, self.kspScalar, self.kspVector, self.G, self.P, self.tol) DL = b.duplicate() self.Dt.multTranspose(Lr, DL) K = b.duplicate() K, its, self.HiptmairTime = HiptmairSetup.HiptmairApply( self.AA, DL, self.kspScalar, self.kspVector, self.G, self.P, self.tol) DM = r.duplicate() self.Dt.mult(Mxb, DM) E = r.duplicate() self.kspScalar.solve(DM, E) y.array = (np.concatenate([ Fu.array + Q.array - Y.array, H.array - Sp.array - J.array, T.array + V.array + Mxb.array + K.array, E.array ]))
a = inner(curl(u), curl(v)) * dx + inner(u, v) * dx L1 = inner(v, CurlMass) * dx tic() Acurl, b = assemble_system( a, L1, bc, form_compiler_parameters={"eliminate_zeros": True}) print "System assembled, time: ", toc() tic() A, b = CP.Assemble(Acurl, b) x = b.duplicate() print "PETSc system assembled, time: ", toc() MatVec = 'yes' if MatVec == "yes": tic() VecLagrange, kspMass, VectorLaplacian, ScalarLaplacian, B, BC = HiptmairSetup.HiptmairAnyOrder( Magnetic, Lagrange) # del b1, b2 print "Hiptmair Laplacians BC assembled, time: ", toc() ksp = PETSc.KSP().create() ksp.setTolerances(1e-6) ksp.setType('cg') ksp.setOperators(A, A) pc = ksp.getPC() reshist = {} def monitor(ksp, its, rnorm): reshist[its] = rnorm print its, ' ', rnorm ksp.setMonitor(monitor)