Exemple #1
0
 def rhs(t, u):
     return (diffusion_operator(discr,
                                quad_tag=DISCR_TAG_BASE,
                                alpha=1,
                                boundaries=boundaries,
                                u=u) +
             actx.np.exp(-np.dot(nodes, nodes) / source_width**2))
Exemple #2
0
 def get_rhs(t, u):
     return (
         diffusion_operator(discr,
                            quad_tag=discr_tag,
                            alpha=alpha,
                            boundaries=p.get_boundaries(discr, actx, t),
                            u=u) + sym_eval(sym_f, t))
 def get_rhs(t, u):
     result = (
         diffusion_operator(discr,
                            alpha=p.alpha,
                            boundaries=p.get_boundaries(discr, actx, t),
                            u=u) + sym_eval(sym_f, t))
     return result
 def get_rhs(t, u):
     alpha = p.get_alpha(nodes, t, u)
     if isinstance(alpha, DOFArray):
         discr_tag = DISCR_TAG_QUAD
     else:
         discr_tag = DISCR_TAG_BASE
     return (
         diffusion_operator(discr,
                            quad_tag=discr_tag,
                            alpha=alpha,
                            boundaries=p.get_boundaries(discr, actx, t),
                            u=u) + _sym_eval(sym_f, x=nodes, t=t))
Exemple #5
0
 def op(alpha, u):
     return diffusion_operator(
         discr, DISCR_TAG_BASE, alpha, boundaries, u)
Exemple #6
0
def test_diffusion_obj_array_vectorize(actx_factory):
    """
    Checks that the diffusion operator can be called with either scalars or object
    arrays for `u`.
    """
    actx = actx_factory()

    p = get_decaying_trig(1, 2.)

    assert isinstance(p.sym_alpha, Number)

    sym_u1 = p.sym_u
    sym_u2 = 2 * p.sym_u

    sym_diffusion_u1 = sym_diffusion(p.dim, p.sym_alpha, sym_u1)
    sym_diffusion_u2 = sym_diffusion(p.dim, p.sym_alpha, sym_u2)

    n = 128

    mesh = p.get_mesh(n)

    from grudge.eager import EagerDGDiscretization
    discr = EagerDGDiscretization(actx, mesh, order=4)

    nodes = thaw(actx, discr.nodes())

    t = 1.23456789

    def sym_eval(expr):
        return sym.EvaluationMapper({"x": nodes, "t": t})(expr)

    alpha = sym_eval(p.sym_alpha)

    u1 = sym_eval(sym_u1)
    u2 = sym_eval(sym_u2)

    boundaries = p.get_boundaries(discr, actx, t)

    diffusion_u1 = diffusion_operator(discr,
                                      quad_tag=DISCR_TAG_BASE,
                                      alpha=alpha,
                                      boundaries=boundaries,
                                      u=u1)

    assert isinstance(diffusion_u1, DOFArray)

    expected_diffusion_u1 = sym_eval(sym_diffusion_u1)
    rel_linf_err = (discr.norm(diffusion_u1 - expected_diffusion_u1, np.inf) /
                    discr.norm(expected_diffusion_u1, np.inf))
    assert rel_linf_err < 1.e-5

    boundaries_vector = [boundaries, boundaries]
    u_vector = make_obj_array([u1, u2])

    diffusion_u_vector = diffusion_operator(discr,
                                            quad_tag=DISCR_TAG_BASE,
                                            alpha=alpha,
                                            boundaries=boundaries_vector,
                                            u=u_vector)

    assert isinstance(diffusion_u_vector, np.ndarray)
    assert diffusion_u_vector.shape == (2, )

    expected_diffusion_u_vector = make_obj_array(
        [sym_eval(sym_diffusion_u1),
         sym_eval(sym_diffusion_u2)])
    rel_linf_err = (
        discr.norm(diffusion_u_vector - expected_diffusion_u_vector, np.inf) /
        discr.norm(expected_diffusion_u_vector, np.inf))
    assert rel_linf_err < 1.e-5
