コード例 #1
0
    def set_grids(self, N, num_nodes_mortar, num_nodes_1d, physdims=[1, 1]):
        f1 = np.array([[0, physdims[0]], [.5, .5]])

        gb = meshing.cart_grid([f1], N, **{"physdims": physdims})
        gb.compute_geometry()
        gb.assign_node_ordering()

        for e, d in gb.edges():
            mg = d["mortar_grid"]
            new_side_grids = {
                s: refinement.remesh_1d(g, num_nodes=num_nodes_mortar)
                for s, g in mg.side_grids.items()
            }

            mortars.update_mortar_grid(mg, new_side_grids, tol=1e-4)

            # refine the 1d-physical grid
            old_g = gb.nodes_of_edge(e)[0]
            new_g = refinement.remesh_1d(old_g, num_nodes=num_nodes_1d)
            new_g.compute_geometry()

            gb.update_nodes(old_g, new_g)
            mg = d["mortar_grid"]
            mortars.update_physical_low_grid(mg, new_g, tol=1e-4)
        return gb
コード例 #2
0
    def test_mortar_grid_1d_refine_1d_grid(self):
        """ Refine the lower-dimensional grid so that it is matching with the
        higher dimensional grid.
        """

        f1 = np.array([[0, 1], [.5, .5]])

        gb = meshing.cart_grid([f1], [2, 2], **{"physdims": [1, 1]})
        gb.compute_geometry()
        meshing.create_mortar_grids(gb)
        gb.assign_node_ordering()

        for e, d in gb.edges():

            # refine the 1d-physical grid
            old_g = gb.nodes_of_edge(e)[0]
            new_g = refinement.remesh_1d(old_g, num_nodes=5)
            new_g.compute_geometry()

            gb.update_nodes({old_g: new_g})
            mg = d["mortar_grid"]
            mortars.update_physical_low_grid(mg, new_g, 1e-4)

            high_to_mortar_known = np.matrix(
                [
                    [0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],
                    [0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],
                    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
                    [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
                ]
            )
            low_to_mortar_known = np.matrix(
                [
                    [0., 0., 0.5, 0.5],
                    [0.5, 0.5, 0., 0.],
                    [0., 0., 0.5, 0.5],
                    [0.5, 0.5, 0., 0.],
                ]
            )

            self.assertTrue(
                np.allclose(high_to_mortar_known, mg.high_to_mortar_int.todense())
            )

            # The ordering of the cells in the new 1d grid may be flipped on
            # some systems; therefore allow two configurations
            self.assertTrue(
                np.logical_or(
                    np.allclose(low_to_mortar_known, mg.low_to_mortar_int.todense()),
                    np.allclose(
                        low_to_mortar_known, mg.low_to_mortar_int.todense()[::-1]
                    ),
                )
            )
コード例 #3
0
def create_gb(cells_2d, alpha_1d=None, alpha_mortar=None):

    mesh_size = np.sqrt(2 / cells_2d)
    mesh_kwargs = {
        "tol": tol(),
        "mesh_size_frac": mesh_size,
        "mesh_size_min": mesh_size / 20,
    }

    mesh_kwargs = {"mesh_size_frac": mesh_size, "mesh_size_min": mesh_size / 20}

    file_name = "example_1_split.csv"
    gb = pp.importer.dfm_2d_from_csv(file_name, mesh_kwargs, domain())

    g_map = {}
    if alpha_1d is not None:
        for g, d in gb:
            if g.dim == 1:
                num_nodes = int(g.num_nodes * alpha_1d)
                g_map[g] = refinement.remesh_1d(g, num_nodes=num_nodes)
                g_map[g].compute_geometry()

    mg_map = {}
    if alpha_mortar is not None:
        for e, d in gb.edges():
            mg = d["mortar_grid"]
            if mg.dim == 1:
                mg_map[mg] = {}
                for s, g in mg.side_grids.items():
                    num_nodes = int(g.num_nodes * alpha_mortar)
                    mg_map[mg][s] = refinement.remesh_1d(g, num_nodes=num_nodes)

    gb = mortars.replace_grids_in_bucket(gb, g_map, mg_map, tol())
    gb.assign_node_ordering()

    return gb
コード例 #4
0
    def test_mortar_grid_1d_equally_refine_mortar_grids(self):

        f1 = np.array([[0, 1], [.5, .5]])

        gb = meshing.cart_grid([f1], [2, 2], **{"physdims": [1, 1]})
        gb.compute_geometry()
        gb.assign_node_ordering()

        for e, d in gb.edges():

            mg = d["mortar_grid"]
            new_side_grids = {
                s: refinement.remesh_1d(g, num_nodes=4)
                for s, g in mg.side_grids.items()
            }

            mortars.update_mortar_grid(mg, new_side_grids, 1e-4)

            high_to_mortar_known = (
                1.
                / 3.
                * np.matrix(
                    [
                        [0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0., 0.],
                        [0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 0., 0., 0., 0.],
                        [0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0., 0., 0., 0.],
                        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2., 0.],
                        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],
                        [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 2.],
                    ]
                )
            )

            low_to_mortar_known = (
                1.
                / 3.
                * np.matrix(
                    [[0., 2.], [1., 1.], [2., 0.], [0., 2.], [1., 1.], [2., 0.]]
                )
            )

            self.assertTrue(
                np.allclose(high_to_mortar_known, mg.high_to_mortar_int.todense())
            )
            self.assertTrue(
                np.allclose(low_to_mortar_known, mg.low_to_mortar_int.todense())
            )
