def test_affine_shape_parametrization_from_vertices_mapping_hole(): filename = "vertices_mapping_hole" assert VerticesMappingIO.exists_file(data_dir, filename) vertices_mappings = VerticesMappingIO.load_file(data_dir, filename) shape_parametrization_expression = [ affine_shape_parametrization_from_vertices_mapping(2, vertices_mapping) for vertices_mapping in vertices_mappings] # Auxiliary symbolic quantities x = MatrixSymbol("x", 2, 1) mu = MatrixSymbol("mu", 2, 1) # Start checks assert len(shape_parametrization_expression) == 8 # Check subdomain 1 assert len(shape_parametrization_expression[0]) == 2 assert symbolic_equal( shape_parametrization_expression[0][X], "2 - 2 * mu[0] + mu[0] * x[0] + (2 - 2 * mu[0]) * x[1]", x, mu) assert symbolic_equal( shape_parametrization_expression[0][Y], "2 - 2 * mu[1] + (2 - mu[1]) * x[1]", x, mu) # Check subdomain 2 assert len(shape_parametrization_expression[1]) == 2 assert symbolic_equal( shape_parametrization_expression[1][X], "2 * mu[0]- 2 + x[0] + (mu[0] - 1) * x[1]", x, mu) assert symbolic_equal( shape_parametrization_expression[1][Y], "2 - 2 * mu[1] + (2 - mu[1]) * x[1]", x, mu) # Check subdomain 3 assert len(shape_parametrization_expression[2]) == 2 assert symbolic_equal( shape_parametrization_expression[2][X], "2 - 2 * mu[0] + (2 - mu[0]) * x[0]", x, mu) assert symbolic_equal( shape_parametrization_expression[2][Y], "2 - 2 * mu[1] + (2- 2*mu[1]) * x[0] + mu[1] * x[1]", x, mu) # Check subdomain 4 assert len(shape_parametrization_expression[3]) == 2 assert symbolic_equal( shape_parametrization_expression[3][X], "2 - 2 * mu[0] + (2 - mu[0]) * x[0]", x, mu) assert symbolic_equal( shape_parametrization_expression[3][Y], "2 * mu[1] - 2 + (mu[1] - 1) * x[0] + x[1]", x, mu) # Check subdomain 5 assert len(shape_parametrization_expression[4]) == 2 assert symbolic_equal( shape_parametrization_expression[4][X], "2 * mu[0] - 2 + (2 - mu[0]) * x[0]", x, mu) assert symbolic_equal( shape_parametrization_expression[4][Y], "2 - 2 * mu[1] + (2 * mu[1]- 2) * x[0] + mu[1] * x[1]", x, mu) # Check subdomain 6 assert len(shape_parametrization_expression[5]) == 2 assert symbolic_equal( shape_parametrization_expression[5][X], "2 * mu[0] - 2 + (2 - mu[0]) * x[0]", x, mu) assert symbolic_equal( shape_parametrization_expression[5][Y], "2 * mu[1] - 2 + (1 - mu[1]) * x[0] + x[1]", x, mu) # Check subdomain 7 assert len(shape_parametrization_expression[6]) == 2 assert symbolic_equal( shape_parametrization_expression[6][X], "2 - 2 * mu[0] + mu[0] * x[0] + (2 * mu[0] - 2) * x[1]", x, mu) assert symbolic_equal( shape_parametrization_expression[6][Y], "2 * mu[1] - 2 + (2 - mu[1]) * x[1]", x, mu) # Check subdomain 8 assert len(shape_parametrization_expression[7]) == 2 assert symbolic_equal( shape_parametrization_expression[7][X], "2 * mu[0] - 2 + x[0] + (1 - mu[0]) * x[1]", x, mu) assert symbolic_equal( shape_parametrization_expression[7][Y], "2 * mu[1] - 2 + (2 - mu[1]) * x[1]", x, mu)
def test_affine_shape_parametrization_from_vertices_mapping_navier_stokes(): vertices_mappings = [ { ("0.0", "5.0"): ("0.0", "5.0"), ("0.0", "2.0"): ("0.0", "2.0"), ("22.0", "2.0"): ("22.0", "2.0") }, # subdomain 1 bottom { ("22.0", "2.0"): ("22.0", "2.0"), ("22.0", "5.0"): ("22.0", "5.0"), ("0.0", "5.0"): ("0.0", "5.0") }, # subdomain 1 top { ("4.0", "2.0"): ("4.0", "2.0"), ("4.0", "0.0"): ("4.0", "2.0 - mu[1]"), ("22.0", "0.0"): ("22.0", "2.0 - mu[1]") }, # subdomain 2 bottom { ("22.0", "0.0"): ("22.0", "2.0 - mu[1]"), ("22.0", "2.0"): ("22.0", "2.0"), ("4.0", "2.0"): ("4.0", "2.0") } # subdomain 2 top ] shape_parametrization_expression = [ affine_shape_parametrization_from_vertices_mapping( 2, vertices_mapping) for vertices_mapping in vertices_mappings ] # Auxiliary symbolic quantities x = MatrixSymbol("x", 2, 1) mu = MatrixSymbol("mu", 2, 1) # Start checks assert len(shape_parametrization_expression) is 4 # Check subdomain 1 top assert len(shape_parametrization_expression[0]) is 2 assert symbolic_equal(shape_parametrization_expression[0][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[0][Y], "x[1]", x, mu) # Check subdomain 1 bottom assert len(shape_parametrization_expression[1]) is 2 assert symbolic_equal(shape_parametrization_expression[1][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[1][Y], "x[1]", x, mu) # Check subdomain 2 top assert len(shape_parametrization_expression[2]) is 2 assert symbolic_equal(shape_parametrization_expression[2][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[2][Y], "0.5*mu[1]*x[1] - 1.0*mu[1] + 2.0", x, mu) # Check subdomain 2 bottom assert len(shape_parametrization_expression[3]) is 2 assert symbolic_equal(shape_parametrization_expression[3][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[3][Y], "0.5*mu[1]*x[1] - 1.0*mu[1]+ 2.0", x, mu)
def test_affine_shape_parametrization_from_vertices_mapping_graetz(): vertices_mappings = [ { ("0", "0"): ("0", "0"), ("0", "1"): ("0", "1"), ("1", "1"): ("1", "1") }, # subdomain 1 top { ("0", "0"): ("0", "0"), ("1", "0"): ("1", "0"), ("1", "1"): ("1", "1") }, # subdomain 1 bottom { ("1", "0"): ("1", "0"), ("1", "1"): ("1", "1"), ("2", "1"): ("1 + mu[0]", "1") }, # subdomain 2 top { ("1", "0"): ("1", "0"), ("2", "0"): ("1 + mu[0]", "0"), ("2", "1"): ("1 + mu[0]", "1") } # subdomain 2 bottom ] shape_parametrization_expression = [ affine_shape_parametrization_from_vertices_mapping( 2, vertices_mapping) for vertices_mapping in vertices_mappings ] # Auxiliary symbolic quantities x = MatrixSymbol("x", 2, 1) mu = MatrixSymbol("mu", 1, 1) # Start checks assert len(shape_parametrization_expression) is 4 # Check subdomain 1 top assert len(shape_parametrization_expression[0]) is 2 assert symbolic_equal(shape_parametrization_expression[0][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[0][Y], "x[1]", x, mu) # Check subdomain 1 bottom assert len(shape_parametrization_expression[1]) is 2 assert symbolic_equal(shape_parametrization_expression[1][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[1][Y], "x[1]", x, mu) # Check subdomain 2 top assert len(shape_parametrization_expression[2]) is 2 assert symbolic_equal(shape_parametrization_expression[2][X], "mu[0]*(x[0] - 1) + 1", x, mu) assert symbolic_equal(shape_parametrization_expression[2][Y], "x[1]", x, mu) # Check subdomain 2 bottom assert len(shape_parametrization_expression[3]) is 2 assert symbolic_equal(shape_parametrization_expression[3][X], "mu[0]*(x[0] - 1) + 1", x, mu) assert symbolic_equal(shape_parametrization_expression[3][Y], "x[1]", x, mu)
def test_affine_shape_parametrization_from_vertices_mapping_stokes_optimal_dirichlet_boundary_control( ): vertices_mappings = [ "identity", # subdomain 1 { ("0.9", "0.0"): ("0.9", "0.0"), ("1.0", "0.0"): ("0.9+mu[0]", "0.0"), ("0.9", "0.4"): ("0.9", "0.4") }, # subdomain 2 { ("1.0", "0.0"): ("0.9+mu[0]", "0.0"), ("1.0", "0.4"): ("0.9+mu[0]", "0.4"), ("0.9", "0.4"): ("0.9", "0.4") }, # subdomain 3 { ("0.9", "0.6"): ("0.9", "0.6"), ("1.0", "0.6"): ("0.9+mu[0]", "0.6"), ("0.9", "1.0"): ("0.9", "1.0") }, # subdomain 4 { ("1.0", "0.6"): ("0.9+mu[0]", "0.6"), ("1.0", "1.0"): ("0.9+mu[0]", "1.0"), ("0.9", "1.0"): ("0.9", "1.0") }, # subdomain 5 { ("1.0", "0.0"): ("0.9+mu[0]", "0.0"), ("1.8", "0.2"): ("1.8", "0.2"), ("1.0", "0.4"): ("0.9+mu[0]", "0.4") }, # subdomain 6 { ("1.0", "0.0"): ("0.9+mu[0]", "0.0"), ("2.0", "0.0"): ("2.0", "0.0"), ("1.8", "0.2"): ("1.8", "0.2") }, # subdomain 7 { ("1.0", "0.6"): ("0.9+mu[0]", "0.6"), ("1.8", "0.8"): ("1.8", "0.8"), ("1.0", "1.0"): ("0.9+mu[0]", "1.0") }, # subdomain 8 { ("1.0", "1.0"): ("0.9+mu[0]", "1.0"), ("1.8", "0.8"): ("1.8", "0.8"), ("2.0", "1.0"): ("2.0", "1.0") }, # subdomain 9 { ("1.8", "0.8"): ("1.8", "0.8"), ("2.0", "0.0"): ("2.0", "0.0"), ("2.0", "1.0"): ("2.0", "1.0") }, # subdomain 10 { ("1.8", "0.8"): ("1.8", "0.8"), ("1.8", "0.2"): ("1.8", "0.2"), ("2.0", "0.0"): ("2.0", "0.0") }, # subdomain 11 { ("1.0", "0.4"): ("0.9+mu[0]", "0.4"), ("1.8", "0.2"): ("1.8", "0.2"), ("1.0", "0.6"): ("0.9+mu[0]", "0.6") }, # subdomain 12 { ("1.0", "0.6"): ("0.9+mu[0]", "0.6"), ("1.8", "0.2"): ("1.8", "0.2"), ("1.8", "0.8"): ("1.8", "0.8") } # subdomain 13 ] shape_parametrization_expression = [ affine_shape_parametrization_from_vertices_mapping( 2, vertices_mapping) for vertices_mapping in vertices_mappings ] # Auxiliary symbolic quantities x = MatrixSymbol("x", 2, 1) mu = MatrixSymbol("mu", 1, 1) # Start checks assert len(shape_parametrization_expression) is 13 # Check subdomain 1 assert len(shape_parametrization_expression[0]) is 2 assert symbolic_equal(shape_parametrization_expression[0][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[0][Y], "x[1]", x, mu) # Check subdomain 2 assert len(shape_parametrization_expression[1]) is 2 assert symbolic_equal(shape_parametrization_expression[1][X], "0.9 - 9.0*mu[0] + 10.0*mu[0]*x[0] ", x, mu) assert symbolic_equal(shape_parametrization_expression[1][Y], "x[1]", x, mu) # Check subdomain 3 assert len(shape_parametrization_expression[2]) is 2 assert symbolic_equal(shape_parametrization_expression[2][X], "0.9 - 9.0*mu[0] + 10.0*mu[0]*x[0] ", x, mu) assert symbolic_equal(shape_parametrization_expression[2][Y], "x[1]", x, mu) # Check subdomain 4 assert len(shape_parametrization_expression[3]) is 2 assert symbolic_equal(shape_parametrization_expression[3][X], "0.9 - 9.0*mu[0] + 10.0*mu[0]*x[0] ", x, mu) assert symbolic_equal(shape_parametrization_expression[3][Y], "x[1]", x, mu) # Check subdomain 5 assert len(shape_parametrization_expression[4]) is 2 assert symbolic_equal(shape_parametrization_expression[4][X], "0.9 - 9.0*mu[0] + 10.0*mu[0]*x[0] ", x, mu) assert symbolic_equal(shape_parametrization_expression[4][Y], "x[1]", x, mu) # Check subdomain 6 assert len(shape_parametrization_expression[5]) is 2 assert symbolic_equal(shape_parametrization_expression[5][X], "2.25*mu[0] + x[0]*(-1.25*mu[0] + 1.125) - 0.225 ", x, mu) assert symbolic_equal(shape_parametrization_expression[5][Y], "x[1]", x, mu) # Check subdomain 7 assert len(shape_parametrization_expression[6]) is 2 assert symbolic_equal( shape_parametrization_expression[6][X], "2.0*mu[0] + x[0]*(-mu[0] + 1.1) + x[1]*(-mu[0] + 0.1) - 0.2 ", x, mu) assert symbolic_equal(shape_parametrization_expression[6][Y], "x[1]", x, mu) # Check subdomain 8 assert len(shape_parametrization_expression[7]) is 2 assert symbolic_equal(shape_parametrization_expression[7][X], "2.25*mu[0] + x[0]*(-1.25*mu[0] + 1.125) - 0.225 ", x, mu) assert symbolic_equal(shape_parametrization_expression[7][Y], "x[1]", x, mu) # Check subdomain 9 assert len(shape_parametrization_expression[8]) is 2 assert symbolic_equal( shape_parametrization_expression[8][X], "mu[0] + x[0]*(-mu[0] + 1.1) + x[1]*(mu[0] - 0.1) - 0.1", x, mu) assert symbolic_equal(shape_parametrization_expression[8][Y], "x[1]", x, mu) # Check subdomain 10 assert len(shape_parametrization_expression[9]) is 2 assert symbolic_equal(shape_parametrization_expression[9][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[9][Y], "x[1]", x, mu) # Check subdomain 11 assert len(shape_parametrization_expression[10]) is 2 assert symbolic_equal(shape_parametrization_expression[10][X], "x[0]", x, mu) assert symbolic_equal(shape_parametrization_expression[10][Y], "x[1]", x, mu) # Check subdomain 12 assert len(shape_parametrization_expression[11]) is 2 assert symbolic_equal(shape_parametrization_expression[11][X], "x[0]*(-1.25*mu[0] + 1.125) + 2.25*mu[0] - 0.225", x, mu) assert symbolic_equal(shape_parametrization_expression[11][Y], "x[1]", x, mu) # Check subdomain 13 assert len(shape_parametrization_expression[12]) is 2 assert symbolic_equal(shape_parametrization_expression[12][X], "2.25*mu[0] + x[0]*(-1.25*mu[0] + 1.125) - 0.225", x, mu) assert symbolic_equal(shape_parametrization_expression[12][Y], "x[1]", x, mu)
def test_affine_shape_parametrization_from_vertices_mapping_hole_rotation(): vertices_mappings = [ { ("-1", "-1"): ("-sqrt(2.0)*cos(mu[0]) - 0.0*sin(mu[0])", "-sqrt(2.0)*sin(mu[0]) + 0.0*cos(mu[0])"), ("-2", "-2"): ("-2", "-2"), ("1", "-1"): ("0.0*cos(mu[0])-(-sqrt(2.0))*sin(mu[0])", "0.0*sin(mu[0])+(-sqrt(2.0))*cos(mu[0])") }, # subdomain 1 { ("-2", "-2"): ("-2", "-2"), ("2", "-2"): ("2", "-2"), ("1", "-1"): ("0.0*cos(mu[0])-(-sqrt(2.0))*sin(mu[0])", "0.0*sin(mu[0])+(-sqrt(2.0))*cos(mu[0])") }, # subdomain 2 { ("-1", "-1"): ("-sqrt(2.0)*cos(mu[0]) - 0.0*sin(mu[0])", "-sqrt(2.0)*sin(mu[0]) + 0.0*cos(mu[0])"), ("-1", "1"): ("0.0*cos(mu[0])-sqrt(2.0)*sin(mu[0])", "0.0*sin(mu[0])+sqrt(2.0)*cos(mu[0])"), ("-2", "-2"): ("-2", "-2") }, # subdomain 3 { ("-1", "1"): ("0.0*cos(mu[0])-sqrt(2.0)*sin(mu[0])", "0.0*sin(mu[0])+sqrt(2.0)*cos(mu[0])"), ("-2", "2"): ("-2", "2"), ("-2", "-2"): ("-2", "-2") }, # subdomain 4 { ("1", "-1"): ("0.0*cos(mu[0])-(-sqrt(2.0))*sin(mu[0])", "0.0*sin(mu[0])+(-sqrt(2.0))*cos(mu[0])"), ("2", "-2"): ("2", "-2"), ("1", "1"): ("sqrt(2.0)*cos(mu[0]) - 0.0*sin(mu[0])", "sqrt(2.0)*sin(mu[0]) + 0.0*cos(mu[0])") }, # subdomain 5 { ("2", "2"): ("2", "2"), ("1", "1"): ("sqrt(2.0)*cos(mu[0]) - 0.0*sin(mu[0])", "sqrt(2.0)*sin(mu[0]) + 0.0*cos(mu[0])"), ("2", "-2"): ("2", "-2") }, # subdomain 6 { ("-2", "2"): ("-2", "2"), ("-1", "1"): ("0.0*cos(mu[0])-sqrt(2.0)*sin(mu[0])", "0.0*sin(mu[0])+sqrt(2.0)*cos(mu[0])"), ("1", "1"): ("sqrt(2.0)*cos(mu[0]) - 0.0*sin(mu[0])", "sqrt(2.0)*sin(mu[0]) + 0.0*cos(mu[0])") }, # subdomain 7 { ("-2", "2"): ("-2", "2"), ("1", "1"): ("sqrt(2.0)*cos(mu[0]) - 0.0*sin(mu[0])", "sqrt(2.0)*sin(mu[0]) + 0.0*cos(mu[0])"), ("2", "2"): ("2", "2") } # subdomain 8 ] shape_parametrization_expression = [ affine_shape_parametrization_from_vertices_mapping( 2, vertices_mapping) for vertices_mapping in vertices_mappings ] # Auxiliary symbolic quantities x = MatrixSymbol("x", 2, 1) mu = MatrixSymbol("mu", 1, 1) # Start checks assert len(shape_parametrization_expression) is 8 # Check subdomain 1 assert len(shape_parametrization_expression[0]) is 2 assert symbolic_equal( shape_parametrization_expression[0][X], "-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", x, mu) assert symbolic_equal( shape_parametrization_expression[0][Y], "-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", x, mu) # Check subdomain 2 assert len(shape_parametrization_expression[1]) is 2 assert symbolic_equal( shape_parametrization_expression[1][X], "2*sqrt(2.0)*sin(mu[0]) + x[0] + x[1]*(sqrt(2.0)*sin(mu[0]) - 1) - 2", x, mu) assert symbolic_equal( shape_parametrization_expression[1][Y], "-2*sqrt(2.0)*cos(mu[0]) + x[1]*(-sqrt(2.0)*cos(mu[0]) + 2) + 2", x, mu) # Check subdomain 3 assert len(shape_parametrization_expression[2]) is 2 assert symbolic_equal( shape_parametrization_expression[2][X], "-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", x, mu) assert symbolic_equal( shape_parametrization_expression[2][Y], "-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", x, mu) # Check subdomain 4 assert len(shape_parametrization_expression[3]) is 2 assert symbolic_equal( shape_parametrization_expression[3][X], "-2*sqrt(2.0)*sin(mu[0]) + x[0]*(-sqrt(2.0)*sin(mu[0]) + 2) + 2", x, mu) assert symbolic_equal( shape_parametrization_expression[3][Y], "2*sqrt(2.0)*cos(mu[0]) + x[0]*(sqrt(2.0)*cos(mu[0]) - 1) + x[1] - 2", x, mu) # Check subdomain 5 assert len(shape_parametrization_expression[4]) is 2 assert symbolic_equal( shape_parametrization_expression[4][X], "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", x, mu) assert symbolic_equal( shape_parametrization_expression[4][Y], "-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", x, mu) # Check subdomain 6 assert len(shape_parametrization_expression[5]) is 2 assert symbolic_equal( shape_parametrization_expression[5][X], "2*sqrt(2.0)*cos(mu[0]) + x[0]*(-sqrt(2.0)*cos(mu[0]) + 2) - 2", x, mu) assert symbolic_equal( shape_parametrization_expression[5][Y], "2*sqrt(2.0)*sin(mu[0]) + x[0]*(-sqrt(2.0)*sin(mu[0]) + 1) + x[1] - 2", x, mu) # Check subdomain 7 assert len(shape_parametrization_expression[6]) is 2 assert symbolic_equal( shape_parametrization_expression[6][X], "-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", x, mu) assert symbolic_equal( shape_parametrization_expression[6][Y], "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", x, mu) # Check subdomain 8 assert len(shape_parametrization_expression[7]) is 2 assert symbolic_equal( shape_parametrization_expression[7][X], "2*sqrt(2.0)*cos(mu[0]) + x[0] + x[1]*(-sqrt(2.0)*cos(mu[0]) + 1) - 2", x, mu) assert symbolic_equal( shape_parametrization_expression[7][Y], "2*sqrt(2.0)*sin(mu[0]) + x[1]*(-sqrt(2.0)*sin(mu[0]) + 2) - 2", x, mu)
def AffineShapeParametrizationDecoratedProblem(*shape_parametrization_vertices_mappings, **decorator_kwargs): if "shape_parametrization_vertices_mappings" in decorator_kwargs: assert len(shape_parametrization_vertices_mappings) is 0 shape_parametrization_vertices_mappings = decorator_kwargs["shape_parametrization_vertices_mappings"] # Possibly read vertices mappings from file if ( len(shape_parametrization_vertices_mappings) is 1 and isinstance(shape_parametrization_vertices_mappings[0], str) ): filename = shape_parametrization_vertices_mappings[0] assert filename != "identity", "It does not make any sense to use this if you only have one subdomain without parametrization" assert VerticesMappingIO.exists_file("", filename) shape_parametrization_vertices_mappings = VerticesMappingIO.load_file("", filename) # Detect the mesh dimension based on the number of vertices to be mapped dim = None for vertices_mapping in shape_parametrization_vertices_mappings: if isinstance(vertices_mapping, str): assert vertices_mapping.lower() == "identity" continue else: assert isinstance(vertices_mapping, dict) assert len(vertices_mapping) in (3, 4) if len(vertices_mapping) is 3: if dim is None: dim = 2 else: assert dim is 2 elif len(vertices_mapping) is 4: if dim is None: dim = 3 else: assert dim is 3 assert dim is not None, "It does not make any sense to use this of all your subdomains are not parametrized" # Get the shape parametrization expression from vertices mappings shape_parametrization_expression = [affine_shape_parametrization_from_vertices_mapping(dim, vertices_mapping) for vertices_mapping in shape_parametrization_vertices_mappings] if decorator_kwargs.get("debug", False): print("=== DEBUGGING AFFINE SHAPE PARAMETRIZATION ===") for (subdomain, (vertices_mapping, expression)) in enumerate(zip(shape_parametrization_vertices_mappings, shape_parametrization_expression)): print("Subdomain", subdomain + 1) print("\tvertices mapping =", vertices_mapping) print("\tshape parametrization expression =", expression) decorator_kwargs.pop("debug", None) # Apply the parent decorator AffineShapeParametrizationDecoratedProblem_Decorator_Base = ShapeParametrizationDecoratedProblem(*shape_parametrization_expression, **decorator_kwargs) # Further decorate the resulting class from rbnics.shape_parametrization.problems.affine_shape_parametrization import AffineShapeParametrization @ProblemDecoratorFor(AffineShapeParametrization, shape_parametrization_vertices_mappings=shape_parametrization_vertices_mappings) def AffineShapeParametrizationDecoratedProblem_Decorator(ParametrizedDifferentialProblem_DerivedClass): AffineShapeParametrizationDecoratedProblem_Class = AffineShapeParametrizationDecoratedProblem_Decorator_Base(ParametrizedDifferentialProblem_DerivedClass) # return value (a class) for the decorator return AffineShapeParametrizationDecoratedProblem_Class # return the decorator itself return AffineShapeParametrizationDecoratedProblem_Decorator