prommis.roasting.ree_oxalate_roaster#

IDAES REE Oxalate Roaster Unit Model#

REE Oxalate Roaster is a unit operation to convert oxalates of rare earth and gangue metal elements to metal oxides through thermal decomposition and oxidation. There are 18 rare earth elements including Sc, Y, La, Ce, Pr, Nd, Pm, Sm, Eu, Gd, Tb, Dy, Ho, Er, Tm, Yb, Lu, and Th in the model. The user can specify a subset of those 18 elements through configuration when creating the unit model. The 3 gangue elements considered in the model are Fe, Al, and Ca.

The feed oxalate mixture stream is typically from a precipitator in an upstream process. It is assumed that all oxalates are in their hydrate forms. In case the anhydrous oxalate feed flow rates are specified in the property package of the solid feed stream, the molar flow rates are converted to the corresponding hydrate flow rates. The molecular formula of an oxalate hydrate can be expressed in a general form as \(\require{mhchem} \ce{RE2(C2O4)3 \cdot xH2O}\) where RE is one of the 18 rare earth elements and x is the number of water molecules associated with the hyrate. The three gangue oxalate hydrates considered in the model are \(\require{mhchem} \ce{Fe2(C2O4)3 \cdot 2H2O}\), \(\require{mhchem} \ce{Al2(C2O4)3 \cdot H2O}\), and \(\require{mhchem} \ce{CaC2O4 \cdot H2O}\), for Fe, Al, and Ca elements, respectively.

The feed stream contains surface moisture. The amount of surface moisture entering the reactor is specified by a liquid inlet that contains a fraction of the liquid outlet of the precipitator.

Physical Changes#

Moisture in the solid feed stream from the liquid inlet is vaporized.

Reactions#

The thermal decomposition reactions modeled for rare earth oxalates and three gaugue oxalates are as listed below:

  • \(\require{mhchem} \ce{RE2(C2O4)3 \cdot xH2O(s) + 1.5O2(g) -> RE2O3(s) + 6CO2(g) + xH2O(g)}\)

  • \(\require{mhchem} \ce{Fe2(C2O4)3 \cdot 2H2O(s) + 1.5O2(g) -> Fe2O3(s) + 6CO2(g) + 2H2O(g)}\)

  • \(\require{mhchem} \ce{Al2(C2O4)3 \cdot H2O(s) + 1.5O2(g) -> Al2O3(s) + 6CO2(g) + H2O(g)}\)

  • \(\require{mhchem} \ce{CaC2O4 \cdot H2O(s) + 0.5O2(g) -> CaO(s) + 2CO2(g) + H2O(g)}\)

In the first reaction, RE represent any of 18 rare earth elements and x is the number of water molecules associated with the oxalate. Typically x=10 for most rare earth elements. It is assumed in the current model that the reaction is carried out at a high enough temperature and long enough residence time that the reactants are completely decomposed. It is also assumed that a gas feed stream provides enough \(\require{mhchem} \ce{O2}\) reactant to carry out the reactions. Since the kinetics of the reactions are not modeled, the current unit model is valid for steady-state simulations only.

Thermal Properties#

The standard heats of formation and heat capacities of solid components involved are defined as parameters in this model. The default values of those parameters are obtained from three sources as listed below:

  1. NIST Chemistry WebBook

  2. Wagman, D.D., W.H. Evans, V.B. Parker, R.H.Schumm, I. Halow, S.M. Bailey, K.L. Churney, R.L. Nuttall, “The NBS tables of chemical thermodynamic properties-Selected values for inorganic and C1 and C2 organic substances in SI units,” Journal of Physical and Chemical Reference Data, 11(2), 1982

  3. Kotz, J.C., P.M. Treichel, J. Townsend, D. Treichel, “Chemistry and Chemical Reactivity,” 9th Edition, Cengage Learning, 2014

The solid heat capacity model is simplified as a linear function of temperature. Since the data for the rare earth components are very limited, default parameters based on the average values of \(\require{mhchem} \ce{La}\), \(\require{mhchem} \ce{Ce}\), \(\require{mhchem} \ce{Pr}\), and \(\require{mhchem} \ce{Nd}\) are used for the species if no reported data are found.

The gas phase properties are calculated based on user configured property package.

Mass Balance#

The content of the surface moisture specified by the liquid inlet stream is vaporized and enters the gas phase. The other species in the liquid solution, including metal elements in the liquid inlet stream, are ignored.

The species mass balance is based on complete conversion of solid reactants such that the molar flow rates of individual metals (rare earth and gangue elements) are conserved. For the species in the gas phase, the \(\require{mhchem} \ce{O2}\) is consumed while \(\require{mhchem} \ce{CO2}\) and \(\require{mhchem} \ce{H2O}\) are produced. For any other species in the gas feed stream that does not participate in any reactions, its molar flow rate in the gas product stream is the same as that in the inlet stream. Note that the user needs to make sure that the gas feed stream contains enough \(\require{mhchem} \ce{O2}\) to avoid negative flow rate of \(\require{mhchem} \ce{O2}\) in the gas product stream.