コード例 #5
0
    def test_mortar_grid_1d_refine_1d_grid_2(self):
        """ Refine the 1D grid so that it is no longer matching the 2D grid.
        """

        f1 = np.array([[0, 1], [0.5, 0.5]])

        gb = meshing.cart_grid([f1], [2, 2], **{"physdims": [1, 1]})
        gb.compute_geometry()
        meshing.create_mortar_grids(gb)
        gb.assign_node_ordering()

        for e, d in gb.edges():

            # refine the 1d-physical grid
            old_g = gb.nodes_of_edge(e)[0]
            new_g = refinement.remesh_1d(old_g, num_nodes=4)
            new_g.compute_geometry()

            gb.update_nodes({old_g: new_g})
            mg = d["mortar_grid"]
            mg.update_slave(new_g, 1e-4)

            high_to_mortar_known = np.matrix([
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    1.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    1.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    1.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    1.0,
                    0.0,
                ],
            ])
            low_to_mortar_known = (
                1.0 / 3.0 * np.matrix([[0.0, 1.0, 2.0], [2.0, 1.0, 0.0],
                                       [0.0, 1.0, 2.0], [2.0, 1.0, 0.0]]))

            self.assertTrue(
                np.allclose(high_to_mortar_known,
                            mg.master_to_mortar_int().todense()))
            # The ordering of the cells in the new 1d grid may be flipped on
            # some systems; therefore allow two configurations
            self.assertTrue(
                np.logical_or(
                    np.allclose(low_to_mortar_known,
                                mg.slave_to_mortar_int().todense()),
                    np.allclose(low_to_mortar_known,
                                mg.slave_to_mortar_int().todense()[::-1]),
                ))
