diff --git a/python/dune/perftool/pdelab/driver.py b/python/dune/perftool/pdelab/driver.py index f246e0d95b68235eb7c467ce01dbc3fae3e4c2a6..9940aba70a83b17e606b3912bda72aa55ef4dd9a 100644 --- a/python/dune/perftool/pdelab/driver.py +++ b/python/dune/perftool/pdelab/driver.py @@ -72,7 +72,7 @@ def isSimplical(fem): def isQuadrilateral(fem): - return any(fem._cell._cellname in x for x in ["vertex", "interval", "quadrilateral", "hexalateral"]) + return any(fem._cell._cellname in x for x in ["vertex", "interval", "quadrilateral", "hexahedron"]) def isPk(fem): @@ -146,7 +146,7 @@ def name_dimension(): @preamble def typedef_grid(name): dim = name_dimension() - if any(_form.ufl_cell().cellname() in x for x in ["vertex", "interval", "quadrilateral", "hexalateral"]): + if any(_form.ufl_cell().cellname() in x for x in ["vertex", "interval", "quadrilateral", "hexahedron"]): gridt = "Dune::YaspGrid<{}>".format(dim) include_file("dune/grid/yaspgrid.hh", filetag="driver") else: diff --git a/python/dune/perftool/ufl/execution.py b/python/dune/perftool/ufl/execution.py index 90d75e771f93aa9c1f41f6136f20e3864d3b5685..8018e8593cbc3cffb304a6aea1fa62f8423846ff 100644 --- a/python/dune/perftool/ufl/execution.py +++ b/python/dune/perftool/ufl/execution.py @@ -51,17 +51,16 @@ def TrialFunctions(element): return split(TrialFunction(element)) -_dg0 = FiniteElement("DG", "triangle", 0) -_dg0vec = VectorElement("DG", "triangle", 0) - - class Expression(Coefficient): - def __init__(self, expr, is_global=True, on_intersection=False): + def __init__(self, expr, is_global=True, on_intersection=False, cell_type="triangle"): assert isinstance(expr, str) self.c_expr = expr self.is_global = is_global self.on_intersection = on_intersection + # Avoid ufl complaining about not matching dimension/cells + _dg0 = FiniteElement("DG", cell_type, 0) + # Initialize a coefficient with a dummy finite element map. Coefficient.__init__(self, _dg0) @@ -72,12 +71,15 @@ class Expression(Coefficient): class VectorExpression(Coefficient): - def __init__(self, expr, is_global=True, on_intersection=False): + def __init__(self, expr, is_global=True, on_intersection=False, cell_type="triangle"): assert isinstance(expr, str) self.c_expr = expr self.is_global = is_global self.on_intersection = on_intersection + # Avoid ufl complaining about not matching dimension/cells + _dg0vec = VectorElement("DG", cell_type, 0) + # Initialize a coefficient with a dummy finite element map. Coefficient.__init__(self, _dg0vec) diff --git a/test/poisson/CMakeLists.txt b/test/poisson/CMakeLists.txt index 54b8cfb27525d34c76f769a2db556ad01f983277..88f33d3a7d5a8727eabec2abdf3d286bff882680 100644 --- a/test/poisson/CMakeLists.txt +++ b/test/poisson/CMakeLists.txt @@ -1,3 +1,5 @@ +add_subdirectory(dimension-grid-variations) + # Symlink any reference solutions dune_symlink_to_source_files(FILES poisson_ref.vtu poisson_dg_ref.vtu diff --git a/test/poisson/dimension-grid-variations/CMakeLists.txt b/test/poisson/dimension-grid-variations/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..13b52b6dc48b7b6b17bdd5a5a4b723f91de2954b --- /dev/null +++ b/test/poisson/dimension-grid-variations/CMakeLists.txt @@ -0,0 +1,103 @@ +#================ +# 1D Tests: cg/dg +#================ + +add_generated_executable(UFLFILE poisson_1d_cg_interval.ufl + TARGET poisson_1d_cg_interval + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-14 --compare-l2errorsquared 1e-7 + ) + +dune_add_system_test(TARGET poisson_1d_cg_interval + INIFILE poisson_1d_cg_interval.mini + ) + +add_generated_executable(UFLFILE poisson_1d_dg_interval.ufl + TARGET poisson_1d_dg_interval + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-2 --compare-l2errorsquared 1e-7 + ) + +dune_add_system_test(TARGET poisson_1d_dg_interval + INIFILE poisson_1d_dg_interval.mini + ) + + +#======================================== +# 2D Tests: cg/dg, triangle/quadrilateral +#======================================== + +add_generated_executable(UFLFILE poisson_2d_cg_triangle.ufl + TARGET poisson_2d_cg_triangle + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-14 --compare-l2errorsquared 1e-6 + ) + +dune_add_system_test(TARGET poisson_2d_cg_triangle + INIFILE poisson_2d_cg_triangle.mini + ) + +add_generated_executable(UFLFILE poisson_2d_dg_triangle.ufl + TARGET poisson_2d_dg_triangle + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-1 --compare-l2errorsquared 1e-4 + ) + +dune_add_system_test(TARGET poisson_2d_dg_triangle + INIFILE poisson_2d_dg_triangle.mini + ) + +add_generated_executable(UFLFILE poisson_2d_cg_quadrilateral.ufl + TARGET poisson_2d_cg_quadrilateral + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-14 --compare-l2errorsquared 1e-6 + ) + +dune_add_system_test(TARGET poisson_2d_cg_quadrilateral + INIFILE poisson_2d_cg_quadrilateral.mini + ) + +add_generated_executable(UFLFILE poisson_2d_dg_quadrilateral.ufl + TARGET poisson_2d_dg_quadrilateral + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-1 --compare-l2errorsquared 1e-4 + ) + +dune_add_system_test(TARGET poisson_2d_dg_quadrilateral + INIFILE poisson_2d_dg_quadrilateral.mini + ) + + +#======================================== +# 3D Tests: cg/dg, tetrahedron/hexahedron +#======================================== + +add_generated_executable(UFLFILE poisson_3d_cg_tetrahedron.ufl + TARGET poisson_3d_cg_tetrahedron + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-14 --compare-l2errorsquared 1e-4 + ) + +dune_add_system_test(TARGET poisson_3d_cg_tetrahedron + INIFILE poisson_3d_cg_tetrahedron.mini + ) + +add_generated_executable(UFLFILE poisson_3d_dg_tetrahedron.ufl + TARGET poisson_3d_dg_tetrahedron + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-2 --compare-l2errorsquared 1e-4 + ) + +dune_add_system_test(TARGET poisson_3d_dg_tetrahedron + INIFILE poisson_3d_dg_tetrahedron.mini + ) + +add_generated_executable(UFLFILE poisson_3d_cg_hexahedron.ufl + TARGET poisson_3d_cg_hexahedron + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1e-14 --compare-l2errorsquared 1e-4 + ) + +dune_add_system_test(TARGET poisson_3d_cg_hexahedron + INIFILE poisson_3d_cg_hexahedron.mini + ) + +add_generated_executable(UFLFILE poisson_3d_dg_hexahedron.ufl + TARGET poisson_3d_dg_hexahedron + FORM_COMPILER_ARGS --exact-solution-expression g --compare-dofs 1 --compare-l2errorsquared 1e-3 + ) + +dune_add_system_test(TARGET poisson_3d_dg_hexahedron + INIFILE poisson_3d_dg_hexahedron.mini + ) diff --git a/test/poisson/dimension-grid-variations/poisson_1d_cg_interval.mini b/test/poisson/dimension-grid-variations/poisson_1d_cg_interval.mini new file mode 100644 index 0000000000000000000000000000000000000000..016ce0b61111528827273e7cfcd3c73e68042660 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_1d_cg_interval.mini @@ -0,0 +1,8 @@ +__name = poisson_1d_cg_interval + +cells = 32 +extension = 1. + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_1d_cg_interval.ufl b/test/poisson/dimension-grid-variations/poisson_1d_cg_interval.ufl new file mode 100644 index 0000000000000000000000000000000000000000..864810e8a0dd87330992901f0badaf53c9eedbe3 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_1d_cg_interval.ufl @@ -0,0 +1,10 @@ +cell_type = "interval" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", cell_type=cell_type) + +V = FiniteElement("CG", cell_type, 1, dirichlet_expression=g) +u = TrialFunction(V) +v = TestFunction(V) + +forms = [(inner(grad(u), grad(v)) - f*v)*dx] \ No newline at end of file diff --git a/test/poisson/dimension-grid-variations/poisson_1d_dg_interval.mini b/test/poisson/dimension-grid-variations/poisson_1d_dg_interval.mini new file mode 100644 index 0000000000000000000000000000000000000000..f053c7321cb76e5854498a60dbbf253facca52cc --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_1d_dg_interval.mini @@ -0,0 +1,8 @@ +__name = poisson_1d_dg_interval + +cells = 32 +extension = 1. + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_1d_dg_interval.ufl b/test/poisson/dimension-grid-variations/poisson_1d_dg_interval.ufl new file mode 100644 index 0000000000000000000000000000000000000000..f7775baf11b5225addc511a2016ddaac8ad0d9fe --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_1d_dg_interval.ufl @@ -0,0 +1,27 @@ +cell_type = "interval" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", on_intersection=True, cell_type=cell_type) + +V = FiniteElement("DG", cell_type, 1) + +u = TrialFunction(V) +v = TestFunction(V) + +n = FacetNormal(cell_type)('+') + +gamma = 1.0 +theta = 1.0 + +r = inner(grad(u), grad(v))*dx \ + + inner(n, avg(grad(u)))*jump(v)*dS \ + + gamma*jump(u)*jump(v)*dS \ + + theta*jump(u)*inner(avg(grad(v)), n)*dS \ + - inner(n, grad(u))*v*ds \ + + gamma*u*v*ds \ + - theta*u*inner(grad(v), n)*ds \ + - f*v*dx \ + + theta*g*inner(grad(v), n)*ds \ + - gamma*g*v*ds + +forms = [r] diff --git a/test/poisson/dimension-grid-variations/poisson_2d_cg_quadrilateral.mini b/test/poisson/dimension-grid-variations/poisson_2d_cg_quadrilateral.mini new file mode 100644 index 0000000000000000000000000000000000000000..d0ede6942e2f529eab9ba799de1376621e1917a7 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_cg_quadrilateral.mini @@ -0,0 +1,8 @@ +__name = poisson_2d_cg_quadrilateral + +cells = 32 32 +extension = 1. 1. + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_2d_cg_quadrilateral.ufl b/test/poisson/dimension-grid-variations/poisson_2d_cg_quadrilateral.ufl new file mode 100644 index 0000000000000000000000000000000000000000..7d43c7eb3ee86e180ad51443d2d4bb370e79e4c2 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_cg_quadrilateral.ufl @@ -0,0 +1,10 @@ +cell_type = "quadrilateral" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", cell_type=cell_type) + +V = FiniteElement("CG", cell_type, 1, dirichlet_expression=g) +u = TrialFunction(V) +v = TestFunction(V) + +forms = [(inner(grad(u), grad(v)) - f*v)*dx] diff --git a/test/poisson/dimension-grid-variations/poisson_2d_cg_triangle.mini b/test/poisson/dimension-grid-variations/poisson_2d_cg_triangle.mini new file mode 100644 index 0000000000000000000000000000000000000000..bf7adf0a3d966c4239e5d6861b3ea4187efa4f53 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_cg_triangle.mini @@ -0,0 +1,10 @@ +__name = poisson_2d_cg_triangle + +lowerleft = 0.0 0.0 +upperright = 1.0 1.0 +elements = 32 32 +elementType = simplical + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_2d_cg_triangle.ufl b/test/poisson/dimension-grid-variations/poisson_2d_cg_triangle.ufl new file mode 100644 index 0000000000000000000000000000000000000000..902a7f2a36f739b0088ded8b08d12f3d906832da --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_cg_triangle.ufl @@ -0,0 +1,8 @@ +f = Expression("return -2.0*x.size();") +g = Expression("return x.two_norm2();") + +V = FiniteElement("CG", "triangle", 1, dirichlet_expression=g) +u = TrialFunction(V) +v = TestFunction(V) + +forms = [(inner(grad(u), grad(v)) - f*v)*dx] \ No newline at end of file diff --git a/test/poisson/dimension-grid-variations/poisson_2d_dg_quadrilateral.mini b/test/poisson/dimension-grid-variations/poisson_2d_dg_quadrilateral.mini new file mode 100644 index 0000000000000000000000000000000000000000..4bea68343fc24ebeee0b4188d6b17004f086c47d --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_dg_quadrilateral.mini @@ -0,0 +1,8 @@ +__name = poisson_2d_dg_quadrilateral + +cells = 32 32 +extension = 1. 1. + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_2d_dg_quadrilateral.ufl b/test/poisson/dimension-grid-variations/poisson_2d_dg_quadrilateral.ufl new file mode 100644 index 0000000000000000000000000000000000000000..24dbccae56b8b93ae305b561e1ac5025d3a53bd7 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_dg_quadrilateral.ufl @@ -0,0 +1,27 @@ +cell_type = "quadrilateral" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", on_intersection=True, cell_type=cell_type) + +V = FiniteElement("DG", cell_type, 1) + +u = TrialFunction(V) +v = TestFunction(V) + +n = FacetNormal(cell_type)('+') + +gamma = 1.0 +theta = 1.0 + +r = inner(grad(u), grad(v))*dx \ + + inner(n, avg(grad(u)))*jump(v)*dS \ + + gamma*jump(u)*jump(v)*dS \ + + theta*jump(u)*inner(avg(grad(v)), n)*dS \ + - inner(n, grad(u))*v*ds \ + + gamma*u*v*ds \ + - theta*u*inner(grad(v), n)*ds \ + - f*v*dx \ + + theta*g*inner(grad(v), n)*ds \ + - gamma*g*v*ds + +forms = [r] diff --git a/test/poisson/dimension-grid-variations/poisson_2d_dg_triangle.mini b/test/poisson/dimension-grid-variations/poisson_2d_dg_triangle.mini new file mode 100644 index 0000000000000000000000000000000000000000..dedd6a3ffac42315ea150ad28849c50008fbe1ec --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_dg_triangle.mini @@ -0,0 +1,10 @@ +__name = poisson_2d_dg_triangle + +lowerleft = 0.0 0.0 +upperright = 1.0 1.0 +elements = 32 32 +elementType = simplical + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_2d_dg_triangle.ufl b/test/poisson/dimension-grid-variations/poisson_2d_dg_triangle.ufl new file mode 100644 index 0000000000000000000000000000000000000000..bf606f9cdb7b3726b457688db4921c4aacfa99ab --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_2d_dg_triangle.ufl @@ -0,0 +1,26 @@ +f = Expression("return -2.0*x.size();") +g = Expression("return x.two_norm2();", on_intersection=True) + +cell = triangle +V = FiniteElement("DG", cell, 1) + +u = TrialFunction(V) +v = TestFunction(V) + +n = FacetNormal(cell)('+') + +gamma = 1.0 +theta = 1.0 + +r = inner(grad(u), grad(v))*dx \ + + inner(n, avg(grad(u)))*jump(v)*dS \ + + gamma*jump(u)*jump(v)*dS \ + + theta*jump(u)*inner(avg(grad(v)), n)*dS \ + - inner(n, grad(u))*v*ds \ + + gamma*u*v*ds \ + - theta*u*inner(grad(v), n)*ds \ + - f*v*dx \ + + theta*g*inner(grad(v), n)*ds \ + - gamma*g*v*ds + +forms = [r] diff --git a/test/poisson/dimension-grid-variations/poisson_3d_cg_hexahedron.mini b/test/poisson/dimension-grid-variations/poisson_3d_cg_hexahedron.mini new file mode 100644 index 0000000000000000000000000000000000000000..ee7893caae615184a6e8cca678f0e600f21bfdaa --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_cg_hexahedron.mini @@ -0,0 +1,8 @@ +__name = poisson_3d_cg_hexahedron + +cells = 8 8 8 +extension = 1. 1. 1. + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_3d_cg_hexahedron.ufl b/test/poisson/dimension-grid-variations/poisson_3d_cg_hexahedron.ufl new file mode 100644 index 0000000000000000000000000000000000000000..5c0091d74b1e9349fd6631b18b2ffdfbd42e990d --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_cg_hexahedron.ufl @@ -0,0 +1,10 @@ +cell_type = "hexahedron" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", cell_type=cell_type) + +V = FiniteElement("CG", cell_type, 1, dirichlet_expression=g) +u = TrialFunction(V) +v = TestFunction(V) + +forms = [(inner(grad(u), grad(v)) - f*v)*dx] \ No newline at end of file diff --git a/test/poisson/dimension-grid-variations/poisson_3d_cg_tetrahedron.mini b/test/poisson/dimension-grid-variations/poisson_3d_cg_tetrahedron.mini new file mode 100644 index 0000000000000000000000000000000000000000..6a788f16f67aba18d73c390b00cb5af8dbcb5ad3 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_cg_tetrahedron.mini @@ -0,0 +1,10 @@ +__name = poisson_3d_cg_tetrahedron + +lowerleft = 0.0 0.0 0.0 +upperright = 1.0 1.0 1.1 +elements = 8 8 8 +elementType = simplical + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_3d_cg_tetrahedron.ufl b/test/poisson/dimension-grid-variations/poisson_3d_cg_tetrahedron.ufl new file mode 100644 index 0000000000000000000000000000000000000000..1456671d43ce0de2d3bfbf8d1ca13fda9f8e0733 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_cg_tetrahedron.ufl @@ -0,0 +1,10 @@ +cell_type = "tetrahedron" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", cell_type=cell_type) + +V = FiniteElement("CG", "tetrahedron", 1, dirichlet_expression=g) +u = TrialFunction(V) +v = TestFunction(V) + +forms = [(inner(grad(u), grad(v)) - f*v)*dx] \ No newline at end of file diff --git a/test/poisson/dimension-grid-variations/poisson_3d_dg_hexahedron.mini b/test/poisson/dimension-grid-variations/poisson_3d_dg_hexahedron.mini new file mode 100644 index 0000000000000000000000000000000000000000..82c8faec2c8b8d23f15d09cbaa56abcf7eb385b5 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_dg_hexahedron.mini @@ -0,0 +1,8 @@ +__name = poisson_3d_dg_hexahedron + +cells = 8 8 8 +extension = 1. 1. 1. + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_3d_dg_hexahedron.ufl b/test/poisson/dimension-grid-variations/poisson_3d_dg_hexahedron.ufl new file mode 100644 index 0000000000000000000000000000000000000000..3a410e3011596ab6372028e1e705d26cd5747216 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_dg_hexahedron.ufl @@ -0,0 +1,27 @@ +cell_type = "hexahedron" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", on_intersection=True, cell_type=cell_type) + +V = FiniteElement("DG", cell_type, 1) + +u = TrialFunction(V) +v = TestFunction(V) + +n = FacetNormal(cell_type)('+') + +gamma = 1.0 +theta = 1.0 + +r = inner(grad(u), grad(v))*dx \ + + inner(n, avg(grad(u)))*jump(v)*dS \ + + gamma*jump(u)*jump(v)*dS \ + + theta*jump(u)*inner(avg(grad(v)), n)*dS \ + - inner(n, grad(u))*v*ds \ + + gamma*u*v*ds \ + - theta*u*inner(grad(v), n)*ds \ + - f*v*dx \ + + theta*g*inner(grad(v), n)*ds \ + - gamma*g*v*ds + +forms = [r] diff --git a/test/poisson/dimension-grid-variations/poisson_3d_dg_tetrahedron.mini b/test/poisson/dimension-grid-variations/poisson_3d_dg_tetrahedron.mini new file mode 100644 index 0000000000000000000000000000000000000000..16f1adaffaebb6ab4af342789a6c617ed73a9d8b --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_dg_tetrahedron.mini @@ -0,0 +1,10 @@ +__name = poisson_3d_dg_tetrahedron + +lowerleft = 0.0 0.0 0.0 +upperright = 1.0 1.0 1.1 +elements = 8 8 8 +elementType = simplical + +[wrapper.vtkcompare] +name = {__name} +extension = vtu diff --git a/test/poisson/dimension-grid-variations/poisson_3d_dg_tetrahedron.ufl b/test/poisson/dimension-grid-variations/poisson_3d_dg_tetrahedron.ufl new file mode 100644 index 0000000000000000000000000000000000000000..a2d8135baa6d8f6556dcff607989af38a9ffa826 --- /dev/null +++ b/test/poisson/dimension-grid-variations/poisson_3d_dg_tetrahedron.ufl @@ -0,0 +1,27 @@ +cell_type = "tetrahedron" + +f = Expression("return -2.0*x.size();", cell_type=cell_type) +g = Expression("return x.two_norm2();", on_intersection=True, cell_type=cell_type) + +V = FiniteElement("DG", cell_type, 1) + +u = TrialFunction(V) +v = TestFunction(V) + +n = FacetNormal(cell_type)('+') + +gamma = 1.0 +theta = 1.0 + +r = inner(grad(u), grad(v))*dx \ + + inner(n, avg(grad(u)))*jump(v)*dS \ + + gamma*jump(u)*jump(v)*dS \ + + theta*jump(u)*inner(avg(grad(v)), n)*dS \ + - inner(n, grad(u))*v*ds \ + + gamma*u*v*ds \ + - theta*u*inner(grad(v), n)*ds \ + - f*v*dx \ + + theta*g*inner(grad(v), n)*ds \ + - gamma*g*v*ds + +forms = [r]