(* ASCEND modelling environment
Copyright (C) 1998, 2007 Carnegie Mellon University
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*)
REQUIRE "atoms.a4l";
(*
The following the conditional model is discussed in the PhD thesis of
Vicente Rico-Ramirez,
https://pse.cheme.cmu.edu/ascend/ftp/pdfThesis/victhesis.pdf
The original problem was presented by Joe Zaher
Zaher, Conditional Modeling. Ph.D. Thesis, Carnegie Mellon University,
Pittsburgh, PA. 1995.
The problem consists of a phase equilibrium calculation of a
multicomponent mixture. For each of the phases (3 phases are possible:
organic-liquid, inorganic-liquid, and vapor) there is a disjunctive
statement which represents whether the phase exists or not. It represents
a problem which we can represent as a conditional model and solve with
the ASCEND conditional solver, CMSlv.
by Vicente Rico-Ramirez, April 10, 1998
*)
MODEL phaseq;
phases IS_A set OF symbol_constant;
components IS_A set OF symbol_constant;
k_terms IS_A set OF integer_constant;
z[components] IS_A fraction;
y[phases][components] IS_A fraction;
phi[phases] IS_A fraction;
exist[phases] IS_A boolean_var;
P IS_A pressure;
T IS_A temperature;
Pcr[components] IS_A critical_pressure;
Tcr[components] IS_A critical_temperature;
B[components][k_terms] IS_A factor_constant;
C[k_terms] IS_A factor_constant;
A[components][components] IS_A temperature_constant;
(* Definition os sets *)
components :== ['B','E','W'];
phases :== ['A','O','V'];
k_terms :== [1..4];
(* Boundaries *)
CONDITIONAL
FOR i IN phases CREATE
cond[i]: SUM[y[i][j] | j IN components ]+ phi[i] >= 1.0;
END FOR;
END CONDITIONAL;
FOR i IN phases CREATE
(* Variant Equations *)
sum[i]: SUM[y[i][j] | j IN components ] = 1.0;
frac[i]: phi[i] = 0.0;
exist[i] == SATISFIED(cond[i],1e-08);
(* Disjunctive statement *)
WHEN (exist[i])
CASE TRUE:
USE sum[i];
CASE FALSE:
USE frac[i];
END WHEN;
END FOR;
(* Invariant Equations *)
FOR i IN components CREATE
y['V'][i] = y['A'][i] * (Pcr[i]/P) * exp(
((1/T) *
SUM[ ( A[i][j] - (0.5*
SUM[ A[j][k] * y['A'][k] | k IN components]
) ) * y['A'][j]
| j IN components ]) +
((Tcr[i]/T) *
SUM[ B[i][k] * ( (1 - (T/Tcr[i]))^C[k] ) | k IN k_terms] ) );
y['V'][i] = y['O'][i] * (Pcr[i]/P) * exp(
((1/T) *
SUM[ ( A[i][j] - (0.5*
SUM[ A[j][k] * y['O'][k] | k IN components]
) ) * y['O'][j]
| j IN components ]) +
((Tcr[i]/T) *
SUM[ B[i][k] * ( (1 - (T/Tcr[i]))^C[k] ) | k IN k_terms] ) );
END FOR;
FOR i IN components CREATE
SUM[phi[j]*y[j][i] | j IN phases] = z[i];
END FOR;
(* Constants *)
Tcr['B'] :== 562.2 {K};
Tcr['E'] :== 516.2 {K};
Tcr['W'] :== 647.4 {K};
Pcr['B'] :== 48.3 {atm};
Pcr['E'] :== 63.0 {atm};
Pcr['W'] :== 217.6 {atm};
C[1] :== 1.0;
C[2] :== 1.5;
C[3] :== 3.0;
C[4] :== 6.0;
A['B']['B'] :== 0.0{K};
A['B']['E'] :== 576.3 {K};
A['B']['W'] :== 1074.5 {K};
A['E']['B'] :== 576.3 {K};
A['E']['E'] :== 0.0 {K};
A['E']['W'] :== 351.8 {K};
A['W']['B'] :== 1074.5 {K};
A['W']['E'] :== 351.8 {K};
A['W']['W'] :== 0.0 {K};
B['B'][1] :== -6.98273;
B['B'][2] :== 1.33213;
B['B'][3] :== -2.62863;
B['B'][4] :== -3.33399;
B['E'][1] :== -8.51838;
B['E'][2] :== 0.34163;
B['E'][3] :== -5.73683;
B['E'][4] :== 8.32581;
B['W'][1] :== -7.76451;
B['W'][2] :== 1.45838;
B['W'][3] :== -2.77580;
B['W'][4] :== -1.23303;
METHODS
METHOD default_self;
END default_self;
METHOD specify;
FIX P;
FIX T;
FOR i IN components DO
FIX z[i];
END FOR;
END specify;
METHOD values;
(* fixed *)
T := 340.0 {K};
P := 1.0 {atm};
z['B'] := 0.50;
z['E'] := 0.15;
z['W'] := 0.35;
(* initial values for reals *)
y['A']['B'] := 0.02;
y['A']['E'] := 0.03;
y['A']['W'] := 0.95;
y['O']['B'] := 0.95;
y['O']['E'] := 0.03;
y['O']['W'] := 0.02;
y['V']['B'] := 0.50;
y['V']['E'] := 0.15;
y['V']['W'] := 0.35;
phi['A'] := 0.0;
phi['O'] := 0.0;
phi['V'] := 0.0;
(* initial values for booleans *)
FOR i IN phases DO
exist[i] := SATISFIED(cond[i],1e-08);
END FOR;
END values;
METHOD on_load;
RUN default_self;
RUN reset;
RUN values;
END on_load;
METHOD self_test;
(* not tests yet *)
END self_test;
END phaseq;