diff --git a/docs/source/plugins/01_quick_start.rst b/docs/source/plugins/01_quick_start.rst index 0d6a74c9..2394d634 100644 --- a/docs/source/plugins/01_quick_start.rst +++ b/docs/source/plugins/01_quick_start.rst @@ -18,16 +18,15 @@ the official docs `_. .. note:: - It is recommended that you install the |sdk| using the conda package manager. With the commands below, a conda - environment would be created with |sdk| installed on it. + It is recommended to install the |sdk| using the conda package manager. The following commands will create a conda environment with |sdk| installed. .. code-block:: bash - >>> conda env create -n sdk_env + >>> conda create -n sdk_env >>> conda activate sdk_env >>> pip install alfasim-sdk - Another approach could be adding a ``environment.yml`` to your project and declare the ``alfasim-sdk`` inside the ``pip`` dependencies. + Alternatively, an ``environment.yml`` can be added to your project and ``alfasim-sdk`` can be declared at ``pip`` dependencies. For more details, see `Getting started with conda `_. @@ -100,16 +99,16 @@ After the execution of the :program:`new` command the generated plugin project w The highlights here are for: :plugin.yaml: File with all information about the plugin that will be used by |alfasim|. -:myplugin.py: Implementation of the hooks for customization of the UI interface, or the solver configuration hooks. +:myplugin.py: Implementation of the hooks for customization of the user interface or the solver configuration hooks. :myplugin.c: Implementation of the hooks for customization of solver. -Check out the :ref:`Plugin Structure section ` for more details about how the folder and files are structured, and -also, check the :ref:`plugin-by-example-section` that shows how to create simple plugins that make use of the `User Interface Hooks` and the `Solver Hooks`. +Refer to the :ref:`Plugin Structure section ` for more details about how the folder and files are structured. +The section :ref:`plugin-by-example-section` shows how to create simple plugins that make use of the `User Interface Hooks` and the `Solver Hooks`. Invoke ------ -From version 0.17.0 onwards, |sdk| started using `pyinvoke`_ tasks in order facilitate and standardize the plugins development process +Since version 0.17.0, |sdk| started using `pyinvoke`_ tasks in order facilitate and standardize the plugins development process using pre-defined tasks. A standard ``tasks.py`` file is generated automatically by the :program:`new` command, which can be customized by the user if needed. To list the tasks available, use: @@ -124,8 +123,8 @@ To list the tasks available, use: Creating a package ------------------ -From the root directory of the plugin, execute the command `invoke package`. -This command will compile your C/C++ implementation and include the shared libraries inside a `artifacts` directory and +From the plugin root directory, execute the command `invoke package`. +This command will compile your C/C++ implementation and include the shared libraries inside an `artifacts` directory and the generated plugin on the root directory with the extension `hmplugin`. .. code-block:: bash @@ -171,18 +170,18 @@ Installing the plugin --------------------- With :file:`myplugin.hmplugin` file, it is now possible to install it on |alfasim| application. -From the menu bar select the `Plugin Manager` option, as illustrated in the figure below: +At the menu bar select the `Plugin Manager` option, as illustrated in the figure below: .. image:: /_static/images/quick_start/menu_bar.png -In the `Plugin Manager` windows, install :file:`myplugin.hmplugin` file plugin. +In the `Plugin Manager` window, install :file:`myplugin.hmplugin` file plugin. .. image:: /_static/images/quick_start/plugin_manager_empty.png -By clicking on the plugin name, it is possible to visualize the content from the :file:`README.md` file. +By clicking on the plugin name, it is possible to visualize the content of the :file:`README.md` file. .. image:: /_static/images/quick_start/plugin_manager_with_plugin.png -Restart the application and check the recently installed plugin available over the :guilabel:`Tree`. +Restart the application and check the recently installed plugin available at the :guilabel:`Tree`. .. image:: /_static/images/quick_start/tree_with_plugin.png diff --git a/docs/source/plugins/02_alfasim_sdk_by_example.rst b/docs/source/plugins/02_alfasim_sdk_by_example.rst index edee20c7..130ecafa 100644 --- a/docs/source/plugins/02_alfasim_sdk_by_example.rst +++ b/docs/source/plugins/02_alfasim_sdk_by_example.rst @@ -5,8 +5,8 @@ Plugin by Example ================= -In this section, we will continue to customize the plugin created from the previous section, -this plugin will calculate the oil velocity to the power of a given exponent provided by the user from the user interface. +In this section, we will continue to customize the plugin created from the previous section. +This plugin will calculate the oil velocity to the power of a given exponent provided by the user from the user interface. The following equation describes the plugin: @@ -26,11 +26,11 @@ The following equation describes the plugin: For this, we will need to: -#. Create a simple input, on the user interface. +#. Create a simple input on the user interface. #. Add a secondary variable, to keep track of the value. #. Retrieve the input data on the :py:func:`HOOK_INITIALIZE`. #. Save the input data on a plugin internal data. -#. Get the oil velocity from the solver, during run-time. +#. Get the oil velocity from the solver during run-time. #. Export the value into the created/registered plugin secondary variable. @@ -54,7 +54,7 @@ the locations where a custom model can be inserted using the hook |gui_hook|. For this example we will use a :py:func:`~alfasim_sdk.data_model` entry over the Tree, using a :py:class:`~alfasim_sdk.Quantity` field to get exponent value from the user. -The hook |gui_hook| needs to be implemented on the :file:`myplugin.py`, located on :file:`myplugin/src/python` folder. +The hook |gui_hook| needs to be implemented in the :file:`myplugin.py`, found in :file:`myplugin/src/python` folder. .. rubric:: Implementation of :file:`myplugin.py` @@ -74,7 +74,7 @@ The hook |gui_hook| needs to be implemented on the :file:`myplugin.py`, located Notice that only models that are returned by the hook :py:func:`~alfasim_sdk._internal.hook_specs_gui.alfasim_get_data_model_type` -will be included on the user interface of |alfasim|. +will be included in the user interface of |alfasim|. The image below illustrates the application with the output from the snippet above. @@ -90,18 +90,18 @@ And for more detail about the available models, check the section :ref:`api-mode Solver Configuration -------------------- -|sdk| provides hooks to customize the settings of the application that configures the solver internally, -some of these configurations are: +|sdk| provides hooks to customize the settings of the application that configures the solver internally. +Some of these configurations are: - Creation/Registration of new secondary variables - Creation of new phases/fields/layers. - Update of default phases and layers from the application. -For this example, a new |s_variable| will be created, to track the oil velocity to the power of a custom value provided from the user. +For this example, a new |s_variable| will be created to track the oil velocity to the power of a custom value provided by the user. A *Secondary Variable* is a variable that can be calculated along the `Network`. Also, if configured as external, this -variable will be set an Output, and will be available within the Trends and Profiles plots. +variable will be set as an Output, and will be available within the Trends and Profiles plots. To create these variables, the hook |s_variable_hook| must be implemented in the :file:`myplugin.py` file. @@ -130,7 +130,7 @@ To create these variables, the hook |s_variable_hook| must be implemented in the ] -The image below illustrates the application with the output from the snippet above. To access that window, first select the desired structure +The image below illustrates the application with the output from the snippet above. To access the configuration window, first select the desired structure then go to Output Options at the left side tree and add/edit a trend. .. image:: /_static/images/plugin_example/secondary_variable_trend_output.png @@ -144,14 +144,14 @@ Hooks for Solver |sdk| provides hooks that can customize the ``Solver`` behavior, this customization are implemented in C/C++ and can make use of the :ref:`ALFAsim-SDK C/C++ API ` in order to fetch information from the application. -At this point, we are going to implement the :ref:`solver_hooks` that updates the secondary variable declared from +At this point, we are going to implement the :ref:`solver_hooks` that updates the secondary variable declared in :file:`myplugin.py` file and retrieve the ``Oil Velocity`` from the |alfasim|'s Solver. -First, we need to implement two mandatory hooks, the :py:func:`HOOK_INITIALIZE ` and +First, we need to implement two mandatory hooks: the :py:func:`HOOK_INITIALIZE ` and the :py:func:`HOOK_FINALIZE ` With them it is possible to initialize any custom data (to store any important information) for internal use. Also it is -needed to load and unload the |sdk| API, in which will allows the plugin to use the API in any implemented `hook`. +necessary to load and unload the |sdk| API, allowing the plugin to use the API in any implemented `hook`. .. rubric:: Implementation of :file:`myplugin.cpp` @@ -221,7 +221,7 @@ needed to load and unload the |sdk| API, in which will allows the plugin to use return OK; } -Then, since the plugin wants to calculate its own secondary variable, the +Then, since the plugin aims to calculate its own secondary variable, the :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES ` must be implemented. As can be seen in the example below, to retrieve the velocity of the continuous oil field it is necessary to use the :cpp:func:`get_simulation_array` API function. @@ -301,7 +301,7 @@ it is necessary to use the :cpp:func:`get_simulation_array` API function. } -The image below illustrates the output from the solver, when running the plugin created in this section with the given +The image below illustrates the output from the solver when running the plugin created in this section with the given network. That information can be seen by selecting the desired structure and opening the Trend plot window. .. image:: /_static/images/plugin_example/output_graph.png diff --git a/docs/source/plugins/03_plugin_structure.rst b/docs/source/plugins/03_plugin_structure.rst index 0128e524..d79243c6 100644 --- a/docs/source/plugins/03_plugin_structure.rst +++ b/docs/source/plugins/03_plugin_structure.rst @@ -3,7 +3,7 @@ Plugins Structure ================= -As mentioned in :ref:`quick-start-section`, the |sdk| package has some utilities to help in the process to create +As mentioned in :ref:`quick-start-section`, the |sdk| package has some utilities to help in the process of creating a plugin file. First, to create the plugin use :program:`new`: @@ -21,10 +21,8 @@ First, to create the plugin use :program:`new`: Pyinvoke tasks -------------- -Except for creating the plugin structure, all other activities that you might want to perform, you will use ``pyinvoke`` tasks. - -Below there is detailed list on what they are meant to do. However, in general, the tasks that you will use the most are ``compile``, -``package`` and ``update``. +Once the plugin structure is created, you can perform all necessary activities using ``pyinvoke`` tasks, with ``compile``, ``package`` and ``update`` beeing the +most commonly used during plugin development. Below you can find a list of all available along with their descriptions. .. invoke:: :module: alfasim_sdk.default_tasks diff --git a/docs/source/plugins/04_application_hooks.rst b/docs/source/plugins/04_application_hooks.rst index 11a2606f..2ce019a8 100644 --- a/docs/source/plugins/04_application_hooks.rst +++ b/docs/source/plugins/04_application_hooks.rst @@ -7,8 +7,7 @@ The application hooks allow plugins to add custom models or custom checks in the To add an application hook it is necessary to implement the given hook in a python file that is already available on your plugin project folder. -As an example, if the ``alfasim-sdk new`` command was created with the name ``myplugin``, the necessary file to -be customized will be located on: :menuselection:`myplugin --> src --> python --> myplugin.py` +For example, after executing the command ``alfasim-sdk new myplugin``, the file ``myplugin.py``, located at :menuselection:`myplugin --> src --> python` should be customized. .. contents:: :depth: 3 diff --git a/docs/source/plugins/05_solver_config_hooks.rst b/docs/source/plugins/05_solver_config_hooks.rst index 6626e55a..b56ef2af 100644 --- a/docs/source/plugins/05_solver_config_hooks.rst +++ b/docs/source/plugins/05_solver_config_hooks.rst @@ -33,8 +33,8 @@ the hook listed below, the plugin can: - Add/update layers .. note:: - For each new added ``field`` is considered a mass conservation equation and for each new added ``layer`` is considered - a momentum conservation and an energy conservation equations, depending on the energy model used at |alfasim|. + For each new added ``field``, an additional mass conservation equation is considered. For each new added ``layer``, an additional momentum equation is considered. + Depending on the energy model used at |alfasim|, an additional energy equation can be considered as well. .. autofunction:: alfasim_sdk._internal.hook_specs_gui.alfasim_configure_fields @@ -44,7 +44,7 @@ the hook listed below, the plugin can: In order to complement the :py:class customization, it is possible to inform |alfasim| which phases -(added from plugin or not) will have the state variables calculated by plugin. +(added by the plugin or not) will have the state variables calculated by plugin. .. autofunction:: alfasim_sdk._internal.hook_specs_gui.alfasim_get_phase_properties_calculated_from_plugin diff --git a/docs/source/plugins/06_solver_hooks.rst b/docs/source/plugins/06_solver_hooks.rst index 6eaa2c42..6aa772d4 100644 --- a/docs/source/plugins/06_solver_hooks.rst +++ b/docs/source/plugins/06_solver_hooks.rst @@ -3,10 +3,10 @@ Solver Hooks ============ -The present section describes all solver `Hooks` available on |alfasim| plugin infrastructure. -Solver `Hooks` are |alfasim|'s pre-defined functions that allows the plugin developer to modify/extend |alfasim|'s Solver. -As already informed in :ref:`Quick Start ` section once created a plugin using ``new`` option -on |sdk|'s CLI a new file named ``plugin.c`` will be available to implement those `hooks`. +The present section describes all solver `Hooks` available in |alfasim| plugin infrastructure. +Solver `Hooks` are |alfasim|'s pre-defined functions that allow plugin developer to modify or extend |alfasim|'s Solver. +As already informed in :ref:`Quick Start ` section, once created a plugin using ``new`` option +in |sdk|'s CLI a new file named ``plugin.cpp`` will be available to implement those `hooks`. .. Note:: There is no need to implement all solver `hooks` in the plugin. It depends on which functionality the developer wants @@ -31,12 +31,11 @@ Initial configuration and plugin internal data ---------------------------------------------- In the :ref:`User Interface Hooks ` section is explained that the plugins are allowed to -customize the |alfasim|'s user interface extending it in order to get some input data from the user. Using the solver +customize the |alfasim|'s user interface extending it in order to get input data from the user. Using the solver :py:func:`HOOK_INITIALIZE` the developer can obtain the input data from user interface and use it to initialize the plugin internal data. -As already mentioned, it is allowed that the plugins have internal data, in which can hold some important information that -will be used during the simulation, and also by other `hooks`. +As already mentioned, plugins internal data can hold the information that will be used during the simulation, which will be available for the other `hooks`. .. warning:: The plugin internal data will be hold by |alfasim|'s solver, however the plugin has full responsibility to allocate @@ -72,22 +71,23 @@ Update plugin variables The `hooks` described in this section are related to plugin secondary variables that were registered in the python config file, as already explained in :ref:`solver_customization` section. They are called `secondary variables` because they -are not obtained from |alfasim|'s Solver, these ones are called primary variables and examples of those variables are `pressure`, -`temperature`, `volume fractions` and `velocities`. +are not obtained from |alfasim|'s Solver like the `pressure`, `temperature`, `volume fractions` and `velocities`, called primary variables instead. Using the following `hooks` the plugin is able to calculate/update those variables in three different moments of the simulation step. Two of them are called in the `Hydrodynamic Solver` scope and the last one is called in the `Tracers Solver` scope as illustrated on :ref:`hyd_solver` and :ref:`tracer_solver` workflow section. Once the solver obtain results for primary variables, it updates all secondary variables in which depend on primary variables. After that, :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES` -is called, but if it is running the `first time step` +is called, but at the `first time step` :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES_ON_FIRST_TIMESTEP` -is called before. It is necessary because usually during the `first time step` some initialization tasks are needed. Then, -if the plugin needs to initialize with some value that is different from the initial ``nan`` value, this hook is the place to do that. -Another possibility is to update secondary variables explicitly on timestep. For that :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES_TIME_EXPLICIT` can be used and it will be called once at the end of the timestep. This hook is important in situations where the secondary variable doesn't affect the solution or when secondary variable computations are extremely heavy, in which computational time would be prohibited. +should be called before because usually during the `first time step` some initialization tasks are needed. Then, +if any plugin variable needs to be initialized with some value different from the initial ``nan`` value, this hook is the place to do that. +Another possibility is to update secondary variables explicitly on timestep. For that :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES_TIME_EXPLICIT` +can be used and it will be called once at the end of the timestep. This hook is important in situations where the secondary variable doesn't affect the solution or when secondary variable computations are extremely heavy, +making computational time prohibitive. .. note:: Different from plugin internal data, the secondary variables registered by plugins are allocated, deallocated and - held by |alfasim|'s Solver. It is necessary because the variables arrays are dependent on `network` with its + held by |alfasim|'s Solver. It is necessary because the variables arrays depend on `network` with its discretization and on `hydrodynamic model`, which defines the fluid flow's `phases`, `fields` and `layers`. .. autofunction:: alfasim_sdk._internal.hook_specs.update_plugins_secondary_variables @@ -99,11 +99,11 @@ Another possibility is to update secondary variables explicitly on timestep. For The |alfasim|'s Solver is divided in two *non-linear solvers* solvers that will solve different group of equations. The first one is the `hydrodynamic solver` which solves the Mass Conservation of fields, Momentum Conservation of layers and Energy Conservation equations all together for all elements in the network. The second one is the `Tracer Solver` which solves the Mass Conservation -Equation for each added tracer. Since the tracers mass conservation is a transport equation it is solved after `hydrodynamic solver` +Equation for each added tracer. Since the tracers mass conservation is a transport equation, it is solved after `hydrodynamic solver` and using its results (such as `velocities`) as input data in the `Tracer Solver`. See the |alfasim|'s Technical Report for more information. -To complete the group of `hooks` related to the plugins secondary variables there is the :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES_ON_TRACER_SOLVER`. +The hook :py:func:`HOOK_UPDATE_PLUGINS_SECONDARY_VARIABLES_ON_TRACER_SOLVER` completes the group of `hooks` related to the plugins secondary variables. This `hook` is used to update plugin's variables that depends on Tracer's mass fractions and has to be updated in the `Tracer Solver` scope. @@ -117,7 +117,7 @@ This `hook` is used to update plugin's variables that depends on Tracer's mass f Source Terms ------------ -The `hooks` showed in this section can be considered as the most important. Since they allow the plugin to change the +The `hooks` showed in this section can be considered as the most important since they allow the plugin to change the conservation equations. This is achieved by adding source terms in the residual function of mass, momentum and energy conservation equations. Since the equations are in residual form, the negative values of source terms indicate that mass, momentum and energy will be consumed. Otherwise, some amount of mass, momentum, and energy will be generated. @@ -149,7 +149,7 @@ Additional solid phase ---------------------- When a new phase is added to the hydrodynamic model using the :py:class:`~alfasim_sdk.AddPhase` type, it is possible -to set as a `solid phase`. In this case, the particle size of `fields` that are `solid phase` can be calculated by +to set it as a `solid phase`. In this case, the particle size of `fields` that are `solid phase` can be calculated by implementing the following Solver `Hooks`. Otherwise, the particle size will be considered constant and equal to :math:`1\times10^{-4}` meters. @@ -161,7 +161,7 @@ Solids Model ------------ When a new solid phase is added to the hydrodynamic model using the :class:`~alfasim_sdk.AddPhase` type, it is -possible simulate a case with solid phase dispersed in fluids. In this kind of simulation a solids model can be +possible to simulate a case with solid phase dispersed in fluids. In this kind of simulation a solids model can be chosen by the user through |alfasim|'s GUI. Those models are able to calculate the slurry viscosity of the layer and the slip velocity of the dispersed solid phase. Currently, there are only three solids model available, however any plugin can add its own solids model. For that, it is necessary to implement the following hooks. @@ -174,8 +174,8 @@ Internal deposit layer ---------------------- When a new phase is added to the hydrodynamic model using the :py:class:`~alfasim_sdk.AddPhase` type, it is possible -to consider the deposition inside the pipeline walls. If so, calculate the thickness of the deposited layer on a given -phase through the usage of :py:func:`~alfasim_sdk._internal.hook_specs.update_internal_deposition_layer`. By default, the layer +to consider the deposition inside the pipeline walls. In this case, the thickness of the deposited layer on a given +phase should be calculated through the usage of :py:func:`~alfasim_sdk._internal.hook_specs.update_internal_deposition_layer`. By default, the layer thickness will be considered equal to zero meters. .. autofunction:: alfasim_sdk._internal.hook_specs.update_internal_deposition_layer @@ -190,7 +190,7 @@ flow is in the control volume. .. note:: It is important to know that the main input variables needed to compute the friction factor is available in - the API function :cpp:func:`get_ucm_friction_factor_input_variable`. Note that, the variables listed in the + the API function :cpp:func:`get_ucm_friction_factor_input_variable`. Note that the variables listed in the documentation of the cited function are related to one control volume, in which the Unit Cell Model is applied. .. autofunction:: alfasim_sdk._internal.hook_specs.calculate_ucm_friction_factor_stratified @@ -205,10 +205,10 @@ Liquid-Liquid Mechanistic Model ------------------------------- |alfasim|'s resulting multiphase model is a one-dimensional system of nonlinear equations, which is a result of some -averaging steps that transforms a local instantaneous three-dimensional model into a one-dimensional multiphase (and +averaging steps that transform a local instantaneous three-dimensional model into a one-dimensional multiphase (and multi-field) model. The derived variables that form the nonlinear differential equations represent average values at a given point in time and space. It is clear that in this averaging process there are important phenomena that will -non longer be naturally captured from the equations and therefore one of the strategies is to incorporate all the +no longer be naturally captured from the equations and therefore one of the strategies is to incorporate all the physics that have been lost in the averaging process in the shear stress term in order to accurately represent the physical behavior. Hence the shear stress is one of the most important parameters for characterizing the quality of a one-dimensional multiphase model. @@ -217,9 +217,10 @@ The main goal of the mechanistic model is to calculate the friction pressure dro fractions and velocities. |alfasim| supports two-phase (gas-liquid) and three-phase (gas-oil-water) flows, but for three-phase flow it is required a plugin that handles the oil-water system. -.. note :: - Note that the two phase (Gas-Liquid) system of Mechanistic Model can be used for both two and three-phase flows, - in which is done in case of a liquid-liquid system is not available via plugin. +.. note:: + Note that the two-phase (Gas-Liquid) Mechanistic Model can be used for both two and three-phase flows (Fluid FLow Type selected by the user in ALFAsim). + When no Liquid-Liquid System is implemented by the plugin, the three-phase flow is adapted to work with the traditional two-phase Mechanistic Model, + in which all liquid phases are considered as only one. In the gas-liquid system the liquid phase is considered as a sum of all liquid phases, and the model take into account only the interaction behavior between these two phases (Gas and Liquid). Of course, this kind of approach brings some @@ -288,7 +289,7 @@ The `hooks` described in this section must be implemented when at least one `use |tracer_warn| These `hooks` can modify the tracer transport equation from the initialization to configuration of boundary conditions. -The plugin developer has complete freedom to change the equations, however it is important to be aware that it can be +The plugin developer has full freedom to modify the equations, however it is important to be aware that it can be made manipulating the transport equation terms inside the `hooks`. For that, it is important to read the `Tracers` Chapter at |alfasim|'s Technical Manual. diff --git a/docs/source/plugins/99_2_user_interface_reference.rst b/docs/source/plugins/99_2_user_interface_reference.rst index 73c3bcc1..5134cb19 100644 --- a/docs/source/plugins/99_2_user_interface_reference.rst +++ b/docs/source/plugins/99_2_user_interface_reference.rst @@ -1,7 +1,7 @@ Application API =============== -Here is listed the completed API available to implement the :ref:`user_interface_hooks-section`. +Here is listed the complete API available to implement the :ref:`user_interface_hooks-section`. .. contents:: :depth: 3 @@ -24,9 +24,9 @@ Types ----- The ``types`` module supplies UI elements for creating user interfaces with the classic desktop-style, each type -has a related model. +related to a model. -Models are the primary elements to create user interfaces on |alfasim|, models can display data, receive user input, +Models are the primary elements to create user interfaces on |alfasim|. They can display data, receive user input, and provide a container for other fields that should be grouped together. diff --git a/docs/source/plugins/99_3_solver_configuration_reference.rst b/docs/source/plugins/99_3_solver_configuration_reference.rst index d669310f..0c0e5b5b 100644 --- a/docs/source/plugins/99_3_solver_configuration_reference.rst +++ b/docs/source/plugins/99_3_solver_configuration_reference.rst @@ -1,7 +1,7 @@ Configuration API ================= -Here is listed the completed API available to implement the :ref:`solver_config_hooks-section`. +Here is listed the complete API available to implement the :ref:`solver_config_hooks-section`. .. contents:: :depth: 3 diff --git a/docs/source/plugins/index.rst b/docs/source/plugins/index.rst index 49eac4dd..17cb642e 100644 --- a/docs/source/plugins/index.rst +++ b/docs/source/plugins/index.rst @@ -1,8 +1,8 @@ Plugins ======= -The |sdk| help developers to create plugins for |alfasim| application. -Plugins can extend the |alfasim| capabilities in a lot of ways, from adding a simple input to a custom calculation of solver equations. +The |sdk| helps developers to create plugins for |alfasim| application. +Plugins can extend the |alfasim| capabilities in many ways, from adding a simple input to a custom calculation of solver equations. Some examples of the capabilities that can be extended are: