From 37c5d1c12afd14f7b49981f304bc7f7c02d919d6 Mon Sep 17 00:00:00 2001 From: "paul.profizi" Date: Tue, 15 Mar 2022 18:33:54 +0100 Subject: [PATCH 1/4] Fix plot behavior when using keywords screenshot and off_screen --- ansys/dpf/core/meshed_region.py | 9 ++++++--- ansys/dpf/core/plotter.py | 11 ++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ansys/dpf/core/meshed_region.py b/ansys/dpf/core/meshed_region.py index e47eaf77484..0f5ffd6be6e 100644 --- a/ansys/dpf/core/meshed_region.py +++ b/ansys/dpf/core/meshed_region.py @@ -370,7 +370,7 @@ def plot( field_or_fields_container=None, notebook=None, shell_layers=None, - off_screen=None, + # off_screen=None, show_axes=True, **kwargs ): @@ -406,13 +406,16 @@ def plot( >>> model.metadata.meshed_region.plot(field) """ - pl = _DpfPlotter(self) + # kwargs["notebook"] = notebook + screenshot = kwargs.pop("screenshot", None) + pl = _DpfPlotter(self, **kwargs) + kwargs["screenshot"] = screenshot if field_or_fields_container is not None: return pl.plot_contour( field_or_fields_container, notebook, shell_layers, - off_screen, + # off_screen, show_axes, **kwargs ) diff --git a/ansys/dpf/core/plotter.py b/ansys/dpf/core/plotter.py index b233b225dae..d45087092ee 100755 --- a/ansys/dpf/core/plotter.py +++ b/ansys/dpf/core/plotter.py @@ -419,6 +419,8 @@ class Plotter: """ def __init__(self, mesh, **kwargs): + # from warnings import warn + # warn('Using the Plotter is deprecated, please switch to DpfPlotter instead.', DeprecationWarning, stacklevel=2) self._internal_plotter = _InternalPlotter(mesh=mesh, **kwargs) self._mesh = mesh @@ -506,7 +508,7 @@ def plot_contour( field_or_fields_container, notebook=None, shell_layers=None, - off_screen=None, + # off_screen=None, show_axes=True, meshed_region=None, **kwargs @@ -632,6 +634,8 @@ def plot_contour( background = kwargs.pop("background", None) cpos = kwargs.pop("cpos", None) return_cpos = kwargs.pop("return_cpos", None) + off_screen = kwargs.pop("off_screen", False) + # plotter = pv.Plotter(notebook=notebook, off_screen=off_screen) if notebook is not None: @@ -644,6 +648,7 @@ def plot_contour( kwargs.setdefault("nan_color", "grey") kwargs.setdefault("stitle", name) text = kwargs.pop('text', None) + screenshot = kwargs.pop('screenshot', False) if text is not None: self._internal_plotter._plotter.add_text(text, position='lower_edge') self._internal_plotter._plotter.add_mesh(mesh.grid, scalars=overall_data, **kwargs) @@ -658,14 +663,14 @@ def plot_contour( if show_axes: self._internal_plotter._plotter.add_axes() if return_cpos is None: - return self._internal_plotter._plotter.show() + return self._internal_plotter._plotter.show(screenshot=screenshot) else: import pyvista as pv pv_version = pv.__version__ version_to_reach = '0.32.0' meet_ver = meets_version(pv_version, version_to_reach) if meet_ver: - return self._internal_plotter._plotter.show(return_cpos=return_cpos) + return self._internal_plotter._plotter.show(return_cpos=return_cpos, screenshot=screenshot) else: txt = """To use the return_cpos option, please upgrade your pyvista module with a version higher than """ From 53317a7497bc540c7b6403cefb7c72e7948f0d0d Mon Sep 17 00:00:00 2001 From: "paul.profizi" Date: Thu, 17 Mar 2022 18:43:07 +0100 Subject: [PATCH 2/4] Add a second try when starting a server and getting a TimeOutError, with a timeout multiplied by 2. If still TimeOutError, then raise. --- ansys/dpf/core/server.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/ansys/dpf/core/server.py b/ansys/dpf/core/server.py index 1eb1ba79822..7edae2e59d3 100644 --- a/ansys/dpf/core/server.py +++ b/ansys/dpf/core/server.py @@ -221,15 +221,22 @@ def start_local_server( server = None n_attempts = 10 + timeout = 10 + timed_out = False for _ in range(n_attempts): try: server = DpfServer( - ansys_path, ip, port, as_global=as_global, + ansys_path, ip, port, timeout=timeout, as_global=as_global, load_operators=load_operators, docker_name=docker_name ) break except errors.InvalidPortError: # allow socket in use errors port += 1 + except TimeoutError: + if timed_out: + break + timeout *= 2. + timed_out = True if server is None: raise OSError( From 2d478eb9a18d22616b61d376f69f5694355da92d Mon Sep 17 00:00:00 2001 From: "paul.profizi" Date: Thu, 17 Mar 2022 18:51:31 +0100 Subject: [PATCH 3/4] Revert "Fix plot behavior when using keywords screenshot and off_screen" This reverts commit 37c5d1c12afd14f7b49981f304bc7f7c02d919d6. --- ansys/dpf/core/meshed_region.py | 9 +++------ ansys/dpf/core/plotter.py | 11 +++-------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/ansys/dpf/core/meshed_region.py b/ansys/dpf/core/meshed_region.py index 0f5ffd6be6e..e47eaf77484 100644 --- a/ansys/dpf/core/meshed_region.py +++ b/ansys/dpf/core/meshed_region.py @@ -370,7 +370,7 @@ def plot( field_or_fields_container=None, notebook=None, shell_layers=None, - # off_screen=None, + off_screen=None, show_axes=True, **kwargs ): @@ -406,16 +406,13 @@ def plot( >>> model.metadata.meshed_region.plot(field) """ - # kwargs["notebook"] = notebook - screenshot = kwargs.pop("screenshot", None) - pl = _DpfPlotter(self, **kwargs) - kwargs["screenshot"] = screenshot + pl = _DpfPlotter(self) if field_or_fields_container is not None: return pl.plot_contour( field_or_fields_container, notebook, shell_layers, - # off_screen, + off_screen, show_axes, **kwargs ) diff --git a/ansys/dpf/core/plotter.py b/ansys/dpf/core/plotter.py index d45087092ee..b233b225dae 100755 --- a/ansys/dpf/core/plotter.py +++ b/ansys/dpf/core/plotter.py @@ -419,8 +419,6 @@ class Plotter: """ def __init__(self, mesh, **kwargs): - # from warnings import warn - # warn('Using the Plotter is deprecated, please switch to DpfPlotter instead.', DeprecationWarning, stacklevel=2) self._internal_plotter = _InternalPlotter(mesh=mesh, **kwargs) self._mesh = mesh @@ -508,7 +506,7 @@ def plot_contour( field_or_fields_container, notebook=None, shell_layers=None, - # off_screen=None, + off_screen=None, show_axes=True, meshed_region=None, **kwargs @@ -634,8 +632,6 @@ def plot_contour( background = kwargs.pop("background", None) cpos = kwargs.pop("cpos", None) return_cpos = kwargs.pop("return_cpos", None) - off_screen = kwargs.pop("off_screen", False) - # plotter = pv.Plotter(notebook=notebook, off_screen=off_screen) if notebook is not None: @@ -648,7 +644,6 @@ def plot_contour( kwargs.setdefault("nan_color", "grey") kwargs.setdefault("stitle", name) text = kwargs.pop('text', None) - screenshot = kwargs.pop('screenshot', False) if text is not None: self._internal_plotter._plotter.add_text(text, position='lower_edge') self._internal_plotter._plotter.add_mesh(mesh.grid, scalars=overall_data, **kwargs) @@ -663,14 +658,14 @@ def plot_contour( if show_axes: self._internal_plotter._plotter.add_axes() if return_cpos is None: - return self._internal_plotter._plotter.show(screenshot=screenshot) + return self._internal_plotter._plotter.show() else: import pyvista as pv pv_version = pv.__version__ version_to_reach = '0.32.0' meet_ver = meets_version(pv_version, version_to_reach) if meet_ver: - return self._internal_plotter._plotter.show(return_cpos=return_cpos, screenshot=screenshot) + return self._internal_plotter._plotter.show(return_cpos=return_cpos) else: txt = """To use the return_cpos option, please upgrade your pyvista module with a version higher than """ From 470c3ad0619e0b4ab2c422f6caccc118df45e6c7 Mon Sep 17 00:00:00 2001 From: "paul.profizi" Date: Fri, 18 Mar 2022 10:04:26 +0100 Subject: [PATCH 4/4] Timeout parameter for server start goes all the way up to connect_to_server and start_local_server. Now gives a warning when first attempt timed out and tries a second attempt with a doubled timeout. --- ansys/dpf/core/server.py | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/ansys/dpf/core/server.py b/ansys/dpf/core/server.py index 7edae2e59d3..fb899b28ed7 100644 --- a/ansys/dpf/core/server.py +++ b/ansys/dpf/core/server.py @@ -139,7 +139,8 @@ def start_local_server( as_global=True, load_operators=True, use_docker_by_default=True, - docker_name=None + docker_name=None, + timeout=10. ): """Start a new local DPF server at a given port and IP address. @@ -169,6 +170,11 @@ def start_local_server( is True, the server is ran as a docker (default is True). docker_name : str, optional To start DPF server as a docker, specify the docker name here. + timeout : float, optional + Maximum number of seconds for the initialization attempt. + The default is ``10``. Once the specified number of seconds + passes, a second attempt is made with twice the given timeout, + then if still no server has started, the connection fails. Returns ------- @@ -221,7 +227,6 @@ def start_local_server( server = None n_attempts = 10 - timeout = 10 timed_out = False for _ in range(n_attempts): try: @@ -235,6 +240,9 @@ def start_local_server( except TimeoutError: if timed_out: break + import warnings + warnings.warn(f"Failed to start a server in {timeout}s, " + + f"trying again once in {timeout*2.}s.") timeout *= 2. timed_out = True @@ -249,7 +257,7 @@ def start_local_server( return server -def connect_to_server(ip=LOCALHOST, port=DPF_DEFAULT_PORT, as_global=True, timeout=5): +def connect_to_server(ip=LOCALHOST, port=DPF_DEFAULT_PORT, as_global=True, timeout=10): """Connect to an existing DPF server. This method sets the global default channel that is then used for the @@ -291,7 +299,7 @@ def connect_to_server(ip=LOCALHOST, port=DPF_DEFAULT_PORT, as_global=True, timeo >>> #unspecified_server = dpf.connect_to_server(as_global=False) """ - server = DpfServer(ip=ip, port=port, as_global=as_global, launch_server=False) + server = DpfServer(ip=ip, port=port, as_global=as_global, launch_server=False, timeout=timeout) dpf.core._server_instances.append(weakref.ref(server)) return server @@ -331,7 +339,7 @@ def __init__( ansys_path="", ip=LOCALHOST, port=DPF_DEFAULT_PORT, - timeout=10, + timeout=10., as_global=True, load_operators=True, launch_server=True, @@ -347,7 +355,9 @@ def __init__( if os.name == "posix" and "ubuntu" in platform.platform().lower(): raise OSError("DPF does not support Ubuntu") elif launch_server: - self._server_id = launch_dpf(str(ansys_path), ip, port, docker_name=docker_name) + self._server_id = launch_dpf(str(ansys_path), ip, port, + docker_name=docker_name, + timeout=timeout) self.channel = grpc.insecure_channel("%s:%d" % (ip, port)) @@ -366,7 +376,7 @@ def __init__( self._base_service_instance = None self._session_instance = None - check_ansys_grpc_dpf_version(self, timeout) + check_ansys_grpc_dpf_version(self, timeout=timeout) @property def _base_service(self): @@ -577,7 +587,7 @@ def _run_launch_server_process(ansys_path, ip, port, docker_name): os.chdir(old_dir) return process -def launch_dpf(ansys_path, ip=LOCALHOST, port=DPF_DEFAULT_PORT, timeout=10, docker_name=None): +def launch_dpf(ansys_path, ip=LOCALHOST, port=DPF_DEFAULT_PORT, timeout=10., docker_name=None): """Launch Ansys DPF. Parameters @@ -657,7 +667,7 @@ def read_stderr(): return docker_id[0] -def check_ansys_grpc_dpf_version(server, timeout): +def check_ansys_grpc_dpf_version(server, timeout=10.): state = grpc.channel_ready_future(server.channel) # verify connection has matured tstart = time.time() @@ -666,7 +676,8 @@ def check_ansys_grpc_dpf_version(server, timeout): if not state._matured: raise TimeoutError( - f"Failed to connect to {server._input_ip}:{server._input_port} in {timeout} seconds" + f"Failed to connect to {server._input_ip}:" + + f"{server._input_port} in {int(timeout)} seconds" ) LOG.debug("Established connection to DPF gRPC")