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
Example #3
0
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')
Example #4
0
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)
Example #9
0
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