.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "examples\07-distributed-post\00-distributed_total_disp.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_examples_07-distributed-post_00-distributed_total_disp.py: .. _ref_distributed_total_disp: Postprocessing of displacement on distributed processes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This diagram helps you to understand this example. It shows the operator chain that is used to compute the final result. .. graphviz:: digraph foo { graph [pad="0", nodesep="0.3", ranksep="0.3"] node [shape=box, style=filled, fillcolor="#ffcc00", margin="0"]; rankdir=LR; splines=line; disp01 [label="displacement"]; disp02 [label="displacement"]; norm01 [label="norm"]; norm02 [label="norm"]; subgraph cluster_1 { ds01 [label="data_src", shape=box, style=filled, fillcolor=cadetblue2]; ds01 -> disp01 [style=dashed]; disp01 -> norm01; label="Server 1"; style=filled; fillcolor=lightgrey; } subgraph cluster_2 { ds02 [label="data_src", shape=box, style=filled, fillcolor=cadetblue2]; ds02 -> disp02 [style=dashed]; disp02 -> norm02; label="Server 2"; style=filled; fillcolor=lightgrey; } norm01 -> "merge"; norm02 -> "merge"; } .. GENERATED FROM PYTHON SOURCE LINES 73-74 Import the ``dpf-core`` module and its examples files. .. GENERATED FROM PYTHON SOURCE LINES 74-80 .. code-block:: Python import os from ansys.dpf import core as dpf from ansys.dpf.core import examples from ansys.dpf.core import operators as ops .. GENERATED FROM PYTHON SOURCE LINES 81-91 Configure the servers. Make a list of IP addresses and port numbers that DPF servers start and listen on. Operator instances are created on each of these servers so that each can address a different result file. This example postprocesses an analysis distributed in two files. Consequently, it requires two remote processes. To make it easier, this example starts local servers. However, you can connect to any existing servers on your network. .. GENERATED FROM PYTHON SOURCE LINES 91-105 .. code-block:: Python config = dpf.AvailableServerConfigs.InProcessServer if "DPF_DOCKER" in os.environ.keys(): # If running DPF on Docker, you cannot start an InProcessServer config = dpf.AvailableServerConfigs.GrpcServer global_server = dpf.start_local_server(as_global=True, config=config) remote_servers = [ dpf.start_local_server(as_global=False, config=dpf.AvailableServerConfigs.GrpcServer), dpf.start_local_server(as_global=False, config=dpf.AvailableServerConfigs.GrpcServer), ] ips = [remote_server.ip for remote_server in remote_servers] ports = [remote_server.port for remote_server in remote_servers] .. GENERATED FROM PYTHON SOURCE LINES 106-107 Print the IP addresses and ports. .. GENERATED FROM PYTHON SOURCE LINES 107-110 .. code-block:: Python print("ips:", ips) print("ports:", ports) .. rst-class:: sphx-glr-script-out .. code-block:: none ips: ['127.0.0.1', '127.0.0.1'] ports: [50055, 50056] .. GENERATED FROM PYTHON SOURCE LINES 111-112 Send files to the temporary directory if they are not in shared memory. .. GENERATED FROM PYTHON SOURCE LINES 112-118 .. code-block:: Python files = examples.download_distributed_files(return_local_path=True) server_file_paths = [ dpf.upload_file_in_tmp_folder(files[0], server=remote_servers[0]), dpf.upload_file_in_tmp_folder(files[1], server=remote_servers[1]), ] .. GENERATED FROM PYTHON SOURCE LINES 119-123 Create operators on each server ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On each server, create two operators, one for displacement computations and one for norm computations. Define their data sources: .. GENERATED FROM PYTHON SOURCE LINES 123-137 .. code-block:: Python # - The displacement operator receives data from the data file in its respective # server. # - The norm operator, which is chained to the displacement operator, receives # input from the output of the displacement operator. # remote_operators = [] for i, server in enumerate(remote_servers): displacement = ops.result.displacement(server=server) norm = ops.math.norm_fc(displacement, server=server) remote_operators.append(norm) ds = dpf.DataSources(server_file_paths[i], server=server) displacement.inputs.data_sources(ds) .. GENERATED FROM PYTHON SOURCE LINES 138-141 Create an operator to merge results ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Create the ``merge_fields_containers`` operator to merge the results. .. GENERATED FROM PYTHON SOURCE LINES 141-144 .. code-block:: Python merge = ops.utility.merge_fields_containers() .. GENERATED FROM PYTHON SOURCE LINES 145-147 Connect the operators together and get the output ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. GENERATED FROM PYTHON SOURCE LINES 147-155 .. code-block:: Python for i, server in enumerate(remote_servers): merge.connect(i, remote_operators[i], 0) fc = merge.get_output(0, dpf.types.fields_container) print(fc) print(fc[0].min().data) print(fc[0].max().data) .. rst-class:: sphx-glr-script-out .. code-block:: none DPF Fields Container with 1 field(s) defined on labels: time with: - field 0 {time: 1} with Nodal location, 1 components and 432 entities. [0.] [10.03242272] .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 4.483 seconds) .. _sphx_glr_download_examples_07-distributed-post_00-distributed_total_disp.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: 00-distributed_total_disp.ipynb <00-distributed_total_disp.ipynb>` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: 00-distributed_total_disp.py <00-distributed_total_disp.py>` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: 00-distributed_total_disp.zip <00-distributed_total_disp.zip>` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_