1 |
REQUIRE "atoms.a4l"; |
2 |
(* => atoms.a4l, measures.a4l, system.a4l, basemodel.a4l *) |
3 |
PROVIDE "heatex.a4c"; |
4 |
(* |
5 |
* This file is part of the ASCEND Modeling Library and is released |
6 |
* under the GNU Public License as described at the end of this file. |
7 |
* |
8 |
* Use of this module is demonstrated by the associated script file |
9 |
* heatex.a4s. |
10 |
*) |
11 |
|
12 |
|
13 |
(* |
14 |
Ascend model of the heat exchanger example presented by |
15 |
Zaher -- Conditional Modeling. Ph.D. Thesis, Carnegie Mellon University, |
16 |
Pittsburgh, PA, 15213. 1995 --. The problem represents the condensation |
17 |
of vapor because the heat transfer between the vapor and cooling water in |
18 |
a heat exchanger. There are two disjunctive statement which represent |
19 |
the possible condensation of vapor in the different sections of the |
20 |
heat exchanger. This example shows how we can represent a conditional model |
21 |
containing differential equations. It represent a problem that we can |
22 |
solve with the ascend conditional solver CMSlv. |
23 |
|
24 |
This model requires: |
25 |
"system.a4l" |
26 |
"atoms.a4l" |
27 |
*) |
28 |
|
29 |
(* ************************************************* *) |
30 |
|
31 |
MODEL heatex; |
32 |
|
33 |
points IS_A set OF integer_constant; |
34 |
components IS_A set OF symbol_constant; |
35 |
k_terms IS_A set OF integer_constant; |
36 |
z[components] IS_A fraction; |
37 |
x[points][components] IS_A fraction; |
38 |
y[points][components] IS_A fraction; |
39 |
Tcr[components] IS_A critical_temperature; |
40 |
Pcr[components] IS_A critical_pressure; |
41 |
Hv[components] IS_A molar_energy_constant; |
42 |
B[components][k_terms] IS_A factor_constant; |
43 |
C[k_terms] IS_A factor_constant; |
44 |
D[components][k_terms] IS_A molar_energy_constant; |
45 |
E[k_terms] IS_A factor_constant; |
46 |
phi[points] IS_A fraction; |
47 |
eta[points] IS_A fraction; |
48 |
A IS_A area; |
49 |
Fc IS_A molar_rate; |
50 |
Fh IS_A molar_rate; |
51 |
P IS_A pressure; |
52 |
Tc[points] IS_A temperature; |
53 |
Th[points] IS_A temperature; |
54 |
Hc[points] IS_A molar_energy; |
55 |
Hh[points] IS_A molar_energy; |
56 |
dQ[points] IS_A energy_rate; |
57 |
erscale IS_A energy_rate; |
58 |
entscale IS_A factor; |
59 |
bolphaq[1..2] IS_A boolean_var; |
60 |
|
61 |
(* Boundaries *) |
62 |
|
63 |
CONDITIONAL |
64 |
cond1: SUM[x[0][i] | i IN components] + phi[0] >= 1.0; |
65 |
cond2: SUM[x[2][i] | i IN components] + phi[1] >= 1.0; |
66 |
END CONDITIONAL; |
67 |
|
68 |
bolphaq[1] == SATISFIED(cond1,1e-08); |
69 |
bolphaq[2] == SATISFIED(cond2,1e-08); |
70 |
|
71 |
(* Variant Equations *) |
72 |
|
73 |
sum0: SUM[x[0][i] | i IN components] = 1.0; |
74 |
frac0: phi[0] = 0.0; |
75 |
|
76 |
sum2: SUM[x[2][i] | i IN components] = 1.0; |
77 |
frac1: phi[1] = 0.0; |
78 |
|
79 |
p1: eta[1] = 0.5; |
80 |
p2: eta[2] = 0.5; |
81 |
|
82 |
sum1: SUM[x[1][i] | i IN components] = 1.0; |
83 |
p12: eta[1] = 0.0; |
84 |
|
85 |
(* Disjunctive Statements *) |
86 |
|
87 |
WHEN (bolphaq[1]) |
88 |
CASE TRUE: |
89 |
USE sum0; |
90 |
USE sum1; |
91 |
CASE FALSE: |
92 |
USE frac0; |
93 |
USE p12; |
94 |
END WHEN; |
95 |
|
96 |
WHEN (bolphaq[2]) |
97 |
CASE TRUE: |
98 |
USE sum2; |
99 |
USE p1; |
100 |
CASE FALSE: |
101 |
USE frac1; |
102 |
USE p2; |
103 |
END WHEN; |
104 |
|
105 |
(* Invariant Equations *) |
106 |
|
107 |
phi[2] = 0.0; |
108 |
phi[3] = 0.0; |
109 |
|
110 |
FOR i IN points CREATE |
111 |
FOR j IN components CREATE |
112 |
phi[i]*x[i][j] + (1 - phi[i])*y[i][j] = z[j]; |
113 |
END FOR; |
114 |
END FOR; |
115 |
|
116 |
FOR i IN points CREATE |
117 |
FOR j IN components CREATE |
118 |
ln((y[i][j]*P)/(x[i][j]*Pcr[j])) = (Tcr[j]/Th[i])*( |
119 |
SUM[B[j][k] *(1 - Th[i]/Tcr[j])^C[k] |
120 |
| k IN k_terms] ); |
121 |
END FOR; |
122 |
END FOR; |
123 |
|
124 |
FOR i IN points CREATE |
125 |
dQ[i]/erscale = 20{BTU/hour/ft^2/R}*(1 + 10*phi[i])* |
126 |
A*(Th[i] - Tc[i])/erscale; |
127 |
END FOR; |
128 |
|
129 |
FOR i IN [0..2] CREATE |
130 |
Fh*(Hh[i+1] - Hh[i])/erscale = |
131 |
Fc*(Hc[i+1] - Hc[i])/erscale; |
132 |
|
133 |
Fc*(Hc[i+1] - Hc[i])/erscale = 0.5*(dQ[i] + dQ[i+1])* |
134 |
(eta[i+1] - eta[i])/erscale; |
135 |
END FOR; |
136 |
|
137 |
FOR i IN points CREATE |
138 |
Hc[i]/entscale = 9720{BTU/lb_mole}*(Tc[i]/540{R} - 1)/entscale; |
139 |
END FOR; |
140 |
|
141 |
FOR j IN points CREATE |
142 |
Hh[j]/entscale = (SUM[ z[i] *( |
143 |
SUM[ D[i][k]*((Th[j]/540{R})^E[k] - 1)|k IN k_terms]) |
144 |
- phi[j]*x[j][i]*Hv[i] | i IN components])/entscale; |
145 |
END FOR; |
146 |
|
147 |
(* Definition of sets *) |
148 |
|
149 |
components :== ['B','P5','H']; |
150 |
points :== [0..3]; |
151 |
k_terms :== [1..4]; |
152 |
|
153 |
(* Constants *) |
154 |
|
155 |
Tcr['B'] :== 765.4 {R}; |
156 |
Tcr['P5'] :== 845.3 {R}; |
157 |
Tcr['H'] :== 913.3 {R}; |
158 |
Pcr['B'] :== 37.5 {atm}; |
159 |
Pcr['P5'] :== 33.3 {atm}; |
160 |
Pcr['H'] :== 29.3 {atm}; |
161 |
Hv['B'] :== 9634 {BTU/lb_mole}; |
162 |
Hv['P5'] :== 11088{BTU/lb_mole}; |
163 |
Hv['H'] :== 12413 {BTU/lb_mole}; |
164 |
C[1] :== 1.0; |
165 |
C[2] :== 1.5; |
166 |
C[3] :== 3.0; |
167 |
C[4] :== 6.0; |
168 |
E[1] :== 1.0; |
169 |
E[2] :== 2.0; |
170 |
E[3] :== 3.0; |
171 |
E[4] :== 4.0; |
172 |
B['B'][1]:== -6.88709; |
173 |
B['B'][2]:== 1.15157; |
174 |
B['B'][3]:== -1.99873; |
175 |
B['B'][4]:== -3.13003; |
176 |
B['P5'][1]:== -7.28936; |
177 |
B['P5'][2]:== 1.53679; |
178 |
B['P5'][3]:== -3.08367; |
179 |
B['P5'][4]:== -1.02456; |
180 |
B['H'][1]:== -7.46765; |
181 |
B['H'][2]:== 1.44211; |
182 |
B['H'][3]:== -3.28222; |
183 |
B['H'][4]:== -2.50941; |
184 |
D['B'][1]:== 1224 {BTU/lb_mole}; |
185 |
D['B'][2]:== 6410 {BTU/lb_mole}; |
186 |
D['B'][3]:== -429 {BTU/lb_mole}; |
187 |
D['B'][4]:== -2 {BTU/lb_mole}; |
188 |
D['P5'][1]:== -468 {BTU/lb_mole}; |
189 |
D['P5'][2]:== 9428 {BTU/lb_mole}; |
190 |
D['P5'][3]:== -998 {BTU/lb_mole}; |
191 |
D['P5'][4]:== 46 {BTU/lb_mole}; |
192 |
D['H'][1]:== -569 {BTU/lb_mole}; |
193 |
D['H'][2]:== 11260 {BTU/lb_mole}; |
194 |
D['H'][3]:== -1207 {BTU/lb_mole}; |
195 |
D['H'][4]:== 57 {BTU/lb_mole}; |
196 |
|
197 |
METHODS |
198 |
|
199 |
METHOD default_self; |
200 |
END default_self; |
201 |
|
202 |
METHOD specify; |
203 |
FOR j IN components DO |
204 |
z[j].fixed := TRUE; |
205 |
END FOR; |
206 |
A.fixed := TRUE; |
207 |
P.fixed := TRUE; |
208 |
Fc.fixed := TRUE; |
209 |
Fh.fixed := TRUE; |
210 |
erscale.fixed := TRUE; |
211 |
entscale.fixed := TRUE; |
212 |
eta[0].fixed := TRUE; |
213 |
eta[3].fixed := TRUE; |
214 |
Tc[0].fixed := TRUE; |
215 |
Th[3].fixed := TRUE; |
216 |
END specify; |
217 |
|
218 |
METHOD values; |
219 |
(* fixed *) |
220 |
P := 1.0{atm}; |
221 |
z['B'] := 0.2; |
222 |
z['P5'] := 0.5; |
223 |
z['H'] := 0.3; |
224 |
Fh := 250.0{lb_mole/hour}; |
225 |
Tc[0] := 540.0{R}; |
226 |
Th[3] := 600.0{R}; |
227 |
erscale := 1.0e6{BTU/hour}; |
228 |
entscale := 1000.0 ; |
229 |
|
230 |
(* initial guess *) |
231 |
A := 379.12{ft^2}; |
232 |
Fc := 1104.13{lb_mole/hour}; |
233 |
x[0]['B'] := 0.04183; |
234 |
x[0]['P5'] := 0.32735; |
235 |
x[0]['H'] := 0.58922; |
236 |
x[1]['B'] := 0.04183; |
237 |
x[1]['P5'] := 0.32735; |
238 |
x[1]['H'] := 0.58922; |
239 |
x[2]['B'] := 0.03558; |
240 |
x[2]['P5'] := 0.27044; |
241 |
x[2]['H'] := 0.47211; |
242 |
x[3]['B'] := 0.03153; |
243 |
x[3]['P5'] := 0.23457; |
244 |
x[3]['H'] := 0.40038; |
245 |
y[0]['B'] := 0.2; |
246 |
y[0]['P5'] := 0.5; |
247 |
y[0]['H'] := 0.3; |
248 |
y[1]['B'] := 0.2; |
249 |
y[1]['P5'] := 0.5; |
250 |
y[1]['H'] := 0.3; |
251 |
y[2]['B'] := 0.2; |
252 |
y[2]['P5'] := 0.5; |
253 |
y[2]['H'] := 0.3; |
254 |
y[3]['B'] := 0.2; |
255 |
y[3]['P5'] := 0.5; |
256 |
y[3]['H'] := 0.3; |
257 |
phi[0] := 0.0; |
258 |
phi[1] := 0.0; |
259 |
phi[2] := 0.0; |
260 |
phi[3] := 0.0; |
261 |
eta[0] := 0.0; |
262 |
eta[1] := 0.0; |
263 |
eta[2] := 0.5; |
264 |
eta[3] := 1.0; |
265 |
Tc[1] := 540.000{R}; |
266 |
Tc[2] := 559.820{R}; |
267 |
Tc[3] := 575.386{R}; |
268 |
Th[0] := 579.932{R}; |
269 |
Th[1] := 579.932{R}; |
270 |
Th[2] := 591.242{R}; |
271 |
Hc[0] := 0000.0{BTU/lb_mole}; |
272 |
Hc[1] := 0000.0{BTU/lb_mole}; |
273 |
Hc[2] := 356.768{BTU/lb_mole}; |
274 |
Hc[3] := 636.948{BTU/lb_mole}; |
275 |
Hh[0] := 1212.93{BTU/lb_mole}; |
276 |
Hh[1] := 1212.93{BTU/lb_mole}; |
277 |
Hh[2] := 1569.7{BTU/lb_mole}; |
278 |
Hh[3] := 1849.88{BTU/lb_mole}; |
279 |
dQ[0] := 199658{BTU/hour}; |
280 |
dQ[1] := 199658{BTU/hour}; |
281 |
dQ[2] := 157110{BTU/hour}; |
282 |
dQ[3] := 123070{BTU/hour}; |
283 |
eta[1].upper_bound := 0.5; |
284 |
eta[2].lower_bound := 0.5; |
285 |
eta[2].upper_bound := 1.0; |
286 |
|
287 |
(* Initial value for booleans *) |
288 |
bolphaq[1] := SATISFIED(cond1,1e-08); |
289 |
bolphaq[2] := SATISFIED(cond2,1e-08); |
290 |
END values; |
291 |
|
292 |
END heatex; |
293 |
|
294 |
|
295 |
(* |
296 |
* heatex.a4c |
297 |
* by Vicente Rico-Ramirez |
298 |
* April 10, 1998 |
299 |
* Part of the ASCEND Library |
300 |
* $Date: 1998/06/17 19:08:03 $ |
301 |
* $Revision: 1.3 $ |
302 |
* $Author: mthomas $ |
303 |
* $Source: /afs/cs.cmu.edu/project/ascend/Repository/models/heatex.a4c,v $ |
304 |
* |
305 |
* This file is part of the ASCEND Modeling Library. |
306 |
* |
307 |
* Copyright (C) 1998 Carnegie Mellon University |
308 |
* |
309 |
* The ASCEND Modeling Library is free software; you can redistribute |
310 |
* it and/or modify it under the terms of the GNU General Public |
311 |
* License as published by the Free Software Foundation; either |
312 |
* version 2 of the License, or (at your option) any later version. |
313 |
* |
314 |
* The ASCEND Modeling Library is distributed in hope that it will be |
315 |
* useful, but WITHOUT ANY WARRANTY; without even the implied |
316 |
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
317 |
* See the GNU General Public License for more details. |
318 |
* |
319 |
* You should have received a copy of the GNU General Public License |
320 |
* along with the program; if not, write to the Free Software |
321 |
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139 USA. Check |
322 |
* the file named COPYING. |
323 |
*) |