def test_compute_shape_parametrization_gradient_graetz():
    shape_parametrization_expression = [
        ("x[0]", "x[1]"), # subdomain 1
        ("mu[0]*(x[0] - 1) + 1", "x[1]") # subdomain 2
    ]
    shape_parametrization_gradient_expression = [compute_shape_parametrization_gradient(expression_on_subdomain) for expression_on_subdomain in shape_parametrization_expression]
    # Auxiliary symbolic quantities
    x = MatrixSymbol("x", 2, 1)
    mu = MatrixSymbol("mu", 1, 1)
    # Start checks
    assert len(shape_parametrization_gradient_expression) == 2
    # Check subdomain 1
    assert len(shape_parametrization_gradient_expression[0]) == 2
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][X], "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][Y], "0", x, mu)
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][X], "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][Y], "1", x, mu)
    # Check subdomain 2
    assert len(shape_parametrization_gradient_expression[1]) == 2
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][X], "mu[0]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][Y], "0", x, mu)
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][X], "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][Y], "1", x, mu)
def test_compute_shape_parametrization_gradient_navier_stokes():
    shape_parametrization_expression = [
        ("x[0]", "x[1]"), # subdomain 1 bottom
        ("x[0]", "x[1]"), # subdomain 1 top
        ("x[0]", "0.5*mu[1]*x[1] - 1.0*mu[1] + 2.0"), # subdomain 2 bottom
        ("x[0]", "0.5*mu[1]*x[1] - 1.0*mu[1] + 2.0") # subdomain 2 top
    ]
    shape_parametrization_gradient_expression = [compute_shape_parametrization_gradient(expression_on_subdomain) for expression_on_subdomain in shape_parametrization_expression]
    # Auxiliary symbolic quantities
    x = MatrixSymbol("x", 2, 1)
    mu = MatrixSymbol("mu", 2, 1)
    # Start checks
    assert len(shape_parametrization_gradient_expression) == 4
    # Check subdomain 1
    assert len(shape_parametrization_gradient_expression[0]) == 2
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][X], "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][Y], "0", x, mu)
    assert len(shape_parametrization_gradient_expression[0][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][X], "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][Y], "1", x, mu)
    # Check subdomain 2
    assert len(shape_parametrization_gradient_expression[1]) == 2
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][X], "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][Y], "0", x, mu)
    assert len(shape_parametrization_gradient_expression[1][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][X], "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][Y], "1", x, mu)
    # Check subdomain 3
    assert len(shape_parametrization_gradient_expression[2]) == 2
    assert len(shape_parametrization_gradient_expression[2][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[2][X][X], "1.0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[2][X][Y], "0", x, mu)
    assert len(shape_parametrization_gradient_expression[2][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[2][Y][X], "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[2][Y][Y], "0.5*mu[1]", x, mu)
    # Check subdomain 4
    assert len(shape_parametrization_gradient_expression[3]) == 2
    assert len(shape_parametrization_gradient_expression[3][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][X], "1.0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][Y], "0", x, mu)
    assert len(shape_parametrization_gradient_expression[3][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][X], "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][Y], "0.5*mu[1]", x, mu)
def test_compute_shape_parametrization_gradient_stokes_optimal_dirichlet_boundary_control(
):
    shape_parametrization_expression = [
        ("x[0]", "x[1]"),  # subdomain 1
        ("0.9 - 9.0 * mu[0] + 10.0 * mu[0] * x[0] ", "x[1]"),  # subdomain 2
        ("0.9 - 9.0 * mu[0] + 10.0 * mu[0] * x[0] ", "x[1]"),  # subdomain 3
        ("0.9 - 9.0 * mu[0] + 10.0 * mu[0] * x[0] ", "x[1]"),  # subdomain 4
        ("0.9 - 9.0 * mu[0] + 10.0 * mu[0] * x[0] ", "x[1]"),  # subdomain 5
        ("2.25 * mu[0] + x[0] * (- 1.25 * mu[0] + 1.125) - 0.225 ",
         "x[1]"),  # subdomain 6
        ("2.0 * mu[0] + x[0] *(- mu[0] + 1.1) + x[1] * (-mu[0] + 0.1) - 0.2 ",
         "x[1]"),  # subdomain 7
        ("2.25 * mu[0] + x[0] * (- 1.25 * mu[0] + 1.125) - 0.225 ",
         "x[1]"),  # subdomain 8
        ("mu[0] + x[0] * (- mu[0] + 1.1) + x[1] * (mu[0] - 0.1) - 0.1",
         "x[1]"),  # subdomain 9
        ("x[0]", "x[1]"),  # subdomain 10
        ("x[0]", "x[1]"),  # subdomain 11
        ("2.25 * mu[0] + x[0] * (- 1.25 * mu[0] + 1.125) - 0.225 ",
         "x[1]"),  # subdomain 12
        ("2.25 * mu[0] + x[0] * (- 1.25 * mu[0] + 1.125) - 0.225 ", "x[1]"
         )  # subdomain 13
    ]
    shape_parametrization_gradient_expression = [
        compute_shape_parametrization_gradient(expression_on_subdomain)
        for expression_on_subdomain in shape_parametrization_expression
    ]
    # Auxiliary symbolic quantities
    x = MatrixSymbol("x", 2, 1)
    mu = MatrixSymbol("mu", 1, 1)
    # Start checks
    assert len(shape_parametrization_gradient_expression) == 13
    # Check subdomain 1
    assert len(shape_parametrization_gradient_expression[0]) == 2
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][X],
                          "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[0][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][Y],
                          "1", x, mu)
    # Check subdomain 2
    assert len(shape_parametrization_gradient_expression[1]) == 2
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][X],
                          "10.0 * mu[0]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[1][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][Y],
                          "1", x, mu)
    # Check subdomain 3
    assert len(shape_parametrization_gradient_expression[2]) == 2
    assert len(shape_parametrization_gradient_expression[2][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[2][X][X],
                          "10.0 * mu[0]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[2][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[2][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[2][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[2][Y][Y],
                          "1", x, mu)
    # Check subdomain 4
    assert len(shape_parametrization_gradient_expression[3]) == 2
    assert len(shape_parametrization_gradient_expression[3][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][X],
                          "10.0 * mu[0]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[3][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][Y],
                          "1", x, mu)
    # Check subdomain 5
    assert len(shape_parametrization_gradient_expression[4]) == 2
    assert len(shape_parametrization_gradient_expression[4][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[4][X][X],
                          "10.0 * mu[0]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[4][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[4][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[4][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[4][Y][Y],
                          "1", x, mu)
    # Check subdomain 6
    assert len(shape_parametrization_gradient_expression[5]) == 2
    assert len(shape_parametrization_gradient_expression[5][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[5][X][X],
                          "- 1.25 * mu[0] + 1.125", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[5][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[5][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[5][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[5][Y][Y],
                          "1", x, mu)
    # Check subdomain 7
    assert len(shape_parametrization_gradient_expression[6]) == 2
    assert len(shape_parametrization_gradient_expression[6][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[6][X][X],
                          "- mu[0] + 1.1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[6][X][Y],
                          "- mu[0] + 0.1", x, mu)
    assert len(shape_parametrization_gradient_expression[6][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[6][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[6][Y][Y],
                          "1", x, mu)
    # Check subdomain 8
    assert len(shape_parametrization_gradient_expression[7]) == 2
    assert len(shape_parametrization_gradient_expression[7][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[7][X][X],
                          "-1.25 * mu[0] + 1.125", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[7][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[7][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[7][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[7][Y][Y],
                          "1", x, mu)
    # Check subdomain 9
    assert len(shape_parametrization_gradient_expression[8]) == 2
    assert len(shape_parametrization_gradient_expression[8][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[8][X][X],
                          "- mu[0] + 1.1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[8][X][Y],
                          "mu[0] - 0.1", x, mu)
    assert len(shape_parametrization_gradient_expression[8][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[8][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[8][Y][Y],
                          "1", x, mu)
    # Check subdomain 10
    assert len(shape_parametrization_gradient_expression[9]) == 2
    assert len(shape_parametrization_gradient_expression[9][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[9][X][X],
                          "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[9][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[9][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[9][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[9][Y][Y],
                          "1", x, mu)
    # Check subdomain 11
    assert len(shape_parametrization_gradient_expression[10]) == 2
    assert len(shape_parametrization_gradient_expression[10][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[10][X][X],
                          "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[10][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[10][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[10][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[10][Y][Y],
                          "1", x, mu)
    # Check subdomain 12
    assert len(shape_parametrization_gradient_expression[11]) == 2
    assert len(shape_parametrization_gradient_expression[11][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[11][X][X],
                          "- 1.25 * mu[0] + 1.125", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[11][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[11][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[11][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[11][Y][Y],
                          "1", x, mu)
    # Check subdomain 13
    assert len(shape_parametrization_gradient_expression[12]) == 2
    assert len(shape_parametrization_gradient_expression[12][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[12][X][X],
                          "- 1.25 * mu[0] + 1.125", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[12][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[12][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[12][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[12][Y][Y],
                          "1", x, mu)
def test_compute_shape_parametrization_gradient_stokes():
    shape_parametrization_expression = [
        ("mu[4] * x[0] + mu[1] - mu[4]",
         "mu[4] * tan(mu[5]) * x[0] + mu[0] * x[1] + mu[2] - tan(mu[5]) - mu[0]"
         ),  # subdomain 1
        ("mu[4] * x[0] + mu[1] - mu[4]",
         "mu[4] * tan(mu[5]) * x[0] + mu[0] * x[1] + mu[2] - tan(mu[5]) - mu[0]"
         ),  # subdomain 2
        ("mu[1] * x[0]",
         "mu[3] * x[1] + mu[2] + mu[0] - 2*mu[3]"),  # subdomain 3
        ("mu[1] * x[0]",
         "mu[3] * x[1] + mu[2] + mu[0] - 2*mu[3]"),  # subdomain 4
        ("mu[1] * x[0]", "mu[0] * x[1] + mu[2] - mu[0]"),  # subdomain 5
        ("mu[1] * x[0]", "mu[0] * x[1] + mu[2] - mu[0]"),  # subdomain 6
        ("mu[1] * x[0]", "mu[2] * x[1]"),  # subdomain 7
        ("mu[1] * x[0]", "mu[2] * x[1]"),  # subdomain 8
    ]
    shape_parametrization_gradient_expression = [
        compute_shape_parametrization_gradient(expression_on_subdomain)
        for expression_on_subdomain in shape_parametrization_expression
    ]
    # Auxiliary symbolic quantities
    x = MatrixSymbol("x", 2, 1)
    mu = MatrixSymbol("mu", 6, 1)
    # Start checks
    assert len(shape_parametrization_gradient_expression) == 8
    # Check subdomain 1
    assert len(shape_parametrization_gradient_expression[0]) == 2
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][X],
                          "mu[4]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][X],
                          "mu[4] * tan(mu[5])", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[0][Y][Y],
                          "mu[0]", x, mu)
    # Check subdomain 2
    assert len(shape_parametrization_gradient_expression[1]) == 2
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][X],
                          "mu[4]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][X],
                          "mu[4] * tan(mu[5])", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][Y],
                          "mu[0]", x, mu)
    # Check subdomain 3
    assert len(shape_parametrization_gradient_expression[2]) == 2
    assert len(shape_parametrization_gradient_expression[2][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[2][X][X],
                          "mu[1]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[2][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[2][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[2][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[2][Y][Y],
                          "mu[3]", x, mu)
    # Check subdomain 4
    assert len(shape_parametrization_gradient_expression[3]) == 2
    assert len(shape_parametrization_gradient_expression[3][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][X],
                          "mu[1]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[3][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][Y],
                          "mu[3]", x, mu)
    # Check subdomain 5
    assert len(shape_parametrization_gradient_expression[4]) == 2
    assert len(shape_parametrization_gradient_expression[4][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[4][X][X],
                          "mu[1]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[4][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[4][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[4][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[4][Y][Y],
                          "mu[0]", x, mu)
    # Check subdomain 6
    assert len(shape_parametrization_gradient_expression[5]) == 2
    assert len(shape_parametrization_gradient_expression[5][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[5][X][X],
                          "mu[1]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[5][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[5][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[5][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[5][Y][Y],
                          "mu[0]", x, mu)
    # Check subdomain 7
    assert len(shape_parametrization_gradient_expression[6]) == 2
    assert len(shape_parametrization_gradient_expression[6][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[6][X][X],
                          "mu[1]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[6][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[6][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[6][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[6][Y][Y],
                          "mu[2]", x, mu)
    # Check subdomain 8
    assert len(shape_parametrization_gradient_expression[7]) == 2
    assert len(shape_parametrization_gradient_expression[7][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[7][X][X],
                          "mu[1]", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[7][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[7][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[7][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[7][Y][Y],
                          "mu[2]", x, mu)
def test_compute_shape_parametrization_gradient_hole_rotation():
    shape_parametrization_expression = [
        ("- 2 * sqrt(2.0) * cos(mu[0]) + x[0] * (sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2)"
         +
         "+ x[1] * (- sqrt(2.0) * sin(mu[0]) / 2 - 3 * sqrt(2.0) * cos(mu[0]) / 2 + 2) + 2",
         "- 2 * sqrt(2.0) * sin(mu[0]) + x[0] * (sqrt(2.0) * sin(mu[0]) / 2 - sqrt(2.0) * cos(mu[0]) / 2)"
         +
         "+ x[1] * (- 3 * sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2 + 2) + 2"
         ),  # subdomain 1
        ("2 * sqrt(2.0) * sin(mu[0]) + x[0] + x[1] * (sqrt(2.0) * sin(mu[0]) - 1) - 2",
         "- 2 * sqrt(2.0) * cos(mu[0]) + x[1] * (- sqrt(2.0) * cos(mu[0]) + 2) + 2"
         ),  # subdomain 2
        ("- 2 * sqrt(2.0) * cos(mu[0]) + x[0] * (sqrt(2.0) * sin(mu[0]) / 2 - 3 * sqrt(2.0) * cos(mu[0]) / 2 + 2)"
         +
         "+ x[1] * (- sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2) + 2",
         "- 2 * sqrt(2.0) * sin(mu[0]) + x[0] * (- 3 * sqrt(2.0) * sin(mu[0]) / 2 - sqrt(2.0) * cos(mu[0]) / 2 + 2)"
         +
         "+ x[1] * (sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2) + 2"
         ),  # subdomain 3
        ("- 2 * sqrt(2.0) * sin(mu[0]) + x[0] * (- sqrt(2.0) * sin(mu[0]) + 2) + 2",
         "2 * sqrt(2.0) * cos(mu[0]) + x[0] * (sqrt(2.0) * cos(mu[0]) - 1) + x[1] - 2"
         ),  # subdomain 4
        ("2 * sqrt(2.0) * sin(mu[0]) + x[0]* (- 3 * sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2 + 2)"
         +
         "+ x[1] * (- sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2) - 2",
         "- 2 * sqrt(2.0) * cos(mu[0]) + x[0] * (sqrt(2.0) * sin(mu[0]) / 2 + 3 * sqrt(2.0) * cos(mu[0]) / 2 - 2)"
         +
         "+ x[1] * (sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2) + 2"
         ),  # subdomain 5
        ("2 * sqrt(2.0) * cos(mu[0]) + x[0] * (- sqrt(2.0) * cos(mu[0]) + 2) - 2",
         "2 * sqrt(2.0) * sin(mu[0]) + x[0] * (- sqrt(2.0) * sin(mu[0]) + 1) + x[1] - 2"
         ),  # subdomain 6
        ("- 2 * sqrt(2.0) * sin(mu[0]) + x[0] * (sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2)"
         +
         "+ x[1] * (3 * sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2 - 2) + 2",
         "2 * sqrt(2.0) * cos(mu[0]) + x[0] * (sqrt(2.0) * sin(mu[0]) / 2 - sqrt(2.0) * cos(mu[0]) / 2)"
         +
         "+ x[1] * (sqrt(2.0) * sin(mu[0]) / 2 - 3 * sqrt(2.0) * cos(mu[0]) / 2 + 2) - 2"
         ),  # subdomain 7
        ("2 * sqrt(2.0) * cos(mu[0]) + x[0] + x[1] * (- sqrt(2.0) * cos(mu[0]) + 1) - 2",
         "2 * sqrt(2.0) * sin(mu[0]) + x[1] * (- sqrt(2.0) * sin(mu[0]) + 2) - 2"
         )  # subdomain 8
    ]
    shape_parametrization_gradient_expression = [
        compute_shape_parametrization_gradient(expression_on_subdomain)
        for expression_on_subdomain in shape_parametrization_expression
    ]
    # Auxiliary symbolic quantities
    x = MatrixSymbol("x", 2, 1)
    mu = MatrixSymbol("mu", 1, 1)
    # Start checks
    assert len(shape_parametrization_gradient_expression) == 8
    # Check subdomain 1
    assert len(shape_parametrization_gradient_expression[0]) == 2
    assert len(shape_parametrization_gradient_expression[0][X]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[0][X][X],
        "sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[0][X][Y],
        "- sqrt(2.0) * sin(mu[0]) / 2 - 3 * sqrt(2.0) * cos(mu[0]) / 2 + 2", x,
        mu)
    assert len(shape_parametrization_gradient_expression[0][Y]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[0][Y][X],
        "sqrt(2.0) * sin(mu[0]) / 2 - sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[0][Y][Y],
        "-3 * sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2 + 2", x,
        mu)
    # Check subdomain 2
    assert len(shape_parametrization_gradient_expression[1]) == 2
    assert len(shape_parametrization_gradient_expression[1][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][X],
                          "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][X][Y],
                          "sqrt(2.0) * sin(mu[0]) - 1", x, mu)
    assert len(shape_parametrization_gradient_expression[1][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[1][Y][Y],
                          "- sqrt(2.0) * cos(mu[0]) + 2", x, mu)
    # Check subdomain 3
    assert len(shape_parametrization_gradient_expression[2]) == 2
    assert len(shape_parametrization_gradient_expression[2][X]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[2][X][X],
        "sqrt(2.0) * sin(mu[0]) / 2 - 3 * sqrt(2.0) * cos(mu[0]) / 2 + 2", x,
        mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[2][X][Y],
        "- sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    assert len(shape_parametrization_gradient_expression[2][Y]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[2][Y][X],
        "- 3 * sqrt(2.0) * sin(mu[0]) / 2 - sqrt(2.0) * cos(mu[0]) / 2 + 2", x,
        mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[2][Y][Y],
        "sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    # Check subdomain 4
    assert len(shape_parametrization_gradient_expression[3]) == 2
    assert len(shape_parametrization_gradient_expression[3][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][X],
                          "- sqrt(2.0) * sin(mu[0]) + 2", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[3][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][X],
                          "sqrt(2.0) * cos(mu[0]) - 1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[3][Y][Y],
                          "1", x, mu)
    # Check subdomain 5
    assert len(shape_parametrization_gradient_expression[4]) == 2
    assert len(shape_parametrization_gradient_expression[4][X]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[4][X][X],
        "- 3 * sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2 + 2", x,
        mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[4][X][Y],
        "- sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    assert len(shape_parametrization_gradient_expression[4][Y]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[4][Y][X],
        "sqrt(2.0) * sin(mu[0]) / 2 + 3 * sqrt(2.0) * cos(mu[0]) / 2 - 2", x,
        mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[4][Y][Y],
        "sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    # Check subdomain 6
    assert len(shape_parametrization_gradient_expression[5]) == 2
    assert len(shape_parametrization_gradient_expression[5][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[5][X][X],
                          "- sqrt(2.0) * cos(mu[0]) + 2", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[5][X][Y],
                          "0", x, mu)
    assert len(shape_parametrization_gradient_expression[5][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[5][Y][X],
                          "- sqrt(2.0) * sin(mu[0]) + 1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[5][Y][Y],
                          "1", x, mu)
    # Check subdomain 7
    assert len(shape_parametrization_gradient_expression[6]) == 2
    assert len(shape_parametrization_gradient_expression[6][X]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[6][X][X],
        "sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[6][X][Y],
        "3 * sqrt(2.0) * sin(mu[0]) / 2 + sqrt(2.0) * cos(mu[0]) / 2 - 2", x,
        mu)
    assert len(shape_parametrization_gradient_expression[6][Y]) == 2
    assert symbolic_equal(
        shape_parametrization_gradient_expression[6][Y][X],
        "sqrt(2.0) * sin(mu[0]) / 2 - sqrt(2.0) * cos(mu[0]) / 2", x, mu)
    assert symbolic_equal(
        shape_parametrization_gradient_expression[6][Y][Y],
        "sqrt(2.0) * sin(mu[0]) / 2 - 3 * sqrt(2.0) * cos(mu[0]) / 2 + 2", x,
        mu)
    # Check subdomain 8
    assert len(shape_parametrization_gradient_expression[7]) == 2
    assert len(shape_parametrization_gradient_expression[7][X]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[7][X][X],
                          "1", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[7][X][Y],
                          "- sqrt(2.0) * cos(mu[0]) + 1", x, mu)
    assert len(shape_parametrization_gradient_expression[7][Y]) == 2
    assert symbolic_equal(shape_parametrization_gradient_expression[7][Y][X],
                          "0", x, mu)
    assert symbolic_equal(shape_parametrization_gradient_expression[7][Y][Y],
                          "- sqrt(2.0) * sin(mu[0]) + 2", x, mu)