1 |
REQUIRE "flash.a4l"; |
2 |
REQUIRE "simpleunits.a4c"; |
3 |
|
4 |
(* |
5 |
* simpleflowsheetrigorous.a4c |
6 |
* by Arthur W. Westerberg |
7 |
* Part of the ASCEND Library |
8 |
* $Date: 2006/04/10 10:08:42 $ |
9 |
* $Revision: 1.95 $ |
10 |
* $Author: a.westerberg $ |
11 |
* |
12 |
* This file is part of the ASCEND Modeling Library. |
13 |
* |
14 |
* Copyright (C) 1998 Carnegie Mellon University |
15 |
* |
16 |
* The ASCEND Modeling Library is free software; you can redistribute |
17 |
* it and/or modify it under the terms of the GNU General Public |
18 |
* License as published by the Free Software Foundation; either |
19 |
* version 2 of the License, or (at your option) any later version. |
20 |
* |
21 |
* The ASCEND Modeling Library is distributed in hope that it |
22 |
* will be useful, but WITHOUT ANY WARRANTY; without even the implied |
23 |
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
24 |
* See the GNU General Public License for more details. |
25 |
* |
26 |
* You should have received a copy of the GNU General Public License |
27 |
* along with the program; if not, write to the Free Software |
28 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139 USA. Check |
29 |
* the file named COPYING. |
30 |
*) |
31 |
|
32 |
|
33 |
(* |
34 |
|
35 |
------------ |
36 |
| | |
37 |
-------------------------->|U4: splitter|---> bleed |
38 |
| | | |
39 |
| ------------ |
40 |
| ^ |
41 |
V | |
42 |
----------- ----------- ------------ |
43 |
| | | | | | |
44 |
--->|U1: mixer |--->|U2: reactor|--->|U3: flash | |
45 |
| | | | | | |
46 |
----------- ----------- ------------ |
47 |
2C2H6 -->C4H12 | |
48 |
| |
49 |
---------> product |
50 |
|
51 |
*) |
52 |
|
53 |
|
54 |
MODEL simpleflowsheet; |
55 |
(* this demo is a reproduction of simpleFS using |
56 |
the models in simpleUnits along with a rigorous |
57 |
flash for the separation step *) |
58 |
|
59 |
(* Set up the thermo calculations *) |
60 |
|
61 |
compsC3, compsAll IS_A set OF symbol_constant; |
62 |
compsC3 :== ['propylene', 'propane']; |
63 |
compsAll :== ['propylene', 'propane', '2_hexene_cis']; |
64 |
|
65 |
cdC3 IS_A components_data(compsC3, 'propane'); |
66 |
cdAll IS_A components_data(compsAll, 'propane'); |
67 |
|
68 |
pdV IS_A phases_data('V','Pitzer_vapor_mixture','none','none'); |
69 |
pdL IS_A phases_data('L', 'none', 'UNIFAC_liquid_mixture','none'); |
70 |
pdVL IS_A phases_data('VL','Pitzer_vapor_mixture', |
71 |
'UNIFAC_liquid_mixture','none'); |
72 |
|
73 |
equil IS_A boolean; |
74 |
|
75 |
(* define feed streams *) |
76 |
S01C3Feed IS_A stream(cdC3, pdV, equil); |
77 |
|
78 |
(* define units and their output streams *) |
79 |
|
80 |
(* U1: feed mixer and heater *) |
81 |
Qmix IS_A energy_rate; |
82 |
S12reactFeed IS_A stream(cdAll, pdVL, equil); |
83 |
U1feedMixer IS_A unitTwoInOneOut(Qmix, S01C3Feed, S51recycle, S12reactFeed); |
84 |
|
85 |
(* U2: reactor *) |
86 |
Qreactor IS_A energy_rate; |
87 |
S23reactProd IS_A stream(cdAll, pdV, equil); |
88 |
U2reactor IS_A unitOneInOneOut(Qreactor, S12reactFeed, S23reactProd); |
89 |
conv IS_A fraction; |
90 |
U2reactor.product.f['propylene'] = (1-conv)*U2reactor.feed.f['propylene']; |
91 |
|
92 |
(* U3: flash *) |
93 |
Qflash IS_A energy_rate; |
94 |
S34flashV IS_A stream(cdAll, pdV, equil); |
95 |
S30flashL IS_A stream(cdAll, pdL, equil); |
96 |
U3flash IS_A vapor_liquid_flash( |
97 |
Qflash, equil, S23reactProd, S34flashV, S30flashL); |
98 |
|
99 |
(* U4: splitter *) |
100 |
Qsplitter IS_A energy_rate; |
101 |
S40bleed IS_A stream(cdAll, pdV, equil); |
102 |
S45compFeed IS_A stream(cdAll, pdV, equil); |
103 |
U4splitter IS_A unitOneInTwoOut(Qsplitter, S34flashV, S45compFeed, S40bleed); |
104 |
(* merge all splits for simple stream splitter *) |
105 |
splitRecycle IS_A fraction; |
106 |
splitRecycle, U4splitter.split[compsAll] ARE_THE_SAME; |
107 |
|
108 |
(* U5: compressor *) |
109 |
Qcomp IS_A energy_rate; |
110 |
effU5 IS_A fraction; |
111 |
compRatioU5 IS_A factor; |
112 |
S51recycle IS_A stream(cdAll, pdV, equil); |
113 |
U5compressor IS_A simpleCompressor(Qcomp, compRatioU5, effU5, S45compFeed, S51recycle); |
114 |
|
115 |
(* recycle pressure should be that of the feed *) |
116 |
U5compressor.product.P = U1feedMixer.feed1.P; |
117 |
|
118 |
|
119 |
(* various objectives we can optimize *) |
120 |
MaxHexeneProd: MAXIMIZE S30flashL.f['2_hexene_cis']; |
121 |
|
122 |
METHODS |
123 |
|
124 |
METHOD default_self; |
125 |
RUN U1feedMixer.default_self; |
126 |
RUN U2reactor.default_self; |
127 |
RUN U3flash.default_self; |
128 |
RUN U4splitter.default_self; |
129 |
RUN U5compressor.default_self; |
130 |
END default_self; |
131 |
|
132 |
METHOD values; |
133 |
equil := FALSE; |
134 |
|
135 |
(* feed streams *) |
136 |
S01C3Feed.f['propylene'] := 0.98 {mol/s}; |
137 |
S01C3Feed.f['propane'] := 0.02 {mol/s}; |
138 |
S01C3Feed.T := 423.15 {K}; (* 150 degC *) |
139 |
S01C3Feed.P := 20 {bar}; |
140 |
|
141 |
(* U1 feed mixer *) |
142 |
(* set a pressure drop for the unit *) |
143 |
U1feedMixer.delP1 := -5.0 {psia}; |
144 |
|
145 |
(* U2 reactor *) |
146 |
U2reactor.delP := -5.0 {psia}; |
147 |
U2reactor.stoichCoef['propylene'] := -2; |
148 |
U2reactor.stoichCoef['2_hexene_cis'] := 1; |
149 |
conv := 0.8; |
150 |
|
151 |
(* U3 flash *) |
152 |
U3flash.liqout.P := 10 {bar}; |
153 |
U3flash.liqout.T := 400 {K}; |
154 |
U3flash.alpha['propylene'] := 7; |
155 |
U3flash.alpha['propane'] := 8; |
156 |
U3flash.alpha['2_hexene_cis'] := 1; |
157 |
U3flash.state.phase_fraction['vapor'] := 0.5; |
158 |
|
159 |
(* U4 splitter *) |
160 |
splitRecycle := 0.98; |
161 |
|
162 |
(* U5 compressor *) |
163 |
U5compressor.efficiency := 0.95; |
164 |
END values; |
165 |
|
166 |
METHOD specify; |
167 |
(* Each unit runs the specify method for each of its |
168 |
streams. It then releases the fixed flags for |
169 |
the component flows, T and P of its product |
170 |
streams. |
171 |
|
172 |
Only the recycle stream is overspecified |
173 |
after running the unit specify methods if |
174 |
we run them in the reverse order *) |
175 |
|
176 |
RUN U5compressor.specify; |
177 |
RUN U4splitter.specify; |
178 |
RUN U3flash.specify; |
179 |
RUN U2reactor.specify; |
180 |
RUN U1feedMixer.specify; |
181 |
|
182 |
(* release specs set by splitter for flash vapor *) |
183 |
FREE S34flashV.f[compsAll]; |
184 |
|
185 |
(* release specs for recycle stream *) |
186 |
FREE S51recycle.f[compsAll]; |
187 |
FREE S51recycle.T; |
188 |
FREE S51recycle.P; |
189 |
|
190 |
(* U1: feed mixer *) |
191 |
(* fix product temperature of feed mixer *) |
192 |
FIX U1feedMixer.delT1; |
193 |
FREE U1feedMixer.Qin; |
194 |
|
195 |
(* U2: reactor *) |
196 |
(* fix conversion *) |
197 |
FIX conv; |
198 |
FREE U2reactor.turnover; |
199 |
(* product temperature is same as that of feed *) |
200 |
FIX U2reactor.delT; |
201 |
FREE U2reactor.Qin; |
202 |
|
203 |
(* U3: flash *) |
204 |
(* flash P and vapor fraction already fixed *) |
205 |
|
206 |
(* U4: splitter *) |
207 |
|
208 |
(* U5: compressor *) |
209 |
FREE U5compressor.compressionRatio; |
210 |
|
211 |
END specify; |
212 |
|
213 |
END simpleflowsheet; |