#####################################################################################################
# “PrOMMiS” was produced under the DOE Process Optimization and Modeling for Minerals Sustainability
# (“PrOMMiS”) initiative, and is copyright (c) 2023-2026 by the software owners: The Regents of the
# University of California, through Lawrence Berkeley National Laboratory, et al. All rights reserved.
# Please see the files COPYRIGHT.md and LICENSE.md for full copyright and license information.
#####################################################################################################
"""
Preliminary property package for West Kentucky No. 13 coal refuse.
Authors: Alejandro Garciadiego
"""
from pyomo.common.config import ConfigValue
from pyomo.environ import Param, Var, units
import idaes.core.util.scaling as iscale
from idaes.core import (
MaterialFlowBasis,
Phase,
PhysicalParameterBlock,
StateBlock,
StateBlockData,
declare_process_block_class,
)
from idaes.core.util.initialization import fix_state_vars
# -----------------------------------------------------------------------------
# Precipitate solution property package
def _config_blk_build(blk):
blk.declare(
"key_components",
ConfigValue(
default=None,
domain=set,
description="Set of key components",
doc="(set) Set of key components",
),
)
[docs]
@declare_process_block_class("PrecipitateParameters")
class PrecipitateParametersData(PhysicalParameterBlock):
"""
Solid phase property package for oxalate precipitation.
Based on assay provided in:
RESEARCH PERFORMANCE FINAL REPORT, Pilot-Scale Testing of an Integrated
Circuit for the Extraction of Rare Earth Minerals and Elements from Coal
and Coal Byproducts Using Advanced Separation Technologies,
Honaker, R.Q., et al., DE-FE0027035
Includes the following components:
* Rare Earth Oxalates: "Al2(C2O4)3(s)", "Fe2(C2O4)3(s)", "Sc2(C2O4)3(s)",
"Y2(C2O4)3(s)", "La2(C2O4)3(s)", "Ce2(C2O4)3(s)", "Pr2(C2O4)3(s)",
"Nd2(C2O4)3(s)", "Sm2(C2O4)3(s)", "Gd2(C2O4)3(s)", "Dy2(C2O4)3(s)"
"""
CONFIG = PhysicalParameterBlock.CONFIG()
_config_blk_build(CONFIG)
[docs]
def build(self):
super().build()
self.solid = Phase()
comp_list = [
"Al2(C2O4)3(s)",
"Ca(C2O4)(s)",
"Fe2(C2O4)3(s)",
"Sc2(C2O4)3(s)",
"Y2(C2O4)3(s)",
"La2(C2O4)3(s)",
"Ce2(C2O4)3(s)",
"Pr2(C2O4)3(s)",
"Nd2(C2O4)3(s)",
"Sm2(C2O4)3(s)",
"Gd2(C2O4)3(s)",
"Dy2(C2O4)3(s)",
]
self.component_list = comp_list
self.react = {
"Sc2(C2O4)3(s)": "Sc",
"Y2(C2O4)3(s)": "Y",
"La2(C2O4)3(s)": "La",
"Ce2(C2O4)3(s)": "Ce",
"Pr2(C2O4)3(s)": "Pr",
"Nd2(C2O4)3(s)": "Nd",
"Sm2(C2O4)3(s)": "Sm",
"Gd2(C2O4)3(s)": "Gd",
"Dy2(C2O4)3(s)": "Dy",
"Al2(C2O4)3(s)": "Al",
"Ca(C2O4)(s)": "Ca",
"Fe2(C2O4)3(s)": "Fe",
}
self.stoich = Param(
self.component_list,
units=units.mol / units.mol,
initialize={
"Sc2(C2O4)3(s)": 2,
"Y2(C2O4)3(s)": 2,
"La2(C2O4)3(s)": 2,
"Ce2(C2O4)3(s)": 2,
"Pr2(C2O4)3(s)": 2,
"Nd2(C2O4)3(s)": 2,
"Sm2(C2O4)3(s)": 2,
"Gd2(C2O4)3(s)": 2,
"Dy2(C2O4)3(s)": 2,
"Al2(C2O4)3(s)": 2,
"Ca(C2O4)(s)": 1,
"Fe2(C2O4)3(s)": 2,
},
)
self.mw = Param(
self.component_list,
units=units.kg / units.mol,
initialize={
"Sc2(C2O4)3(s)": 354 * 1e-3,
"Y2(C2O4)3(s)": 441.87 * 1e-3,
"La2(C2O4)3(s)": 541.87 * 1e-3,
"Ce2(C2O4)3(s)": 544.286 * 1e-3,
"Pr2(C2O4)3(s)": 545.87 * 1e-3,
"Nd2(C2O4)3(s)": 552.54 * 1e-3,
"Sm2(C2O4)3(s)": 564.77 * 1e-3,
"Gd2(C2O4)3(s)": 578.56 * 1e-3,
"Dy2(C2O4)3(s)": 769.21 * 1e-3,
"Al2(C2O4)3(s)": 318.02 * 1e-3,
"Ca(C2O4)(s)": 128.097 * 1e-3,
"Fe2(C2O4)3(s)": 143.86 * 1e-3,
},
)
self._state_block_class = PrecipitateBlock
class _PrecipitateBlock(StateBlock):
def fix_initialization_states(self):
"""
Fixes state variables for state blocks.
Returns:
None
"""
# Fix state variables
fix_state_vars(self)
[docs]
@declare_process_block_class("PrecipitateBlock", block_class=_PrecipitateBlock)
class PrecipitateStateBlockData(StateBlockData):
"""
State block for solid REE oxalate.
"""
[docs]
def build(self):
super().build()
# State Variables
self.temperature = Var(
initialize=348.15,
doc="Temperature",
units=units.kelvin,
bounds=(298.15, None),
)
self.flow_mol_comp = Var(
self.params.component_list,
units=units.mol / units.hour,
initialize=1e-5,
bounds=(1e-20, None),
)
iscale.set_scaling_factor(self.flow_mol_comp, 1e3)
iscale.set_scaling_factor(self.temperature, 1e1)
iscale.set_scaling_factor(self.flow_mol_comp["Sc2(C2O4)3(s)"], 1e5)
[docs]
def get_material_flow_basis(self):
return MaterialFlowBasis.molar
[docs]
def define_state_vars(self):
return {
"flow_mol_comp": self.flow_mol_comp,
"temperature": self.temperature,
}