1 |
REQUIRE "ben/benstream.a4l"; |
2 |
(* => ben/stream.a4l, ben/benHGthermo.a4l, ben/benpropertyoptions.a4l, |
3 |
* ben/bencomponents.a4l, atoms.a4l, measures.a4l, system.a4l, |
4 |
* basemodel.a4l *) |
5 |
PROVIDE "KenPendings.a4l"; |
6 |
|
7 |
(* |
8 |
* KenPendings.a4l |
9 |
* by Kenneth H. Tyner |
10 |
* Part of the ASCEND Library |
11 |
* $Date: 1998/06/17 19:45:36 $ |
12 |
* $Revision: 1.4 $ |
13 |
* $Author: mthomas $ |
14 |
* $Source: /afs/cs.cmu.edu/project/ascend/Repository/models/KenPendings.a4l,v $ |
15 |
* |
16 |
* This file is part of the ASCEND Modeling Library. |
17 |
* |
18 |
* Copyright (C) 1997-1998 Carnegie Mellon University |
19 |
* |
20 |
* The ASCEND Modeling Library is free software; you can redistribute |
21 |
* it and/or modify it under the terms of the GNU General Public |
22 |
* License as published by the Free Software Foundation; either |
23 |
* version 2 of the License, or (at your option) any later version. |
24 |
* |
25 |
* The ASCEND Modeling Library is distributed in hope that it |
26 |
* will be useful, but WITHOUT ANY WARRANTY; without even the implied |
27 |
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
28 |
* See the GNU General Public License for more details. |
29 |
* |
30 |
* You should have received a copy of the GNU General Public License |
31 |
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
32 |
*) |
33 |
|
34 |
(* |
35 |
* Various models that Ken finds useful but are not yet |
36 |
* recomended for general use. Many of these models are |
37 |
* currently hacks due to compiler bugs from the recent |
38 |
* ASCEND version upgrade. When the compiler is fixed |
39 |
* much more elegant models will replace these. |
40 |
* |
41 |
*) |
42 |
|
43 |
MODEL mass_stream( |
44 |
components IS_A set OF symbol_constant; |
45 |
); |
46 |
Ftot,f[components] IS_A molar_rate; |
47 |
|
48 |
Ftot = SUM[f[i] | i IN components]; |
49 |
|
50 |
METHODS |
51 |
METHOD clear; |
52 |
FREE Ftot; |
53 |
FREE f[components]; |
54 |
END clear; |
55 |
METHOD reset; |
56 |
FIX f[components]; |
57 |
END reset; |
58 |
METHOD seqmod; |
59 |
RUN clear; |
60 |
END seqmod; |
61 |
END mass_stream; |
62 |
|
63 |
(**************************************************************************** |
64 |
MODELS USING HOMOTOPY METHODS |
65 |
****************************************************************************) |
66 |
|
67 |
MODEL mass_balance_mixer_single_output_base( |
68 |
); |
69 |
(* |
70 |
NOTES inline SELF { |
71 |
Provides common methods FOR mass_balance_mixer_single_output class OF mixers. |
72 |
NEVER CREATE one OF these |
73 |
} |
74 |
END NOTES; |
75 |
*) |
76 |
METHODS |
77 |
METHOD clear; |
78 |
RUN input[inputs].clear; |
79 |
RUN output.clear; |
80 |
END clear; |
81 |
METHOD seqmod; |
82 |
RUN output.specify; |
83 |
FREE output.f[output.state.options.ds.components]; |
84 |
(* type OF inputs not know so must be handled somewhere ELSE *) |
85 |
END seqmod; |
86 |
METHOD specify; |
87 |
RUN seqmod; |
88 |
RUN input[inputs].specify; |
89 |
END specify; |
90 |
METHOD reset; |
91 |
RUN clear; |
92 |
RUN specify; |
93 |
END reset; |
94 |
METHOD scale; |
95 |
RUN output.scale; |
96 |
RUN input[inputs].scale; |
97 |
END scale; |
98 |
END mass_balance_mixer_single_output_base; |
99 |
|
100 |
MODEL mass_balance_homotopy_mixer_single_output_int( |
101 |
inputs IS_A set OF integer_constant; |
102 |
input[inputs] WILL_BE mass_stream; |
103 |
(* input[inputs] WILL_BE homogeneous_molar_stream;*) |
104 |
output WILL_BE two_phase_molar_stream; |
105 |
reduce WILL_BE factor; |
106 |
) WHERE ( |
107 |
) REFINES mass_balance_mixer_single_output_base( |
108 |
); |
109 |
f_mult[output.components] IS_A factor; |
110 |
|
111 |
FOR i IN output.components CREATE |
112 |
cmb[i]: output.f[i] = |
113 |
SUM[f_mult[i]*input[k].f[i] | k IN inputs]; |
114 |
END FOR; |
115 |
METHODS |
116 |
METHOD clear; |
117 |
RUN mass_balance_mixer_single_output_base::clear; |
118 |
FREE f_mult[output.components]; |
119 |
END clear; |
120 |
METHOD seqmod; |
121 |
(* RUN mass_balance_mixer_single_output_base::seqmod;*) |
122 |
RUN output.specify; |
123 |
FREE output.f[output.components]; |
124 |
FIX f_mult[output.components]; |
125 |
END seqmod; |
126 |
METHOD calc_multipliers; |
127 |
FREE f_mult[output.components]; |
128 |
FIX output.f[output.components]; |
129 |
END calc_multipliers; |
130 |
METHOD calc_outputs; |
131 |
FIX f_mult[output.components]; |
132 |
FREE output.f[output.components]; |
133 |
END calc_outputs; |
134 |
|
135 |
METHOD reduce_mix_diff; |
136 |
FOR i IN output.components DO |
137 |
f_mult[i] := f_mult[i] + reduce*(1-f_mult[i]); |
138 |
END FOR; |
139 |
END reduce_mix_diff; |
140 |
|
141 |
END mass_balance_homotopy_mixer_single_output_int; |
142 |
|
143 |
MODEL mass_balance_homotopy_mixer_single_output_int2( |
144 |
inputs IS_A set OF integer_constant; |
145 |
input[inputs] WILL_BE mass_stream; |
146 |
(* input[inputs] WILL_BE homogeneous_molar_stream;*) |
147 |
output WILL_BE homogeneous_molar_stream; |
148 |
reduce WILL_BE factor; |
149 |
) WHERE ( |
150 |
) REFINES mass_balance_mixer_single_output_base( |
151 |
); |
152 |
f_mult[output.components] IS_A factor; |
153 |
|
154 |
FOR i IN output.components CREATE |
155 |
cmb[i]: output.f[i] = |
156 |
SUM[f_mult[i]*input[k].f[i] | k IN inputs]; |
157 |
END FOR; |
158 |
METHODS |
159 |
METHOD clear; |
160 |
RUN mass_balance_mixer_single_output_base::clear; |
161 |
FREE f_mult[output.components]; |
162 |
END clear; |
163 |
METHOD seqmod; |
164 |
RUN mass_balance_mixer_single_output_base::seqmod; |
165 |
FIX f_mult[output.components]; |
166 |
END seqmod; |
167 |
METHOD calc_multipliers; |
168 |
FREE f_mult[output.components]; |
169 |
FIX output.f[output.components]; |
170 |
END calc_multipliers; |
171 |
METHOD reduce_mix_diff; |
172 |
FOR i IN output.components DO |
173 |
f_mult[i] := f_mult[i] + reduce*(1-f_mult[i]); |
174 |
END FOR; |
175 |
END reduce_mix_diff; |
176 |
|
177 |
END mass_balance_homotopy_mixer_single_output_int2; |
178 |
|
179 |
MODEL liquid_stream_splitter_int( |
180 |
input WILL_BE liquid_stream; |
181 |
outputs IS_A set OF integer_constant; |
182 |
output[outputs] WILL_BE mass_stream; |
183 |
(* ) WHERE ( |
184 |
input.state, |
185 |
output[outputs].state WILL_NOT_BE_THE_SAME;*) |
186 |
); |
187 |
split[outputs] IS_A fraction; |
188 |
|
189 |
FOR i IN [outputs] CREATE |
190 |
FOR j IN input.state.options.ds.components CREATE |
191 |
output[i].f[j] = split[i]*input.f[j]; |
192 |
END FOR; |
193 |
END FOR; |
194 |
|
195 |
(* SUM[split[i] | i IN outputs] = 1.0;*) |
196 |
(* |
197 |
FOR i IN [outputs] CREATE |
198 |
output[i].state.T = input.state.T; |
199 |
output[i].state.P = input.state.P; |
200 |
END FOR; |
201 |
*) |
202 |
METHODS |
203 |
METHOD clear; |
204 |
RUN input.clear; |
205 |
RUN output[outputs].clear; |
206 |
(* output[outputs].saturated := FALSE;*) |
207 |
FREE split[outputs]; |
208 |
END clear; |
209 |
METHOD seqmod; |
210 |
RUN clear; |
211 |
END seqmod; |
212 |
END liquid_stream_splitter_int; |