1 |
johnpye |
825 |
#LyX 1.4.1 created this file. For more info see http://www.lyx.org/ |
2 |
|
|
\lyxformat 245 |
3 |
|
|
\begin_document |
4 |
|
|
\begin_header |
5 |
|
|
\textclass book |
6 |
|
|
\language english |
7 |
|
|
\inputencoding auto |
8 |
|
|
\fontscheme default |
9 |
|
|
\graphics default |
10 |
|
|
\paperfontsize default |
11 |
|
|
\spacing single |
12 |
|
|
\papersize a4paper |
13 |
|
|
\use_geometry false |
14 |
|
|
\use_amsmath 2 |
15 |
|
|
\cite_engine basic |
16 |
|
|
\use_bibtopic false |
17 |
|
|
\paperorientation portrait |
18 |
|
|
\secnumdepth 3 |
19 |
|
|
\tocdepth 3 |
20 |
|
|
\paragraph_separation indent |
21 |
|
|
\defskip medskip |
22 |
|
|
\quotes_language english |
23 |
|
|
\papercolumns 1 |
24 |
|
|
\papersides 2 |
25 |
|
|
\paperpagestyle default |
26 |
|
|
\tracking_changes false |
27 |
|
|
\output_changes true |
28 |
|
|
\end_header |
29 |
|
|
|
30 |
|
|
\begin_body |
31 |
|
|
|
32 |
|
|
\begin_layout Chapter |
33 |
|
|
Writing METHODs |
34 |
|
|
\begin_inset LatexCommand \label{cha:methods} |
35 |
|
|
|
36 |
|
|
\end_inset |
37 |
|
|
|
38 |
|
|
|
39 |
|
|
\end_layout |
40 |
|
|
|
41 |
|
|
\begin_layout Standard |
42 |
|
|
In this chapter we describe a methodology (pun intended) which can help |
43 |
|
|
make anyone who can solve a quadratic equation a mathematical modeling |
44 |
|
|
expert. |
45 |
|
|
This methodology helps you to avoid mistakes and to find mistakes quickly |
46 |
|
|
when you make them. |
47 |
|
|
Finding bugs weeks after creating a model is annoying, inefficient, and |
48 |
|
|
(frequently) embarrassing. |
49 |
|
|
Because METHOD code can be large, we do not include many examples here. |
50 |
|
|
|
51 |
|
|
\begin_inset Note Note |
52 |
|
|
status collapsed |
53 |
|
|
|
54 |
|
|
\begin_layout Standard |
55 |
|
|
See ***vessel something*** for detailed examples |
56 |
|
|
\end_layout |
57 |
|
|
|
58 |
|
|
\end_inset |
59 |
|
|
|
60 |
|
|
One of the advantages of this methodology is that it allows almost automatic |
61 |
|
|
\begin_inset LatexCommand \index{methods, automatic generation} |
62 |
|
|
|
63 |
|
|
\end_inset |
64 |
|
|
|
65 |
|
|
generation of methods for a model based on the declarative structure (defined |
66 |
|
|
parts and variables) in the model, as we shall see in Section\InsetSpace ~ |
67 |
|
|
|
68 |
|
|
\begin_inset LatexCommand \ref{sec:methods.automation} |
69 |
|
|
|
70 |
|
|
\end_inset |
71 |
|
|
|
72 |
|
|
|
73 |
|
|
\noun off |
74 |
|
|
. |
75 |
|
|
Even if you skip much of this chapter, read |
76 |
|
|
\noun default |
77 |
|
|
Section\InsetSpace ~ |
78 |
|
|
|
79 |
|
|
\noun off |
80 |
|
|
|
81 |
|
|
\begin_inset LatexCommand \ref{sec:methods.automation} |
82 |
|
|
|
83 |
|
|
\end_inset |
84 |
|
|
|
85 |
|
|
|
86 |
|
|
\end_layout |
87 |
|
|
|
88 |
|
|
\begin_layout Standard |
89 |
|
|
We divide methods into |
90 |
|
|
\family typewriter |
91 |
|
|
_self |
92 |
|
|
\family default |
93 |
|
|
and |
94 |
|
|
\family typewriter |
95 |
|
|
_all |
96 |
|
|
\family default |
97 |
|
|
categories. |
98 |
|
|
The premise of our approach to design methods is that we can write the |
99 |
|
|
|
100 |
|
|
\family typewriter |
101 |
|
|
_self |
102 |
|
|
\family default |
103 |
|
|
methods incrementally, building on the already tested methods of previous |
104 |
|
|
MODEL parts we are reusing. |
105 |
|
|
In this way we never have to write a single huge method that directly manipulat |
106 |
|
|
es the hundreds of variables that are in the model hierarchy. |
107 |
|
|
Were that all there was to it, things would actually be pretty simple. |
108 |
|
|
However, in ASCEND, one can also select to solve any part of an ASCEND |
109 |
|
|
model (in particular, any part that is an instance of a single type), and |
110 |
|
|
this capability complicates method writing - but not by much if we really |
111 |
|
|
understand the approach we advocate here. |
112 |
|
|
As an example, suppose we have a flowsheet that has a reactor followed |
113 |
|
|
by a flash unit in it. |
114 |
|
|
In ASCEND, we can select to solve the entire flowsheet, only the reactor, |
115 |
|
|
only the flash unit or even any one of the streams in it (yes, each stream |
116 |
|
|
has physical property calculations that belong to it making it interesting |
117 |
|
|
to isolate and solve). |
118 |
|
|
Should we choose to solve only the flash unit, ASCEND will isolate the |
119 |
|
|
equations defining the flash - including the equations we use when defining |
120 |
|
|
the input and output streams to it as they are a part of the flash unit. |
121 |
|
|
But the input to the flash is also the output from the reactor and is a |
122 |
|
|
part of the reactor, too. |
123 |
|
|
Each part would typically take the prime responsibility for supplying methods |
124 |
|
|
that will set fix flags, set nominal values, etc., for its variables, but |
125 |
|
|
who owns the variables they both share such as in the connecting stream? |
126 |
|
|
By |
127 |
|
|
\begin_inset Quotes eld |
128 |
|
|
\end_inset |
129 |
|
|
|
130 |
|
|
tradition |
131 |
|
|
\begin_inset Quotes erd |
132 |
|
|
\end_inset |
133 |
|
|
|
134 |
|
|
in chemical engineering flowsheet modeling, we will assert that the reactor |
135 |
|
|
has prime responsibility for its output stream. |
136 |
|
|
If we are solving the entire flowsheet, it should set the flags, etc., for |
137 |
|
|
its output stream. |
138 |
|
|
However, when we isolate the flash for solving, the flash unit must assume |
139 |
|
|
responsibility to set fix flags, nominal values, etc., for the output stream |
140 |
|
|
from the reactor as that stream is its input stream. |
141 |
|
|
The |
142 |
|
|
\family typewriter |
143 |
|
|
_all |
144 |
|
|
\family default |
145 |
|
|
methods allow us to handle these shared variables correctly when we isolate |
146 |
|
|
a part for solving by itself. |
147 |
|
|
\begin_inset Note Note |
148 |
|
|
status collapsed |
149 |
|
|
|
150 |
|
|
\begin_layout Standard |
151 |
|
|
This needs more explanation: I don't find it completely clear. |
152 |
|
|
\end_layout |
153 |
|
|
|
154 |
|
|
\end_inset |
155 |
|
|
|
156 |
|
|
|
157 |
|
|
\end_layout |
158 |
|
|
|
159 |
|
|
\begin_layout Standard |
160 |
|
|
Usually discovery of the information you need to write the methods proceeds |
161 |
|
|
in the order that they appear below: |
162 |
|
|
\family typewriter |
163 |
|
|
check |
164 |
|
|
\family default |
165 |
|
|
, |
166 |
|
|
\family typewriter |
167 |
|
|
default |
168 |
|
|
\family default |
169 |
|
|
, |
170 |
|
|
\family typewriter |
171 |
|
|
specify |
172 |
|
|
\family default |
173 |
|
|
, |
174 |
|
|
\family typewriter |
175 |
|
|
bound |
176 |
|
|
\family default |
177 |
|
|
, |
178 |
|
|
\family typewriter |
179 |
|
|
scale |
180 |
|
|
\family default |
181 |
|
|
. |
182 |
|
|
|
183 |
|
|
\end_layout |
184 |
|
|
|
185 |
|
|
\begin_layout Section |
186 |
|
|
Why use standardised methods on models? |
187 |
|
|
\end_layout |
188 |
|
|
|
189 |
|
|
\begin_layout Standard |
190 |
|
|
In the present chapter, we are proposing that you use a particular standardised |
191 |
|
|
set of methods on your models. |
192 |
|
|
While ASCEND doesn't force you to follow these conventions, we hope that |
193 |
|
|
you will |
194 |
|
|
\emph on |
195 |
|
|
choose |
196 |
|
|
\emph default |
197 |
|
|
to follow them, because: |
198 |
|
|
\end_layout |
199 |
|
|
|
200 |
|
|
\begin_layout Itemize |
201 |
|
|
You models will be more portable. |
202 |
|
|
\end_layout |
203 |
|
|
|
204 |
|
|
\begin_layout Itemize |
205 |
|
|
They will integrate better with the existing model library when composing |
206 |
|
|
larger models composed of smaller perhaps pre-existing models. |
207 |
|
|
\end_layout |
208 |
|
|
|
209 |
|
|
\begin_layout Itemize |
210 |
|
|
Other users will be be more easily able to understand what you have built. |
211 |
|
|
\end_layout |
212 |
|
|
|
213 |
|
|
\begin_layout Itemize |
214 |
|
|
The proposed structure has, in our experience, made for models that are |
215 |
|
|
easier to debug. |
216 |
|
|
\end_layout |
217 |
|
|
|
218 |
|
|
\begin_layout Standard |
219 |
|
|
There will be cases where these standard methods don't suffice for your |
220 |
|
|
needs; these are just proposals for a useful starting point and shared-use |
221 |
|
|
conventions. |
222 |
|
|
\end_layout |
223 |
|
|
|
224 |
|
|
\begin_layout Standard |
225 |
|
|
Note that if you do not write the standard methods, your MODEL will inherit |
226 |
|
|
the ones given in the library |
227 |
|
|
\family typewriter |
228 |
|
|
basemodel.a4l |
229 |
|
|
\family default |
230 |
|
|
. |
231 |
|
|
The |
232 |
|
|
\family typewriter |
233 |
|
|
ClearAll |
234 |
|
|
\family default |
235 |
|
|
and |
236 |
|
|
\family typewriter |
237 |
|
|
reset |
238 |
|
|
\family default |
239 |
|
|
methods here will work for you if you follow the guidelines for the method |
240 |
|
|
|
241 |
|
|
\family typewriter |
242 |
|
|
specify |
243 |
|
|
\family default |
244 |
|
|
. |
245 |
|
|
The other methods defined in |
246 |
|
|
\family typewriter |
247 |
|
|
basemodel.a4l |
248 |
|
|
\family default |
249 |
|
|
|
250 |
|
|
\family typewriter |
251 |
|
|
(check_self |
252 |
|
|
\family default |
253 |
|
|
, |
254 |
|
|
\family typewriter |
255 |
|
|
default_self |
256 |
|
|
\family default |
257 |
|
|
, |
258 |
|
|
\family typewriter |
259 |
|
|
bound_self |
260 |
|
|
\family default |
261 |
|
|
, |
262 |
|
|
\family typewriter |
263 |
|
|
scale_self |
264 |
|
|
\family default |
265 |
|
|
, |
266 |
|
|
\family typewriter |
267 |
|
|
check_all |
268 |
|
|
\family default |
269 |
|
|
, |
270 |
|
|
\family typewriter |
271 |
|
|
default_all |
272 |
|
|
\family default |
273 |
|
|
, |
274 |
|
|
\family typewriter |
275 |
|
|
bound_all |
276 |
|
|
\family default |
277 |
|
|
, |
278 |
|
|
\family typewriter |
279 |
|
|
scale_all |
280 |
|
|
\family default |
281 |
|
|
) all contain |
282 |
|
|
\family typewriter |
283 |
|
|
STOP |
284 |
|
|
\family default |
285 |
|
|
statements that will warn you that you have skipped something important, |
286 |
|
|
should you accidentally call one of these methods. |
287 |
|
|
If you create a model for someone else and they run into one of these |
288 |
|
|
\family typewriter |
289 |
|
|
STOP |
290 |
|
|
\family default |
291 |
|
|
errors while using your model, that error is your fault. |
292 |
|
|
\end_layout |
293 |
|
|
|
294 |
|
|
\begin_layout Section |
295 |
|
|
Methods *_self |
296 |
|
|
\begin_inset LatexCommand \index{methods, \_self} |
297 |
|
|
|
298 |
|
|
\end_inset |
299 |
|
|
|
300 |
|
|
VS *_all |
301 |
|
|
\begin_inset LatexCommand \index{methods, \_all} |
302 |
|
|
|
303 |
|
|
\end_inset |
304 |
|
|
|
305 |
|
|
|
306 |
|
|
\end_layout |
307 |
|
|
|
308 |
|
|
\begin_layout Standard |
309 |
|
|
When you create a model definition, you create a container holding variables, |
310 |
|
|
equations, arrays, and other models. |
311 |
|
|
You create methods in the same definition to control the state of (the |
312 |
|
|
values stored in) all these parts. |
313 |
|
|
ASCEND lets you share objects among several models by passing objects through |
314 |
|
|
a model interface (the |
315 |
|
|
\family typewriter |
316 |
|
|
MODEL |
317 |
|
|
\family default |
318 |
|
|
parameter list), by creating ALIASES |
319 |
|
|
\begin_inset LatexCommand \index{ALIASES} |
320 |
|
|
|
321 |
|
|
\end_inset |
322 |
|
|
|
323 |
|
|
for parts within contained objects, and even by merging parts (though merging |
324 |
|
|
should be avoided for any object larger than a variable). |
325 |
|
|
|
326 |
|
|
\end_layout |
327 |
|
|
|
328 |
|
|
\begin_layout Standard |
329 |
|
|
\begin_inset Marginal |
330 |
|
|
status collapsed |
331 |
|
|
|
332 |
|
|
\begin_layout Standard |
333 |
|
|
Too many cooks |
334 |
|
|
\begin_inset LatexCommand \index{cooks} |
335 |
|
|
|
336 |
|
|
\end_inset |
337 |
|
|
|
338 |
|
|
spoil the broth |
339 |
|
|
\begin_inset LatexCommand \index{broth} |
340 |
|
|
|
341 |
|
|
\end_inset |
342 |
|
|
|
343 |
|
|
. |
344 |
|
|
\end_layout |
345 |
|
|
|
346 |
|
|
\end_inset |
347 |
|
|
|
348 |
|
|
The problem this creates for you as a |
349 |
|
|
\family typewriter |
350 |
|
|
METHOD |
351 |
|
|
\family default |
352 |
|
|
writer is to decide which of the several |
353 |
|
|
\family typewriter |
354 |
|
|
MODEL |
355 |
|
|
\family default |
356 |
|
|
s that share an object is responsible for updating that variable's default, |
357 |
|
|
bounds, and nominal values. |
358 |
|
|
You could decide that every model which shares a variable is responsible |
359 |
|
|
for these values. |
360 |
|
|
This decision will lead to many, many, many hard to understand conflicts |
361 |
|
|
as different models all try to manage the same value. |
362 |
|
|
And, the last one run will in fact have the final say. |
363 |
|
|
But it is difficult to know always which is the last one run. |
364 |
|
|
The sensible approach is to make only one model responsible for the bounding, |
365 |
|
|
scaling, and default setting of each variable: |
366 |
|
|
\emph on |
367 |
|
|
the model that creates the variable in the first place |
368 |
|
|
\emph default |
369 |
|
|
. |
370 |
|
|
If you abide by this approach, you will keep things much simpler for yourself. |
371 |
|
|
And, fortunately, the modeling language makes it pretty clear who has created |
372 |
|
|
each and every variable - except when merging variables. |
373 |
|
|
\end_layout |
374 |
|
|
|
375 |
|
|
\begin_layout Standard |
376 |
|
|
\begin_inset Marginal |
377 |
|
|
status collapsed |
378 |
|
|
|
379 |
|
|
\begin_layout Standard |
380 |
|
|
Use *_self methods on locally created variables and parts |
381 |
|
|
\end_layout |
382 |
|
|
|
383 |
|
|
\end_inset |
384 |
|
|
|
385 |
|
|
Consider the following model and creating the |
386 |
|
|
\family typewriter |
387 |
|
|
*_self |
388 |
|
|
\family default |
389 |
|
|
methods |
390 |
|
|
\family typewriter |
391 |
|
|
default_self |
392 |
|
|
\family default |
393 |
|
|
, |
394 |
|
|
\family typewriter |
395 |
|
|
check_self |
396 |
|
|
\family default |
397 |
|
|
, |
398 |
|
|
\family typewriter |
399 |
|
|
bound_self |
400 |
|
|
\family default |
401 |
|
|
, and |
402 |
|
|
\family typewriter |
403 |
|
|
scale_self |
404 |
|
|
\family default |
405 |
|
|
for it. |
406 |
|
|
|
407 |
|
|
\end_layout |
408 |
|
|
|
409 |
|
|
\begin_layout LyX-Code |
410 |
|
|
MODEL selfish( |
411 |
|
|
\end_layout |
412 |
|
|
|
413 |
|
|
\begin_layout LyX-Code |
414 |
|
|
external_var WILL_BE solver_var; |
415 |
|
|
\end_layout |
416 |
|
|
|
417 |
|
|
\begin_layout LyX-Code |
418 |
|
|
out_thingy WILL_BE input_part; |
419 |
|
|
\end_layout |
420 |
|
|
|
421 |
|
|
\begin_layout LyX-Code |
422 |
|
|
); |
423 |
|
|
\end_layout |
424 |
|
|
|
425 |
|
|
\begin_layout LyX-Code |
426 |
|
|
my_variable IS_A solver_var; |
427 |
|
|
\end_layout |
428 |
|
|
|
429 |
|
|
\begin_layout LyX-Code |
430 |
|
|
|
431 |
|
|
\end_layout |
432 |
|
|
|
433 |
|
|
\begin_layout LyX-Code |
434 |
|
|
peek_at_variable ALIASES out_thingy.mabob.cost; |
435 |
|
|
\end_layout |
436 |
|
|
|
437 |
|
|
\begin_layout LyX-Code |
438 |
|
|
my_thingy IS_A nother_part; |
439 |
|
|
\end_layout |
440 |
|
|
|
441 |
|
|
\begin_layout LyX-Code |
442 |
|
|
navel_gaze ALIASES my_thingy.mabob.cost; |
443 |
|
|
\end_layout |
444 |
|
|
|
445 |
|
|
\begin_layout LyX-Code |
446 |
|
|
END selfish; |
447 |
|
|
\end_layout |
448 |
|
|
|
449 |
|
|
\begin_layout Standard |
450 |
|
|
|
451 |
|
|
\end_layout |
452 |
|
|
|
453 |
|
|
\begin_layout Standard |
454 |
|
|
|
455 |
|
|
\family typewriter |
456 |
|
|
IS_A |
457 |
|
|
\family default |
458 |
|
|
statements indicate all the parts we have created in this model: namely, |
459 |
|
|
the |
460 |
|
|
\family typewriter |
461 |
|
|
solver_var |
462 |
|
|
\family default |
463 |
|
|
we call |
464 |
|
|
\family typewriter |
465 |
|
|
my_variable |
466 |
|
|
\family default |
467 |
|
|
and the |
468 |
|
|
\family typewriter |
469 |
|
|
nother_part |
470 |
|
|
\family default |
471 |
|
|
we call |
472 |
|
|
\family typewriter |
473 |
|
|
my_thingy |
474 |
|
|
\family default |
475 |
|
|
. |
476 |
|
|
This model should manage the value of the only variable it creates: |
477 |
|
|
\family typewriter |
478 |
|
|
my_variable |
479 |
|
|
\family default |
480 |
|
|
. |
481 |
|
|
The variable, |
482 |
|
|
\family typewriter |
483 |
|
|
external_var |
484 |
|
|
\family default |
485 |
|
|
, comes in from the outside so some other model has created it and should |
486 |
|
|
manage it. |
487 |
|
|
The variables |
488 |
|
|
\family typewriter |
489 |
|
|
peek_at_variable |
490 |
|
|
\family default |
491 |
|
|
and |
492 |
|
|
\family typewriter |
493 |
|
|
navel_gaze |
494 |
|
|
\family default |
495 |
|
|
also are not created here and should not be managed in the |
496 |
|
|
\family typewriter |
497 |
|
|
*_self |
498 |
|
|
\family default |
499 |
|
|
methods of |
500 |
|
|
\family typewriter |
501 |
|
|
selfish |
502 |
|
|
\family default |
503 |
|
|
. |
504 |
|
|
|
505 |
|
|
\family typewriter |
506 |
|
|
my_thingy.mabob.cost |
507 |
|
|
\family default |
508 |
|
|
belongs to a part we created. |
509 |
|
|
We want to default, bound, or scale variables in all parts we create, also, |
510 |
|
|
so we must call |
511 |
|
|
\family typewriter |
512 |
|
|
my_thingy.default_self |
513 |
|
|
\family default |
514 |
|
|
whenever |
515 |
|
|
\family typewriter |
516 |
|
|
default_self |
517 |
|
|
\family default |
518 |
|
|
is called for this model. |
519 |
|
|
Its |
520 |
|
|
\family typewriter |
521 |
|
|
*_self |
522 |
|
|
\family default |
523 |
|
|
method should in turn call the |
524 |
|
|
\family typewriter |
525 |
|
|
*_self |
526 |
|
|
\family default |
527 |
|
|
method for |
528 |
|
|
\family typewriter |
529 |
|
|
mabob |
530 |
|
|
\family default |
531 |
|
|
, which should set defaults, bounds and scaling for its variable, |
532 |
|
|
\family typewriter |
533 |
|
|
cost |
534 |
|
|
\family default |
535 |
|
|
. |
536 |
|
|
Finally, |
537 |
|
|
\family typewriter |
538 |
|
|
out_thingy |
539 |
|
|
\family default |
540 |
|
|
is an input parameter and is not created here; we should not call |
541 |
|
|
\family typewriter |
542 |
|
|
out_thingy.default_self |
543 |
|
|
\family default |
544 |
|
|
, therefore, as some other model will do so. |
545 |
|
|
\end_layout |
546 |
|
|
|
547 |
|
|
\begin_layout Standard |
548 |
|
|
\begin_inset Marginal |
549 |
|
|
status collapsed |
550 |
|
|
|
551 |
|
|
\begin_layout Standard |
552 |
|
|
Use *_all methods to manage a troublesome part |
553 |
|
|
\end_layout |
554 |
|
|
|
555 |
|
|
\end_inset |
556 |
|
|
|
557 |
|
|
As noted above, you may choose to isolate any mathematical subproblem in |
558 |
|
|
a large simulation for debugging or solving purposes. |
559 |
|
|
When you do this isolation using the Browser and Solver tools, you still |
560 |
|
|
need to call scaling, bounding, and checking methods for all parts of the |
561 |
|
|
isolated subproblem, even for those parts that come in from the outside. |
562 |
|
|
This is easily done by writing |
563 |
|
|
\family typewriter |
564 |
|
|
*_all |
565 |
|
|
\family default |
566 |
|
|
methods. |
567 |
|
|
In the example above, |
568 |
|
|
\family typewriter |
569 |
|
|
scale_all |
570 |
|
|
\family default |
571 |
|
|
will scale |
572 |
|
|
\family typewriter |
573 |
|
|
external_var |
574 |
|
|
\family default |
575 |
|
|
and call |
576 |
|
|
\family typewriter |
577 |
|
|
out_thingy.scale_all |
578 |
|
|
\family default |
579 |
|
|
because these parts are defined using |
580 |
|
|
\family typewriter |
581 |
|
|
WILL_BE |
582 |
|
|
\family default |
583 |
|
|
|
584 |
|
|
\begin_inset LatexCommand \index{WILL\_BE} |
585 |
|
|
|
586 |
|
|
\end_inset |
587 |
|
|
|
588 |
|
|
statements. |
589 |
|
|
Finally |
590 |
|
|
\family typewriter |
591 |
|
|
scale_all |
592 |
|
|
\family default |
593 |
|
|
will call its local |
594 |
|
|
\family typewriter |
595 |
|
|
*_self |
596 |
|
|
\family default |
597 |
|
|
to do all the normal scaling. |
598 |
|
|
\end_layout |
599 |
|
|
|
600 |
|
|
\begin_layout Standard |
601 |
|
|
That's the big picture of |
602 |
|
|
\family typewriter |
603 |
|
|
*_self |
604 |
|
|
\family default |
605 |
|
|
and |
606 |
|
|
\family typewriter |
607 |
|
|
*_all |
608 |
|
|
\family default |
609 |
|
|
methods. |
610 |
|
|
Each kind of method (bound, scale, default, check) has its own peculiarities, |
611 |
|
|
which we cover in Section |
612 |
|
|
\begin_inset LatexCommand \ref{sec:methods.selfMethods} |
613 |
|
|
|
614 |
|
|
\end_inset |
615 |
|
|
|
616 |
|
|
|
617 |
|
|
\noun off |
618 |
|
|
and |
619 |
|
|
\noun default |
620 |
|
|
Section |
621 |
|
|
\noun off |
622 |
|
|
|
623 |
|
|
\begin_inset LatexCommand \ref{sec:methods.allMethods} |
624 |
|
|
|
625 |
|
|
\end_inset |
626 |
|
|
|
627 |
|
|
, but they all follow the rules above |
628 |
|
|
\noun default |
629 |
|
|
and |
630 |
|
|
\noun off |
631 |
|
|
distinguish among variables and parts defined with |
632 |
|
|
\family typewriter |
633 |
|
|
\noun default |
634 |
|
|
WILL_BE |
635 |
|
|
\family default |
636 |
|
|
\noun off |
637 |
|
|
(managed in * |
638 |
|
|
\family typewriter |
639 |
|
|
\noun default |
640 |
|
|
_all |
641 |
|
|
\family default |
642 |
|
|
\noun off |
643 |
|
|
only), IS_A |
644 |
|
|
\begin_inset LatexCommand \index{IS\_A} |
645 |
|
|
|
646 |
|
|
\end_inset |
647 |
|
|
|
648 |
|
|
(managed in |
649 |
|
|
\family typewriter |
650 |
|
|
\noun default |
651 |
|
|
*_self |
652 |
|
|
\family default |
653 |
|
|
\noun off |
654 |
|
|
only), and |
655 |
|
|
\family typewriter |
656 |
|
|
\noun default |
657 |
|
|
ALIASES |
658 |
|
|
\family default |
659 |
|
|
\noun off |
660 |
|
|
(not our responsibility). |
661 |
|
|
\end_layout |
662 |
|
|
|
663 |
|
|
\begin_layout Section |
664 |
|
|
How to write ClearAll |
665 |
|
|
\begin_inset LatexCommand \index{ClearAll} |
666 |
|
|
|
667 |
|
|
\end_inset |
668 |
|
|
|
669 |
|
|
and reset |
670 |
|
|
\begin_inset LatexCommand \index{reset} |
671 |
|
|
|
672 |
|
|
\end_inset |
673 |
|
|
|
674 |
|
|
|
675 |
|
|
\end_layout |
676 |
|
|
|
677 |
|
|
\begin_layout Standard |
678 |
|
|
Writing these two standard methods in your model is very simple: do nothing. |
679 |
|
|
You may wish to write alternative |
680 |
|
|
\family typewriter |
681 |
|
|
reset_* |
682 |
|
|
\family default |
683 |
|
|
methods as we shall discuss. |
684 |
|
|
All models inherit these methods from the definitions in |
685 |
|
|
\family typewriter |
686 |
|
|
basemodel.a4l |
687 |
|
|
\family default |
688 |
|
|
. |
689 |
|
|
Just so you know, here is what they do. |
690 |
|
|
\end_layout |
691 |
|
|
|
692 |
|
|
\begin_layout Subsection |
693 |
|
|
|
694 |
|
|
\family typewriter |
695 |
|
|
METHOD ClearAll |
696 |
|
|
\end_layout |
697 |
|
|
|
698 |
|
|
\begin_layout Standard |
699 |
|
|
This method finds any variable that is a |
700 |
|
|
\family typewriter |
701 |
|
|
solver_var |
702 |
|
|
\family default |
703 |
|
|
or refinement of |
704 |
|
|
\family typewriter |
705 |
|
|
solver_var |
706 |
|
|
\family default |
707 |
|
|
and changes the |
708 |
|
|
\family typewriter |
709 |
|
|
.fixed |
710 |
|
|
\family default |
711 |
|
|
flag on that var to |
712 |
|
|
\family typewriter |
713 |
|
|
FALSE |
714 |
|
|
\family default |
715 |
|
|
. |
716 |
|
|
This method only touches the |
717 |
|
|
\family typewriter |
718 |
|
|
.fixe |
719 |
|
|
\family default |
720 |
|
|
d flags; i.e., it does not change the value of |
721 |
|
|
\family typewriter |
722 |
|
|
.included |
723 |
|
|
\family default |
724 |
|
|
flags on relations or return boolean, integer and symbol variables to a |
725 |
|
|
default value. |
726 |
|
|
|
727 |
|
|
\end_layout |
728 |
|
|
|
729 |
|
|
\begin_layout Subsection |
730 |
|
|
|
731 |
|
|
\family typewriter |
732 |
|
|
METHOD reset |
733 |
|
|
\end_layout |
734 |
|
|
|
735 |
|
|
\begin_layout Standard |
736 |
|
|
This method calls |
737 |
|
|
\family typewriter |
738 |
|
|
ClearAll |
739 |
|
|
\family default |
740 |
|
|
to bring the model to a standard state with all variables unfixed (free), |
741 |
|
|
then it calls the user-written specify method to bring the model to a state |
742 |
|
|
where it has an equal number of variables to calculate and equations to |
743 |
|
|
solve - i.e., to being |
744 |
|
|
\begin_inset Quotes eld |
745 |
|
|
\end_inset |
746 |
|
|
|
747 |
|
|
square. |
748 |
|
|
\begin_inset Quotes erd |
749 |
|
|
\end_inset |
750 |
|
|
|
751 |
|
|
Normally you do not need to write this method: your models will inherit |
752 |
|
|
this one unless you override it (redefine it) in your model. |
753 |
|
|
\end_layout |
754 |
|
|
|
755 |
|
|
\begin_layout Standard |
756 |
|
|
This standard state is not necessarily the most useful starting state for |
757 |
|
|
any particular application. |
758 |
|
|
This method merely establishes a base case the modeler finds to be a good |
759 |
|
|
starting point. |
760 |
|
|
As an example, the modeler may elect to set fix variables for the base |
761 |
|
|
case for a flash unit so it corresponds to an isothermal flash calculation. |
762 |
|
|
Chemical engineers understand this case and can make changes from it to |
763 |
|
|
set up other cases, such as an adiabatic flash, relatively easily by setting |
764 |
|
|
and resetting but one or two |
765 |
|
|
\family typewriter |
766 |
|
|
.fixed |
767 |
|
|
\family default |
768 |
|
|
flags. |
769 |
|
|
There is no one perfect "reset"' for all purposes. |
770 |
|
|
Other |
771 |
|
|
\family typewriter |
772 |
|
|
reset_* |
773 |
|
|
\family default |
774 |
|
|
methods can also be written for particular purposes, if such arise |
775 |
|
|
\begin_inset Foot |
776 |
|
|
status collapsed |
777 |
|
|
|
778 |
|
|
\begin_layout Standard |
779 |
|
|
The name of a method, for example |
780 |
|
|
\family typewriter |
781 |
|
|
reset_someOtherPurpose |
782 |
|
|
\family default |
783 |
|
|
is a communication tool. |
784 |
|
|
Please use meaningful names as long as necessary to tell what the method |
785 |
|
|
does. |
786 |
|
|
Avoid cryptic abbreviations and hyper-specialized jargon known only to |
787 |
|
|
you and your three friends when you are naming methods; however, do not |
788 |
|
|
shy away from technical terms common to the engineering domain in which |
789 |
|
|
you are modeling. |
790 |
|
|
\end_layout |
791 |
|
|
|
792 |
|
|
\end_inset |
793 |
|
|
|
794 |
|
|
. |
795 |
|
|
\end_layout |
796 |
|
|
|
797 |
|
|
\begin_layout Section |
798 |
|
|
The |
799 |
|
|
\family typewriter |
800 |
|
|
*_self |
801 |
|
|
\family default |
802 |
|
|
|
803 |
|
|
\begin_inset LatexCommand \index{\_self} |
804 |
|
|
|
805 |
|
|
\end_inset |
806 |
|
|
|
807 |
|
|
methods |
808 |
|
|
\begin_inset LatexCommand \label{sec:methods.selfMethods} |
809 |
|
|
|
810 |
|
|
\end_inset |
811 |
|
|
|
812 |
|
|
|
813 |
|
|
\end_layout |
814 |
|
|
|
815 |
|
|
\begin_layout Standard |
816 |
|
|
The following methods should be redefined by each reusable library |
817 |
|
|
\family typewriter |
818 |
|
|
MODEL |
819 |
|
|
\family default |
820 |
|
|
. |
821 |
|
|
Models that do not supply proper versions of these methods are usually |
822 |
|
|
very hard to reuse. |
823 |
|
|
|
824 |
|
|
\end_layout |
825 |
|
|
|
826 |
|
|
\begin_layout Subsection |
827 |
|
|
|
828 |
|
|
\family typewriter |
829 |
|
|
METHOD check_self |
830 |
|
|
\family default |
831 |
|
|
|
832 |
|
|
\begin_inset LatexCommand \index{check\_self} |
833 |
|
|
|
834 |
|
|
\end_inset |
835 |
|
|
|
836 |
|
|
|
837 |
|
|
\end_layout |
838 |
|
|
|
839 |
|
|
\begin_layout Standard |
840 |
|
|
One can benefit by writing this method first, though it is run last. |
841 |
|
|
Just as they taught you in elementary school, always check your work. |
842 |
|
|
Start by defining criteria for a successful solution that will not be included |
843 |
|
|
in the equations solved and compute them in this method. |
844 |
|
|
As you develop your |
845 |
|
|
\family typewriter |
846 |
|
|
MODEL |
847 |
|
|
\family default |
848 |
|
|
, you should expect to revise the check method from time to time, if you |
849 |
|
|
are learning anything about the model. |
850 |
|
|
We frequently change our definition of success when modeling. |
851 |
|
|
\end_layout |
852 |
|
|
|
853 |
|
|
\begin_layout Standard |
854 |
|
|
When a mathematical model is solved, the assumptions that went into writing |
855 |
|
|
(deriving) the equations should be checked. |
856 |
|
|
Usually there are redundant equations available (more than one way to state |
857 |
|
|
the physics or economics mathematically). |
858 |
|
|
These should be used to check the particularly tricky bits of the model. |
859 |
|
|
\end_layout |
860 |
|
|
|
861 |
|
|
\begin_layout Standard |
862 |
|
|
Check that the physical or intuitive (qualitative) relationships among variables |
863 |
|
|
you expect to hold are true, especially if you have not written such relationsh |
864 |
|
|
ips in terms of inequalities ( |
865 |
|
|
\family typewriter |
866 |
|
|
x*z <= y |
867 |
|
|
\family default |
868 |
|
|
) in the |
869 |
|
|
\family typewriter |
870 |
|
|
MODEL |
871 |
|
|
\family default |
872 |
|
|
equations. |
873 |
|
|
\end_layout |
874 |
|
|
|
875 |
|
|
\begin_layout Standard |
876 |
|
|
In some models, checking the variable values against absolute physical limits |
877 |
|
|
( |
878 |
|
|
\family typewriter |
879 |
|
|
temperature > 0{K} |
880 |
|
|
\family default |
881 |
|
|
and |
882 |
|
|
\family typewriter |
883 |
|
|
temperature < Tcritical |
884 |
|
|
\family default |
885 |
|
|
, for example) may be all that is necessary or possible. |
886 |
|
|
Do not check variable values against their |
887 |
|
|
\family typewriter |
888 |
|
|
.lower_bound |
889 |
|
|
\family default |
890 |
|
|
or |
891 |
|
|
\family typewriter |
892 |
|
|
.upper_bound |
893 |
|
|
\family default |
894 |
|
|
, as ASCEND will do this for you. |
895 |
|
|
\end_layout |
896 |
|
|
|
897 |
|
|
\begin_layout Standard |
898 |
|
|
If a check fails, use a |
899 |
|
|
\family typewriter |
900 |
|
|
STOP |
901 |
|
|
\family default |
902 |
|
|
|
903 |
|
|
\begin_inset LatexCommand \index{STOP} |
904 |
|
|
|
905 |
|
|
\end_inset |
906 |
|
|
|
907 |
|
|
statement to notify yourself (or your end-user) that the solution may be |
908 |
|
|
bogus. |
909 |
|
|
|
910 |
|
|
\family typewriter |
911 |
|
|
STOP |
912 |
|
|
\family default |
913 |
|
|
raises an error signal and issues an error message. |
914 |
|
|
|
915 |
|
|
\family typewriter |
916 |
|
|
STOP |
917 |
|
|
\family default |
918 |
|
|
normally also stops further execution of the method and returns control |
919 |
|
|
to a higher level, though there are interactive tools to force method execution |
920 |
|
|
to continue. |
921 |
|
|
|
922 |
|
|
\family typewriter |
923 |
|
|
STOP |
924 |
|
|
\family default |
925 |
|
|
does not cause ASCEND to exit though: just for the method execution to |
926 |
|
|
halt and for control to return to the user. |
927 |
|
|
\end_layout |
928 |
|
|
|
929 |
|
|
\begin_layout Subsection |
930 |
|
|
|
931 |
|
|
\family typewriter |
932 |
|
|
METHOD default_self |
933 |
|
|
\begin_inset LatexCommand \index{default\_self} |
934 |
|
|
|
935 |
|
|
\end_inset |
936 |
|
|
|
937 |
|
|
|
938 |
|
|
\end_layout |
939 |
|
|
|
940 |
|
|
\begin_layout Standard |
941 |
|
|
This method should set default values for any variables declared locally |
942 |
|
|
( |
943 |
|
|
\family typewriter |
944 |
|
|
IS_A |
945 |
|
|
\family default |
946 |
|
|
) to the model. |
947 |
|
|
If the default value declared for the atom type, of which the variable |
948 |
|
|
is an instance, is appropriate (and typically it is), then you need not |
949 |
|
|
set a specific default value here. |
950 |
|
|
This method also should run |
951 |
|
|
\family typewriter |
952 |
|
|
default_self |
953 |
|
|
\family default |
954 |
|
|
on all the complex parts that are declared locally (with |
955 |
|
|
\family typewriter |
956 |
|
|
IS_A |
957 |
|
|
\family default |
958 |
|
|
) in the model. |
959 |
|
|
\end_layout |
960 |
|
|
|
961 |
|
|
\begin_layout Standard |
962 |
|
|
This method should not run any methods on model parts that come via |
963 |
|
|
\family typewriter |
964 |
|
|
WILL_BE |
965 |
|
|
\family default |
966 |
|
|
in the definition's parameter list. |
967 |
|
|
This method also should not change the values of variables that are passed |
968 |
|
|
in through the parameter list. |
969 |
|
|
Sometimes there will be nothing for this method to do. |
970 |
|
|
Define it anyway, leaving it empty, so that any writer reusing this model |
971 |
|
|
as part of a higher level model can safely assume it is there and call |
972 |
|
|
it without having to know the details. |
973 |
|
|
\end_layout |
974 |
|
|
|
975 |
|
|
\begin_layout Standard |
976 |
|
|
When a top-level simulation is built by the compiler, this method will be |
977 |
|
|
run (for the top-level model) at the end of compilation. |
978 |
|
|
If your model's |
979 |
|
|
\family typewriter |
980 |
|
|
default_self |
981 |
|
|
\family default |
982 |
|
|
method does not call the lower-level |
983 |
|
|
\family typewriter |
984 |
|
|
default_self |
985 |
|
|
\family default |
986 |
|
|
methods in your model locally-declared ( |
987 |
|
|
\family typewriter |
988 |
|
|
IS_A |
989 |
|
|
\family default |
990 |
|
|
) parts, it is quite likely that your model will not solve. |
991 |
|
|
\end_layout |
992 |
|
|
|
993 |
|
|
\begin_layout Subsection |
994 |
|
|
|
995 |
|
|
\family typewriter |
996 |
|
|
METHOD bound_self |
997 |
|
|
\begin_inset LatexCommand \index{bound\_self} |
998 |
|
|
|
999 |
|
|
\end_inset |
1000 |
|
|
|
1001 |
|
|
|
1002 |
|
|
\end_layout |
1003 |
|
|
|
1004 |
|
|
\begin_layout Standard |
1005 |
|
|
Much of the art of nonlinear physical modeling is in bounding the solution. |
1006 |
|
|
This method should update the bounds on locally defined ( |
1007 |
|
|
\family typewriter |
1008 |
|
|
IS_A |
1009 |
|
|
\family default |
1010 |
|
|
) variables and |
1011 |
|
|
\family typewriter |
1012 |
|
|
(IS_A) |
1013 |
|
|
\family default |
1014 |
|
|
defined model parts. |
1015 |
|
|
Updating bounds requires some care. |
1016 |
|
|
For example, the bounds on fractions frequently don't need updating. |
1017 |
|
|
This method should not bound variables passed into the |
1018 |
|
|
\family typewriter |
1019 |
|
|
MODEL |
1020 |
|
|
\family default |
1021 |
|
|
definition or parts passed into the definition. |
1022 |
|
|
\end_layout |
1023 |
|
|
|
1024 |
|
|
\begin_layout Standard |
1025 |
|
|
A common formula for updating bounds is to define a region around the current |
1026 |
|
|
value of the variable. |
1027 |
|
|
A linear region size formula, as an example, would be: |
1028 |
|
|
\end_layout |
1029 |
|
|
|
1030 |
|
|
\begin_layout Standard |
1031 |
|
|
\begin_inset Formula \begin{equation} |
1032 |
|
|
x_{bound}=x\pm\Delta\cdot x_{nominal}\label{eq:methods.bound-width}\end{equation} |
1033 |
|
|
|
1034 |
|
|
\end_inset |
1035 |
|
|
|
1036 |
|
|
or, in ASCEND syntax, |
1037 |
|
|
\end_layout |
1038 |
|
|
|
1039 |
|
|
\begin_layout LyX-Code |
1040 |
|
|
v.upper_bound := v + |
1041 |
|
|
\begin_inset LatexCommand \index{boundwidth} |
1042 |
|
|
|
1043 |
|
|
\end_inset |
1044 |
|
|
|
1045 |
|
|
boundwidth * v.nominal; |
1046 |
|
|
\end_layout |
1047 |
|
|
|
1048 |
|
|
\begin_layout LyX-Code |
1049 |
|
|
v.lower_bound := v - boundwidth * v.nominal; |
1050 |
|
|
\end_layout |
1051 |
|
|
|
1052 |
|
|
\begin_layout Standard |
1053 |
|
|
Care must be taken that such a formula does not move the bounds (particularly |
1054 |
|
|
lower bounds) out so far as to allow non-physical solutions. |
1055 |
|
|
Logarithmic bounding regions are also simple to calculate. |
1056 |
|
|
Here |
1057 |
|
|
\family typewriter |
1058 |
|
|
boundwidth |
1059 |
|
|
\family default |
1060 |
|
|
is a |
1061 |
|
|
\family typewriter |
1062 |
|
|
bound_width |
1063 |
|
|
\family default |
1064 |
|
|
: it could be a real atom (but |
1065 |
|
|
\series bold |
1066 |
|
|
not |
1067 |
|
|
\series default |
1068 |
|
|
a |
1069 |
|
|
\family typewriter |
1070 |
|
|
solver_var |
1071 |
|
|
\family default |
1072 |
|
|
) or some value you can use to determine how much "wiggle-room" you want |
1073 |
|
|
to give a solver. |
1074 |
|
|
|
1075 |
|
|
\end_layout |
1076 |
|
|
|
1077 |
|
|
\begin_layout Standard |
1078 |
|
|
Small powers of 4 and 10 are usually good values of |
1079 |
|
|
\family typewriter |
1080 |
|
|
boundwidth |
1081 |
|
|
\family default |
1082 |
|
|
. |
1083 |
|
|
Too small a boundwidth can cut off the portion of number space where the |
1084 |
|
|
solution is found. |
1085 |
|
|
Too large a bound width can allow solvers to wander for great distances |
1086 |
|
|
in uninteresting regions of the number space. |
1087 |
|
|
\end_layout |
1088 |
|
|
|
1089 |
|
|
\begin_layout Standard |
1090 |
|
|
\begin_inset Note Note |
1091 |
|
|
status open |
1092 |
|
|
|
1093 |
|
|
\begin_layout Standard |
1094 |
|
|
We need an example here |
1095 |
|
|
\end_layout |
1096 |
|
|
|
1097 |
|
|
\end_inset |
1098 |
|
|
|
1099 |
|
|
|
1100 |
|
|
\end_layout |
1101 |
|
|
|
1102 |
|
|
\begin_layout Subsection |
1103 |
|
|
|
1104 |
|
|
\family typewriter |
1105 |
|
|
METHOD scale_self |
1106 |
|
|
\begin_inset LatexCommand \index{scale\_self} |
1107 |
|
|
|
1108 |
|
|
\end_inset |
1109 |
|
|
|
1110 |
|
|
|
1111 |
|
|
\begin_inset LatexCommand \label{ssec:methods.scaleself} |
1112 |
|
|
|
1113 |
|
|
\end_inset |
1114 |
|
|
|
1115 |
|
|
|
1116 |
|
|
\end_layout |
1117 |
|
|
|
1118 |
|
|
\begin_layout Standard |
1119 |
|
|
Most nonlinear (and many linear) models cannot be solved without proper |
1120 |
|
|
scaling of the variables. |
1121 |
|
|
|
1122 |
|
|
\family typewriter |
1123 |
|
|
scale_self |
1124 |
|
|
\family default |
1125 |
|
|
should reset the |
1126 |
|
|
\family typewriter |
1127 |
|
|
.nominal |
1128 |
|
|
\family default |
1129 |
|
|
value on every real variable in need of scaling. |
1130 |
|
|
It should then call the |
1131 |
|
|
\family typewriter |
1132 |
|
|
scale_self |
1133 |
|
|
\family default |
1134 |
|
|
method on all the locally-defined ( |
1135 |
|
|
\family typewriter |
1136 |
|
|
IS_A |
1137 |
|
|
\family default |
1138 |
|
|
) parts of the MODEL. |
1139 |
|
|
A proper nominal is one such that you expect at the solution |
1140 |
|
|
\end_layout |
1141 |
|
|
|
1142 |
|
|
\begin_layout Standard |
1143 |
|
|
\begin_inset Formula \begin{equation} |
1144 |
|
|
0\leq abs\left(\frac{x}{x_{nominal}}\right)\leq10\label{eq:methods.choiceNominal}\end{equation} |
1145 |
|
|
|
1146 |
|
|
\end_inset |
1147 |
|
|
|
1148 |
|
|
|
1149 |
|
|
\end_layout |
1150 |
|
|
|
1151 |
|
|
\begin_layout Standard |
1152 |
|
|
As one is dividing by the nominal value for the variable to establish its |
1153 |
|
|
scaled value, zero is about the worst value you could choose for a nominal |
1154 |
|
|
value. |
1155 |
|
|
\end_layout |
1156 |
|
|
|
1157 |
|
|
\begin_layout Standard |
1158 |
|
|
This method should not change the |
1159 |
|
|
\family typewriter |
1160 |
|
|
.nominal |
1161 |
|
|
\family default |
1162 |
|
|
values for models and variables that are received through the parameter |
1163 |
|
|
list of the model. |
1164 |
|
|
\end_layout |
1165 |
|
|
|
1166 |
|
|
\begin_layout Standard |
1167 |
|
|
Variables (like fractions), when bounded such that they cannot be too far |
1168 |
|
|
away from 1.0 in magnitude, probably don't need scaling most of the time, |
1169 |
|
|
so long as they they are also bounded away from 0.0. |
1170 |
|
|
|
1171 |
|
|
\end_layout |
1172 |
|
|
|
1173 |
|
|
\begin_layout Standard |
1174 |
|
|
Some solvers, but not all, will attempt to scale the equations and variables |
1175 |
|
|
by heuristic matrix-based methods. |
1176 |
|
|
This works, but inconsistently; user-defined scaling |
1177 |
|
|
\begin_inset LatexCommand \index{scaling} |
1178 |
|
|
|
1179 |
|
|
\end_inset |
1180 |
|
|
|
1181 |
|
|
is generally superior. |
1182 |
|
|
ASCEND makes scaling equations easy to do. |
1183 |
|
|
You scale the variables, which can only be done well by knowing something |
1184 |
|
|
about where the solution is going to be found (by being an engineer, for |
1185 |
|
|
example). |
1186 |
|
|
Then ASCEND can calculate an appropriate equation-scaling by efficient |
1187 |
|
|
symbolic methods. |
1188 |
|
|
\end_layout |
1189 |
|
|
|
1190 |
|
|
\begin_layout Section |
1191 |
|
|
The |
1192 |
|
|
\family typewriter |
1193 |
|
|
*_all |
1194 |
|
|
\family default |
1195 |
|
|
methods |
1196 |
|
|
\begin_inset LatexCommand \label{sec:methods.allMethods} |
1197 |
|
|
|
1198 |
|
|
\end_inset |
1199 |
|
|
|
1200 |
|
|
|
1201 |
|
|
\end_layout |
1202 |
|
|
|
1203 |
|
|
\begin_layout Subsection |
1204 |
|
|
|
1205 |
|
|
\family typewriter |
1206 |
|
|
METHOD default_all |
1207 |
|
|
\begin_inset LatexCommand \index{default\_all} |
1208 |
|
|
|
1209 |
|
|
\end_inset |
1210 |
|
|
|
1211 |
|
|
|
1212 |
|
|
\end_layout |
1213 |
|
|
|
1214 |
|
|
\begin_layout Standard |
1215 |
|
|
Above we discussed the ability in ASCEND to isolate and solve any part of |
1216 |
|
|
a model that is defined as an instance of a single type requires you initialize |
1217 |
|
|
the arguments to a model that you are isolating. |
1218 |
|
|
This method should run the |
1219 |
|
|
\family typewriter |
1220 |
|
|
default_all |
1221 |
|
|
\family default |
1222 |
|
|
method on each of the parts received through the parameter list via |
1223 |
|
|
\family typewriter |
1224 |
|
|
WILL_BE |
1225 |
|
|
\family default |
1226 |
|
|
statements and should give appropriate default values to any variables |
1227 |
|
|
received through the parameter list. |
1228 |
|
|
After these calls and settings have been done, it should then call its |
1229 |
|
|
own |
1230 |
|
|
\family typewriter |
1231 |
|
|
default_self |
1232 |
|
|
\family default |
1233 |
|
|
to take care of all local defaults. |
1234 |
|
|
\end_layout |
1235 |
|
|
|
1236 |
|
|
\begin_layout Subsection |
1237 |
|
|
|
1238 |
|
|
\family typewriter |
1239 |
|
|
METHOD check_all |
1240 |
|
|
\begin_inset LatexCommand \index{check\_all} |
1241 |
|
|
|
1242 |
|
|
\end_inset |
1243 |
|
|
|
1244 |
|
|
|
1245 |
|
|
\end_layout |
1246 |
|
|
|
1247 |
|
|
\begin_layout Standard |
1248 |
|
|
When solving only a part of a simulation, it is necessary to check the models |
1249 |
|
|
and variables passed into the part as well as the locally defined parts |
1250 |
|
|
and variables. |
1251 |
|
|
This method should call |
1252 |
|
|
\family typewriter |
1253 |
|
|
check_all |
1254 |
|
|
\family default |
1255 |
|
|
on the parts received as |
1256 |
|
|
\family typewriter |
1257 |
|
|
WILL_BE |
1258 |
|
|
\family default |
1259 |
|
|
parameters, then call |
1260 |
|
|
\family typewriter |
1261 |
|
|
check_self |
1262 |
|
|
\family default |
1263 |
|
|
to check the locally defined parts and equations. |
1264 |
|
|
\end_layout |
1265 |
|
|
|
1266 |
|
|
\begin_layout Subsection |
1267 |
|
|
|
1268 |
|
|
\family typewriter |
1269 |
|
|
METHOD bound_all |
1270 |
|
|
\begin_inset LatexCommand \index{bound\_all} |
1271 |
|
|
|
1272 |
|
|
\end_inset |
1273 |
|
|
|
1274 |
|
|
|
1275 |
|
|
\end_layout |
1276 |
|
|
|
1277 |
|
|
\begin_layout Standard |
1278 |
|
|
This method should be like |
1279 |
|
|
\family typewriter |
1280 |
|
|
bound_self |
1281 |
|
|
\family default |
1282 |
|
|
except that it bounds the passed in variables and calls |
1283 |
|
|
\family typewriter |
1284 |
|
|
bound_all |
1285 |
|
|
\family default |
1286 |
|
|
on the passed in parts. |
1287 |
|
|
It should then call |
1288 |
|
|
\family typewriter |
1289 |
|
|
bound_self |
1290 |
|
|
\family default |
1291 |
|
|
. |
1292 |
|
|
\end_layout |
1293 |
|
|
|
1294 |
|
|
\begin_layout Subsection |
1295 |
|
|
|
1296 |
|
|
\family typewriter |
1297 |
|
|
METHOD scale_all |
1298 |
|
|
\begin_inset LatexCommand \index{scale\_all} |
1299 |
|
|
|
1300 |
|
|
\end_inset |
1301 |
|
|
|
1302 |
|
|
|
1303 |
|
|
\end_layout |
1304 |
|
|
|
1305 |
|
|
\begin_layout Standard |
1306 |
|
|
This method should be like |
1307 |
|
|
\family typewriter |
1308 |
|
|
scale_self |
1309 |
|
|
\family default |
1310 |
|
|
above except that it scales the variables received through the parameter |
1311 |
|
|
list and calls |
1312 |
|
|
\family typewriter |
1313 |
|
|
scale_all |
1314 |
|
|
\family default |
1315 |
|
|
on the passed in parts. |
1316 |
|
|
It should then call |
1317 |
|
|
\family typewriter |
1318 |
|
|
scale_self |
1319 |
|
|
\family default |
1320 |
|
|
to take care of the local variables and models. |
1321 |
|
|
\end_layout |
1322 |
|
|
|
1323 |
|
|
\begin_layout Section |
1324 |
|
|
|
1325 |
|
|
\family typewriter |
1326 |
|
|
METHOD specify |
1327 |
|
|
\family default |
1328 |
|
|
|
1329 |
|
|
\begin_inset LatexCommand \index{specify} |
1330 |
|
|
|
1331 |
|
|
\end_inset |
1332 |
|
|
|
1333 |
|
|
|
1334 |
|
|
\end_layout |
1335 |
|
|
|
1336 |
|
|
\begin_layout Standard |
1337 |
|
|
The method |
1338 |
|
|
\family typewriter |
1339 |
|
|
specify |
1340 |
|
|
\family default |
1341 |
|
|
sets the |
1342 |
|
|
\family typewriter |
1343 |
|
|
.fixed |
1344 |
|
|
\family default |
1345 |
|
|
flags so an instance of the model is solvable. |
1346 |
|
|
There are two issues involved. |
1347 |
|
|
First, the model must be square - i.e., it must have as many free variables |
1348 |
|
|
as it has eligible equations available to compute them. |
1349 |
|
|
Second, it should be a setting of |
1350 |
|
|
\family typewriter |
1351 |
|
|
.fixed |
1352 |
|
|
\family default |
1353 |
|
|
flags that the modeler knows will solve numerically. |
1354 |
|
|
This latter requirement requires one to have an intuitive feel for the |
1355 |
|
|
model. |
1356 |
|
|
A chemical engineer will |
1357 |
|
|
\begin_inset Quotes eld |
1358 |
|
|
\end_inset |
1359 |
|
|
|
1360 |
|
|
know |
1361 |
|
|
\begin_inset Quotes erd |
1362 |
|
|
\end_inset |
1363 |
|
|
|
1364 |
|
|
that a flash calculation, where he has fixed both the pressure and the |
1365 |
|
|
vapor fraction, is a pretty robust calculation. |
1366 |
|
|
It would be a good way to set fix flags in the |
1367 |
|
|
\family typewriter |
1368 |
|
|
specify |
1369 |
|
|
\family default |
1370 |
|
|
method. |
1371 |
|
|
Getting the |
1372 |
|
|
\family typewriter |
1373 |
|
|
.fixed |
1374 |
|
|
\family default |
1375 |
|
|
flags set for a large complex model is one of the hardest tasks ever invented |
1376 |
|
|
by mathematicians if you go about it in the wrong way. |
1377 |
|
|
If you follow the prescription here, getting the right number of flags |
1378 |
|
|
set is almost automatic. |
1379 |
|
|
We have set written the specify methods for a complex hierarchy of models |
1380 |
|
|
correctly the first time using this approach. |
1381 |
|
|
\end_layout |
1382 |
|
|
|
1383 |
|
|
\begin_layout Standard |
1384 |
|
|
We shall illustrate this section by examining the set of models in |
1385 |
|
|
\family typewriter |
1386 |
|
|
simple_fs.a4c |
1387 |
|
|
\family default |
1388 |
|
|
. |
1389 |
|
|
You should find that model in the model directory for ASCEND and open it |
1390 |
|
|
in your favorite text editor. |
1391 |
|
|
This model is for a simple flowsheet comprising a mixer, a reactor, a flash |
1392 |
|
|
unit and a simple stream splitter. |
1393 |
|
|
It contains the following models: |
1394 |
|
|
\family typewriter |
1395 |
|
|
mixture |
1396 |
|
|
\family default |
1397 |
|
|
, |
1398 |
|
|
\family typewriter |
1399 |
|
|
molar_stream |
1400 |
|
|
\family default |
1401 |
|
|
, |
1402 |
|
|
\family typewriter |
1403 |
|
|
mixer |
1404 |
|
|
\family default |
1405 |
|
|
, |
1406 |
|
|
\family typewriter |
1407 |
|
|
reactor |
1408 |
|
|
\family default |
1409 |
|
|
, |
1410 |
|
|
\family typewriter |
1411 |
|
|
flash |
1412 |
|
|
\family default |
1413 |
|
|
, |
1414 |
|
|
\family typewriter |
1415 |
|
|
splitter |
1416 |
|
|
\family default |
1417 |
|
|
, |
1418 |
|
|
\family typewriter |
1419 |
|
|
flowsheet |
1420 |
|
|
\family default |
1421 |
|
|
, |
1422 |
|
|
\family typewriter |
1423 |
|
|
controller |
1424 |
|
|
\family default |
1425 |
|
|
, |
1426 |
|
|
\family typewriter |
1427 |
|
|
test_flowsheet |
1428 |
|
|
\family default |
1429 |
|
|
and |
1430 |
|
|
\family typewriter |
1431 |
|
|
test_controller |
1432 |
|
|
\family default |
1433 |
|
|
. |
1434 |
|
|
When compiling and solving, one typically creates an instance of |
1435 |
|
|
\family typewriter |
1436 |
|
|
test_controller |
1437 |
|
|
\family default |
1438 |
|
|
. |
1439 |
|
|
|
1440 |
|
|
\end_layout |
1441 |
|
|
|
1442 |
|
|
\begin_layout Standard |
1443 |
|
|
Model mixture only defines new variables |
1444 |
|
|
\family typewriter |
1445 |
|
|
y[components] |
1446 |
|
|
\family default |
1447 |
|
|
and one equation that says their sum is unity. |
1448 |
|
|
Model molar_stream introduces new variables |
1449 |
|
|
\family typewriter |
1450 |
|
|
Ftot |
1451 |
|
|
\family default |
1452 |
|
|
and |
1453 |
|
|
\family typewriter |
1454 |
|
|
f[components] |
1455 |
|
|
\family default |
1456 |
|
|
. |
1457 |
|
|
It also introduces an instance of the model mixture, which it calls |
1458 |
|
|
\family typewriter |
1459 |
|
|
state |
1460 |
|
|
\family default |
1461 |
|
|
. |
1462 |
|
|
Finally it introduces locally the equations |
1463 |
|
|
\family typewriter |
1464 |
|
|
f_def |
1465 |
|
|
\family default |
1466 |
|
|
, one for each component. |
1467 |
|
|
Models |
1468 |
|
|
\family typewriter |
1469 |
|
|
mixer |
1470 |
|
|
\family default |
1471 |
|
|
, |
1472 |
|
|
\family typewriter |
1473 |
|
|
reactor |
1474 |
|
|
\family default |
1475 |
|
|
, |
1476 |
|
|
\family typewriter |
1477 |
|
|
flash |
1478 |
|
|
\family default |
1479 |
|
|
and |
1480 |
|
|
\family typewriter |
1481 |
|
|
splitter |
1482 |
|
|
\family default |
1483 |
|
|
introduce their own local variables and equations. |
1484 |
|
|
Each also defines it input and output streams as instances of the model |
1485 |
|
|
|
1486 |
|
|
\family typewriter |
1487 |
|
|
molar_stream |
1488 |
|
|
\family default |
1489 |
|
|
. |
1490 |
|
|
Model |
1491 |
|
|
\family typewriter |
1492 |
|
|
flowsheet |
1493 |
|
|
\family default |
1494 |
|
|
contains a |
1495 |
|
|
\family typewriter |
1496 |
|
|
mixer |
1497 |
|
|
\family default |
1498 |
|
|
, |
1499 |
|
|
\family typewriter |
1500 |
|
|
reactor |
1501 |
|
|
\family default |
1502 |
|
|
, |
1503 |
|
|
\family typewriter |
1504 |
|
|
flash |
1505 |
|
|
\family default |
1506 |
|
|
and |
1507 |
|
|
\family typewriter |
1508 |
|
|
splitter |
1509 |
|
|
\family default |
1510 |
|
|
, etc. |
1511 |
|
|
\end_layout |
1512 |
|
|
|
1513 |
|
|
\begin_layout Standard |
1514 |
|
|
Assume you have just written a set of models, such as those in |
1515 |
|
|
\family typewriter |
1516 |
|
|
simple_fs.a4c |
1517 |
|
|
\family default |
1518 |
|
|
. |
1519 |
|
|
In this approach you should start with the lowest level models - i.e., the |
1520 |
|
|
ones that only introduce (using |
1521 |
|
|
\family typewriter |
1522 |
|
|
IS_A |
1523 |
|
|
\family default |
1524 |
|
|
statements) new variables and new parts that are instances of types in |
1525 |
|
|
existing ASCEND libraries. |
1526 |
|
|
The lowest level model by this definition is |
1527 |
|
|
\family typewriter |
1528 |
|
|
mixture |
1529 |
|
|
\family default |
1530 |
|
|
. |
1531 |
|
|
It only introduces new variables and one new equation. |
1532 |
|
|
Once you have written and debugged a |
1533 |
|
|
\family typewriter |
1534 |
|
|
specify |
1535 |
|
|
\family default |
1536 |
|
|
method for |
1537 |
|
|
\family typewriter |
1538 |
|
|
mixture |
1539 |
|
|
\family default |
1540 |
|
|
, then again look for any model that only introduces new variables and local |
1541 |
|
|
equations and/or parts for which a debugged |
1542 |
|
|
\family typewriter |
1543 |
|
|
specify |
1544 |
|
|
\family default |
1545 |
|
|
method exists. |
1546 |
|
|
The model |
1547 |
|
|
\family typewriter |
1548 |
|
|
molar_stream |
1549 |
|
|
\family default |
1550 |
|
|
is such a model and can be considered next. |
1551 |
|
|
It introduces a part which is an instance of |
1552 |
|
|
\family typewriter |
1553 |
|
|
mixture |
1554 |
|
|
\family default |
1555 |
|
|
for which we already have a |
1556 |
|
|
\family typewriter |
1557 |
|
|
specify |
1558 |
|
|
\family default |
1559 |
|
|
method. |
1560 |
|
|
Once we have a debugged |
1561 |
|
|
\family typewriter |
1562 |
|
|
specify |
1563 |
|
|
\family default |
1564 |
|
|
method for |
1565 |
|
|
\family typewriter |
1566 |
|
|
molar_stream |
1567 |
|
|
\family default |
1568 |
|
|
, then we can consider any of the models |
1569 |
|
|
\family typewriter |
1570 |
|
|
mixer |
1571 |
|
|
\family default |
1572 |
|
|
, |
1573 |
|
|
\family typewriter |
1574 |
|
|
reactor |
1575 |
|
|
\family default |
1576 |
|
|
, |
1577 |
|
|
\family typewriter |
1578 |
|
|
flash |
1579 |
|
|
\family default |
1580 |
|
|
and |
1581 |
|
|
\family typewriter |
1582 |
|
|
splitter |
1583 |
|
|
\family default |
1584 |
|
|
- they only have parts that are instances of |
1585 |
|
|
\family typewriter |
1586 |
|
|
molar_stream |
1587 |
|
|
\family default |
1588 |
|
|
. |
1589 |
|
|
After creating and debugging their |
1590 |
|
|
\family typewriter |
1591 |
|
|
specify |
1592 |
|
|
\family default |
1593 |
|
|
methods, we can consider the model |
1594 |
|
|
\family typewriter |
1595 |
|
|
flowsheet |
1596 |
|
|
\family default |
1597 |
|
|
, then |
1598 |
|
|
\family typewriter |
1599 |
|
|
controller |
1600 |
|
|
\family default |
1601 |
|
|
, then |
1602 |
|
|
\family typewriter |
1603 |
|
|
test_flowsheet |
1604 |
|
|
\family default |
1605 |
|
|
and finally |
1606 |
|
|
\family typewriter |
1607 |
|
|
test_controller |
1608 |
|
|
\family default |
1609 |
|
|
. |
1610 |
|
|
\end_layout |
1611 |
|
|
|
1612 |
|
|
\begin_layout Standard |
1613 |
|
|
The safest way to set |
1614 |
|
|
\family typewriter |
1615 |
|
|
.fixed |
1616 |
|
|
\family default |
1617 |
|
|
flags is first to clear all the |
1618 |
|
|
\family typewriter |
1619 |
|
|
.fixed |
1620 |
|
|
\family default |
1621 |
|
|
flags for a model instance by running the method |
1622 |
|
|
\family typewriter |
1623 |
|
|
ClearAll |
1624 |
|
|
\family default |
1625 |
|
|
. |
1626 |
|
|
The method |
1627 |
|
|
\family typewriter |
1628 |
|
|
specify |
1629 |
|
|
\family default |
1630 |
|
|
does |
1631 |
|
|
\series bold |
1632 |
|
|
not |
1633 |
|
|
\series default |
1634 |
|
|
run |
1635 |
|
|
\family typewriter |
1636 |
|
|
ClearAll |
1637 |
|
|
\family default |
1638 |
|
|
, but we always write our |
1639 |
|
|
\family typewriter |
1640 |
|
|
specify |
1641 |
|
|
\family default |
1642 |
|
|
methods assuming |
1643 |
|
|
\family typewriter |
1644 |
|
|
ClearAll |
1645 |
|
|
\family default |
1646 |
|
|
has just been run and thus that all |
1647 |
|
|
\family typewriter |
1648 |
|
|
.fixed |
1649 |
|
|
\family default |
1650 |
|
|
flags are set to false. |
1651 |
|
|
The following steps will aid you to write, almost automatically, a |
1652 |
|
|
\family typewriter |
1653 |
|
|
specify |
1654 |
|
|
\family default |
1655 |
|
|
method that fixes the correct number of |
1656 |
|
|
\family typewriter |
1657 |
|
|
.fixed |
1658 |
|
|
\family default |
1659 |
|
|
flags. |
1660 |
|
|
\end_layout |
1661 |
|
|
|
1662 |
|
|
\begin_layout Enumerate |
1663 |
|
|
Find all locally defined solver variables (of type |
1664 |
|
|
\family typewriter |
1665 |
|
|
solver_var |
1666 |
|
|
\family default |
1667 |
|
|
- e.g., |
1668 |
|
|
\family typewriter |
1669 |
|
|
y[components] |
1670 |
|
|
\family default |
1671 |
|
|
are of type |
1672 |
|
|
\family typewriter |
1673 |
|
|
fraction |
1674 |
|
|
\family default |
1675 |
|
|
which is of type |
1676 |
|
|
\family typewriter |
1677 |
|
|
solver_var |
1678 |
|
|
\family default |
1679 |
|
|
). |
1680 |
|
|
In mixture, the statement |
1681 |
|
|
\begin_inset Quotes eld |
1682 |
|
|
\end_inset |
1683 |
|
|
|
1684 |
|
|
|
1685 |
|
|
\family typewriter |
1686 |
|
|
y[components] IS_A fraction; |
1687 |
|
|
\family default |
1688 |
|
|
|
1689 |
|
|
\begin_inset Quotes erd |
1690 |
|
|
\end_inset |
1691 |
|
|
|
1692 |
|
|
introduces new |
1693 |
|
|
\family typewriter |
1694 |
|
|
solver_var |
1695 |
|
|
\family default |
1696 |
|
|
s, one for each element in the set |
1697 |
|
|
\family typewriter |
1698 |
|
|
components |
1699 |
|
|
\family default |
1700 |
|
|
. |
1701 |
|
|
Let us assume there are |
1702 |
|
|
\family typewriter |
1703 |
|
|
nc |
1704 |
|
|
\family default |
1705 |
|
|
such elements. |
1706 |
|
|
\end_layout |
1707 |
|
|
|
1708 |
|
|
\begin_layout Enumerate |
1709 |
|
|
Find locally introduced equations. |
1710 |
|
|
In |
1711 |
|
|
\family typewriter |
1712 |
|
|
mixture |
1713 |
|
|
\family default |
1714 |
|
|
, there is one such equation that says the variables |
1715 |
|
|
\family typewriter |
1716 |
|
|
y |
1717 |
|
|
\family default |
1718 |
|
|
add up to one. |
1719 |
|
|
\end_layout |
1720 |
|
|
|
1721 |
|
|
\begin_layout Enumerate |
1722 |
|
|
Find all new parts that are instances of previously defined types. |
1723 |
|
|
In |
1724 |
|
|
\family typewriter |
1725 |
|
|
mixture |
1726 |
|
|
\family default |
1727 |
|
|
, there are no new parts. |
1728 |
|
|
\end_layout |
1729 |
|
|
|
1730 |
|
|
\begin_layout Enumerate |
1731 |
|
|
You must set |
1732 |
|
|
\family typewriter |
1733 |
|
|
.fixed |
1734 |
|
|
\family default |
1735 |
|
|
flags locally equal in number to the number of new locally defined |
1736 |
|
|
\family typewriter |
1737 |
|
|
solver_var |
1738 |
|
|
\family default |
1739 |
|
|
s minus the number of new locally defined equations. |
1740 |
|
|
In |
1741 |
|
|
\family typewriter |
1742 |
|
|
mixture |
1743 |
|
|
\family default |
1744 |
|
|
you must write set one |
1745 |
|
|
\family typewriter |
1746 |
|
|
fixed |
1747 |
|
|
\family default |
1748 |
|
|
flag to true for all but one of the components as there are |
1749 |
|
|
\family typewriter |
1750 |
|
|
nc |
1751 |
|
|
\family default |
1752 |
|
|
new locally introduced variables and one new locally introduced equation. |
1753 |
|
|
The |
1754 |
|
|
\family typewriter |
1755 |
|
|
CHOICE |
1756 |
|
|
\family default |
1757 |
|
|
function arbitrarily selects one element of the set (in set theory, you |
1758 |
|
|
cannot identify a set element as being first, another as second, etc, so |
1759 |
|
|
for purity's sake, we only give you the option of letting ASCEND pick one |
1760 |
|
|
arbitrarily). |
1761 |
|
|
Thus we set all |
1762 |
|
|
\family typewriter |
1763 |
|
|
nc |
1764 |
|
|
\family default |
1765 |
|
|
flags and then clear one. |
1766 |
|
|
\end_layout |
1767 |
|
|
|
1768 |
|
|
\begin_layout Enumerate |
1769 |
|
|
You must run the |
1770 |
|
|
\family typewriter |
1771 |
|
|
specify |
1772 |
|
|
\family default |
1773 |
|
|
method for each new part. |
1774 |
|
|
Here there are none. |
1775 |
|
|
Running specify will guarantee each part is |
1776 |
|
|
\begin_inset Quotes eld |
1777 |
|
|
\end_inset |
1778 |
|
|
|
1779 |
|
|
square |
1780 |
|
|
\begin_inset Quotes erd |
1781 |
|
|
\end_inset |
1782 |
|
|
|
1783 |
|
|
- i.e., after being run, the part will not alter the number of degrees of |
1784 |
|
|
freedom for the current model definition. |
1785 |
|
|
However, the same |
1786 |
|
|
\family typewriter |
1787 |
|
|
solver_var |
1788 |
|
|
\family default |
1789 |
|
|
may get fixed in two or more different parts if those parts share that |
1790 |
|
|
|
1791 |
|
|
\family typewriter |
1792 |
|
|
solver_var |
1793 |
|
|
\family default |
1794 |
|
|
, and you will have to discover this sharing and add special statements |
1795 |
|
|
to correct this type of multiple setting of the same flag. |
1796 |
|
|
This discovery will best be done by compiling an instance of the type and |
1797 |
|
|
using the Find By Type tool in the Browser. |
1798 |
|
|
Its default setting is to find all |
1799 |
|
|
\family typewriter |
1800 |
|
|
solver_vars |
1801 |
|
|
\family default |
1802 |
|
|
with |
1803 |
|
|
\family typewriter |
1804 |
|
|
.fixed |
1805 |
|
|
\family default |
1806 |
|
|
equal to |
1807 |
|
|
\family typewriter |
1808 |
|
|
TRUE |
1809 |
|
|
\family default |
1810 |
|
|
, exactly what you need to aid you with this task. |
1811 |
|
|
You may also wish to change in minor ways the flag setting that the parts |
1812 |
|
|
do to suit the needs of the current type definition - you may wish to free |
1813 |
|
|
|
1814 |
|
|
\family typewriter |
1815 |
|
|
temperature |
1816 |
|
|
\family default |
1817 |
|
|
and fix |
1818 |
|
|
\family typewriter |
1819 |
|
|
pressure |
1820 |
|
|
\family default |
1821 |
|
|
for a stream, for example, when the stream is part of a higher level model. |
1822 |
|
|
\end_layout |
1823 |
|
|
|
1824 |
|
|
\begin_layout Standard |
1825 |
|
|
Look now at the |
1826 |
|
|
\family typewriter |
1827 |
|
|
molar_stream |
1828 |
|
|
\family default |
1829 |
|
|
model. |
1830 |
|
|
Running |
1831 |
|
|
\family typewriter |
1832 |
|
|
ClearAll |
1833 |
|
|
\family default |
1834 |
|
|
for an instance of |
1835 |
|
|
\family typewriter |
1836 |
|
|
molar_stream |
1837 |
|
|
\family default |
1838 |
|
|
will clear all the |
1839 |
|
|
\family typewriter |
1840 |
|
|
.fixed |
1841 |
|
|
\family default |
1842 |
|
|
flags for it and all its parts. |
1843 |
|
|
It introduces |
1844 |
|
|
\family typewriter |
1845 |
|
|
Ftot |
1846 |
|
|
\family default |
1847 |
|
|
and |
1848 |
|
|
\family typewriter |
1849 |
|
|
f[components] |
1850 |
|
|
\family default |
1851 |
|
|
as local new solver variables. |
1852 |
|
|
It also introduces one new equation for each component, one less than the |
1853 |
|
|
number of new variables. |
1854 |
|
|
Finally it introduces a new part called |
1855 |
|
|
\family typewriter |
1856 |
|
|
state |
1857 |
|
|
\family default |
1858 |
|
|
. |
1859 |
|
|
We have partitioned the |
1860 |
|
|
\family typewriter |
1861 |
|
|
specify |
1862 |
|
|
\family default |
1863 |
|
|
method into two methods here for |
1864 |
|
|
\begin_inset Quotes eld |
1865 |
|
|
\end_inset |
1866 |
|
|
|
1867 |
|
|
chemical engineering reasons, |
1868 |
|
|
\begin_inset Quotes erd |
1869 |
|
|
\end_inset |
1870 |
|
|
|
1871 |
|
|
one of which runs the other. |
1872 |
|
|
Think of what the two of them accomplish as the |
1873 |
|
|
\family typewriter |
1874 |
|
|
specify |
1875 |
|
|
\family default |
1876 |
|
|
method we wish to create. |
1877 |
|
|
First we run the |
1878 |
|
|
\family typewriter |
1879 |
|
|
specify |
1880 |
|
|
\family default |
1881 |
|
|
method for the new part: |
1882 |
|
|
\family typewriter |
1883 |
|
|
state |
1884 |
|
|
\family default |
1885 |
|
|
. |
1886 |
|
|
That will set the |
1887 |
|
|
\family typewriter |
1888 |
|
|
.fixed |
1889 |
|
|
\family default |
1890 |
|
|
flags for |
1891 |
|
|
\family typewriter |
1892 |
|
|
nc-1 |
1893 |
|
|
\family default |
1894 |
|
|
of the variables |
1895 |
|
|
\family typewriter |
1896 |
|
|
state.y[components] |
1897 |
|
|
\family default |
1898 |
|
|
. |
1899 |
|
|
Then, as there is one more variable than equation in this model, we must |
1900 |
|
|
set a net of one added |
1901 |
|
|
\family typewriter |
1902 |
|
|
.fixed |
1903 |
|
|
\family default |
1904 |
|
|
flag. |
1905 |
|
|
We accomplish this by first clearing all the flags for the variables |
1906 |
|
|
\family typewriter |
1907 |
|
|
state.y[components] |
1908 |
|
|
\family default |
1909 |
|
|
-- one of which was already clear -- and then fixing all the variables |
1910 |
|
|
|
1911 |
|
|
\family typewriter |
1912 |
|
|
f[components] |
1913 |
|
|
\family default |
1914 |
|
|
. |
1915 |
|
|
We cleared |
1916 |
|
|
\family typewriter |
1917 |
|
|
nc-1 |
1918 |
|
|
\family default |
1919 |
|
|
flags and set |
1920 |
|
|
\family typewriter |
1921 |
|
|
nc |
1922 |
|
|
\family default |
1923 |
|
|
for a net of one new flag being set. |
1924 |
|
|
For our |
1925 |
|
|
\family typewriter |
1926 |
|
|
molar_stream |
1927 |
|
|
\family default |
1928 |
|
|
model, we would prefer that the variables |
1929 |
|
|
\family typewriter |
1930 |
|
|
f[components] |
1931 |
|
|
\family default |
1932 |
|
|
are the ones we fix. |
1933 |
|
|
\end_layout |
1934 |
|
|
|
1935 |
|
|
\begin_layout Standard |
1936 |
|
|
Lastly, look at the |
1937 |
|
|
\family typewriter |
1938 |
|
|
reactor |
1939 |
|
|
\family default |
1940 |
|
|
model. |
1941 |
|
|
We introduce |
1942 |
|
|
\family typewriter |
1943 |
|
|
nc+1 |
1944 |
|
|
\family default |
1945 |
|
|
new variables: |
1946 |
|
|
\family typewriter |
1947 |
|
|
stoich_coef[feed.components] |
1948 |
|
|
\family default |
1949 |
|
|
and |
1950 |
|
|
\family typewriter |
1951 |
|
|
turnover |
1952 |
|
|
\family default |
1953 |
|
|
. |
1954 |
|
|
We also introduce |
1955 |
|
|
\family typewriter |
1956 |
|
|
nc |
1957 |
|
|
\family default |
1958 |
|
|
new equations. |
1959 |
|
|
Lastly we introduce two parts |
1960 |
|
|
\family typewriter |
1961 |
|
|
feed |
1962 |
|
|
\family default |
1963 |
|
|
and |
1964 |
|
|
\family typewriter |
1965 |
|
|
out |
1966 |
|
|
\family default |
1967 |
|
|
, which are |
1968 |
|
|
\family typewriter |
1969 |
|
|
molar_stream |
1970 |
|
|
\family default |
1971 |
|
|
s. |
1972 |
|
|
The |
1973 |
|
|
\family typewriter |
1974 |
|
|
specify |
1975 |
|
|
\family default |
1976 |
|
|
method, again a combination of |
1977 |
|
|
\family typewriter |
1978 |
|
|
specify |
1979 |
|
|
\family default |
1980 |
|
|
and |
1981 |
|
|
\family typewriter |
1982 |
|
|
seqmod |
1983 |
|
|
\family default |
1984 |
|
|
, must set a net of one new |
1985 |
|
|
\family typewriter |
1986 |
|
|
.fixed |
1987 |
|
|
\family default |
1988 |
|
|
flag. |
1989 |
|
|
The way it does it is |
1990 |
|
|
\begin_inset Quotes eld |
1991 |
|
|
\end_inset |
1992 |
|
|
|
1993 |
|
|
tricky |
1994 |
|
|
\begin_inset Quotes erd |
1995 |
|
|
\end_inset |
1996 |
|
|
|
1997 |
|
|
but not difficult to follow. |
1998 |
|
|
In |
1999 |
|
|
\family typewriter |
2000 |
|
|
seqmod |
2001 |
|
|
\family default |
2002 |
|
|
, we fix |
2003 |
|
|
\family typewriter |
2004 |
|
|
turnover |
2005 |
|
|
\family default |
2006 |
|
|
and all |
2007 |
|
|
\family typewriter |
2008 |
|
|
nc |
2009 |
|
|
\family default |
2010 |
|
|
of the variables |
2011 |
|
|
\family typewriter |
2012 |
|
|
stoich_coef |
2013 |
|
|
\family default |
2014 |
|
|
. |
2015 |
|
|
We seem to have fixed |
2016 |
|
|
\family typewriter |
2017 |
|
|
nc |
2018 |
|
|
\family default |
2019 |
|
|
too many. |
2020 |
|
|
In |
2021 |
|
|
\family typewriter |
2022 |
|
|
specify |
2023 |
|
|
\family default |
2024 |
|
|
, which first runs |
2025 |
|
|
\family typewriter |
2026 |
|
|
seqmod |
2027 |
|
|
\family default |
2028 |
|
|
, we only run the |
2029 |
|
|
\family typewriter |
2030 |
|
|
specify |
2031 |
|
|
\family default |
2032 |
|
|
method for |
2033 |
|
|
\family typewriter |
2034 |
|
|
feed |
2035 |
|
|
\family default |
2036 |
|
|
and |
2037 |
|
|
\series bold |
2038 |
|
|
not |
2039 |
|
|
\series default |
2040 |
|
|
the |
2041 |
|
|
\family typewriter |
2042 |
|
|
specify |
2043 |
|
|
\family default |
2044 |
|
|
method for |
2045 |
|
|
\family typewriter |
2046 |
|
|
out |
2047 |
|
|
\family default |
2048 |
|
|
. |
2049 |
|
|
We know that not running the |
2050 |
|
|
\family typewriter |
2051 |
|
|
specify |
2052 |
|
|
\family default |
2053 |
|
|
method for |
2054 |
|
|
\family typewriter |
2055 |
|
|
out |
2056 |
|
|
\family default |
2057 |
|
|
, a |
2058 |
|
|
\family typewriter |
2059 |
|
|
molar_stream |
2060 |
|
|
\family default |
2061 |
|
|
as we just discussed above, will leave us with |
2062 |
|
|
\family typewriter |
2063 |
|
|
nc |
2064 |
|
|
\family default |
2065 |
|
|
|
2066 |
|
|
\family typewriter |
2067 |
|
|
.fixed |
2068 |
|
|
\family default |
2069 |
|
|
flags not set. |
2070 |
|
|
So we deviously traded these flags for those belonging to |
2071 |
|
|
\family typewriter |
2072 |
|
|
stoich_coef |
2073 |
|
|
\family default |
2074 |
|
|
, giving us a net of fixing one flag. |
2075 |
|
|
If we had abided by all the steps above, we would have run the |
2076 |
|
|
\family typewriter |
2077 |
|
|
specify |
2078 |
|
|
\family default |
2079 |
|
|
method for |
2080 |
|
|
\family typewriter |
2081 |
|
|
out |
2082 |
|
|
\family default |
2083 |
|
|
, then gone in and cleared the flags for |
2084 |
|
|
\family typewriter |
2085 |
|
|
out.f[components] |
2086 |
|
|
\family default |
2087 |
|
|
while setting those for |
2088 |
|
|
\family typewriter |
2089 |
|
|
stoich_coef[components] |
2090 |
|
|
\family default |
2091 |
|
|
in trade to get the flags we want set for this model. |
2092 |
|
|
We did the equivalent with a shortcut. |
2093 |
|
|
\end_layout |
2094 |
|
|
|
2095 |
|
|
\begin_layout Standard |
2096 |
|
|
If a model is parametric, the models defined by |
2097 |
|
|
\family typewriter |
2098 |
|
|
WILL_BE |
2099 |
|
|
\family default |
2100 |
|
|
in the parameter list should be viewed as new variables defined in the |
2101 |
|
|
model. |
2102 |
|
|
Remember |
2103 |
|
|
\family typewriter |
2104 |
|
|
specify |
2105 |
|
|
\family default |
2106 |
|
|
must fix sufficient variables to make an instance of this model square. |
2107 |
|
|
\end_layout |
2108 |
|
|
|
2109 |
|
|
\begin_layout Standard |
2110 |
|
|
At each of the above steps, pay special attention to indexed variables used |
2111 |
|
|
in |
2112 |
|
|
\emph on |
2113 |
|
|
indexed |
2114 |
|
|
\emph default |
2115 |
|
|
equations |
2116 |
|
|
\begin_inset Note Note |
2117 |
|
|
status collapsed |
2118 |
|
|
|
2119 |
|
|
\begin_layout Standard |
2120 |
|
|
need a cross reference here to the appropriate part of the manual |
2121 |
|
|
\end_layout |
2122 |
|
|
|
2123 |
|
|
\end_inset |
2124 |
|
|
|
2125 |
|
|
. |
2126 |
|
|
Frequently you must fix or free |
2127 |
|
|
\family typewriter |
2128 |
|
|
n |
2129 |
|
|
\family default |
2130 |
|
|
or |
2131 |
|
|
\family typewriter |
2132 |
|
|
n-1 |
2133 |
|
|
\family default |
2134 |
|
|
variables indexed over a set of size |
2135 |
|
|
\family typewriter |
2136 |
|
|
n |
2137 |
|
|
\family default |
2138 |
|
|
, if there are |
2139 |
|
|
\family typewriter |
2140 |
|
|
n |
2141 |
|
|
\family default |
2142 |
|
|
matching equations. |
2143 |
|
|
In general, if you think you have |
2144 |
|
|
\family typewriter |
2145 |
|
|
specify |
2146 |
|
|
\family default |
2147 |
|
|
correctly written, change the sizes of all the sets in your MODEL by one |
2148 |
|
|
and then by two members. |
2149 |
|
|
If your |
2150 |
|
|
\family typewriter |
2151 |
|
|
specify |
2152 |
|
|
\family default |
2153 |
|
|
method still works, you are probably using sets correctly. |
2154 |
|
|
Pursuing 'symmetry', i.e. |
2155 |
|
|
the identical treatment of all variables defined in a single array, usually |
2156 |
|
|
helps you write |
2157 |
|
|
\family typewriter |
2158 |
|
|
specify |
2159 |
|
|
\family default |
2160 |
|
|
correctly. |
2161 |
|
|
\end_layout |
2162 |
|
|
|
2163 |
|
|
\begin_layout Standard |
2164 |
|
|
When writing models that combine parts which do not share very well, or |
2165 |
|
|
which both try to compute the same variable in different ways, it may even |
2166 |
|
|
be necessary to write a |
2167 |
|
|
\family typewriter |
2168 |
|
|
WHEN |
2169 |
|
|
\family default |
2170 |
|
|
statement to selectively 'turn off' the conflicting equations or model |
2171 |
|
|
fragments. |
2172 |
|
|
An object or equation |
2173 |
|
|
\family typewriter |
2174 |
|
|
USE |
2175 |
|
|
\family default |
2176 |
|
|
d in any |
2177 |
|
|
\family typewriter |
2178 |
|
|
WHEN |
2179 |
|
|
\family default |
2180 |
|
|
statement is turned off by default and becomes a part of the solved |
2181 |
|
|
\family typewriter |
2182 |
|
|
MODEL |
2183 |
|
|
\family default |
2184 |
|
|
only when the condition of some |
2185 |
|
|
\family typewriter |
2186 |
|
|
CASE |
2187 |
|
|
\family default |
2188 |
|
|
that |
2189 |
|
|
\family typewriter |
2190 |
|
|
USE |
2191 |
|
|
\family default |
2192 |
|
|
s that object is matched. |
2193 |
|
|
\end_layout |
2194 |
|
|
|
2195 |
|
|
\begin_layout Standard |
2196 |
|
|
The setting of boolean, integer, and symbol variables that are controlling |
2197 |
|
|
conditions of |
2198 |
|
|
\family typewriter |
2199 |
|
|
WHEN |
2200 |
|
|
\family default |
2201 |
|
|
and |
2202 |
|
|
\family typewriter |
2203 |
|
|
SWITCH |
2204 |
|
|
\family default |
2205 |
|
|
statements should be done in the |
2206 |
|
|
\family typewriter |
2207 |
|
|
specify |
2208 |
|
|
\family default |
2209 |
|
|
method. |
2210 |
|
|
\end_layout |
2211 |
|
|
|
2212 |
|
|
\begin_layout Standard |
2213 |
|
|
There is no 'one perfect' |
2214 |
|
|
\family typewriter |
2215 |
|
|
specify |
2216 |
|
|
\family default |
2217 |
|
|
method for all purposes. |
2218 |
|
|
This routine should merely define a reasonably useful base configuration |
2219 |
|
|
of the model. |
2220 |
|
|
Other |
2221 |
|
|
\family typewriter |
2222 |
|
|
specify_whatElseYouWant |
2223 |
|
|
\family default |
2224 |
|
|
methods can also be written. |
2225 |
|
|
\end_layout |
2226 |
|
|
|
2227 |
|
|
\begin_layout Section |
2228 |
|
|
|
2229 |
|
|
\family typewriter |
2230 |
|
|
METHOD values |
2231 |
|
|
\begin_inset LatexCommand \index{values} |
2232 |
|
|
|
2233 |
|
|
\end_inset |
2234 |
|
|
|
2235 |
|
|
|
2236 |
|
|
\end_layout |
2237 |
|
|
|
2238 |
|
|
\begin_layout Standard |
2239 |
|
|
In a final application |
2240 |
|
|
\family typewriter |
2241 |
|
|
MODEL |
2242 |
|
|
\family default |
2243 |
|
|
, you should record at least one set of input values (values of the fixed |
2244 |
|
|
variables and guesses of key solved-for variables) that leads to a good |
2245 |
|
|
solution. |
2246 |
|
|
This facilitates testing of the model, and helps the next person using |
2247 |
|
|
your model to be assured that it works as expected. |
2248 |
|
|
\end_layout |
2249 |
|
|
|
2250 |
|
|
\begin_layout Section |
2251 |
|
|
Summary |
2252 |
|
|
\end_layout |
2253 |
|
|
|
2254 |
|
|
\begin_layout Standard |
2255 |
|
|
\begin_inset Marginal |
2256 |
|
|
status collapsed |
2257 |
|
|
|
2258 |
|
|
\begin_layout Standard |
2259 |
|
|
adding our standard methods to a model definition |
2260 |
|
|
\end_layout |
2261 |
|
|
|
2262 |
|
|
\end_inset |
2263 |
|
|
|
2264 |
|
|
We have defined a set of standard methods for ASCEND models which we insist |
2265 |
|
|
a modeler provide before we will allow a model to be placed in any of our |
2266 |
|
|
model libraries. |
2267 |
|
|
These are listed in Table |
2268 |
|
|
\begin_inset LatexCommand \ref{tab:methods.stdMethodReqd} |
2269 |
|
|
|
2270 |
|
|
\end_inset |
2271 |
|
|
|
2272 |
|
|
|
2273 |
|
|
\noun off |
2274 |
|
|
. |
2275 |
|
|
As should be evident from above, not all models must have associated methods; |
2276 |
|
|
our first vessel model did not. |
2277 |
|
|
It is simply our policy that models in our libraries must have these methods |
2278 |
|
|
to promote model reuse and to serve as examples of best practices in mathematic |
2279 |
|
|
al modeling. |
2280 |
|
|
\end_layout |
2281 |
|
|
|
2282 |
|
|
\begin_layout Standard |
2283 |
|
|
\begin_inset Float table |
2284 |
|
|
wide false |
2285 |
|
|
sideways false |
2286 |
|
|
status open |
2287 |
|
|
|
2288 |
|
|
\begin_layout Caption |
2289 |
|
|
\begin_inset LatexCommand \label{tab:methods.stdMethodReqd} |
2290 |
|
|
|
2291 |
|
|
\end_inset |
2292 |
|
|
|
2293 |
|
|
Standard methods required for types in our ASCEND model library |
2294 |
|
|
\end_layout |
2295 |
|
|
|
2296 |
|
|
\begin_layout Standard |
2297 |
|
|
\begin_inset Tabular |
2298 |
|
|
<lyxtabular version="3" rows="8" columns="2"> |
2299 |
|
|
<features islongtable="true"> |
2300 |
|
|
<column alignment="center" valignment="top" leftline="true" width="0"> |
2301 |
|
|
<column alignment="center" valignment="top" leftline="true" rightline="true" width="4in"> |
2302 |
|
|
<row topline="true" bottomline="true"> |
2303 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2304 |
|
|
\begin_inset Text |
2305 |
|
|
|
2306 |
|
|
\begin_layout Standard |
2307 |
|
|
method |
2308 |
|
|
\end_layout |
2309 |
|
|
|
2310 |
|
|
\end_inset |
2311 |
|
|
</cell> |
2312 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2313 |
|
|
\begin_inset Text |
2314 |
|
|
|
2315 |
|
|
\begin_layout Standard |
2316 |
|
|
description |
2317 |
|
|
\end_layout |
2318 |
|
|
|
2319 |
|
|
\end_inset |
2320 |
|
|
</cell> |
2321 |
|
|
</row> |
2322 |
|
|
<row topline="true"> |
2323 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2324 |
|
|
\begin_inset Text |
2325 |
|
|
|
2326 |
|
|
\begin_layout Standard |
2327 |
|
|
|
2328 |
|
|
\family typewriter |
2329 |
|
|
default_self |
2330 |
|
|
\end_layout |
2331 |
|
|
|
2332 |
|
|
\end_inset |
2333 |
|
|
</cell> |
2334 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2335 |
|
|
\begin_inset Text |
2336 |
|
|
|
2337 |
|
|
\begin_layout Standard |
2338 |
|
|
a method called automatically when any simulation is compiled to provide |
2339 |
|
|
default values and adjust bounds for any locally created variables which |
2340 |
|
|
may have unsuitable defaultsin their ATOM definitions. |
2341 |
|
|
Usually the variables selected are those for which the model becomes ill-behave |
2342 |
|
|
d if given poor initial guesses or bounds (e.g., zero). |
2343 |
|
|
This method should include statements to run the default_self method for |
2344 |
|
|
each of its locally created (IS_A'd) parts. |
2345 |
|
|
This method should be written first. |
2346 |
|
|
\end_layout |
2347 |
|
|
|
2348 |
|
|
\end_inset |
2349 |
|
|
</cell> |
2350 |
|
|
</row> |
2351 |
|
|
<row topline="true"> |
2352 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2353 |
|
|
\begin_inset Text |
2354 |
|
|
|
2355 |
|
|
\begin_layout Standard |
2356 |
|
|
|
2357 |
|
|
\family typewriter |
2358 |
|
|
ClearAll |
2359 |
|
|
\end_layout |
2360 |
|
|
|
2361 |
|
|
\end_inset |
2362 |
|
|
</cell> |
2363 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2364 |
|
|
\begin_inset Text |
2365 |
|
|
|
2366 |
|
|
\begin_layout Standard |
2367 |
|
|
a method to set all the fixed flags for variables in the type to FALSE. |
2368 |
|
|
This puts these flags into a known standard state -- i.e., all are FALSE. |
2369 |
|
|
All models inherit this method from the base model and the need to rewrite |
2370 |
|
|
it is very, very rare. |
2371 |
|
|
|
2372 |
|
|
\end_layout |
2373 |
|
|
|
2374 |
|
|
\end_inset |
2375 |
|
|
</cell> |
2376 |
|
|
</row> |
2377 |
|
|
<row topline="true"> |
2378 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2379 |
|
|
\begin_inset Text |
2380 |
|
|
|
2381 |
|
|
\begin_layout Standard |
2382 |
|
|
|
2383 |
|
|
\family typewriter |
2384 |
|
|
specify |
2385 |
|
|
\end_layout |
2386 |
|
|
|
2387 |
|
|
\end_inset |
2388 |
|
|
</cell> |
2389 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2390 |
|
|
\begin_inset Text |
2391 |
|
|
|
2392 |
|
|
\begin_layout Standard |
2393 |
|
|
a method which assumes all the |
2394 |
|
|
\family typewriter |
2395 |
|
|
fixed |
2396 |
|
|
\family default |
2397 |
|
|
flags are currently |
2398 |
|
|
\family typewriter |
2399 |
|
|
FALSE |
2400 |
|
|
\family default |
2401 |
|
|
and which then sets a suitable set of fixed flags to |
2402 |
|
|
\family typewriter |
2403 |
|
|
TRUE |
2404 |
|
|
\family default |
2405 |
|
|
to make an instance of this type of model well-posed. |
2406 |
|
|
A well-posed model is one that is square ( |
2407 |
|
|
\begin_inset Formula $n$ |
2408 |
|
|
\end_inset |
2409 |
|
|
|
2410 |
|
|
equations in |
2411 |
|
|
\begin_inset Formula $n$ |
2412 |
|
|
\end_inset |
2413 |
|
|
|
2414 |
|
|
unknowns) and solvable. |
2415 |
|
|
|
2416 |
|
|
\end_layout |
2417 |
|
|
|
2418 |
|
|
\end_inset |
2419 |
|
|
</cell> |
2420 |
|
|
</row> |
2421 |
|
|
<row topline="true"> |
2422 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2423 |
|
|
\begin_inset Text |
2424 |
|
|
|
2425 |
|
|
\begin_layout Standard |
2426 |
|
|
|
2427 |
|
|
\family typewriter |
2428 |
|
|
reset |
2429 |
|
|
\end_layout |
2430 |
|
|
|
2431 |
|
|
\end_inset |
2432 |
|
|
</cell> |
2433 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2434 |
|
|
\begin_inset Text |
2435 |
|
|
|
2436 |
|
|
\begin_layout Standard |
2437 |
|
|
a method which first runs the |
2438 |
|
|
\family typewriter |
2439 |
|
|
ClearAll |
2440 |
|
|
\family default |
2441 |
|
|
method and then the |
2442 |
|
|
\family typewriter |
2443 |
|
|
specify |
2444 |
|
|
\family default |
2445 |
|
|
method. |
2446 |
|
|
We include this method because it is very convenient. |
2447 |
|
|
We only have to run one method to make any simulation well-posed, no matter |
2448 |
|
|
how its fixed flags are currently set. |
2449 |
|
|
All models inherit this method from the base model, as with |
2450 |
|
|
\family typewriter |
2451 |
|
|
ClearAll |
2452 |
|
|
\family default |
2453 |
|
|
. |
2454 |
|
|
|
2455 |
|
|
\end_layout |
2456 |
|
|
|
2457 |
|
|
\end_inset |
2458 |
|
|
</cell> |
2459 |
|
|
</row> |
2460 |
|
|
<row topline="true"> |
2461 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2462 |
|
|
\begin_inset Text |
2463 |
|
|
|
2464 |
|
|
\begin_layout Standard |
2465 |
|
|
|
2466 |
|
|
\family typewriter |
2467 |
|
|
values |
2468 |
|
|
\end_layout |
2469 |
|
|
|
2470 |
|
|
\end_inset |
2471 |
|
|
</cell> |
2472 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2473 |
|
|
\begin_inset Text |
2474 |
|
|
|
2475 |
|
|
\begin_layout Standard |
2476 |
|
|
a method to establish typical values for the variables we have fixed in |
2477 |
|
|
an application or test model. |
2478 |
|
|
We may also supply values for some of the variables we will be computing |
2479 |
|
|
to aid in solving a model instance of this type. |
2480 |
|
|
These values are ones that we have tested for simulation of this type and |
2481 |
|
|
found good. |
2482 |
|
|
|
2483 |
|
|
\end_layout |
2484 |
|
|
|
2485 |
|
|
\end_inset |
2486 |
|
|
</cell> |
2487 |
|
|
</row> |
2488 |
|
|
<row topline="true"> |
2489 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2490 |
|
|
\begin_inset Text |
2491 |
|
|
|
2492 |
|
|
\begin_layout Standard |
2493 |
|
|
|
2494 |
|
|
\family typewriter |
2495 |
|
|
bound_self |
2496 |
|
|
\end_layout |
2497 |
|
|
|
2498 |
|
|
\end_inset |
2499 |
|
|
</cell> |
2500 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2501 |
|
|
\begin_inset Text |
2502 |
|
|
|
2503 |
|
|
\begin_layout Standard |
2504 |
|
|
a method to update the |
2505 |
|
|
\family typewriter |
2506 |
|
|
.upper_bound |
2507 |
|
|
\family default |
2508 |
|
|
and |
2509 |
|
|
\family typewriter |
2510 |
|
|
.lower_bound |
2511 |
|
|
\family default |
2512 |
|
|
value for each of the variables. |
2513 |
|
|
ASCEND solvers use these bound values to help solve the model equations. |
2514 |
|
|
This method should bound locally created variables and then call |
2515 |
|
|
\family typewriter |
2516 |
|
|
bound_self |
2517 |
|
|
\family default |
2518 |
|
|
for every locally created ( |
2519 |
|
|
\family typewriter |
2520 |
|
|
IS_A |
2521 |
|
|
\family default |
2522 |
|
|
'd) part. |
2523 |
|
|
|
2524 |
|
|
\end_layout |
2525 |
|
|
|
2526 |
|
|
\end_inset |
2527 |
|
|
</cell> |
2528 |
|
|
</row> |
2529 |
|
|
<row topline="true" bottomline="true"> |
2530 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" usebox="none"> |
2531 |
|
|
\begin_inset Text |
2532 |
|
|
|
2533 |
|
|
\begin_layout Standard |
2534 |
|
|
|
2535 |
|
|
\family typewriter |
2536 |
|
|
scale_self |
2537 |
|
|
\end_layout |
2538 |
|
|
|
2539 |
|
|
\end_inset |
2540 |
|
|
</cell> |
2541 |
|
|
<cell alignment="center" valignment="top" topline="true" leftline="true" rightline="true" usebox="none"> |
2542 |
|
|
\begin_inset Text |
2543 |
|
|
|
2544 |
|
|
\begin_layout Standard |
2545 |
|
|
a method to update the |
2546 |
|
|
\family typewriter |
2547 |
|
|
.nominal |
2548 |
|
|
\family default |
2549 |
|
|
value for each of the variables. |
2550 |
|
|
ASCEND solvers will use these nominal values to rescale the variable to |
2551 |
|
|
have a value of about one in magnitude to help solve the model equations. |
2552 |
|
|
This method should re-scale locally created variables and then call |
2553 |
|
|
\family typewriter |
2554 |
|
|
scale_self |
2555 |
|
|
\family default |
2556 |
|
|
for every locally created ( |
2557 |
|
|
\family typewriter |
2558 |
|
|
IS_A |
2559 |
|
|
\family default |
2560 |
|
|
'd) part. |
2561 |
|
|
|
2562 |
|
|
\end_layout |
2563 |
|
|
|
2564 |
|
|
\end_inset |
2565 |
|
|
</cell> |
2566 |
|
|
</row> |
2567 |
|
|
</lyxtabular> |
2568 |
|
|
|
2569 |
|
|
\end_inset |
2570 |
|
|
|
2571 |
|
|
|
2572 |
|
|
\end_layout |
2573 |
|
|
|
2574 |
|
|
\end_inset |
2575 |
|
|
|
2576 |
|
|
|
2577 |
|
|
\end_layout |
2578 |
|
|
|
2579 |
|
|
\begin_layout Section |
2580 |
|
|
Method writing automation |
2581 |
|
|
\begin_inset LatexCommand \label{sec:methods.automation} |
2582 |
|
|
|
2583 |
|
|
\end_inset |
2584 |
|
|
|
2585 |
|
|
|
2586 |
|
|
\end_layout |
2587 |
|
|
|
2588 |
|
|
\begin_layout Standard |
2589 |
|
|
\begin_inset Marginal |
2590 |
|
|
status collapsed |
2591 |
|
|
|
2592 |
|
|
\begin_layout Standard |
2593 |
|
|
Hit the button Library/Edit/Suggest methods and tweak the results |
2594 |
|
|
\end_layout |
2595 |
|
|
|
2596 |
|
|
\end_inset |
2597 |
|
|
|
2598 |
|
|
ASCEND will help you write the standard methods. |
2599 |
|
|
Writing most of the standard methods can be nearly automated once the declarati |
2600 |
|
|
ve portion of the model definition is written. |
2601 |
|
|
Usually, however, some minor tweaking of the automatically generated code |
2602 |
|
|
is needed. |
2603 |
|
|
In the Library window, the Edit menu has a "Suggest methods" button. |
2604 |
|
|
Select a model you have written and read into the library, then hit this |
2605 |
|
|
button. |
2606 |
|
|
|
2607 |
|
|
\end_layout |
2608 |
|
|
|
2609 |
|
|
\begin_layout Standard |
2610 |
|
|
In the Display window will appear a good starting point for the standard |
2611 |
|
|
methods that you have not yet defined. |
2612 |
|
|
This starting point follows the guidelines in this chapter. |
2613 |
|
|
It saves you a lot of typing but it is a starting point only. |
2614 |
|
|
Select and copy the text into the model you are editing, then tailor it |
2615 |
|
|
to your needs and finish the missing bits. |
2616 |
|
|
The comments in the generated code can be deleted before or after you copy |
2617 |
|
|
the text to your model file. |
2618 |
|
|
\end_layout |
2619 |
|
|
|
2620 |
|
|
\begin_layout Standard |
2621 |
|
|
If you have suggestions for general improvements to the generated method |
2622 |
|
|
code, please mail them to us and include a sample of what the generated |
2623 |
|
|
code ought to look like before the user performs any hand-editing. |
2624 |
|
|
We aim to create easily understood and easily fixed method suggestions, |
2625 |
|
|
not perfect suggestions, because procedural code style tastes vary so widely. |
2626 |
|
|
\end_layout |
2627 |
|
|
|
2628 |
|
|
\begin_layout Standard |
2629 |
|
|
\begin_inset Note Note |
2630 |
|
|
status open |
2631 |
|
|
|
2632 |
|
|
\begin_layout Standard |
2633 |
|
|
Closing the chapter you find below the suggested methods ASCEND generates |
2634 |
|
|
for the ***vessel*** model. |
2635 |
|
|
\end_layout |
2636 |
|
|
|
2637 |
|
|
\end_inset |
2638 |
|
|
|
2639 |
|
|
|
2640 |
|
|
\end_layout |
2641 |
|
|
|
2642 |
|
|
\end_body |
2643 |
|
|
\end_document |