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.
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.
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.
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]#
-
- 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