Beispiel #1
0
def test_symbolic_evaluation(actx_factory):
    """
    Evaluate a symbolic expression by plugging in numbers and
    :class:`~meshmode.dof_array.DOFArray`s and compare the result to the equivalent
    quantity computed explicitly.
    """
    actx = actx_factory()

    mesh = generate_regular_rect_mesh(
        a=(-np.pi/2,)*2,
        b=(np.pi/2,)*2,
        nelements_per_axis=(4,)*2)

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

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

    sym_coords = pmbl.make_sym_vector("x", 2)

    sym_f = (
        pmbl.var("exp")(-pmbl.var("t"))
        * pmbl.var("cos")(sym_coords[0])
        * pmbl.var("sin")(sym_coords[1]))

    t = 0.5

    f = sym.EvaluationMapper({"t": t, "x": nodes})(sym_f)

    expected_f = np.exp(-t) * actx.np.cos(nodes[0]) * actx.np.sin(nodes[1])

    assert actx.to_numpy(discr.norm(f - expected_f)/discr.norm(expected_f)) < 1e-12
Beispiel #2
0
 def sym_eval(expr, x_vec):
     # FIXME: When pymbolic supports array containers
     mapper = sym.EvaluationMapper({"x": x_vec})
     from arraycontext import rec_map_array_container
     result = rec_map_array_container(mapper, expr)
     # If expressions don't depend on coords (e.g., order 0), evaluated result
     # will be scalar-valued, so promote to DOFArray(s) before returning
     return result * (0 * x_vec[0] + 1)
Beispiel #3
0
 def sym_eval(expr, t):
     return sym.EvaluationMapper({"c": p.c, "x": nodes, "t": t})(expr)
Beispiel #4
0
 def sym_eval(expr):
     return sym.EvaluationMapper({"x": nodes, "t": t})(expr)
Beispiel #5
0
 def sym_eval_mirgecom(expr):
     return sym.EvaluationMapper({
         "x": nodes_mirgecom,
         "t": t
     })(expr)
Beispiel #6
0
def _sym_eval(expr, **kwargs):
    return sym.EvaluationMapper(kwargs)(expr)