prommis.evaporation_pond.evaporation_pond#

Solar Evaporation Pond#

Author: Andrew Lee

The Evaporation Pond model is a general purpose model for representing evaporation ponds (both solar and enhanced). Currently, the model only supports steady-state operation (although it could be easily extended to dynamics). The model also only supports material balances with equilibrium reactions, as energy and momentum balances are less meaningful given the open-air nature of these operations and the long-duration time constants involved.

Configuration Arguments#

When creating an instance of an Evaporation Pond model, the user may specify the name of the solvent phase used by the associated property package, which is used to determine which component requires an evaporation term in the material balances. The default name is ‘H2O’, and only a single solvent is supported.

Evaporation Pond models also require a reaction package to define the precipitation reactions which occur in the system. However, unlike normal reaction packages, the equilibrium constraints are written by the unit model as it is necessary to include a conditional check for sub-saturated reactions. Thus, the reaction package should not create any equilibrium constraints, and need only meet the following conditions:

Reaction Parameter Block:

  • Define the set of equilibrium reaction names (equilibrium_reaction_idx), and

  • define the stoichiometry coefficients for the equilibrium reactions (equilibrium_reaction_stoichiometry).

Reaction Block:

  • Define the solubility products for each reaction. Each reaction requires a separate Var or Param named solubility_product_X where X is the identifier for each reaction in equilibrium_reaction_idx. Separate components are required as the units of measurement for each reaction may be different.

  • All reactions are assumed to use a standard power law form.

Degrees of Freedom#

Evaporation Pond models have three degrees of freedom in addition to the feed stream state. The most common variables to specify are:

  • the surface area of the evaporation pond, surface_area,

  • the average depth of liquid in the pond, average_pond_depth, and

  • the rate of evaporation in units of length/time (or volume evaporated per unit area per time), evaporation_rate.

Model Structure#

The Evaporation Pond unit model does not use Control Volumes, and writes custom material balances and reaction constraints. The Evaporation Pond model has one inlet and one outlet Port (named inlet and outlet respectively).

Variables#

Evaporation Pond models have the following Variables.

Variable

Name

Indexing Set(s)

\(A_{t}\)

surface_area

time

\(D_{t}\)

average_pond_depth

time

\(V_{t}\)

volume

time

\(e_{t}\)

evaporation_rate

time

\(W_{t}\)

water_loss_rate

time

\(P_{t, j}\)

precipitation_rate

time, component list

\(X_{t, r}\)

reaction_extent

time, reaction list

Params#

Evaporation Pond models have the following Params, which are used in the complementarity constraint for precipitation.

Parameter

Name

Indexing Set

Notes

\(\epsilon\)

eps

Smoothing parameter for smooth_max

\(norm_{r}\)

s_norm

reaction list

Normalizing factor, should match magnitude of solubility product

\(scale_{r}\)

s_scale

reaction list

Scaling factor for reaction product, Q = Ksp - f(C)

Constraints#

Evaporation Pond models have the following constraints.

Component balances:

For the solvent:

\[0 = F_{in,t,j} - F_{out,t,j} + P_{t_j} + W_{t}\]

For other species:

\[0 = F_{in,t,j} - F_{out,t,j} + P_{t_j}\]

where \(F_{in,t,j}\) and \(F_{out,t,j}\) are the flow rate of component \(j\) in to and out of the pond at time \(t\).

Stoichiometry Constraint:

\[P_{t, j} = \sum_r{n_{r,j} \times X_{t,r}}\]

where \(n_{r,j}\) is the stoichiometric coefficient for component \(j\) in reaction \(r\).

Equilibrium Constraint:

\[Q_{t, r} - \max{0, Q_{t,r}-\bar{X}_{t,r}} = 0\]

where \(Q_{t,r} = \ln{K_{t,r}} - \sum_j{-n_{r,j} \times \ln{C_{t,j}}}\) and \(K_{t,r}\) is the solubility product for reaction \(r\) at time \(t\), \(C_{t,j}\) is the concentration of species \(j\) at time \(t\), and \(\bar{X}_{t,r} = scale_{r} \times \frac{X_{t,r}}{X_{t,r} + norm_{r}}\) The math:max operator is approximated using a smooth maximum,

Evaporation Constraint:

\[W_{t} = e_{t} \times A_{t}\]

Volume Constraint:

\[V_{t} = D_{t} \times A_{t}\]
class prommis.evaporation_pond.evaporation_pond.EvaporationPond(*args, **kwds)#
Parameters:
  • rule (function) – A rule function or None. Default rule calls build().

  • concrete (bool) – If True, make this a toplevel model. Default - False.

  • ctype (class) –

    Pyomo ctype of the block. Default - pyomo.environ.Block

    Config args

    dynamic

    Indicates whether this model will be dynamic or not, default = False. Equilibrium Reactors do not support dynamic behavior.

    has_holdup

    Indicates whether holdup terms should be constructed or not. default - False. Equilibrium reactors do not have defined volume, thus this must be False.

    property_package

    Property parameter object used to define property calculations, default - useDefault. Valid values: { useDefault - use default package from parent model or flowsheet, PhysicalParameterObject - a PhysicalParameterBlock object.}

    property_package_args

    A ConfigDict with arguments to be passed to property block(s) and used when constructing these, default - None. Valid values: { see property package for documentation.}

    reaction_package

    Reaction parameter object used to define precipitation reactions, default - useDefault. Valid values: { useDefault - use default package from parent model or flowsheet, ReactionParameterObject - a ReactionParameterBlock object.}

    reaction_package_args

    A ConfigDict with arguments to be passed to reaction block(s) and used when constructing these, default - None. Valid values: { see reaction package for documentation.}

    solvent_id

    Name of solvent component (default=’H2O’).

  • initialize (dict) – ProcessBlockData config for individual elements. Keys are BlockData indexes and values are dictionaries with config arguments as keys.

  • idx_map (function) – Function to take the index of a BlockData element and return the index in the initialize dict from which to read arguments. This can be provided to override the default behavior of matching the BlockData index exactly to the index in initialize.

Returns:

(EvaporationPond) New instance

class prommis.evaporation_pond.evaporation_pond.EvaporationPondData(component)[source]#

Evaporation Pond Unit Model Class

build()[source]#

Build method for EvaporationPond unit model.

default_initializer#

alias of EvaporationPondInitializer

class prommis.evaporation_pond.evaporation_pond.EvaporationPondInitializer(**kwargs)[source]#

Initializer object for EvaporationPond unit models.

This Initializer initializes the inlet StateBlock, maps the solution of this onto the outlet StateBlock, and then solves the full model.

constraint_tolerance

Tolerance for checking constraint convergence

output_level

Set output level for logging messages

solver

Solver to use for initialization

solver_options

Dict of options to pass to solver

writer_config

Dict of writer_config arguments to pass to solver

default_submodel_initializer

Default Initializer object to use for sub-models. Only used if no Initializer defined in submodel_initializers.

initialization_routine(model: Block, plugin_initializer_args: dict = None)[source]#

Common initialization routine for EvaporationPond unit models.

Parameters:
  • model – Pyomo Block to be initialized

  • plugin_initializer_args – dict-of-dicts containing arguments to be passed to plug-in Initializers. Keys should be submodel components.

Returns:

Pyomo solver results object

initialize_main_model(model: Block)[source]#

Initialization routine for EvaporationPond unit models.

Parameters:

model – current model being initialized

Returns:

Pyomo solver results object from solve of main model