diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py index 97f876eb06f35943aa32522cf749cacaff8d388d..dfbaf7c4b8acbf2d944a46bd56333af9c91dd942 100644 --- a/python/dune/perftool/pdelab/driver.py +++ b/python/dune/perftool/pdelab/driver.py @@ -777,30 +777,43 @@ def define_compositegfs_parameterfunction(name, *children): ', '.join(children)) +def expression_splitter(expr, length): + if expr is None: + return (None,) * length + else: + from dune.perftool.ufl.execution import split_expression + return split_expression(expr) + + @symbol -def name_boundary_function(expr): +def _name_boundary_function(element, boundary, name=None): from ufl import MixedElement, VectorElement, TensorElement - if isinstance(expr, (VectorElement, TensorElement)): - element, (_, boundary) = get_constraints_metadata(expr) + if isinstance(element, (VectorElement, TensorElement)): from dune.perftool.generation import get_global_context_value - name = get_global_context_value("data").object_names.get(id(boundary), "zero") - define_boundary_function(boundary, name) - return name - if isinstance(expr, MixedElement): - children = tuple(name_boundary_function(el) for el in expr.sub_elements()) + basename = get_global_context_value("data").object_names.get(id(boundary), "veczero") + children = tuple(_name_boundary_function(el, exp, basename + '_' + str(i)) for el, exp, i in zip(element.sub_elements(), expression_splitter(boundary, element.num_sub_elements()), range(element.num_sub_elements()))) + define_compositegfs_parameterfunction(basename, *children) + return basename + if isinstance(element, MixedElement): + children = tuple(name_boundary_function(el) for el in element.sub_elements()) name = '_'.join(children) define_compositegfs_parameterfunction(name, *children) return name - # This is a scalar leaf of the ansatz function tree - element, (_, boundary) = get_constraints_metadata(expr) - from dune.perftool.generation import get_global_context_value - name = get_global_context_value("data").object_names.get(id(boundary), "zero") + if name is None: + name = get_global_context_value("data").object_names.get(id(boundary), "zero") define_boundary_function(boundary, name) return name +def name_boundary_function(expr): + # This is a scalar leaf of the ansatz function tree + element, (_, boundary) = get_constraints_metadata(expr) + + return _name_boundary_function(element, boundary) + + @symbol def name_solution_function(expr): diff --git a/test/stokes/stokes.ufl b/test/stokes/stokes.ufl index e88a011ad8f96852c9a7af2d2cdcde5b835e50da..da632caf9ecbf0f93eb5aa1c70cd5df17aba01b6 100644 --- a/test/stokes/stokes.ufl +++ b/test/stokes/stokes.ufl @@ -1,6 +1,6 @@ v_bctype = Expression("if (x[0] < 1. - 1e-8) return 1; else return 0;", on_intersection=True) g_v = Expression(("4*x[1]*(1.-x[1])", "0.0")) -g_p = Expression("8*x[0]") +g_p = Expression("8*(1.-x[0])") g = g_v * g_p diff --git a/test/stokes/stokes_stress.ufl b/test/stokes/stokes_stress.ufl index 9eb4f3b750e26bb930acda17387da3644773d044..71a323994f8d5d7e39e3565c527935a11259f310 100644 --- a/test/stokes/stokes_stress.ufl +++ b/test/stokes/stokes_stress.ufl @@ -1,8 +1,10 @@ v_bctype = Expression("if (x[0] < 1. - 1e-8) return 1; else return 0;", on_intersection=True) -v_dirichlet = Expression("Dune::FieldVector<double, 2> y(0.0); y[0] = 4*x[1]*(1.-x[1]); return y;") +g_v = Expression(("4*x[1]*(1.-x[1])", "0.0")) +g_p = Expression("8*(1.-x[0])") +g = g_v * g_p cell = triangle -P2 = VectorElement("Lagrange", cell, 2, dirichlet_constraints=v_bctype, dirichlet_expression=v_dirichlet) +P2 = VectorElement("Lagrange", cell, 2, dirichlet_constraints=v_bctype, dirichlet_expression=g_v) P1 = FiniteElement("Lagrange", cell, 1) P2_stress = TensorElement("Lagrange", cell, 2)