The library includes blocks such as Tank, Pipeline, Valve, FluidSource, and FluidDispose. There are also blocks for routing, merging, and diverging the flow. In addition, there is an object FluidConveyor designed to model transfer of bulk or condensable matter. See the full list of Fluid Library blocks here.

The Fluid Library interoperates with the Process Modeling Library: it can convert agents into portions of fluid and vice versa.

The Fluid Library blocks put linear constrains on the flow rates, such as maximum rates, proportional rates, and so on. The library engine maximizes the flow throughout the system. As a result, the flow rates in the library are piecewise-constant (constant within time intervals), and only change instantly at discrete moments of time.

The linear nature of the flow dynamics allows for using LP (linear programming) solver to calculate the maximum rates. The solver is invoked only at the discrete moments of change, which makes the execution speed of the Fluid Library models a lot higher than that of the System Dynamics models. At the same time, the LP calculations are much more accurate as there is no notion of time step in the LP solver. We recommend using the Fluid Library when the system is linear, and using System Dynamics only for non-linear cases, i.e. when there are continuous feedback loops in the model, or continuous rate changes.

By default, these blocks of the Fluid Library ask the LP solver to maximize their outflow: FluidSource, AgentToFluid, Tank, and BulkConveyor. In addition, the FluidMerge and FluidSplit blocks in the priority mode will ask to maximize the flow at one of the inputs or outputs. Internally, this is done by raising the priority (coefficient) of the corresponding rate in the LP objective function. By default, the rate being maximized gets the priority 1, all other rates – 0. However, this will not always result in the desirable global picture. The user can create flowchart configurations with priority conflicts, and the library will not be able to figure out the correct global priorities without additional information. The Fluid Library allows you to provide that information in the form of custom priority values, see the corresponding parameters of the blocks listed above. The color indication of priority violation in FluidSplit and FluidMerge blocks may help you to track down issues with flow distribution.

If a rate evaluates to Utils.MAXIMUM_RATE (1.0E10) during runtime, the model stops with an error “Flow rate evaluated to the maximum value. You need to set a limit for this rate.” This is done because typically maximum rate is not normal and is a result of the user forgetting to set a limit somewhere. To avoid this, please set the upper limit for rate in flowchart block(s) where required.

Here are some important places where TOLERANCE is used:

- Amounts of fluid in Tank, Pipeline, BulkConveyor, FluidSource, FluidToAgent, FluidPickup, and amount that flowed through Valve are snapped to 0 and, where applicable, to capacity.
- Tank, Pipeline, and BulkConveyor do not create batches of size less than TOLERANCE.
- Detection of Tank becoming full or empty, and detection of certain level being reached (above/below) is done with TOLERANCE.
- Obviously, all of the the above also applies to the composite blocks that contain Tank.
- FluidPickup and FluidToAgent detect accumulation of the given amount with TOLERANCE.
- In BulkConveyor density variations that are within TOLERANCE are not counted (do not result in new bulk "portions" being created).