def burgers_spacedisc(N=10, nu=None, x0=0.0, xE=1.0, retfemdict=False, condensemats=True): mesh = dolfin.IntervalMesh(N, x0, xE) V = dolfin.FunctionSpace(mesh, 'CG', 1) u = dolfin.TrialFunction(V) v = dolfin.TestFunction(V) # boundaries and conditions ugamma = dolfin.Expression('0', degree=1) def _spaceboundary(x, on_boundary): return on_boundary diribc = dolfin.DirichletBC(V, ugamma, _spaceboundary) mass = assemble(v*u*dx) stif = assemble(nu*inner(nabla_grad(v), nabla_grad(u))*dx) M = dts.mat_dolfin2sparse(mass) A = dts.mat_dolfin2sparse(stif) M, _, bcdict = dts.condense_velmatsbybcs(M, [diribc], return_bcinfo=True) ininds = bcdict['ininds'] A, rhsa = dts.condense_velmatsbybcs(A, [diribc]) def burger_nonl(vvec, t): v0 = expandvfunc(vvec, V=V, ininds=ininds) bnl = assemble(0.5*v*((v0*v0).dx(0))*dx) return bnl.array()[ininds] if retfemdict: return M, A, rhsa, burger_nonl, dict(V=V, diribc=diribc, ininds=ininds) else: return M, A, rhsa, burger_nonl
def get_burgertensor_spacecomp(V=None, podmat=None, ininds=None, diribc=None, Ukyleft=None, bwd=False, **kwargs): if not podmat.shape[0] == len(ininds): raise Warning("Looks like this is not the right POD basis") if Ukyleft is None: Ukyleft = podmat v = dolfin.TestFunction(V) u = dolfin.TrialFunction(V) if bwd: uvvdxl = [] for ui in podmat.T: hatui = expandvfunc(ui, V=V, ininds=ininds) uivvdx = assemble(hatui*v*((u).dx(0))*dx) Uivvdx = dts.mat_dolfin2sparse(uivvdx) Uivvdx, _ = dts.condense_velmatsbybcs(Uivvdx, [diribc]) uvvdxl.append(np.dot(Ukyleft.T, Uivvdx*podmat)) else: uvvdxl = [] for ui in podmat.T: hatui = expandvfunc(ui, V=V, ininds=ininds) uivvdx = assemble(0.5*hatui*((v*u).dx(0))*dx) Uivvdx = dts.mat_dolfin2sparse(uivvdx) Uivvdx, _ = dts.condense_velmatsbybcs(Uivvdx, [diribc]) uvvdxl.append(np.dot(Ukyleft.T, Uivvdx*podmat)) return uvvdxl
def get_pavrg_onsubd(odcoo=None, Q=None, ppin=None): """assemble matrix that returns the pressure average over a subdomain """ odom = ContDomain(odcoo) q = dolfin.TrialFunction(Q) p = dolfin.TestFunction(Q) # factor to compute the average via \bar u = 1/h \int_0^h u(x) dx Ci = 1.0 / ((odcoo['xmax'] - odcoo['xmin']) * (odcoo['ymax'] - odcoo['ymin'])) charfun = CharactFun(odom) # TODO: no need to have `p` and then sum up all rows # TODO: integrate over subdomain rather than using `charfun` cp = dolfin.assemble(Ci * p * q * charfun * dx) CP = dts.mat_dolfin2sparse(cp) ccp = sps.csc_matrix(CP.sum(axis=0)) if ppin is None: return ccp # np.atleast_2d(cp.array()) else: raise UserWarning('Need to implement/specify the pinned pressure')
def check_ass_penaro(bcsd=None, bcssfuns=None, V=None, plot=False): mesh = V.mesh() bcone = bcsd[1] contshfunone = bcssfuns[1] Gammaone = bcone() bparts = dolfin.MeshFunction('size_t', mesh, mesh.topology().dim() - 1) Gammaone.mark(bparts, 0) u = dolfin.TrialFunction(V) v = dolfin.TestFunction(V) # Robin boundary form arob = dolfin.inner(u, v) * dolfin.ds(0) brob = dolfin.inner(v, contshfunone) * dolfin.ds(0) amatrob = dolfin.assemble(arob, exterior_facet_domains=bparts) bmatrob = dolfin.assemble(brob, exterior_facet_domains=bparts) amatrob = dts.mat_dolfin2sparse(amatrob) amatrob.eliminate_zeros() print 'Number of nonzeros in amatrob:', amatrob.nnz bmatrob = bmatrob.array() # [ININDS] if plot: plt.figure(2) plt.spy(amatrob) if plot: plt.figure(1) for x in contshfunone.xs: plt.plot(x[0], x[1], 'bo') plt.show()
def check_ass_penaro(bcsd=None, bcssfuns=None, V=None, plot=False): mesh = V.mesh() bcone = bcsd[1] contshfunone = bcssfuns[1] Gammaone = bcone() bparts = dolfin.MeshFunction('size_t', mesh, mesh.topology().dim() - 1) Gammaone.mark(bparts, 0) u = dolfin.TrialFunction(V) v = dolfin.TestFunction(V) # Robin boundary form arob = dolfin.inner(u, v) * dolfin.ds(0) brob = dolfin.inner(v, contshfunone) * dolfin.ds(0) amatrob = dolfin.assemble(arob, exterior_facet_domains=bparts) bmatrob = dolfin.assemble(brob, exterior_facet_domains=bparts) amatrob = dts.mat_dolfin2sparse(amatrob) amatrob.eliminate_zeros() print('Number of nonzeros in amatrob:', amatrob.nnz) bmatrob = bmatrob.array() # [ININDS] if plot: plt.figure(2) plt.spy(amatrob) if plot: plt.figure(1) for x in contshfunone.xs: plt.plot(x[0], x[1], 'bo') plt.show()
def test_conv_asquad(self): import dolfin_navier_scipy as dns from dolfin import dx, grad, inner import dolfin_navier_scipy.dolfin_to_sparrays as dts femp, stokesmatsc, rhsd = \ dns.problem_setups.get_sysmats(problem='drivencavity', nu=1e-2, mergerhs=True, meshparams={'N': 15}) invinds = femp['invinds'] V = femp['V'] hmat = dns.dolfin_to_sparrays.\ ass_convmat_asmatquad(W=femp['V'], invindsw=invinds) xexp = '(1-x[0])*x[0]*(1-x[1])*x[1]*x[0]+2' yexp = '(1-x[0])*x[0]*(1-x[1])*x[1]*x[1]+1' # yexp = 'x[0]*x[0]*x[1]*x[1]' f = dolfin.Expression((xexp, yexp), element=self.V.ufl_element()) u = dolfin.interpolate(f, V) uvec = np.atleast_2d(u.vector().get_local()).T uvec_gamma = uvec.copy() uvec_gamma[invinds] = 0 u_gamma = dolfin.Function(V) u_gamma.vector().set_local(uvec_gamma) uvec_i = 0 * uvec uvec_i[invinds, :] = uvec[invinds] u_i = dolfin.Function(V) u_i.vector().set_local(uvec_i) # Assemble the 'actual' form w = dolfin.TrialFunction(V) wt = dolfin.TestFunction(V) nform = dolfin.assemble(inner(grad(w) * u, wt) * dx) # rows, cols, values = nform.data() nmat = dts.mat_dolfin2sparse(nform) # consider only the 'inner' equations nmatrc = nmat[invinds, :][:, :] # the boundary terms N1, N2, fv = dns.dolfin_to_sparrays.\ get_convmats(u0_dolfun=u_gamma, V=V) # print np.linalg.norm(nmatrc * uvec_i + nmatrc * uvec_gamma) classicalconv = nmatrc * uvec quadconv = (hmat * np.kron(uvec[invinds], uvec[invinds]) + ((N1 + N2) * uvec_i)[invinds, :] + fv[invinds, :]) self.assertTrue(np.allclose(classicalconv, quadconv)) # print 'consistency tests' self.assertTrue((np.linalg.norm(uvec[invinds]) - np.linalg.norm(uvec_i)) < 1e-14) self.assertTrue(np.linalg.norm(uvec - uvec_gamma - uvec_i) < 1e-14)
def test_conv_asquad(self): import dolfin_navier_scipy as dns from dolfin import dx, grad, inner import dolfin_navier_scipy.dolfin_to_sparrays as dts femp, stokesmatsc, rhsd = \ dns.problem_setups.get_sysmats(problem='drivencavity', nu=1e-2, mergerhs=True, meshparams={'N': 15}) invinds = femp['invinds'] V = femp['V'] hmat = dns.dolfin_to_sparrays.\ ass_convmat_asmatquad(W=femp['V'], invindsw=invinds) xexp = '(1-x[0])*x[0]*(1-x[1])*x[1]*x[0]+2' yexp = '(1-x[0])*x[0]*(1-x[1])*x[1]*x[1]+1' # yexp = 'x[0]*x[0]*x[1]*x[1]' f = dolfin.Expression((xexp, yexp), element=self.V.ufl_element()) u = dolfin.interpolate(f, V) uvec = np.atleast_2d(u.vector().get_local()).T uvec_gamma = uvec.copy() uvec_gamma[invinds] = 0 u_gamma = dolfin.Function(V) u_gamma.vector().set_local(uvec_gamma) uvec_i = 0 * uvec uvec_i[invinds, :] = uvec[invinds] u_i = dolfin.Function(V) u_i.vector().set_local(uvec_i) # Assemble the 'actual' form w = dolfin.TrialFunction(V) wt = dolfin.TestFunction(V) nform = dolfin.assemble(inner(grad(w) * u, wt) * dx) # rows, cols, values = nform.data() nmat = dts.mat_dolfin2sparse(nform) # consider only the 'inner' equations nmatrc = nmat[invinds, :][:, :] # the boundary terms N1, N2, fv = dns.dolfin_to_sparrays.\ get_convmats(u0_dolfun=u_gamma, V=V) # print np.linalg.norm(nmatrc * uvec_i + nmatrc * uvec_gamma) classicalconv = nmatrc * uvec quadconv = (hmat * np.kron(uvec[invinds], uvec[invinds]) + ((N1 + N2) * uvec_i)[invinds, :] + fv[invinds, :]) self.assertTrue(np.allclose(classicalconv, quadconv)) # print 'consistency tests' self.assertTrue( (np.linalg.norm(uvec[invinds]) - np.linalg.norm(uvec_i)) < 1e-14) self.assertTrue(np.linalg.norm(uvec - uvec_gamma - uvec_i) < 1e-14)
import dolfin import dolfin_navier_scipy.dolfin_to_sparrays as dts N = 20 mesh = dolfin.UnitSquareMesh(N, N) V = dolfin.FunctionSpace(mesh, 'CG', 1) u = dolfin.TrialFunction(V) v = dolfin.TestFunction(V) mass = dolfin.assemble(v*u*dolfin.dx) M = dts.mat_dolfin2sparse(mass)
import dolfin import dolfin_navier_scipy.dolfin_to_sparrays as dts from scipy.io import mmwrite N = 25 mesh = dolfin.UnitSquareMesh(N, N) V = dolfin.FunctionSpace(mesh, 'CG', 1) u = dolfin.TrialFunction(V) v = dolfin.TestFunction(V) mass = dolfin.assemble(v*u*dolfin.dx) massmat = dts.mat_dolfin2sparse(mass) matstring = 'testdata/massmat_square_CG1_N{0}'.format(N) mmwrite(matstring, massmat)
def vdxop(vvec): v0 = expandvfunc(vvec, V=V, ininds=ininds) bnl = assemble((v*v0*u.dx(0))*dx) Bnl = dts.mat_dolfin2sparse(bnl) Bnl, rhsa = dts.condense_velmatsbybcs(Bnl, [diribc]) return Bnl