prommis.solid_handling.crusher#

Crusher#

Author: Lingyan Deng

The Crusher module includes power consumption for solid crushing. It is a function of particle size distribution, mass flow rate, and bond work index.

This model contains stage-specific applicability guidance so the unit does not accept an arbitrary feed/product particle-size combination without context.

The stage categories are interpreted using product-P80 intervals:

  • primary: product P80 >= 10 cm

  • secondary: 2 cm <= product P80 <= 10 cm - eps

  • tertiary: 0.5 cm <= product P80 <= 2 cm - eps

Here eps is a small positive tolerance used so the algebraic constraints remain non-overlapping in Pyomo.

If the requested product P80 is below 0.5 cm, the target is treated as finer than this modeled crushing-stage range.

The stage categories is referenced from: Upadhyay, R. K. “Mining, Mineral Beneficiation, and Environment.” Geology and Mineral Resources. Singapore: Springer Nature Singapore, 2025. 799-858.

The model can be configured either by crusher stage or by equipment name. When an unambiguous equipment name is supplied, the corresponding stage is inferred.

A utility method, check_applicability(), is provided to show warning messages when the current product size falls outside the configured stage range, or when the requested target is finer than the modeled crushing-stage range.

Degrees of Freedom#

A Crusher module has two degrees of freedom, which are the output of “particle_size_median” and “particle_size_width”.

Model Structure#

The Crusher model includes one inlet Port (inlet) and one outlet Port (outlet). The properties of the Crusher Unit model is mainly the particle size distribution.

Additional Constraints#

Crusher adds additional constraints to calculate the work required to crush the particles, enforce crushing direction (feed P80 >= product P80), and optionally enforce stage-specific product-P80 applicability limits.

\[work_{t} = 10 * m_{t, in} * BWI * \left(\frac{1}{\sqrt{P_{t, prod, 80}}} - \frac{1}{\sqrt{P_{t, feed, 80}}}\right)\]

where \(work_{t}\) is the work required to crush the particles at \(t\) time, 10 is an empirical value and should not be changed, \(m_{t, in}\) is the inlet mass flow rate at \(t\) time, \(BWI\) is the bond work index of particles, \(P_{t, prod, 80}\) is production particle size with 80% passing the mesh at \(t\) time, \(P_{t, feed, 80}\) is feed particle size with 80% passing the mesh at \(t\) time.

Expressions#

Crusher includes two expressions to calculate the size of particles that has 80% passing the mesh for both feed and product particles. Reference: https://doi.org/10.1016/0304-3967(80)90007-4.

\[P_{t, feed, 80} = \frac{S_{t, in, median}}{unit} * \left(-\log(1 - 0.8)\right)^{\frac{SW_{t, in}}{2}}\]

where \(P_{t, feed, 80}\) is the feed particle size that has 80% passing the mesh at \(t\) time, \(\frac{S_{t, in, median}}{unit}\) is the median particle size of input at \(t\) time and unitless. The default particle size is in micrometer. The \(SW_{t, in}\) is the particle size width of input at \(t\) time.

\[P_{t, prod, 80} = \frac{S_{t, out, median}}{unit} * \left(-\log(1 - 0.8)\right)^{\frac{SW_{t, out}}{2}}\]

where \(P_{t, prod, 80}\) is the product particle size that has 80% passing the mesh at \(t\) time, \(\frac{S_{t, out, median}}{unit}\) is the median particle size of output at \(t\) time and unitless. The default particle size is in micrometer. The \(SW_{t, in}\) is the particle size width of output at \(t\) time.

Variables#

Crusher add the following additional variables beyond those created in property packages.

Variable

Name

Notes

\(work_{t}\)

work

class prommis.solid_handling.crusher.Crusher(*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

    Crush unit is steady-state only

    has_holdup

    Crush unit has no holdup.

    property_package

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

    property_package_args

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

    crusher_stage

    Select the applicable crushing stage. Valid values: - None: infer from equipment, or default to secondary if no equipment is given - primary: jaw, gyratory crusher - secondary: cone, roll1 crusher - tertiary: roll2, short- head cone crusher, hammer mill

    crusher_equipment

    Optional equipment selector. Valid values: - None - jaw - gyratory - cone - roll1 - roll2 - short_head_cone - hammer_mill

    enforce_stage_size_limits

    If True, enforce inclusive interval constraints for the selected stage. Note that the stated primary-stage classification is product P80 > 10 cm; for the algebraic constraint, the lower bound is enforced as product P80 >= 10 cm because strict inequalities cannot be imposed directly in Pyomo constraints. This is opt-in so that a plain Crusher(…) does not impose hard stage-specific bounds unless requested by the user.

  • 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:

(Crusher) New instance

class prommis.solid_handling.crusher.CrusherData(component)[source]#
build()[source]#

Begin building model (pre-DAE transformation).

Parameters:

None

Returns:

None

check_applicability(time_points=None, emit_warning=True)[source]#

Check whether the current product P80 is consistent with the configured stage classification interval.

Parameters:
  • time_points (iterable or None) – Time points to check. If None, check all model time points.

  • emit_warning (bool) – If True, log a warning for each issue.

Returns:

A list of warning messages. Empty if no issues are found.

Return type:

list[str]

property crusher_equipment#

Resolved crusher equipment name used by this unit, if supplied.

Returns:

Crusher equipment name, or None if no equipment was supplied.

Return type:

str or None

property crusher_stage#

Resolved crusher stage used by this unit.

Returns:

One of “primary”, “secondary”, or “tertiary”.

Return type:

str

recommend_stage_for_product_p80(t=None)[source]#

Recommend a crusher stage for the current product P80.

Parameters:

t (hashable or None) – Time index to inspect. If None, use the first time point.

Returns:

(recommended_stage, in_modeled_range)

Return type:

tuple[str, bool]

property stage_selection_basis#

Basis used to resolve the crusher stage.

Returns:

One of “default”, “stage”, “equipment”, or “stage_and_equipment”.

Return type:

str