Source code for CADETProcess.equilibria.initial_conditions

import numpy as np

from CADETProcess import CADETProcessError

from CADETProcess.processModel import Inlet, Outlet
from CADETProcess.processModel import Cstr, LumpedRateModelWithoutPores
from CADETProcess.processModel import FlowSheet
from CADETProcess.processModel import Process
from CADETProcess.simulator import Cadet


[docs] def simulate_solid_equilibria( binding_model, buffer, unit_model='cstr', flush=None, cadet_install_path=None): """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. Raises ------ CADETProcessError DESCRIPTION. Returns ------- list Initial conditions for solid phase. """ 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.porosity = 0.5 unit.V = 1e-6 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()