def FluidNonLinearSetup(Pressure,mu, u_k): MO.PrintStr("Preconditioning Fluid linear setup",3,"=") # parameters['linear_algebra_backend'] = 'uBLAS' p = TrialFunction(Pressure) q = TestFunction(Pressure) mesh = Pressure.mesh() N = FacetNormal(Pressure.mesh()) h = CellSize(Pressure.mesh()) h_avg =avg(h) alpha = 10.0 gamma =10.0 tic() if Pressure.__str__().find("CG") == -1: Fp = assemble(mu*(jump(q)*jump(p)*dx(mesh)) \ + inner(inner(grad(p),u_k),q)*dx(mesh)- (1./2)*inner(u_k,N)*inner(q,p)*ds(mesh) \ -(1./2)*(inner(u_k('+'),N('+'))+inner(u_k('-'),N('-')))*avg(inner(q,p))*ds(mesh) \ -dot(avg(q),dot(outer(p('+'),N('+'))+outer(p('-'),N('-')),avg(u_k)))*dS(Pressure.mesh())) else: if mesh.topology().dim() == 2: Fp = assemble(mu*inner(grad(q), grad(p))*dx(mesh)+inner((u_k[0]*grad(p)[0]+u_k[1]*grad(p)[1]),q)*dx(mesh) + (1./2)*div(u_k)*inner(p,q)*dx(mesh) + (1./2)*(u_k[0]*N[0]+u_k[1]*N[1])*inner(p,q)*ds(mesh)) else: Fp = assemble(mu*inner(grad(q), grad(p))*dx(mesh)+inner((u_k[0]*grad(p)[0]+u_k[1]*grad(p)[1]+u_k[2]*grad(p)[2]),q)*dx(mesh) + (1./2)*div(u_k)*inner(p,q)*dx(mesh) - (1./2)*(u_k[0]*N[0]+u_k[1]*N[1]+u_k[2]*N[2])*inner(p,q)*ds(mesh))# + (-mu*inner(grad(q),N)*p + inner(u_k, N)*q*p)*ds(2)) Fp = CP.Assemble(Fp) print ("{:40}").format("DG convection-diffusion assemble, time: "), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) tic() kspFp= NSprecondSetup.PCDKSPnonlinear(Fp) print ("{:40}").format("Non-linear fluid precond, time: "), " ==> ",("{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format(time.strftime('%X %x %Z')[0:5]) print "\n\n" return kspFp, Fp
def FluidNonLinearSetup(Pressure, mu, u_k): MO.PrintStr("Preconditioning Fluid linear setup", 3, "=") parameters['linear_algebra_backend'] = 'uBLAS' p = TrialFunction(Pressure) q = TestFunction(Pressure) mesh = Pressure.mesh() N = FacetNormal(Pressure.mesh()) h = CellSize(Pressure.mesh()) h_avg = avg(h) alpha = 10.0 gamma = 10.0 tic() Fp = assemble(mu*(inner(grad(q), grad(p))*dx(mesh) \ - inner(avg(grad(q)), outer(p('+'),N('+'))+outer(p('-'),N('-')))*dS (Pressure.mesh())\ - inner(outer(q('+'),N('+'))+outer(q('-'),N('-')), avg(grad(p)))*dS (Pressure.mesh())\ + alpha/h_avg*inner(outer(q('+'),N('+'))+outer(q('-'),N('-')),outer(p('+'),N('+'))+outer(p('-'),N('-')))*dS(Pressure.mesh()) \ - inner(outer(q,N), grad(p))*ds(mesh) \ - inner(grad(q), outer(p,N))*ds(mesh) \ + gamma/h*inner(q,p)*ds(mesh)) \ + inner(inner(grad(p),u_k),q)*dx(mesh)- (1/2)*inner(u_k,N)*inner(q,p)*ds(mesh) \ -(1/2)*(inner(u_k('+'),N('+'))+inner(u_k('-'),N('-')))*avg(inner(q,p))*ds(mesh) \ -dot(avg(q),dot(outer(p('+'),N('+'))+outer(p('-'),N('-')),avg(u_k)))*dS(Pressure.mesh())) Fp = PETSc.Mat().createAIJ(size=Fp.sparray().shape, csr=(Fp.sparray().indptr, Fp.sparray().indices, Fp.sparray().data)) print("{:40}" ).format("DG convection-diffusion assemble, time: "), " ==> ", ( "{:4f}").format( toc()), ("{:9}").format(" time: "), ("{:4}").format( time.strftime('%X %x %Z')[0:5]) tic() kspFp = NSprecondSetup.PCDKSPnonlinear(Fp) print("{:40}").format("Non-linear fluid precond, time: "), " ==> ", ( "{:4f}").format(toc()), ("{:9}").format(" time: "), ("{:4}").format( time.strftime('%X %x %Z')[0:5]) print "\n\n" return kspFp, Fp