Two solid product streams are modeled, one representing the fine solid product particles carried out by the gas product stream and the other are the remaining solid oxides leaving the reactor that is recovered as the final metal oxide product. The fractions of recovery for individual metal oxides are specified by the user as model inputs.

Energy Balance#

The model considers the heat required to vaporize the moisture content of the solid feed based on the enthalpy increase from the liquid water in the solid feed stream to water vapor in the gas outlet stream. The heats of reactions are also considered along with the heat capacities of the reactants and product species. The total enthalpy including the standard heat of formation and sensible heat of an individual component (either a gas or a solid species) is used for energy balance calculation. The outlet gas product stream is assumed to have the same temperature as the two solid product streams.

Heat Source#

The heat to the reactor can be provided either by external heating as a user input or by the combustion of a fossil fuel with air to form a hot \(\require{mhchem} \ce{O2}\)-containing flue gas. The gas inlet stream is an \(\require{mhchem} \ce{O2}\)-containing hot flue gas.

Streams#

  • Gas Inlet Stream: \(\require{mhchem} \ce{O2}\)-containing hot flue gas.

  • Gas Outlet Stream: Gas product leaving the reactor.

  • Solid Inlet Stream: Solid feed of oxalate mixture entering the reactor.

  • Liquid Inlet Stream: Surface moisture in the solid feed as a liquid inlet entering the reactor.

Note that the two solid product streams (fine solid carried by the gas stream and the recovered solid product stream) are not defined as outlet streams and their flow rates are defined as model variables.

class prommis.roasting.ree_oxalate_roaster.REEOxalateRoaster(*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 = useDefault. Valid values: { useDefault - get flag from parent (default = False), True - set as dynamic model, False - set as a steady-state model.}

    has_holdup

    Indicates whether holdup terms should be constructed or not. Must be True if dynamic = True, default - False. Valid values: { True - construct holdup terms, False - do not construct holdup terms}

    property_package_gas

    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_gas

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

    property_package_precipitate_solid

    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_precipitate_solid

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

    property_package_precipitate_liquid

    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_precipitate_liquid

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

    has_heat_transfer

    Indicates whether terms for heat transfer should be constructed, default - False. Valid values: { True - include heat transfer terms, False - exclude heat transfer terms.}

    has_pressure_change

    Indicates whether terms for pressure change should be constructed, default - False. Valid values: { True - include pressure change terms, False - exclude pressure change terms.}

    metal_list

    A list of metal elements contained in solid oxalate feed

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

(REEOxalateRoaster) New instance

class prommis.roasting.ree_oxalate_roaster.REEOxalateRoasterData(component)[source]#

Simple 0D roaster model with mass and energy balance only

build()[source]#

General build method for UnitModelBlockData. This method calls a number of sub-methods which automate the construction of expected attributes of unit models.

Inheriting models should call super().build.

Parameters:

None

Returns:

None

default_scaler#

alias of REEOxalateRoasterScaler

initialize_build(state_args_gas_in=None, outlvl=0, solver=None, optarg=None)[source]#

Initialization routine. 1.- initialize state blocks, using an initial guess for inlet gas inlet. 2.- guess gas outlet component molar flowrates, Temperature, and Pressure. Initialize flue gas state block. 3.- Then, solve complete model.

Keyword Arguments:
  • state_args_gas_in – a dict of arguments to be passed to the property package(s) for the inlet gas state block to provide an initial state for initialization (see documentation of the specific property package) (default = None).

  • outlvl – sets output level of initialisation routine

  • optarg – solver options dictionary object (default=None, use default solver options)

  • solver – str indicating which solver to use during initialization (default = None, use default solver)

Returns:

None

class prommis.roasting.ree_oxalate_roaster.REEOxalateRoasterScaler(**kwargs)[source]#

Scaler for the REEOxalateRoaster unit model.

zero_tolerance

Value at which a variable will be considered equal to zero for scaling.

max_variable_scaling_factor

Maximum value for variable scaling factors.

min_variable_scaling_factor

Minimum value for variable scaling factors.

max_constraint_scaling_factor

Maximum value for constraint scaling factors.

min_constraint_scaling_factor

Minimum value for constraint scaling factors.

max_expression_scaling_hint

Maximum value for expression scaling hints.

min_expression_scaling_hint

Minimum value for constraint scaling hints.

overwrite

Whether to overwrite existing scaling factors.

constraint_scaling_routine(model, overwrite: bool = False, submodel_scalers: dict = None)[source]#

Routine to apply scaling factors to constraints in model.

Parameters:
  • model – model to be scaled

  • overwrite – whether to overwrite existing scaling factors

  • submodel_scalers – dict of Scalers to use for sub-models, keyed by submodel local name

Returns:

None

variable_scaling_routine(model, overwrite: bool = False, submodel_scalers: dict = None)[source]#

Variable scaling routine for LeachingTrain.

Parameters:
  • model – instance of LeachingTrain to be scaled

  • overwrite – whether to overwrite existing scaling factors

  • submodel_scalers – dict of Scalers to use for sub-models, keyed by submodel local name

Returns:

None