def gb_coarse_fine_cell_mapping( gb: pp.GridBucket, gb_ref: pp.GridBucket, tol=1e-8 ) -> None: """ Wrapper for coarse_fine_cell_mapping to construct mapping for grids in GridBucket. Adds a node_prop to each grid in gb. The key is 'coarse_fine_cell_mapping', and is the mapping generated by 'coarse_fine_cell_mapping(...)'. Note: No node prop is added to the reference grids in gb_ref. Parameters ---------- gb : pp.GridBucket Coarse grid bucket gb_ref : pp.GridBucket Refined grid bucket tol : float, Optional Tolerance for point_in_poly* -methods """ grids = gb.get_grids() grids_ref = gb_ref.get_grids() assert len(grids) == len( grids_ref ), "Weakly check that GridBuckets refer to same domains" assert np.allclose( np.append(*gb.bounding_box()), np.append(*gb_ref.bounding_box()) ), "Weakly check that GridBuckets refer to same domains" # This method assumes a consistent node ordering between grids. # At least assign one. gb.assign_node_ordering(overwrite_existing=False) gb_ref.assign_node_ordering(overwrite_existing=False) # Add node prop on the coarse grid to map from coarse to fine cells. gb.add_node_props(keys="coarse_fine_cell_mapping") for i in np.arange(len(grids)): g, g_ref = grids[i], grids_ref[i] node_num = gb.node_props(g, "node_number") node_num_ref = gb_ref.node_props(g_ref, "node_number") assert node_num == node_num_ref, "Weakly check that grids refer to same domain." # Compute the mapping for this grid-pair, # and assign the result to the node of the coarse gb mapping = coarse_fine_cell_mapping(g, g_ref, point_in_poly_tol=tol) gb.set_node_prop(g, key="coarse_fine_cell_mapping", val=mapping)
def gb_refinement( gb: pp.GridBucket, gb_ref: pp.GridBucket, tol: float = 1e-8, mode: str = "nested" ): """Wrapper for coarse_fine_cell_mapping to construct mapping for grids in GridBucket. Adds a node_prop to each grid in gb. The key is 'coarse_fine_cell_mapping', and is the mapping generated by 'coarse_fine_cell_mapping(...)'. Currently, only nested refinement is supported; more general cases are also possible. Note: No node prop is added to the reference grids in gb_ref. Parameters ---------- gb : pp.GridBucket Coarse grid bucket gb_ref : pp.GridBucket Refined grid bucket tol : float, Optional Tolerance for point_in_poly* -methods mode : str, Optional Refinement mode. Defaults to 'nested', corresponds to refinement by splitting. Acknowledgement: The code was contributed by Haakon Ervik. """ grids = gb.get_grids() grids_ref = gb_ref.get_grids() assert len(grids) == len( grids_ref ), "Weakly check that GridBuckets refer to same domains" assert np.allclose( np.append(*gb.bounding_box()), np.append(*gb_ref.bounding_box()) ), "Weakly check that GridBuckets refer to same domains" # This method assumes a consistent node ordering between grids. At least assign one. gb.assign_node_ordering(overwrite_existing=False) gb_ref.assign_node_ordering(overwrite_existing=False) # Add node prop on the coarse grid to map from coarse to fine cells. gb.add_node_props(keys="coarse_fine_cell_mapping") for i in np.arange(len(grids)): g, g_ref = grids[i], grids_ref[i] node_num, node_num_ref = ( gb._nodes[g]["node_number"], gb_ref._nodes[g_ref]["node_number"], ) assert node_num == node_num_ref, "Weakly check that grids refer to same domain." # Compute the mapping for this grid-pair, # and assign the result to the node of the coarse gb if mode == "nested": mapping = structured_refinement(g, g_ref, point_in_poly_tol=tol) else: raise NotImplementedError("Unknown refinement mode") gb.set_node_prop(grid=g, key="coarse_fine_cell_mapping", val=mapping)