Of course you can!
The problem is that you’re switching from a SingleGRM
to a LumpedRateModelWithPores
. The SingleGRM
is actually a combination of a ModelSystem
and a GeneralRateModel
.
CADET only simulates systems. In order to make life a little easier if you just want to simulate a single model, the SingleGRM
, SingleLRMP
, SingleLRM
, and SingleCSTR
classes are offered. These provide the necessary ModelSystem
without the need to fully set it up (i.e., provide InletModel
, connect actual model and InletModel
, etc.).
Long story short, here’s the relevant section of the loadWashElutionSMAsingle.m
file for the LumpedRateModelWithPores
:
% Lumped rate model with pores unit operation
mLrmp = SingleLRMP();
% Discretization
mLrmp.nComponents = 4;
mLrmp.nCellsColumn = 16; % Attention: This is very low and only used for illustration (short runtime)
mLrmp.nBoundStates = ones(mLrmp.nComponents, 1); % Number of bound states for each component
% Initial conditions (equilibrated empty column)
mLrmp.initialBulk = [50.0 0.0 0.0 0.0]; % [mol / m^3], also used for the particle mobile phase
mLrmp.initialSolid = [1.2e3 0.0 0.0 0.0]; % [mol / m^3]
% Transport
mLrmp.dispersionColumn = 5.75e-8; % [m^2 / s]
mLrmp.filmDiffusion = [6.9e-6 6.9e-6 6.9e-6 6.9e-6]; % [m/s]
mLrmp.interstitialVelocity = 5.75e-4; % [m/s]
% Geometry
mLrmp.columnLength = 0.014; % [m]
mLrmp.particleRadius = 4.5e-5; % [m]
mLrmp.porosityColumn = 0.37; % [-]
mLrmp.porosityParticle = 0.75; % [-]
% Adsorption
mSma = StericMassActionBinding();
mSma.kineticBinding = false; % Quasi-stationary binding
mSma.lambda = 1.2e3; % Ionic capacity [mol / m^3]
mSma.kA = [0.0 35.5 1.59 7.7]; % Adsorption rate [(m^3 / mol)^nu / s]
mSma.kD = [0.0 1000 1000 1000]; % Desorption rate [(m^3 / mol)^nu / s]
mSma.nu = [0.0 4.7 5.29 3.7]; % Characteristic charge [-]
mSma.sigma = [0.0 11.83 10.6 10.0]; % Steric factor [-]
mLrmp.bindingModel = mSma;
% Specify inlet profile
% Reserve space: nSections x nComponents (a section can be thought of being a
% step in the process, see below)
mLrmp.constant = zeros(3, mLrmp.nComponents);
mLrmp.linear = zeros(3, mLrmp.nComponents);
mLrmp.quadratic = zeros(3, mLrmp.nComponents);
mLrmp.cubic = zeros(3, mLrmp.nComponents);
% Section 1: Loading phase
mLrmp.constant(1,1) = 50.0; % [mol / m^3] component 1
mLrmp.constant(1,2) = 1.0; % [mol / m^3] component 2
mLrmp.constant(1,3) = 1.0; % [mol / m^3] component 3
mLrmp.constant(1,4) = 1.0; % [mol / m^3] component 4
% Section 2: Washing phase (no protein feed)
mLrmp.constant(2,1) = 50.0; % [mol / m^3] component 1
% Section 3: Elution phase (linear salt gradient with step at the beginning)
mLrmp.constant(3,1) = 100; % [mol / m^3] component 1
mLrmp.linear(3,1) = 0.2; % [mol / (m^3 * s)] component 1
Accordingly, for the LumpedRateModelWithoutPores
, we get
% Lumped rate model without pores unit operation
mLrm = SingleLRM();
% Discretization
mLrm.nComponents = 4;
mLrm.nCellsColumn = 16; % Attention: This is very low and only used for illustration (short runtime)
mLrm.nBoundStates = ones(mLrm.nComponents, 1); % Number of bound states for each component
% Initial conditions (equilibrated empty column)
mLrm.initialBulk = [50.0 0.0 0.0 0.0]; % [mol / m^3], also used for the particle mobile phase
mLrm.initialSolid = [1.2e3 0.0 0.0 0.0]; % [mol / m^3]
% Transport
mLrm.dispersionColumn = 5.75e-8; % [m^2 / s]
mLrm.interstitialVelocity = 3e-3; % [m/s]
% Geometry
mLrm.columnLength = 0.014; % [m]
mLrm.porosity = 0.37 * (1.0 - 0.37) * 0.75; % [-]
% Adsorption
mSma = StericMassActionBinding();
mSma.kineticBinding = false; % Quasi-stationary binding
mSma.lambda = 1.2e3; % Ionic capacity [mol / m^3]
mSma.kA = [0.0 35.5 1.59 7.7]; % Adsorption rate [(m^3 / mol)^nu / s]
mSma.kD = [0.0 1000 1000 1000]; % Desorption rate [(m^3 / mol)^nu / s]
mSma.nu = [0.0 4.7 5.29 3.7]; % Characteristic charge [-]
mSma.sigma = [0.0 11.83 10.6 10.0]; % Steric factor [-]
mLrm.bindingModel = mSma;
% Specify inlet profile
% Reserve space: nSections x nComponents (a section can be thought of being a
% step in the process, see below)
mLrm.constant = zeros(3, mLrm.nComponents);
mLrm.linear = zeros(3, mLrm.nComponents);
mLrm.quadratic = zeros(3, mLrm.nComponents);
mLrm.cubic = zeros(3, mLrm.nComponents);
% Section 1: Loading phase
mLrm.constant(1,1) = 50.0; % [mol / m^3] component 1
mLrm.constant(1,2) = 1.0; % [mol / m^3] component 2
mLrm.constant(1,3) = 1.0; % [mol / m^3] component 3
mLrm.constant(1,4) = 1.0; % [mol / m^3] component 4
% Section 2: Washing phase (no protein feed)
mLrm.constant(2,1) = 50.0; % [mol / m^3] component 1
% Section 3: Elution phase (linear salt gradient with step at the beginning)
mLrm.constant(3,1) = 100; % [mol / m^3] component 1
mLrm.linear(3,1) = 0.2; % [mol / (m^3 * s)] component 1
The model (mLrm
or mLrmp
) is then passed to the simulator object:
% Construct and configure simulator
sim = Simulator.create();
sim.solutionTimes = linspace(0, 1500, 1001); % [s], time points at which solution is computed
% sectionTimes holds the sections and sectionContinuity indicates whether
% the transition between two adjacent sections is continuous
sim.sectionTimes = [0.0 10.0 90.0 1500.0]; % [s]
sim.sectionContinuity = false(2,1);
% Hand model over to simulator
sim.model = mLrmp; % or mLrm