# feedloc.mod LOR2-AN-90-259
# AMPL coding: S. Leyffer, January 1999.
#
# Source: Feed tray location & determination of optimum number of
# trays in a distillation column. Report April 1994.
#
# Number of variables: 90 (37 binary variables)
# Number of constraints: 259
# Objective linear
# Nonlinear constraints
param N := 12; # max. number of trays
param M := 2; # number of components
set I := 1..N;
set J := 1..M;
set TOP := {N};
param F := 100; # Feed rate
param alpha {J}; # relative volatility of component j
param xf{J}; # feed rate of component j
param spec := 0.001; # purity specification
param bigM := 1000; # a large constant
param p2 := 80; # bottom product rate
var n >= 3, <= N, integer; # number of trays
var s{I} binary; # 1, if exactly i trays
var w{I} binary; # 1, if tray i is feed tray
var z{I} binary; # 1, if tray exists
var x{I,J} >= 0, <= 1; # liquid molefraction tray i, component j
var y{I,J} >= 0, <= 1; # vapour molefraction tray i, component j
var l >= 0; # liquid mole flow rate
var v >= 0; # vapour mole flow rate
var p1 >= 0, <= F; # top product rate
var r >= 0, <= 5; # reflux ratio
minimize reflux: r;
subject to
# (1) logical constraints
feed: sum{i in I} w[i] = 1;
trays: sum{i in I} s[i] = 1;
defn1: sum{i in I} z[i] = n;
defn2: sum{i in I} (i*s[i]) = n;
order{i in I diff TOP}: z[i] - z[i+1] >= 0;
feede: sum{i in I} (i*w[i]) <= sum{i in I} (i*s[i]);
last{i in I}: s[i] - z[i] <= 0;
feedi{i in I}: w[i] - z[i] <= 0;
zto0{i in I}: z[i] <= sum{k in {i..N}} s[k];
# (2) linear constraints
phev1{i in I}: 0 <= sum{j in J}( y[i,j] ) + z[i] <= 2;
phev2{i in I}: 0 <= sum{j in J}( y[i,j] ) - z[i] <= 2;
phel1{i in I}: 0 <= sum{j in J}( x[i,j] ) + z[i] <= 2;
phel2{i in I}: 0 <= sum{j in J}( x[i,j] ) - z[i] <= 2;
# (3) nonlinear constraints
eque1{i in I, j in J}:
( sum{k in J}( alpha[k]*x[i,k] ) )*y[i,j] - alpha[j]*x[i,j]
- bigM*(1 - z[i]) <= 0;
eque2{i in I, j in J}: ( sum{k in J}( alpha[k]*x[i,k] ) )*y[i,j]
- alpha[j]*x[i,j] + bigM*(1 - z[i]) >= 0;
defl: l = r*p1;
cmbb{j in J}: p2*x[1,j] + v*y[1,j] - (l+F)*x[2,j] = 0;
cmbt1{i in {2..N}, j in J}: l*x[i,j] + p1*y[i,j] - v*y[i-1,j]
- bigM*(1 - s[i]) <= 0;
cmbt2{i in {2..N}, j in J}: l*x[i,j] + p1*y[i,j] - v*y[i-1,j]
+ bigM*(1 - s[i]) >= 0;
cmb1{i in {2..N-1}, j in J}: ( l + F*sum{k in {i..N}} w[k] )*x[i,j]
+ v*y[i,j] - ( l + F*sum{k in {i+1..N}} w[k] )*x[i+1,j]
- v*y[i-1,j] - F*xf[j]*w[i] - bigM*(1 - z[i] + s[i]) <= 0;
cmb2{i in {2..N-1}, j in J}: ( l + F*sum{k in {i..N}} w[k] )*x[i,j]
+ v*y[i,j] - ( l + F*sum{k in {i+1..N}} w[k] )*x[i+1,j]
- v*y[i-1,j] - F*xf[j]*w[i] + bigM*(1 - z[i] + s[i]) >= 0;
recovery{i in I}: p1*y[i,1] - bigM*(1 - s[i]) <= 0.03*xf[1];
data;
param: alpha, xf :=
1 1.0 0.8
2 5.13435 0.2 ;