1 |
#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 |