Source code for CADETProcess.equilibria.initial_conditions
from typing import Optional
import numpy as np
from CADETProcess import CADETProcessError
from CADETProcess.processModel import (
BindingBaseClass,
Cstr,
FlowSheet,
Inlet,
LumpedRateModelWithoutPores,
Outlet,
Process,
)
from CADETProcess.simulator import Cadet
__all__ = ["simulate_solid_equilibria"]
[docs]
def simulate_solid_equilibria(
binding_model: BindingBaseClass,
buffer: list,
unit_model: Optional[str] = "cstr",
flush: Optional[list] = None,
cadet_install_path: Optional[str] = None,
) -> list:
"""
Simulate initial conditions for solid phase for given buffer.
Parameters
----------
binding_model : BindingBase
Binding model describing relation between bulk and solif phase.
buffer : list
Buffer concentration in mM.
unit_model : {'cstr', 'column'}, optional
Unit model to be used in simulation. The default is 'cstr'.
flush : list, optional
Additional buffer for flushing column after loading.
The default is None.
cadet_install_path : str, optional
Path to CADET installation. If None, the default CADET path is used.
Returns
-------
list
Initial conditions for solid phase.
Raises
------
CADETProcessError
DESCRIPTION.
"""
process_name = flow_sheet_name = "initial_conditions"
component_system = binding_model.component_system
# Unit Operations
buffer_source = Inlet(component_system, name="buffer")
buffer_source.c = buffer
if flush is None:
flush = buffer
flush_source = Inlet(component_system, "flush")
flush_source.c = flush
if unit_model == "cstr":
unit = Cstr(component_system, "cstr")
unit.init_liquid_volume = 5e-7
unit.const_solid_volume = 5e-7
Q = 1e-6
cycle_time = np.round(1000 * unit.volume / Q)
unit.flow_rate = Q
elif unit_model == "column":
unit = LumpedRateModelWithoutPores(component_system, name="column")
unit.length = 0.1
unit.diameter = 0.01
unit.axial_dispersion = 1e-6
unit.total_porosity = 0.7
Q = 60 / (60 * 1e6)
cycle_time = np.round(10 * unit.volume / Q)
else:
raise CADETProcessError("Unknown unit model")
try:
q = binding_model.n_comp * binding_model.n_states * [0]
capacity = binding_model.capacity
if isinstance(capacity, list):
capacity = capacity[0]
q[0] = capacity
unit.q = q
c = binding_model.n_comp * [0]
c[0] = buffer[0]
unit.c = c
except AttributeError:
pass
unit.binding_model = binding_model
unit.solution_recorder.write_solution_bulk = True
unit.solution_recorder.write_solution_solid = True
outlet = Outlet(component_system, name="outlet")
# flow sheet
fs = FlowSheet(component_system, name=flow_sheet_name)
fs.add_unit(buffer_source)
fs.add_unit(flush_source)
fs.add_unit(unit)
fs.add_unit(outlet, product_outlet=True)
fs.add_connection(buffer_source, unit)
fs.add_connection(flush_source, unit)
fs.add_connection(unit, outlet)
# Process
proc = Process(fs, name=process_name)
proc.cycle_time = cycle_time
# Create Events and Durations
proc.add_event("buffer_on", "flow_sheet.buffer.flow_rate", Q)
proc.add_event("buffer_off", "flow_sheet.buffer.flow_rate", 0, 0.9 * cycle_time)
proc.add_event("eluent_off", "flow_sheet.flush.flow_rate", 0.0, 0.0)
proc.add_event("eluent_on", "flow_sheet.flush.flow_rate", Q, 0.9 * cycle_time)
# Simulator
process_simulator = Cadet(cadet_install_path)
proc_results = process_simulator.simulate(proc)
if unit_model == "cstr":
init_q = proc_results.solution[unit.name].solid.solution[-1, :]
elif unit_model == "column":
init_q = proc_results.solution[unit.name].solid.solution[-1, 0, :]
init_q = np.round(init_q, 14)
return init_q.tolist()