/[ascend]/trunk/models/abc_flowsheet.a4l
ViewVC logotype

Contents of /trunk/models/abc_flowsheet.a4l

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Fri Oct 29 20:54:12 2004 UTC (19 years, 7 months ago) by aw0a
File MIME type: text/x-ascend
File size: 13715 byte(s)
Setting up web subdirectory in repository
1 REQUIRE "collocation.a4l";
2 REQUIRE "ben/bencolumn.a4l";
3 (* => ben/bencolumn.a4l, ben/benflash.a4l, ben/benstream.a4l,
4 * ben/benHGthermo.a4l, ben/benpropertyoptions.a4l,
5 * ben/bencomponents.a4l, atoms.a4l, measures.a4l, system.a4l,
6 * basemodel.a4l *)
7 REQUIRE "KenPendings.a4l";
8 (* => KenPendings.a4l, ben/benstream.a4l, ben/benHGthermo.a4l,
9 * ben/benpropertyoptions.a4l, ben/bencomponents.a4l, atoms.a4l,
10 * measures.a4l, system.a4l, basemodel.a4l *)
11 PROVIDE "abc_flowsheet.a4l";
12
13 (*
14 * abc_flowsheet.a4l
15 * by Kenneth H. Tyner
16 * Part of the ASCEND Library
17 * $Date: 1998/06/17 19:49:24 $
18 * $Revision: 1.4 $
19 * $Author: mthomas $
20 * $Source: /afs/cs.cmu.edu/project/ascend/Repository/models/abc_flowsheet.a4l,v $
21 *
22 * This file is part of the ASCEND Modeling Library.
23 *
24 * Copyright (C) 1997, 1998 Carnegie Mellon University
25 *
26 * The ASCEND Modeling Library is free software; you can redistribute
27 * it and/or modify it under the terms of the GNU General Public
28 * License as published by the Free Software Foundation; either
29 * version 2 of the License, or (at your option) any later version.
30 *
31 * The ASCEND Modeling Library is distributed in hope that it
32 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
33 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
34 * See the GNU General Public License for more details.
35 *
36 * You should have received a copy of the GNU General Public License
37 * along with the program; if not, write to the Free Software
38 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139 USA. Check
39 * the file named COPYING.
40 *)
41
42 (*
43 * Distillation flowsheet demos (using aceton-benzene-chloroform.
44 *)
45 MODEL demo_flowsheet(
46 n_columns IS_A integer_constant;
47 components IS_A set OF symbol_constant;
48 reference IS_A symbol_constant;
49 n_trays[1..n_columns] IS_A integer_constant;
50 vapor_options WILL_BE vapor_phase_options;
51 liquid_options WILL_BE liquid_phase_options;
52 ) WHERE (
53 reference IN components == TRUE;
54 );
55
56 feed_P[1..n_columns] IS_A pressure;
57 feed_T[1..n_columns] IS_A temperature;
58 FOR i IN [1..n_columns] CREATE
59 feed_vapor_state[i] IS_A vapor_mixture(
60 feed_P[i],
61 feed_T[i],
62 vapor_options
63 );
64 feed_liquid_state[i] IS_A liquid_mixture(
65 feed_P[i],
66 feed_T[i],
67 liquid_options
68 );
69 END FOR;
70
71 Equilibrated[1..n_columns] IS_A boolean;
72 FOR i IN [1..n_columns] CREATE
73 feed_state[i] IS_A td_VLE_mixture(
74 feed_P[i],
75 feed_T[i],
76 feed_vapor_state[i],
77 feed_liquid_state[i],
78 Equilibrated[i]
79 );
80 END FOR;
81 FOR i IN [1..n_columns] CREATE
82 Feed[i] IS_A vapor_liquid_stream(feed_state[i]);
83 END FOR;
84
85
86 distillate_P[1..n_columns] IS_A pressure;
87 distillate_T[1..n_columns] IS_A temperature;
88 FOR i IN [1..n_columns] CREATE
89 distillate_state[i] IS_A liquid_mixture(
90 distillate_P[i],
91 distillate_T[i],
92 liquid_options
93 );
94 END FOR;
95 FOR i IN [1..n_columns] CREATE
96 Distillate[i] IS_A liquid_stream(distillate_state[i]);
97 END FOR;
98
99 bottoms_P[1..n_columns] IS_A pressure;
100 bottoms_T[1..n_columns] IS_A temperature;
101 FOR i IN [1..n_columns] CREATE
102 bottoms_state[i] IS_A liquid_mixture(
103 bottoms_P[i],
104 bottoms_T[i],
105 liquid_options
106 );
107 END FOR;
108 FOR i IN [1..n_columns] CREATE
109 Bottoms[i] IS_A liquid_stream(bottoms_state[i]);
110 END FOR;
111
112 reduce[1..n_columns] IS_A fraction;
113 z_on[1..n_columns] IS_A boolean;
114 hat_on[1..n_columns] IS_A boolean;
115 hb_on[1..n_columns] IS_A boolean;
116
117 z_on[1..n_columns] := FALSE;
118 hat_on[1..n_columns] := FALSE;
119 hb_on[1..n_columns] := FALSE;
120 Equilibrated[1..n_columns] := FALSE;
121
122 FOR i IN [1..n_columns] CREATE
123 Column[i] IS_A simple_coll_column(
124 n_trays[i],
125 Distillate[i],
126 Feed[i],
127 Bottoms[i],
128 Equilibrated[i],
129 reduce[i],
130 z_on[i],
131 hat_on[i],
132 hb_on[i]
133 );
134 END FOR;
135
136 (* hooking it all up *)
137 n_sheet_feeds IS_A integer_constant;
138 n_sheet_feeds :== 1;
139
140 outputs IS_A set OF symbol_constant;
141 outputs :== [components,'waste'];
142
143 product_P[outputs] IS_A pressure;
144 product_T[outputs] IS_A temperature;
145 sheet_feed_P[n_sheet_feeds] IS_A pressure;
146 sheet_feed_T[n_sheet_feeds] IS_A temperature;
147 FOR i IN [outputs] CREATE
148 product_state[i] IS_A liquid_mixture(
149 product_P[i],
150 product_T[i],
151 liquid_options
152 );
153 END FOR;
154 FOR i IN [n_sheet_feeds] CREATE
155 sheet_feed_state[i] IS_A liquid_mixture(
156 sheet_feed_P[i],
157 sheet_feed_T[i],
158 liquid_options
159 );
160 END FOR;
161
162 FOR i IN [outputs] CREATE
163 product[i] IS_A liquid_stream(product_state[i]);
164 END FOR;
165 Product[n] ALIASES
166 (product[outputs])
167 WHERE n IS_A set OF integer_constant
168 WITH_VALUE (1..CARD[components]+1);
169
170 FOR i IN [1..n_sheet_feeds] CREATE
171 Sheet_Feed[i] IS_A liquid_stream(sheet_feed_state[i]);
172 END FOR;
173
174 sources IS_A set OF integer_constant;
175 sinks IS_A set OF integer_constant;
176
177 sources :== [1..(n_columns*2 + n_sheet_feeds)];
178 sinks :== [1..(n_columns+CARD[components]+1)];
179 (*
180 link_T[sources][sinks] IS_A temperature;
181 link_P[sources][sinks] IS_A pressure;
182 FOR i IN sources CREATE
183 FOR j IN sinks CREATE
184 link_state[i][j] IS_A liquid_mixture(
185 link_P[i][j],
186 link_T[i][j],
187 liquid_options
188 );
189 END FOR;
190 END FOR;*)
191 FOR i IN sources CREATE
192 FOR j IN sinks CREATE
193 (* Source_Link[i][j] IS_A liquid_stream(link_state[i][j]);*)
194 Source_Link[i][j] IS_A mass_stream(components);
195 END FOR;
196 END FOR;
197 FOR i IN sinks CREATE
198 FOR j IN sources CREATE
199 Sink_Link[i][j] ALIASES Source_Link[j][i];
200 END FOR;
201 END FOR;
202
203 mb_reduce[1..n_columns] IS_A factor;
204 prod_reduce[1..CARD[components]+1] IS_A factor;
205
206 FOR i IN [1..n_columns] CREATE
207 mixer[i] IS_A mass_balance_homotopy_mixer_single_output_int(
208 sources,
209 Sink_Link[i],
210 Feed[i],
211 mb_reduce[i]
212 );
213 dist_split[i] IS_A liquid_stream_splitter_int(
214 Distillate[i],
215 sinks,
216 Source_Link[i]
217 );
218 bot_split[i] IS_A liquid_stream_splitter_int(
219 Bottoms[i],
220 sinks,
221 Source_Link[n_columns + i]
222 );
223 END FOR;
224 FOR i IN [1..n_sheet_feeds] CREATE
225 feed_split[i] IS_A liquid_stream_splitter_int(
226 Sheet_Feed[i],
227 sinks,
228 Source_Link[n_columns*2 + i]
229 );
230 END FOR;
231 FOR i IN [1..CARD[components]+1] CREATE
232 prod_mix[i] IS_A mass_balance_homotopy_mixer_single_output_int2(
233 sources,
234 Sink_Link[n_columns + i],
235 Product[i],
236 prod_reduce[i]
237 );
238 END FOR;
239
240 (* conditionals *)
241 (* could just use mass streams *)
242 stream_exists[sources][sinks] IS_A boolean;
243 stream_exists[sources][sinks] := FALSE;
244 (* FOR i IN sources CREATE
245 FOR j IN sinks CREATE
246 WHEN (stream_exists[i][j])
247 CASE TRUE:
248 USE Source_Link[i][j].state;
249 USE Source_Link[i][j].Htot_def;
250 USE Source_Link[i][j].bubble_point;
251 END FOR;
252 END FOR;
253 END FOR;
254 *)
255 METHODS
256 METHOD scale;
257 RUN Column[1..n_columns].scale;
258 END scale;
259 METHOD set_connections;
260 dist_split[1..n_columns].split[sinks].fixed := TRUE;
261 bot_split[1..n_columns].split[sinks].fixed := TRUE;
262 feed_split[1..n_sheet_feeds].split[sinks].fixed := TRUE;
263
264 FOR i IN [1..n_columns] DO
265 FOR j IN sinks DO
266 IF (stream_exists[i][j] == FALSE) THEN
267 dist_split[i].split[j] := 0;
268 END IF;
269 END FOR;
270 END FOR;
271 FOR i IN [n_columns+1..n_columns*2] DO
272 FOR j IN sinks DO
273 IF (stream_exists[i][j] == FALSE) THEN
274 bot_split[i-n_columns].split[j] := 0;
275 END IF;
276 END FOR;
277 END FOR;
278 FOR i IN [n_columns*2+1..n_columns*2+n_sheet_feeds] DO
279 FOR j IN sinks DO
280 IF (stream_exists[i][j] == FALSE) THEN
281 feed_split[i-n_columns*2].split[j] := 0;
282 END IF;
283 END FOR;
284 END FOR;
285 (*
286 FOR i IN sources DO
287 FOR j IN sinks DO
288 IF (stream_exists[i][j] == FALSE) THEN
289 Source_Link[i][j].f_def[components].included
290 := FALSE;
291 ELSE
292 Source_Link[i][j].f_def[components].included
293 := TRUE;
294 END FOR;
295 END IF;
296 END FOR;
297 *)
298 END set_connections;
299 METHOD remove_connections;
300 FOR i IN sources DO
301 FOR j IN sinks DO
302 stream_exists[i][j] := FALSE;
303 END FOR;
304 END FOR;
305 END remove_connections;
306 METHOD fix_splits;
307 FOR i IN [1..n_columns] DO
308 dist_split[i].split[sinks].fixed := TRUE;
309 bot_split[i].split[sinks].fixed := TRUE;
310 END FOR;
311 FOR i IN [1..n_sheet_feeds] DO
312 feed_split[i].split[sinks].fixed := TRUE;
313 END FOR;
314 END fix_splits;
315
316 METHOD calc_multipliers;
317 RUN mixer[1..n_columns].calc_multipliers;
318 END calc_multipliers;
319
320 METHOD calc_outputs;
321 RUN mixer[1..n_columns].calc_outputs;
322 END calc_outputs;
323
324 METHOD reduce_mix_diff;
325 RUN mixer[1..n_columns].reduce_mix_diff;
326 END reduce_mix_diff;
327
328 METHOD clear;
329 RUN Sheet_Feed[1..n_sheet_feeds].clear;
330 RUN Column[1..n_columns].clear;
331 RUN Source_Link[sources][sinks].clear;
332 RUN mixer[1..n_columns].clear;
333 RUN dist_split[1..n_columns].clear;
334 RUN bot_split[1..n_columns].clear;
335 RUN feed_split[1..n_sheet_feeds].clear;
336 RUN prod_mix[1..CARD[components]+1].clear;
337 END clear;
338
339 METHOD reset;
340 RUN clear;
341
342 RUN dist_split[1..n_columns].seqmod;
343 RUN bot_split[1..n_columns].seqmod;
344 RUN feed_split[1..n_sheet_feeds].seqmod;
345
346 RUN Column[1..n_columns].reset;
347 RUN mixer[1..n_columns].seqmod;
348 RUN prod_mix[1..CARD[components]+1].seqmod;
349
350 RUN Sheet_Feed[1..n_sheet_feeds].specify;
351 END reset;
352
353 END demo_flowsheet;
354
355 MODEL abc_demo_sheet;
356 components IS_A set OF symbol_constant;
357 reference IS_A symbol_constant;
358 n_columns IS_A integer_constant;
359 n_trays[1..n_columns] IS_A integer_constant;
360
361 n_columns :== 3;
362 components :== ['acetone','benzene','chloroform'];
363 reference :== 'chloroform';
364 n_trays[1] :== 4;
365 n_trays[2] :== 2;
366 n_trays[3] :== 2;
367
368
369
370 ds IS_A
371 td_component_data_set(components,reference);
372 vapor_options IS_A vapor_phase_options(ds,'Pitzer','Pitzer');
373 (* liquid_options IS_A liquid_phase_options(ds,'Rackett','UNIFAC');*)
374 liquid_options IS_A liquid_phase_options(ds,'Rackett','Wilson');
375
376 abc_sheet IS_A demo_flowsheet(n_columns,
377 components,reference,n_trays,
378 vapor_options,liquid_options);
379
380 (* PLOTING SECTION *)
381
382 FOR i IN [1..n_columns] CREATE
383 liq_eq_plot[i] IS_A ternary_plot_equilateral(
384 'abc liquid comp',
385 components,
386 'acetone',
387 'chloroform',
388 abc_sheet.Column[i].n_plt_points_x,
389 abc_sheet.Column[i].x_plot
390 );
391 END FOR;
392
393 curves IS_A set OF symbol_constant;
394 curves :== ['Column_1','Column_2','Column_3'];
395 curve[c] ALIASES
396 (liq_eq_plot[1..n_columns].curve)
397 WHERE c IS_A set OF symbol_constant
398 WITH_VALUE ([curves]);
399
400 eq_plot IS_A ternary_plot_equilateral2(
401 'Acetone-Benzene-Chloroform Liquid Comps',
402 components,
403 'acetone',
404 'chloroform',
405 curves,
406 curve
407 );
408
409
410
411
412 (*
413 r_plot IS_A ternary_plot_right(
414 'abc liquid comp',
415 abc_column.components,
416 'acetone',
417 'chloroform',
418 abc_column.Column.n_plt_points_x,
419 abc_column.Column.x_plot
420 );
421 *)
422
423 METHODS
424 METHOD values;
425 abc_sheet.Column[1].feed_tray_state.alpha['acetone'] := 1.73;
426 abc_sheet.Column[1].feed_tray_state.alpha['benzene'] := 0.97;
427 abc_sheet.Column[1].feed_tray_state.alpha['chloroform'] := 1.19;
428 abc_sheet.Feed[1].f['acetone'] := 3.5{mole/s};
429 abc_sheet.Feed[1].f['chloroform'] := 2.5{mole/s};
430 abc_sheet.Feed[1].f['benzene'] := 4.0{mole/s};
431 abc_sheet.Distillate[1].Ftot := 3.5{mole/s};
432 abc_sheet.Column[1].rectifying_section.stot := 10;
433 abc_sheet.Column[1].stripping_section.stot := 10;
434 abc_sheet.feed_state[1].phi['vapor'] := 0;
435 abc_sheet.Column[1].condenser.reflux_ratio := 4.0;
436 abc_sheet.Column[1].s_stack[1] := 20.0;
437 abc_sheet.Column[1].s_stack[2] := 15.0;
438 abc_sheet.feed_T[1] := 298 {K};
439 abc_sheet.feed_P[1] := 1{atm};
440 RUN abc_sheet.Column[1].propagate_feed;
441
442 abc_sheet.Column[2].feed_tray_state.alpha['acetone'] := 1.76;
443 abc_sheet.Column[2].feed_tray_state.alpha['benzene'] := 0.79;
444 abc_sheet.Column[2].feed_tray_state.alpha['chloroform'] := 1.22;
445 abc_sheet.Feed[2].f['acetone'] := 0.2{mole/s};
446 abc_sheet.Feed[2].f['chloroform'] := 2.5{mole/s};
447 abc_sheet.Feed[2].f['benzene'] := 4.0{mole/s};
448 abc_sheet.Distillate[2].Ftot := 2.675{mole/s};
449 abc_sheet.Column[2].rectifying_section.stot := 10;
450 abc_sheet.Column[2].stripping_section.stot := 7;
451 abc_sheet.feed_state[2].phi['vapor'] := 0;
452 abc_sheet.Column[2].condenser.reflux_ratio := 4.25;
453 abc_sheet.feed_T[2] := 298 {K};
454 abc_sheet.feed_P[2] := 1{atm};
455 RUN abc_sheet.Column[2].propagate_feed;
456
457 abc_sheet.Column[3].feed_tray_state.alpha['acetone'] := 1.0;
458 abc_sheet.Column[3].feed_tray_state.alpha['benzene'] := 0.6;
459 abc_sheet.Column[3].feed_tray_state.alpha['chloroform'] := 1.11;
460 abc_sheet.Feed[3].f['acetone'] := 0.3{mole/s};
461 abc_sheet.Feed[3].f['chloroform'] := 2.5{mole/s};
462 abc_sheet.Feed[3].f['benzene'] := 0.1{mole/s};
463 abc_sheet.Distillate[3].Ftot := 2.2{mole/s};
464 abc_sheet.Column[3].rectifying_section.stot := 10;
465 abc_sheet.Column[3].stripping_section.stot := 5;
466 abc_sheet.feed_state[3].phi['vapor'] := 0;
467 abc_sheet.Column[3].condenser.reflux_ratio := 4.0;
468 abc_sheet.feed_T[3] := 298 {K};
469 abc_sheet.feed_P[3] := 1{atm};
470 RUN abc_sheet.Column[3].propagate_feed;
471
472 abc_sheet.Sheet_Feed[1].f['acetone'] := 3.5{mole/s};
473 abc_sheet.Sheet_Feed[1].f['chloroform'] := 2.5{mole/s};
474 abc_sheet.Sheet_Feed[1].f['benzene'] := 4.0{mole/s};
475 abc_sheet.sheet_feed_T[1] := 298 {K};
476 abc_sheet.sheet_feed_P[1] := 1{atm};
477
478 abc_sheet.z_on[1..n_columns] := FALSE;
479 abc_sheet.hat_on[1..n_columns] := FALSE;
480 abc_sheet.hb_on[1..n_columns] := FALSE;
481 abc_sheet.Equilibrated[1..n_columns] := FALSE;
482
483 abc_sheet.Distillate[1..n_columns].saturated := FALSE;
484 abc_sheet.Bottoms[1..n_columns].saturated := FALSE;
485 abc_sheet.Product[1..CARD[components]+1].saturated := FALSE;
486 abc_sheet.Sheet_Feed[1..abc_sheet.n_sheet_feeds].saturated := FALSE;
487 (* abc_sheet.Source_Link[abc_sheet.sources][abc_sheet.sinks].saturated
488 := FALSE;*)
489
490 END values;
491
492 END abc_demo_sheet;

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22