Create a pool of Mechanical servers
===================================
The :class:`LocalMechanicalPool <ansys.mechanical.core.pool.LocalMechanicalPool>`
class simplifies creating and connecting to multiple servers of the
:class:`Mechanical <ansys.mechanical.core.mechanical.Mechanical>` class for batch
processing. You can use this class for batch processing a set of input files or
other batch-related processes.

This code shows how to create a pool with 10 instances:

.. code:: pycon

    >>> from ansys.mechanical.core import LocalMechanicalPool
    >>> pool = LocalMechanicalPool(10, version="231")
    'Mechanical Pool with 10 active instances'

When you are creating a pool, you can supply additional keyword arguments.
For example, to restart failed instances, you can set ``restart_failed=True``:

.. code:: pycon

    >>> import os
    >>> my_path = os.getcmd()
    >>> pool = LocalMechanicalPool(10, version="231", restart_failed=True)
    Creating Pool: 100%|########| 10/10 [00:01<00:00,  1.43it/s]

You can access each individual instance of Mechanical with this code:

.. code:: pycon

    >>> pool[0]
    <ansys.mechanical.core.mechanical.Mechanical at 0x7fabf0230d90>

Because this is a *self-healing pool*, if an instance of Mechanical stops
during a batch process, this instance is automatically restarted. When creating
the pool, you can disable this behavior by setting ``restart_failed=False``.

Run a set of input files
~~~~~~~~~~~~~~~~~~~~~~~~
You can use the pool to run a set of pre-generated input files using the
:func:`run_batch() <ansys.mechanical.core.pool.LocalMechanicalPool.run_batch>` method.

For example, you can run the first set of 20 verification files with this code:

.. code:: pycon

     >>>>>> from ansys.mechanical.core import examples
     >>> files = [f"test{index}.py" for index in range(1, 21)]
     >>> outputs = pool.run_batch(files)
     >>> len(outputs)
     20

Run a user-defined function
~~~~~~~~~~~~~~~~~~~~~~~~~~~
While the previous example uses the :func:`run_batch() <ansys.mechanical.core.pool.LocalMechanicalPool.run_batch>`
method to run a set of inputs files, you can also use the
:func:`map() <ansys.mechanical.core.pool.LocalMechanicalPool.map>` method to run a custom user-defined function on
each instance of Mechanical over a set of input files.

.. code:: pycon

    >>> completed_indices = []
    >>> def func(mechanical, input_file, index):
    ...     # input_file, index = args
    ...     mechanical.clear()
    ...     output = mechanical.run_python_script_from_file(input_file)
    ...     completed_indices.append(index)
    ...     return output
    ...
    >>> inputs = [("test{index}.py", i) for i in range(1, 10)]
    >>> output = pool.map(func, inputs, progress_bar=True, wait=True)
    ['result1',
     'result2',
     'result3',
     'result4',
     'result5',
     'result6',
     'result7',
     'result8',
     'result9']


API reference
~~~~~~~~~~~~~
For more information, see :ref:`ref_pool_api`.