Exemple #7
0
def test_diffusion_compare_to_nodal_dg(actx_factory,
                                       problem,
                                       order,
                                       print_err=False):
    """Compares diffusion operator to Hesthaven/Warburton Nodal-DG code."""
    pytest.importorskip("oct2py")

    actx = actx_factory()

    p = problem

    assert p.dim == 1
    assert p.sym_alpha == 1.

    from meshmode.interop.nodal_dg import download_nodal_dg_if_not_present
    download_nodal_dg_if_not_present()

    sym_diffusion_u = sym_diffusion(p.dim, p.sym_alpha, p.sym_u)

    for n in [4, 8, 16, 32, 64]:
        mesh = p.get_mesh(n)

        from meshmode.interop.nodal_dg import NodalDGContext
        with NodalDGContext("./nodal-dg/Codes1.1") as ndgctx:
            ndgctx.set_mesh(mesh, order=order)

            t = 1.23456789

            from grudge.eager import EagerDGDiscretization
            discr_mirgecom = EagerDGDiscretization(actx, mesh, order=order)
            nodes_mirgecom = thaw(actx, discr_mirgecom.nodes())

            def sym_eval_mirgecom(expr):
                return sym.EvaluationMapper({
                    "x": nodes_mirgecom,
                    "t": t
                })(expr)

            u_mirgecom = sym_eval_mirgecom(p.sym_u)

            diffusion_u_mirgecom = diffusion_operator(
                discr_mirgecom,
                quad_tag=DISCR_TAG_BASE,
                alpha=discr_mirgecom.zeros(actx) + 1.,
                boundaries=p.get_boundaries(discr_mirgecom, actx, t),
                u=u_mirgecom)

            discr_ndg = ndgctx.get_discr(actx)
            nodes_ndg = thaw(actx, discr_ndg.nodes())

            def sym_eval_ndg(expr):
                return sym.EvaluationMapper({"x": nodes_ndg, "t": t})(expr)

            u_ndg = sym_eval_ndg(p.sym_u)

            ndgctx.push_dof_array("u", u_ndg)
            ndgctx.octave.push("t", t)
            ndgctx.octave.eval("[rhs] = HeatCRHS1D(u,t)", verbose=False)
            diffusion_u_ndg = ndgctx.pull_dof_array(actx, "rhs")

            def inf_norm(f):
                return actx.np.linalg.norm(f, np.inf)

            err = (inf_norm(diffusion_u_mirgecom - diffusion_u_ndg) /
                   inf_norm(diffusion_u_ndg))

            if print_err:
                diffusion_u_exact = sym_eval_mirgecom(sym_diffusion_u)
                err_exact = (
                    inf_norm(diffusion_u_mirgecom - diffusion_u_exact) /
                    inf_norm(diffusion_u_exact))
                print(err, err_exact)

            assert err < 1e-9
Exemple #8
0
 def get_rhs(t, u):
     return diffusion_operator(discr,
                               quad_tag=DISCR_TAG_BASE,
                               alpha=alpha,
                               boundaries=boundaries,
                               u=u)
def test_diffusion_obj_array_vectorize(actx_factory):
    """
    Checks that the diffusion operator can be called with either scalars or object
    arrays for `u`.
    """
    actx = actx_factory()

    p = DecayingTrig(1, 2.)

    sym_x = pmbl.make_sym_vector("x", p.dim)
    sym_t = pmbl.var("t")

    def get_u1(x, t):
        return p.get_solution(x, t)

    def get_u2(x, t):
        return 2 * p.get_solution(x, t)

    sym_u1 = get_u1(sym_x, sym_t)
    sym_u2 = get_u2(sym_x, sym_t)

    sym_alpha1 = p.get_alpha(sym_x, sym_t, sym_u1)
    sym_alpha2 = p.get_alpha(sym_x, sym_t, sym_u2)

    assert isinstance(sym_alpha1, Number)
    assert isinstance(sym_alpha2, Number)

    alpha = sym_alpha1

    sym_diffusion_u1 = sym_diffusion(p.dim, alpha, sym_u1)
    sym_diffusion_u2 = sym_diffusion(p.dim, alpha, sym_u2)

    n = 128

    mesh = p.get_mesh(n)

    from grudge.eager import EagerDGDiscretization
    discr = EagerDGDiscretization(actx, mesh, order=4)

    nodes = thaw(actx, discr.nodes())

    t = 1.23456789

    u1 = get_u1(nodes, t)
    u2 = get_u2(nodes, t)

    alpha = p.get_alpha(nodes, t, u1)

    boundaries = p.get_boundaries(discr, actx, t)

    diffusion_u1 = diffusion_operator(discr,
                                      quad_tag=DISCR_TAG_BASE,
                                      alpha=alpha,
                                      boundaries=boundaries,
                                      u=u1)

    assert isinstance(diffusion_u1, DOFArray)

    expected_diffusion_u1 = _sym_eval(sym_diffusion_u1, x=nodes, t=t)
    rel_linf_err = actx.to_numpy(
        discr.norm(diffusion_u1 - expected_diffusion_u1, np.inf) /
        discr.norm(expected_diffusion_u1, np.inf))
    assert rel_linf_err < 1.e-5

    boundaries_vector = [boundaries, boundaries]
    u_vector = make_obj_array([u1, u2])

    diffusion_u_vector = diffusion_operator(discr,
                                            quad_tag=DISCR_TAG_BASE,
                                            alpha=alpha,
                                            boundaries=boundaries_vector,
                                            u=u_vector)

    assert isinstance(diffusion_u_vector, np.ndarray)
    assert diffusion_u_vector.shape == (2, )

    expected_diffusion_u_vector = make_obj_array([
        _sym_eval(sym_diffusion_u1, x=nodes, t=t),
        _sym_eval(sym_diffusion_u2, x=nodes, t=t)
    ])
    rel_linf_err = actx.to_numpy(
        discr.norm(diffusion_u_vector - expected_diffusion_u_vector, np.inf) /
        discr.norm(expected_diffusion_u_vector, np.inf))
    assert rel_linf_err < 1.e-5