コード例 #6
0
    def test_mortar_grid_1d_unequally_refine_mortar_grids(self):

        f1 = np.array([[0, 1], [0.5, 0.5]])

        gb = meshing.cart_grid([f1], [2, 2], **{"physdims": [1, 1]})
        gb.compute_geometry()
        gb.assign_node_ordering()

        for e, d in gb.edges():

            mg = d["mortar_grid"]
            new_side_grids = {
                s: refinement.remesh_1d(g, num_nodes=int(s) + 3)
                for s, g in mg.side_grids.items()
            }

            mg.update_mortar(new_side_grids, 1e-4)

            high_to_mortar_known = np.matrix([
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.66666667,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.33333333,
                    0.33333333,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.66666667,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.5,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.5,
                    0.0,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.5,
                ],
                [
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.0,
                    0.5,
                ],
            ])
            low_to_mortar_known = np.matrix([
                [0.0, 0.66666667],
                [0.33333333, 0.33333333],
                [0.66666667, 0.0],
                [0.0, 0.5],
                [0.0, 0.5],
                [0.5, 0.0],
                [0.5, 0.0],
            ])

            self.assertTrue(
                np.allclose(high_to_mortar_known,
                            mg.master_to_mortar_int().todense()))
            self.assertTrue(
                np.allclose(low_to_mortar_known,
                            mg.slave_to_mortar_int().todense()))
コード例 #7
0
    def setup(
        self,
        num_fracs=1,
        remove_tags=False,
        alpha_1d=None,
        alpha_mortar=None,
        alpha_2d=None,
    ):

        domain = {"xmin": 0, "xmax": 1, "ymin": 0, "ymax": 1}

        if num_fracs == 0:
            p = np.zeros((2, 0))

        elif num_fracs == 1:
            p = [np.array([[0, 1], [0.5, 0.5]])]
        #            p = [np.array([[0.5, 0.5], [0, 1]])]
        elif num_fracs == 2:
            p = [
                np.array([[0, 0.5], [0.5, 0.5]]),
                np.array([[0.5, 1], [0.5, 0.5]]),
                np.array([[0.5, 0.5], [0, 0.5]]),
                np.array([[0.5, 0.5], [0.5, 1]]),
            ]
        mesh_size = {"value": 0.3, "bound_value": 0.3}
        gb = meshing.simplex_grid(fracs=p,
                                  domain=domain,
                                  mesh_size=mesh_size,
                                  verbose=0)
        #        gb = meshing.cart_grid([np.array([[0.5, 0.5], [0, 1]])],np.array([10, 10]),
        #                               physdims=np.array([1, 1]))

        gmap = {}

        # Refine 2D grid?
        if alpha_2d is not None:
            mesh_size = {
                "value": 0.3 * alpha_2d,
                "bound_value": 0.3 * alpha_2d
            }
            gbn = meshing.simplex_grid(fracs=p,
                                       domain=domain,
                                       mesh_size=mesh_size,
                                       verbose=0)
            go = gb.grids_of_dimension(2)[0]
            gn = gbn.grids_of_dimension(2)[0]
            gn.compute_geometry()
            gmap[go] = gn

        # Refine 1d grids
        if alpha_1d is not None:
            for g, d in gb:
                if g.dim == 1:
                    if alpha_1d > 1:
                        num_nodes = 1 + int(alpha_1d) * g.num_cells
                    else:
                        num_nodes = 1 + int(alpha_1d * g.num_cells)
                    num_nodes = 1 + int(alpha_1d * g.num_cells)
                    gmap[g] = refinement.remesh_1d(g, num_nodes=num_nodes)
                    gmap[g].compute_geometry()

        # Refine mortar grid
        mg_map = {}
        if alpha_mortar is not None:
            for e, d in gb.edges():
                mg = d["mortar_grid"]
                if mg.dim == 1:
                    mg_map[mg] = {}
                    for s, g in mg.side_grids.items():
                        num_nodes = int(g.num_nodes * alpha_mortar)
                        mg_map[mg][s] = refinement.remesh_1d(
                            g, num_nodes=num_nodes)

        gb = mortars.replace_grids_in_bucket(gb, gmap, mg_map, tol=1e-4)

        #        if remove_tags:
        #            internal_flag = FaceTag.FRACTURE
        #            [g.remove_face_tag_if_tag(FaceTag.BOUNDARY, internal_flag) for g, _ in gb]

        gb.assign_node_ordering()

        self.set_params(gb)

        return gb