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
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)
def sym_eval(expr, t): return sym.EvaluationMapper({"c": p.c, "x": nodes, "t": t})(expr)
def sym_eval(expr): return sym.EvaluationMapper({"x": nodes, "t": t})(expr)
def sym_eval_mirgecom(expr): return sym.EvaluationMapper({ "x": nodes_mirgecom, "t": t })(expr)
def _sym_eval(expr, **kwargs): return sym.EvaluationMapper(kwargs)(expr)