def visualize(self, U, codim=2, **kwargs): """Visualize scalar data associated to the grid as a patch plot. Parameters ---------- U |NumPy array| of the data to visualize. If `U.dim == 2 and len(U) > 1`, the data is visualized as a time series of plots. Alternatively, a tuple of |Numpy arrays| can be provided, in which case a subplot is created for each entry of the tuple. The lengths of all arrays have to agree. codim The codimension of the entities the data in `U` is attached to (either 0 or 2). kwargs See :func:`~pymor.discretizers.builtin.gui.qt.visualize_patch` """ from pymor.discretizers.builtin.gui.qt import visualize_patch from pymor.vectorarrays.interface import VectorArray from pymor.vectorarrays.numpy import NumpyVectorSpace, NumpyVectorArray if isinstance(U, (np.ndarray, VectorArray)): U = (U, ) assert all(isinstance(u, (np.ndarray, VectorArray)) for u in U) U = tuple( NumpyVectorSpace.make_array(u) if isinstance(u, np.ndarray) else u if isinstance(u, NumpyVectorArray ) else NumpyVectorSpace.make_array(u.to_numpy()) for u in U) bounding_box = kwargs.pop('bounding_box', self.domain) visualize_patch(self, U, codim=codim, bounding_box=bounding_box, **kwargs)
def test_visualize_patch(backend_gridtype): backend, gridtype = backend_gridtype domain = LineDomain() if gridtype is OnedGrid else RectDomain() dim = 1 if gridtype is OnedGrid else 2 rhs = GenericFunction(lambda X: np.ones(X.shape[:-1]) * 10, dim) # NOQA dirichlet = GenericFunction(lambda X: np.zeros(X.shape[:-1]), dim) # NOQA diffusion = GenericFunction(lambda X: np.ones(X.shape[:-1]), dim) # NOQA problem = StationaryProblem(domain=domain, rhs=rhs, dirichlet_data=dirichlet, diffusion=diffusion) grid, bi = discretize_domain_default(problem.domain, grid_type=gridtype) m, data = discretize_stationary_cg(analytical_problem=problem, grid=grid, boundary_info=bi) U = m.solve() try: visualize_patch(data['grid'], U=U, backend=backend) except QtMissing as ie: pytest.xfail("Qt missing") finally: stop_gui_processes()
def visualize(self, U, m, title=None, legend=None, separate_colorbars=False, rescale_colorbars=False, block=None, filename=None, columns=2): """Visualize the provided data. Parameters ---------- U |VectorArray| of the data to visualize. If `len(U) > 1`, the data is visualized as a time series of plots. Alternatively, a tuple of |VectorArrays| can be provided, in which case a subplot is created for each entry of the tuple. The lengths of all arrays have to agree. m Filled in by :meth:`pymor.models.interface.Model.visualize` (ignored). title Title of the plot. legend Description of the data that is plotted. Most useful if `U` is a tuple in which case `legend` has to be a tuple of strings of the same length. separate_colorbars If `True`, use separate colorbars for each subplot. rescale_colorbars If `True`, rescale colorbars to data in each frame. block If `True`, block execution until the plot window is closed. If `None`, use the default provided during instantiation. filename If specified, write the data to a VTK-file using :func:`~pymor.discretizers.builtin.grids.vtkio.write_vtk` instead of displaying it. columns The number of columns in the visualizer GUI in case multiple plots are displayed at the same time. """ assert isinstance(U, VectorArray) \ or (isinstance(U, tuple) and all(isinstance(u, VectorArray) for u in U) and all(len(u) == len(U[0]) for u in U)) if filename: if not isinstance(U, tuple): write_vtk(self.grid, U, filename, codim=self.codim) else: for i, u in enumerate(U): write_vtk(self.grid, u, f'{filename}-{i}', codim=self.codim) else: if self.backend == 'jupyter': from pymor.discretizers.builtin.gui.jupyter import get_visualizer return get_visualizer()(self.grid, U, bounding_box=self.bounding_box, codim=self.codim, title=title, legend=legend, separate_colorbars=separate_colorbars, rescale_colorbars=rescale_colorbars, columns=columns) else: block = self.block if block is None else block from pymor.discretizers.builtin.gui.qt import visualize_patch return visualize_patch(self.grid, U, bounding_box=self.bounding_box, codim=self.codim, title=title, legend=legend, separate_colorbars=separate_colorbars, rescale_colorbars=rescale_colorbars, backend=self.backend, block=block, columns=columns)