Parent Directory | Revision Log
Some work on the formatting. Some editing out of old comments about 'new ascend 4'
1 | jpye | 1384 | #LyX 1.4.3 created this file. For more info see http://www.lyx.org/ |
2 | johnpye | 828 | \lyxformat 245 |
3 | \begin_document | ||
4 | \begin_header | ||
5 | \textclass book | ||
6 | \begin_preamble | ||
7 | \usepackage[bookmarks]{hyperref} | ||
8 | \usepackage{lmodern} | ||
9 | \end_preamble | ||
10 | \language english | ||
11 | \inputencoding auto | ||
12 | \fontscheme default | ||
13 | \graphics default | ||
14 | \paperfontsize default | ||
15 | \spacing single | ||
16 | \papersize default | ||
17 | \use_geometry false | ||
18 | \use_amsmath 1 | ||
19 | \cite_engine basic | ||
20 | \use_bibtopic false | ||
21 | \paperorientation portrait | ||
22 | \secnumdepth 3 | ||
23 | \tocdepth 3 | ||
24 | \paragraph_separation indent | ||
25 | \defskip medskip | ||
26 | \quotes_language english | ||
27 | \papercolumns 1 | ||
28 | \papersides 1 | ||
29 | \paperpagestyle default | ||
30 | \tracking_changes false | ||
31 | \output_changes false | ||
32 | \end_header | ||
33 | |||
34 | \begin_body | ||
35 | |||
36 | \begin_layout Chapter | ||
37 | jpye | 1384 | Syntax reference |
38 | johnpye | 828 | \begin_inset LatexCommand \label{cha:ASCENDSyntax} |
39 | |||
40 | \end_inset | ||
41 | |||
42 | |||
43 | \end_layout | ||
44 | |||
45 | \begin_layout Standard | ||
46 | We shall present an informal description of the ASCEND IV language. | ||
47 | Being informal, we shall usually include examples and descriptions of the | ||
48 | intended semantics along with the syntax of the items. | ||
49 | At times the inclusion of semantics will seem to anticipate later definitions. | ||
50 | We do this because we would also like this chapter to be used as a reference | ||
51 | for the ASCEND language even after one generally understands it. | ||
52 | Often one will need to clarify a point about a particular item and will | ||
53 | not wish to have to search in several places to do so. | ||
54 | \end_layout | ||
55 | |||
56 | \begin_layout Standard | ||
57 | Syntax | ||
58 | \begin_inset LatexCommand \index{syntax} | ||
59 | |||
60 | \end_inset | ||
61 | |||
62 | is the form or structure for the statements in ASCEND, where one worries | ||
63 | about the exact words one uses, their ordering, the punctuation, etc. | ||
64 | Semantics | ||
65 | \begin_inset LatexCommand \index{semantics} | ||
66 | |||
67 | \end_inset | ||
68 | |||
69 | describe the meaning of a statement. | ||
70 | \end_layout | ||
71 | |||
72 | \begin_layout Standard | ||
73 | To distinguish between syntax and semantics, consider the statement | ||
74 | \end_layout | ||
75 | |||
76 | \begin_layout LyX-Code | ||
77 | y IS_A fraction; | ||
78 | \end_layout | ||
79 | |||
80 | \begin_layout Standard | ||
81 | Rules on the syntax for this statement tell us we need a user supplied instance | ||
82 | name, y, followed by the ASCEND operator IS_A, followed by a type name | ||
83 | (fraction). | ||
84 | The statement terminates with a semicolon. | ||
85 | The statement semantics says we are declaring the existence of an instance, | ||
86 | locally named y, of the type fraction as a part within the current model | ||
87 | definition and it is to be constructed when an instance of the current | ||
88 | model definition is constructed. | ||
89 | \end_layout | ||
90 | |||
91 | \begin_layout Standard | ||
92 | The syntax for a computer language is often defined by using a Bachus-Naur | ||
93 | \begin_inset LatexCommand \index{Bachus-Naur} | ||
94 | |||
95 | \end_inset | ||
96 | |||
97 | formal (BNF | ||
98 | \begin_inset LatexCommand \index{BNF} | ||
99 | |||
100 | \end_inset | ||
101 | |||
102 | ) description. | ||
103 | The complete YACC | ||
104 | \begin_inset LatexCommand \index{YACC} | ||
105 | |||
106 | \end_inset | ||
107 | |||
108 | and FLEX | ||
109 | \begin_inset LatexCommand \index{FLEX} | ||
110 | |||
111 | \end_inset | ||
112 | |||
113 | description of the language described (as presently implemented) is available | ||
114 | by FTP and via the World Wide Web. | ||
115 | The semantics of a very high level modeling language such as ASCEND IV | ||
116 | are generally much more restrictive than the syntax. | ||
117 | For this reason we do not include a BNF description in this paper. | ||
118 | ASCEND IV is an experiment. | ||
119 | The language is under constant scrutiny and improvement, so this document | ||
120 | is under constant revision. | ||
121 | |||
122 | \end_layout | ||
123 | |||
124 | \begin_layout List | ||
125 | \labelwidthstring 00000.00000.00000.000 | ||
126 | \InsetSpace ~ | ||
127 | |||
128 | \end_layout | ||
129 | |||
130 | \begin_deeper | ||
131 | jpye | 1384 | \begin_layout Chapter |
132 | johnpye | 828 | Preliminaries |
133 | \end_layout | ||
134 | |||
135 | \begin_layout Standard | ||
136 | We will start off with some background information and some tips that make | ||
137 | the rest of the chapter easier to read. | ||
138 | ASCEND is an object-oriented (OO) language for hierarchical modeling that | ||
139 | has been somewhat specialized for mathematical models. | ||
140 | Most of the specialization is in the implementation and the user interface | ||
141 | rather than the language definition. | ||
142 | |||
143 | \end_layout | ||
144 | |||
145 | \begin_layout Standard | ||
146 | We feel the single most distinguishing feature of mathematical models is | ||
147 | that solving them efficiently requires that the solving algorithms be able | ||
148 | to address the entire problem either simultaneously or in a decomposition | ||
149 | of the natural problem structure that the algorithm determines is best | ||
150 | for the machine(s) in use. | ||
151 | In the ASCEND language object-orientation is used to organize natural structure | ||
152 | s and make them easier to understand. | ||
153 | It is not used to hide the details of the objects. | ||
154 | The user (or machine) is free to ignore uninteresting details, and the | ||
155 | ASCEND environment provides tools for the runtime suppression of these. | ||
156 | \end_layout | ||
157 | |||
158 | \begin_layout Standard | ||
159 | ASCEND is well into its 4th generation. | ||
160 | Some features we will describe are not yet implemented (some merely speculative | ||
161 | ) and these are clearly marked (* 4+ *). | ||
162 | Any feature not marked (* 4+ *)has been completely implemented, and thus | ||
163 | any mismatch between the description given here and the software we distribute | ||
164 | is a bug we want you to tell us about. | ||
165 | |||
166 | \end_layout | ||
167 | |||
168 | \begin_layout Standard | ||
169 | The syntax and semantics of ASCEND may seem at first a bit unusual. | ||
170 | However, do not be afraid to just try what comes naturally if what we write | ||
171 | here is unclear. | ||
172 | The parser and compiler of ASCEND IV really will help you get things right. | ||
173 | Of course if what we write here is unclear, please ask us about it because | ||
174 | we aim to continuously improve both this document and the language system | ||
175 | it describes. | ||
176 | \end_layout | ||
177 | |||
178 | \begin_layout Standard | ||
179 | We will describe, starting in Section | ||
180 | \begin_inset LatexCommand \vref{sub:x.1.2Basic-Elements} | ||
181 | |||
182 | \end_inset | ||
183 | |||
184 | , the higher level concepts of ASCEND, but first some important punctuation | ||
185 | rules. | ||
186 | \end_layout | ||
187 | |||
188 | \end_deeper | ||
189 | \begin_layout List | ||
190 | \labelwidthstring 00000.00000.00000.000 | ||
191 | ASCEND\InsetSpace ~ | ||
192 | is\InsetSpace ~ | ||
193 | cAsE\InsetSpace ~ | ||
194 | sensitive | ||
195 | \begin_inset LatexCommand \index{case sensitive} | ||
196 | |||
197 | \end_inset | ||
198 | |||
199 | ! | ||
200 | \end_layout | ||
201 | |||
202 | \begin_deeper | ||
203 | \begin_layout Standard | ||
204 | The keywords that are shown capitalized (or in lower case) in this chapter | ||
205 | are that way because ASCEND is case sensitive. | ||
206 | IS_A is an ASCEND keyword; isa, Is_a, and all the other permutations you | ||
207 | can think of are NOT equivalent to IS_A. | ||
208 | In declaring new types of models and variables the user is free to use | ||
209 | any style of capitalization he or she may prefer; however, they must remain | ||
210 | consistent or undefined types and instances will result. | ||
211 | \end_layout | ||
212 | |||
213 | \begin_layout Standard | ||
214 | This case restriction makes our code very readable, but hard to type without | ||
215 | a smart editor. | ||
216 | We have kept the case-sensitivity because, like all mathematicians, we | ||
217 | find ourselves running out of good variable names if we are restricted | ||
218 | to a 26 letter alphabet. | ||
219 | We have developed smart add-ins for two UNIX editors, EMACS | ||
220 | \begin_inset LatexCommand \index{EMACS} | ||
221 | |||
222 | \end_inset | ||
223 | |||
224 | and vi | ||
225 | \begin_inset LatexCommand \index{vi} | ||
226 | |||
227 | \end_inset | ||
228 | |||
229 | , for handling the upper case keywords and some other syntax elements. | ||
230 | The use of these editors is described in another chapter. | ||
231 | |||
232 | \end_layout | ||
233 | |||
234 | \begin_layout Standard | ||
235 | The ASCEND IV parser is very picky and pedantic. | ||
236 | It also tries to give helpful messages and occasionally even suggestions. | ||
237 | New users should just dive in and make errors, letting the system help | ||
238 | them learn how to avoid errors. | ||
239 | \end_layout | ||
240 | |||
241 | jpye | 1384 | \begin_layout Section |
242 | johnpye | 828 | Punctuation |
243 | \begin_inset LatexCommand \index{punctuation} | ||
244 | |||
245 | \end_inset | ||
246 | |||
247 | |||
248 | \end_layout | ||
249 | |||
250 | jpye | 1384 | \end_deeper |
251 | johnpye | 828 | \begin_layout Standard |
252 | This section covers both the punctuation that must be understood to read | ||
253 | this document and the punctuation of ASCEND code. | ||
254 | \end_layout | ||
255 | |||
256 | \begin_layout List | ||
257 | \labelwidthstring 00000.00000.00000.000 | ||
258 | keywords | ||
259 | \begin_inset LatexCommand \index{keywords} | ||
260 | |||
261 | \end_inset | ||
262 | |||
263 | : ASCEND keywords and type names are given in the left column in bold format. | ||
264 | It is generally clear from the main text which are keywords and which are | ||
265 | type names. | ||
266 | \end_layout | ||
267 | |||
268 | \begin_layout List | ||
269 | \labelwidthstring 00000.00000.00000.000 | ||
270 | |||
271 | \bar under | ||
272 | Minor\InsetSpace ~ | ||
273 | items: | ||
274 | \bar default | ||
275 | Minor headings that are helpful in finding details are given in the left | ||
276 | column in underline format. | ||
277 | \end_layout | ||
278 | |||
279 | \begin_layout List | ||
280 | \labelwidthstring 00000.00000.00000.000 | ||
281 | Tips: Special notes and hints are sometimes placed on the left. | ||
282 | \end_layout | ||
283 | |||
284 | \begin_layout List | ||
285 | \labelwidthstring 00000.00000.00000.000 | ||
286 | |||
287 | \bar under | ||
288 | LHS | ||
289 | \begin_inset LatexCommand \index{LHS} | ||
290 | |||
291 | \end_inset | ||
292 | |||
293 | : | ||
294 | \bar default | ||
295 | Left Hand Side. | ||
296 | Abbreviation used frequently. | ||
297 | \end_layout | ||
298 | |||
299 | \begin_layout List | ||
300 | \labelwidthstring 00000.00000.00000.000 | ||
301 | |||
302 | \bar under | ||
303 | RHS | ||
304 | \begin_inset LatexCommand \index{RHS} | ||
305 | |||
306 | \end_inset | ||
307 | |||
308 | : | ||
309 | \bar default | ||
310 | Right Hand Side. | ||
311 | Abbreviation used frequently. | ||
312 | \end_layout | ||
313 | |||
314 | \begin_layout List | ||
315 | \labelwidthstring 00000.00000.00000.000 | ||
316 | |||
317 | \bar under | ||
318 | Simple\InsetSpace ~ | ||
319 | names | ||
320 | \begin_inset LatexCommand \index{simple names} | ||
321 | |||
322 | \end_inset | ||
323 | |||
324 | : | ||
325 | \bar default | ||
326 | In ASCEND simple names are made of the characters a through z, A through | ||
327 | Z, _, (*4+*: $). | ||
328 | The underscore is used as a letter, but it cannot be the first letter in | ||
329 | a name. | ||
330 | The $ | ||
331 | \begin_inset LatexCommand \index{\$} | ||
332 | |||
333 | \end_inset | ||
334 | |||
335 | character is used exclusively as the first character in the name of system | ||
336 | defined built-in parts. | ||
337 | "$" is explained in more detail in Section | ||
338 | \begin_inset LatexCommand \vref{sub:x.6.2Supported-attributes} | ||
339 | |||
340 | \end_inset | ||
341 | |||
342 | . | ||
343 | Simple names should be no more than 80 characters long. | ||
344 | |||
345 | \end_layout | ||
346 | |||
347 | \begin_layout List | ||
348 | \labelwidthstring 00000.00000.00000.000 | ||
349 | |||
350 | \bar under | ||
351 | Compound\InsetSpace ~ | ||
352 | names | ||
353 | \begin_inset LatexCommand \index{compound names} | ||
354 | |||
355 | \end_inset | ||
356 | |||
357 | : | ||
358 | \bar default | ||
359 | Compound names are simple names strung together with dots (.). | ||
360 | See the description of "." below. | ||
361 | \end_layout | ||
362 | |||
363 | \begin_layout List | ||
364 | \labelwidthstring 00000.00000.00000.000 | ||
365 | |||
366 | \bar under | ||
367 | Groupings: | ||
368 | \end_layout | ||
369 | |||
370 | \begin_layout List | ||
371 | \labelwidthstring 00000.00000.00000.000 | ||
372 | |||
373 | \bar under | ||
374 | «\InsetSpace ~ | ||
375 | » | ||
376 | \bar default | ||
377 | jpye | 1384 | In documentation |
378 | \series bold | ||
379 | optional fields | ||
380 | \series default | ||
381 | |||
382 | johnpye | 828 | \begin_inset LatexCommand \index{optional fields} |
383 | |||
384 | \end_inset | ||
385 | |||
386 | are surrounded by these markers. | ||
387 | \end_layout | ||
388 | |||
389 | \begin_layout List | ||
390 | \labelwidthstring 00000.00000.00000.000 | ||
391 | jpye | 1384 | |
392 | \family typewriter | ||
393 | johnpye | 828 | (*\InsetSpace ~ |
394 | *) | ||
395 | jpye | 1384 | \family default |
396 | |||
397 | johnpye | 828 | \begin_inset LatexCommand \index{(* *)} |
398 | |||
399 | \end_inset | ||
400 | |||
401 | Comment. | ||
402 | jpye | 1384 | Anything inside these is a comment. |
403 | Comments can nest | ||
404 | johnpye | 828 | \begin_inset LatexCommand \index{nest} |
405 | |||
406 | \end_inset | ||
407 | |||
408 | jpye | 1384 | in ASCEND and span several lines. |
409 | johnpye | 828 | \end_layout |
410 | |||
411 | \begin_layout List | ||
412 | \labelwidthstring 00000.00000.00000.000 | ||
413 | jpye | 1384 | |
414 | \family typewriter | ||
415 | johnpye | 828 | (\InsetSpace ~ |
416 | ) | ||
417 | jpye | 1384 | \family default |
418 | |||
419 | johnpye | 828 | \begin_inset LatexCommand \index{( )} |
420 | |||
421 | \end_inset | ||
422 | |||
423 | Rounded parentheses | ||
424 | \begin_inset LatexCommand \index{parentheses} | ||
425 | |||
426 | \end_inset | ||
427 | |||
428 | |||
429 | \begin_inset LatexCommand \index{rounded parentheses} | ||
430 | |||
431 | \end_inset | ||
432 | |||
433 | . | ||
434 | Used to enclose arguments for functions or models where the order of the | ||
435 | arguments matters. | ||
436 | Also used to group terms in complex arithmetic, logical, or set expressions | ||
437 | where the order of operations needs to be specified. | ||
438 | |||
439 | \end_layout | ||
440 | |||
441 | \begin_layout List | ||
442 | \labelwidthstring 00000.00000.00000.000 | ||
443 | Efficiency\InsetSpace ~ | ||
444 | tip: The compiler can simplify relation definitions in a particularly | ||
445 | efficient manner if constants are grouped together. | ||
446 | \end_layout | ||
447 | |||
448 | \begin_layout List | ||
449 | \labelwidthstring 00000.00000.00000.000 | ||
450 | jpye | 1384 | |
451 | \family typewriter | ||
452 | johnpye | 828 | {\InsetSpace ~ |
453 | } | ||
454 | jpye | 1384 | \family default |
455 | |||
456 | johnpye | 828 | \begin_inset LatexCommand \index{{ }} |
457 | |||
458 | \end_inset | ||
459 | |||
460 | Curly braces | ||
461 | \begin_inset LatexCommand \index{Curly braces} | ||
462 | |||
463 | \end_inset | ||
464 | |||
465 | . | ||
466 | Used to enclose units. | ||
467 | For example, 1 {kg_mole/s}. | ||
468 | Also used to enclose the body of annotations. | ||
469 | Note: Curly braces are also used in TCL, the language of the ASCEND user | ||
470 | interface, about which we will say more in another chapter. | ||
471 | \end_layout | ||
472 | |||
473 | \begin_layout List | ||
474 | \labelwidthstring 00000.00000.00000.000 | ||
475 | jpye | 1384 | |
476 | \family typewriter | ||
477 | johnpye | 828 | [\InsetSpace ~ |
478 | ] | ||
479 | jpye | 1384 | \family default |
480 | |||
481 | johnpye | 828 | \begin_inset LatexCommand \index{[ ]} |
482 | |||
483 | \end_inset | ||
484 | |||
485 | Square brackets | ||
486 | \begin_inset LatexCommand \index{square brackets} | ||
487 | |||
488 | \end_inset | ||
489 | |||
490 | . | ||
491 | Used to enclose sets or elements of sets. | ||
492 | Examples: my_integer_set :== [1,2,3], demonstrates the use of square brackets | ||
493 | in the assignment of a set. | ||
494 | My_array[1] demonstrates the use of square brackets in naming an array | ||
495 | object indexed over an integer set which includes the element 1. | ||
496 | \end_layout | ||
497 | |||
498 | \begin_layout List | ||
499 | \labelwidthstring 00000.00000.00000.000 | ||
500 | jpye | 1384 | |
501 | \family typewriter | ||
502 | johnpye | 828 | . |
503 | jpye | 1384 | \family default |
504 | |||
505 | johnpye | 828 | \begin_inset LatexCommand \index{.} |
506 | |||
507 | \end_inset | ||
508 | |||
509 | Dot | ||
510 | \begin_inset LatexCommand \index{dot} | ||
511 | |||
512 | \end_inset | ||
513 | |||
514 | . | ||
515 | The dot is used, as in PASCAL and C, to construct the names of nested objects. | ||
516 | Examples: if object a has a part b, then the way to refer to b is as a.b. | ||
517 | Tray[1].vle shows a dot following a square bracket; here Tray[1] has a part | ||
518 | named vle. | ||
519 | \end_layout | ||
520 | |||
521 | \begin_layout List | ||
522 | \labelwidthstring 00000.00000.00000.000 | ||
523 | jpye | 1384 | |
524 | \family typewriter | ||
525 | johnpye | 828 | .. |
526 | jpye | 1384 | \family default |
527 | |||
528 | johnpye | 828 | \begin_inset LatexCommand \index{..} |
529 | |||
530 | \end_inset | ||
531 | |||
532 | Dot-dot or double dot | ||
533 | \begin_inset LatexCommand \index{double dot} | ||
534 | |||
535 | \end_inset | ||
536 | |||
537 | . | ||
538 | Integer range shorthand. | ||
539 | For example, my_integer_set :== [1,2,3] and my_integer_set :== [1..3] are | ||
540 | equivalent. | ||
541 | If .. | ||
542 | appears in a context requiring (), such as the ALIASES/IS_A statement, | ||
543 | then the range is expanded and ordered as we would naturally expect. | ||
544 | \end_layout | ||
545 | |||
546 | \begin_layout List | ||
547 | \labelwidthstring 00000.00000.00000.000 | ||
548 | jpye | 1384 | |
549 | \family typewriter | ||
550 | johnpye | 828 | : |
551 | jpye | 1384 | \family default |
552 | |||
553 | johnpye | 828 | \begin_inset LatexCommand \index{:} |
554 | |||
555 | \end_inset | ||
556 | |||
557 | Colon | ||
558 | \begin_inset LatexCommand \index{colon} | ||
559 | |||
560 | \end_inset | ||
561 | |||
562 | . | ||
563 | A separator used in various ways, principally to set the name of an arithmetic | ||
564 | relation apart from the definition. | ||
565 | \end_layout | ||
566 | |||
567 | \begin_layout List | ||
568 | \labelwidthstring 00000.00000.00000.000 | ||
569 | jpye | 1384 | |
570 | \family typewriter | ||
571 | johnpye | 828 | :: |
572 | jpye | 1384 | \family default |
573 | |||
574 | johnpye | 828 | \begin_inset LatexCommand \index{::} |
575 | |||
576 | \end_inset | ||
577 | |||
578 | Double colon | ||
579 | \begin_inset LatexCommand \index{double colon} | ||
580 | |||
581 | \end_inset | ||
582 | |||
583 | . | ||
584 | A separator used in the methods section for accessing methods defined on | ||
585 | types other than the type the method is part of. | ||
586 | Explained in Section | ||
587 | \begin_inset LatexCommand \vref{sec:x.4Procedural-statements} | ||
588 | |||
589 | \end_inset | ||
590 | |||
591 | .[ | ||
592 | \end_layout | ||
593 | |||
594 | \begin_layout List | ||
595 | \labelwidthstring 00000.00000.00000.000 | ||
596 | jpye | 1384 | |
597 | \family typewriter | ||
598 | johnpye | 828 | ; |
599 | jpye | 1384 | \family default |
600 | |||
601 | johnpye | 828 | \begin_inset LatexCommand \index{;} |
602 | |||
603 | \end_inset | ||
604 | |||
605 | Semicolon | ||
606 | \begin_inset LatexCommand \index{semicolon} | ||
607 | |||
608 | \end_inset | ||
609 | |||
610 | . | ||
611 | The separator of statements. | ||
612 | \end_layout | ||
613 | |||
614 | \begin_deeper | ||
615 | jpye | 1384 | \begin_layout Section |
616 | johnpye | 828 | Basic Elements |
617 | \begin_inset LatexCommand \index{basic elements} | ||
618 | |||
619 | \end_inset | ||
620 | |||
621 | |||
622 | \begin_inset LatexCommand \label{sub:x.1.2Basic-Elements} | ||
623 | |||
624 | \end_inset | ||
625 | |||
626 | |||
627 | \end_layout | ||
628 | |||
629 | \end_deeper | ||
630 | \begin_layout List | ||
631 | \labelwidthstring 00000.00000.00000.000 | ||
632 | |||
633 | \bar under | ||
634 | Boolean\InsetSpace ~ | ||
635 | value | ||
636 | \bar default | ||
637 | |||
638 | \begin_inset LatexCommand \index{value, Boolean} | ||
639 | |||
640 | \end_inset | ||
641 | |||
642 | |||
643 | \begin_inset LatexCommand \index{Boolean value} | ||
644 | |||
645 | \end_inset | ||
646 | |||
647 | jpye | 1384 | |
648 | \family sans | ||
649 | TRUE | ||
650 | \family default | ||
651 | |||
652 | johnpye | 828 | \begin_inset LatexCommand \index{TRUE} |
653 | |||
654 | \end_inset | ||
655 | |||
656 | jpye | 1384 | or |
657 | \family sans | ||
658 | FALSE | ||
659 | \family default | ||
660 | |||
661 | johnpye | 828 | \begin_inset LatexCommand \index{FALSE} |
662 | |||
663 | \end_inset | ||
664 | |||
665 | . | ||
666 | jpye | 1384 | Can't get much simpler, eh? In the language definition |
667 | \family sans | ||
668 | TRUE | ||
669 | \family default | ||
670 | and | ||
671 | \family sans | ||
672 | FALSE | ||
673 | \family default | ||
674 | do not map to 1 and 0 or any other type of numeric value. | ||
675 | johnpye | 828 | (In the implementation, of course, they do.) |
676 | \end_layout | ||
677 | |||
678 | \begin_layout List | ||
679 | \labelwidthstring 00000.00000.00000.000 | ||
680 | User\InsetSpace ~ | ||
681 | interface\InsetSpace ~ | ||
682 | tip: The ASCEND user interface programmers have found it very | ||
683 | convenient, however, to allow T/F, 1/0, Y/N, and other obvious boolean | ||
684 | conventions as interactive input when assigning boolean values. | ||
685 | We are lazy users. | ||
686 | \end_layout | ||
687 | |||
688 | \begin_layout List | ||
689 | \labelwidthstring 00000.00000.00000.000 | ||
690 | |||
691 | \bar under | ||
692 | Integer\InsetSpace ~ | ||
693 | value | ||
694 | \bar default | ||
695 | |||
696 | \begin_inset LatexCommand \index{value, integer} | ||
697 | |||
698 | \end_inset | ||
699 | |||
700 | |||
701 | \begin_inset LatexCommand \index{integer value} | ||
702 | |||
703 | \end_inset | ||
704 | |||
705 | A signed whole number up to the maximum that can be represented by the | ||
706 | computer on which one is running ASCEND. | ||
707 | jpye | 1384 | |
708 | \family sans | ||
709 | MAX_INTEGER | ||
710 | \family default | ||
711 | |||
712 | johnpye | 828 | \begin_inset LatexCommand \index{MAX\_INTEGER} |
713 | |||
714 | \end_inset | ||
715 | |||
716 | is machine dependent. | ||
717 | Examples are: | ||
718 | \end_layout | ||
719 | |||
720 | \begin_deeper | ||
721 | \begin_layout LyX-Code | ||
722 | \align block | ||
723 | 123 | ||
724 | \end_layout | ||
725 | |||
726 | \begin_layout LyX-Code | ||
727 | \align block | ||
728 | -5 | ||
729 | \end_layout | ||
730 | |||
731 | \begin_layout LyX-Code | ||
732 | \align block | ||
733 | MAX_INTEGER, typically 2147483647. | ||
734 | \end_layout | ||
735 | |||
736 | \end_deeper | ||
737 | \begin_layout List | ||
738 | \labelwidthstring 00000.00000.00000.000 | ||
739 | |||
740 | \bar under | ||
741 | Real\InsetSpace ~ | ||
742 | value | ||
743 | \bar default | ||
744 | |||
745 | \begin_inset LatexCommand \index{value. real} | ||
746 | |||
747 | \end_inset | ||
748 | |||
749 | |||
750 | \begin_inset LatexCommand \index{real value} | ||
751 | |||
752 | \end_inset | ||
753 | |||
754 | ASCEND represents reals almost exactly as any other mathematically oriented | ||
755 | programming language does. | ||
756 | The mantissa | ||
757 | \begin_inset LatexCommand \index{mantissa} | ||
758 | |||
759 | \end_inset | ||
760 | |||
761 | has an optional negative sign followed by a string of digits and at most | ||
762 | one decimal point. | ||
763 | jpye | 1384 | The exponent is the letter |
764 | \family typewriter | ||
765 | e | ||
766 | \family default | ||
767 | or | ||
768 | \family typewriter | ||
769 | E | ||
770 | \family default | ||
771 | followed by an integer. | ||
772 | johnpye | 828 | The number must not exceed the largest the computer is able to handle. |
773 | There can be no blank characters in a real. | ||
774 | jpye | 1384 | |
775 | \family sans | ||
776 | MAX_REAL | ||
777 | \family default | ||
778 | |||
779 | johnpye | 828 | \begin_inset LatexCommand \index{MAX\_REAL} |
780 | |||
781 | \end_inset | ||
782 | |||
783 | is machine dependent. | ||
784 | The following are legitimate reals in ASCEND: | ||
785 | \end_layout | ||
786 | |||
787 | \begin_deeper | ||
788 | \begin_layout LyX-Code | ||
789 | \align block | ||
790 | -1 | ||
791 | \end_layout | ||
792 | |||
793 | \begin_layout LyX-Code | ||
794 | \align block | ||
795 | 1.2 | ||
796 | \end_layout | ||
797 | |||
798 | \begin_layout LyX-Code | ||
799 | \align block | ||
800 | 1.3e-2 | ||
801 | \end_layout | ||
802 | |||
803 | \begin_layout LyX-Code | ||
804 | \align block | ||
805 | 7.888888e+34 | ||
806 | \end_layout | ||
807 | |||
808 | \begin_layout LyX-Code | ||
809 | \align block | ||
810 | .6E21 | ||
811 | \end_layout | ||
812 | |||
813 | \begin_layout LyX-Code | ||
814 | \align block | ||
815 | MAX_REAL, typically about 1.79E+308. | ||
816 | \end_layout | ||
817 | |||
818 | \begin_layout Standard | ||
819 | while the following are not: | ||
820 | \end_layout | ||
821 | |||
822 | \begin_layout LyX-Code | ||
823 | \align block | ||
824 | 1. | ||
825 | jpye | 1384 | 2 (*contains a blank within it*) |
826 | johnpye | 828 | \end_layout |
827 | |||
828 | \begin_layout LyX-Code | ||
829 | \align block | ||
830 | 1.3e2.0 (*exponent has a decimal in it*) | ||
831 | \end_layout | ||
832 | |||
833 | jpye | 1384 | \begin_layout LyX-Code |
834 | |||
835 | \family typewriter | ||
836 | +1.3 (* illegal unary + sign. | ||
837 | johnpye | 828 | x = +1.3 not allowed*) |
838 | \end_layout | ||
839 | |||
840 | \end_deeper | ||
841 | \begin_layout List | ||
842 | \labelwidthstring 00000.00000.00000.000 | ||
843 | |||
844 | \bar under | ||
845 | Reals\InsetSpace ~ | ||
846 | stored\InsetSpace ~ | ||
847 | in\InsetSpace ~ | ||
848 | SI | ||
849 | \begin_inset LatexCommand \index{SI} | ||
850 | |||
851 | \end_inset | ||
852 | |||
853 | \InsetSpace ~ | ||
854 | units | ||
855 | \bar default | ||
856 | |||
857 | \end_layout | ||
858 | |||
859 | \begin_deeper | ||
860 | \begin_layout Standard | ||
861 | We store all real values as double precision | ||
862 | \begin_inset LatexCommand \index{double precision} | ||
863 | |||
864 | \end_inset | ||
865 | |||
866 | jpye | 1384 | numbers in the metre-kilogram-second (MKS) |
867 | johnpye | 828 | \begin_inset LatexCommand \index{MKS} |
868 | |||
869 | \end_inset | ||
870 | |||
871 | system of units. | ||
872 | This eliminates many common errors in the modeling of physical systems. | ||
873 | Since we also place the burden of scaling equations on system routines | ||
874 | and a simple modeling methodology, the internal units are not of concern | ||
875 | to most users. | ||
876 | \end_layout | ||
877 | |||
878 | \end_deeper | ||
879 | \begin_layout List | ||
880 | \labelwidthstring 00000.00000.00000.000 | ||
881 | |||
882 | \bar under | ||
883 | Dimensionality | ||
884 | \begin_inset LatexCommand \index{dimensionality} | ||
885 | |||
886 | \end_inset | ||
887 | |||
888 | : | ||
889 | \bar default | ||
890 | Real values have dimensionality such as length/time for velocity. | ||
891 | jpye | 1384 | |
892 | \series bold | ||
893 | Dimensionality | ||
894 | \series default | ||
895 | is to be distinguished from the | ||
896 | \series bold | ||
897 | units | ||
898 | \series default | ||
899 | such as ft/s. | ||
900 | johnpye | 828 | ASCEND takes care of mapping between units |
901 | \begin_inset LatexCommand \index{units} | ||
902 | |||
903 | \end_inset | ||
904 | |||
905 | and dimensions. | ||
906 | A value without units (this includes integer values) is taken to be dimensionle | ||
907 | ss | ||
908 | \begin_inset LatexCommand \index{dimensionless} | ||
909 | |||
910 | \end_inset | ||
911 | |||
912 | . | ||
913 | Dimensionality is built up from the following base dimensions: | ||
914 | \end_layout | ||
915 | |||
916 | \begin_layout List | ||
917 | \labelwidthstring 00000.00000.00000.000 | ||
918 | Name | ||
919 | \bar under | ||
920 | definition; typical units | ||
921 | \end_layout | ||
922 | |||
923 | \begin_layout List | ||
924 | \labelwidthstring 00000.00000.00000.000 | ||
925 | L | ||
926 | \begin_inset LatexCommand \index{L, length dimension} | ||
927 | |||
928 | \end_inset | ||
929 | |||
930 | length | ||
931 | \begin_inset LatexCommand \index{length} | ||
932 | |||
933 | \end_inset | ||
934 | |||
935 | jpye | 1384 | ; metre, m |
936 | johnpye | 828 | \end_layout |
937 | |||
938 | \begin_layout List | ||
939 | \labelwidthstring 00000.00000.00000.000 | ||
940 | M | ||
941 | \begin_inset LatexCommand \index{M, mass dimension} | ||
942 | |||
943 | \end_inset | ||
944 | |||
945 | mass | ||
946 | \begin_inset LatexCommand \index{mass} | ||
947 | |||
948 | \end_inset | ||
949 | |||
950 | ; kilogram, kg | ||
951 | \end_layout | ||
952 | |||
953 | \begin_layout List | ||
954 | \labelwidthstring 00000.00000.00000.000 | ||
955 | T | ||
956 | \begin_inset LatexCommand \index{T, time dimension} | ||
957 | |||
958 | \end_inset | ||
959 | |||
960 | time | ||
961 | \begin_inset LatexCommand \index{time} | ||
962 | |||
963 | \end_inset | ||
964 | |||
965 | ; second, s | ||
966 | \end_layout | ||
967 | |||
968 | \begin_layout List | ||
969 | \labelwidthstring 00000.00000.00000.000 | ||
970 | E | ||
971 | \begin_inset LatexCommand \index{E, electric current dimension} | ||
972 | |||
973 | \end_inset | ||
974 | |||
975 | electric current | ||
976 | \begin_inset LatexCommand \index{electric current} | ||
977 | |||
978 | \end_inset | ||
979 | |||
980 | ; ampere, A | ||
981 | \end_layout | ||
982 | |||
983 | \begin_layout List | ||
984 | \labelwidthstring 00000.00000.00000.000 | ||
985 | Q | ||
986 | \begin_inset LatexCommand \index{Q, quantity dimension} | ||
987 | |||
988 | \end_inset | ||
989 | |||
990 | quantity | ||
991 | \begin_inset LatexCommand \index{quantity} | ||
992 | |||
993 | \end_inset | ||
994 | |||
995 | ; mole, mole | ||
996 | \end_layout | ||
997 | |||
998 | \begin_layout List | ||
999 | \labelwidthstring 00000.00000.00000.000 | ||
1000 | TMP | ||
1001 | \begin_inset LatexCommand \index{TMP, temperature dimension} | ||
1002 | |||
1003 | \end_inset | ||
1004 | |||
1005 | temperature | ||
1006 | \begin_inset LatexCommand \index{temperature} | ||
1007 | |||
1008 | \end_inset | ||
1009 | |||
1010 | ; Kelvin, K | ||
1011 | \end_layout | ||
1012 | |||
1013 | \begin_layout List | ||
1014 | \labelwidthstring 00000.00000.00000.000 | ||
1015 | LUM | ||
1016 | \begin_inset LatexCommand \index{LUM, luminous intensity dimension} | ||
1017 | |||
1018 | \end_inset | ||
1019 | |||
1020 | luminous intensity | ||
1021 | \begin_inset LatexCommand \index{luminous intensity} | ||
1022 | |||
1023 | \end_inset | ||
1024 | |||
1025 | ; candela, cd | ||
1026 | \end_layout | ||
1027 | |||
1028 | \begin_layout List | ||
1029 | \labelwidthstring 00000.00000.00000.000 | ||
1030 | P | ||
1031 | \begin_inset LatexCommand \index{P, phase angle dimension} | ||
1032 | |||
1033 | \end_inset | ||
1034 | |||
1035 | plane angle | ||
1036 | \begin_inset LatexCommand \index{plane angle} | ||
1037 | |||
1038 | \end_inset | ||
1039 | |||
1040 | ; radian, rad | ||
1041 | \end_layout | ||
1042 | |||
1043 | \begin_layout List | ||
1044 | \labelwidthstring 00000.00000.00000.000 | ||
1045 | S | ||
1046 | \begin_inset LatexCommand \index{S, solid angle dimension} | ||
1047 | |||
1048 | \end_inset | ||
1049 | |||
1050 | solid angle | ||
1051 | \begin_inset LatexCommand \index{solid angle} | ||
1052 | |||
1053 | \end_inset | ||
1054 | |||
1055 | ; steradian, srad | ||
1056 | \end_layout | ||
1057 | |||
1058 | \begin_layout List | ||
1059 | \labelwidthstring 00000.00000.00000.000 | ||
1060 | C | ||
1061 | \begin_inset LatexCommand \index{C, currency dimension} | ||
1062 | |||
1063 | \end_inset | ||
1064 | |||
1065 | currency | ||
1066 | \begin_inset LatexCommand \index{currency} | ||
1067 | |||
1068 | \end_inset | ||
1069 | |||
1070 | ; currency, CR | ||
1071 | \end_layout | ||
1072 | |||
1073 | \begin_deeper | ||
1074 | \begin_layout Standard | ||
1075 | The atom and constant definitions in the library illustrate the use of dimension | ||
1076 | ality. | ||
1077 | \end_layout | ||
1078 | |||
1079 | \begin_layout Standard | ||
1080 | Dimensions may be any combination of these symbols along with rounded parenthese | ||
1081 | jpye | 1384 | s, (), and the operators *, |
1082 | \family typewriter | ||
1083 | ^ | ||
1084 | \family default | ||
1085 | and | ||
1086 | \family typewriter | ||
1087 | / | ||
1088 | \family default | ||
1089 | . | ||
1090 | Examples include | ||
1091 | \family typewriter | ||
1092 | M/T | ||
1093 | \family default | ||
1094 | or | ||
1095 | \family typewriter | ||
1096 | M*L^2/T^2/TMP | ||
1097 | \family default | ||
1098 | {this latter means | ||
1099 | \family typewriter | ||
1100 | (M*(L^2)/(T^2))/TMP | ||
1101 | \family default | ||
1102 | }. | ||
1103 | The second operand for the to-the-power-of operator, | ||
1104 | \family typewriter | ||
1105 | ^ | ||
1106 | \family default | ||
1107 | , must be an integer value (e.g., -2 or 3) because fractional powers of dimensiona | ||
1108 | l numbers are physically undefined | ||
1109 | \begin_inset Note Note | ||
1110 | status open | ||
1111 | |||
1112 | \begin_layout Standard | ||
1113 | although we do seem them occasionally... | ||
1114 | johnpye | 828 | \end_layout |
1115 | |||
1116 | jpye | 1384 | \end_inset |
1117 | |||
1118 | . | ||
1119 | \end_layout | ||
1120 | |||
1121 | johnpye | 828 | \begin_layout Standard |
1122 | If the dimensionality for a real value is undefined, then ASCEND gives it | ||
1123 | jpye | 1384 | a wildcard dimensionality |
1124 | johnpye | 828 | \begin_inset LatexCommand \index{wild card dimensionality} |
1125 | |||
1126 | \end_inset | ||
1127 | |||
1128 | . | ||
1129 | If ASCEND can later deduce its dimensionality from its use in a model definitio | ||
1130 | n it will do so. | ||
1131 | jpye | 1384 | For example consider the real variable |
1132 | \family typewriter | ||
1133 | a | ||
1134 | \family default | ||
1135 | , suppose | ||
1136 | \family typewriter | ||
1137 | a | ||
1138 | \family default | ||
1139 | has wildcard dimensionality, | ||
1140 | \family typewriter | ||
1141 | b | ||
1142 | \family default | ||
1143 | has dimensionality of | ||
1144 | \family typewriter | ||
1145 | L/T | ||
1146 | \family default | ||
1147 | . | ||
1148 | johnpye | 828 | Then the statement: |
1149 | \end_layout | ||
1150 | |||
1151 | \end_deeper | ||
1152 | \begin_layout List | ||
1153 | \labelwidthstring 00000.00000.00000.000 | ||
1154 | Example\InsetSpace ~ | ||
1155 | of\InsetSpace ~ | ||
1156 | a\InsetSpace ~ | ||
1157 | dimensionally\InsetSpace ~ | ||
1158 | consistent | ||
1159 | \begin_inset LatexCommand \index{dimensionally consistent} | ||
1160 | |||
1161 | \end_inset | ||
1162 | |||
1163 | \InsetSpace ~ | ||
1164 | equation. | ||
1165 | |||
1166 | \end_layout | ||
1167 | |||
1168 | \begin_layout List | ||
1169 | \labelwidthstring 00000.00000.00000.000 | ||
1170 | \InsetSpace ~ | ||
1171 | jpye | 1384 | |
1172 | \family typewriter | ||
1173 | a + b = 3 {ft/s}; | ||
1174 | johnpye | 828 | \end_layout |
1175 | |||
1176 | \begin_deeper | ||
1177 | \begin_layout Standard | ||
1178 | jpye | 1384 | requires that |
1179 | \family typewriter | ||
1180 | a | ||
1181 | \family default | ||
1182 | have the same dimensionality as the other two terms, namely, | ||
1183 | \family typewriter | ||
1184 | L/T | ||
1185 | \family default | ||
1186 | . | ||
1187 | ASCEND will assign this dimensionality to | ||
1188 | \family typewriter | ||
1189 | a | ||
1190 | \family default | ||
1191 | . | ||
1192 | johnpye | 828 | The user will be warned of dimensionally inconsistent equations. |
1193 | \end_layout | ||
1194 | |||
1195 | \end_deeper | ||
1196 | \begin_layout List | ||
1197 | \labelwidthstring 00000.00000.00000.000 | ||
1198 | |||
1199 | \bar under | ||
1200 | Unit\InsetSpace ~ | ||
1201 | expression | ||
1202 | \bar default | ||
1203 | A unit expression | ||
1204 | \begin_inset LatexCommand \index{unit expression} | ||
1205 | |||
1206 | \end_inset | ||
1207 | |||
1208 | may be composed of any combination of unit names defined by the system | ||
1209 | jpye | 1384 | and any numerical constants combined with times ( |
1210 | \family typewriter | ||
1211 | * | ||
1212 | \family default | ||
1213 | ), divide( | ||
1214 | \family typewriter | ||
1215 | / | ||
1216 | \family default | ||
1217 | ) and to the power ( | ||
1218 | \family typewriter | ||
1219 | ^ | ||
1220 | \family default | ||
1221 | ) operators. | ||
1222 | The RHS of | ||
1223 | \family typewriter | ||
1224 | ^ | ||
1225 | \family default | ||
1226 | must be an integer. | ||
1227 | Parentheses can be used to group subexpressions with the exception that | ||
1228 | a divide operator may | ||
1229 | \emph on | ||
1230 | not | ||
1231 | \emph default | ||
1232 | be followed by a grouped subexpression. | ||
1233 | johnpye | 828 | |
1234 | \end_layout | ||
1235 | |||
1236 | \begin_deeper | ||
1237 | \begin_layout Standard | ||
1238 | jpye | 1384 | So, |
1239 | \family typewriter | ||
1240 | {kg/m/s} | ||
1241 | \family default | ||
1242 | is fine, but | ||
1243 | \family typewriter | ||
1244 | {kg/(m*s)} | ||
1245 | \family default | ||
1246 | is not. | ||
1247 | johnpye | 828 | Although the two expressions are mathematically equivalent, it makes the |
1248 | system programming and output formatting easier to code and faster to execute | ||
1249 | if we disallow expressions of the latter sort. | ||
1250 | \end_layout | ||
1251 | |||
1252 | \begin_layout Standard | ||
1253 | jpye | 1384 | The units understood by the system are defined in the first part of this |
1254 | manual. | ||
1255 | johnpye | 828 | Note that several units defined are really values of interesting constants |
1256 | in SI, e.g. | ||
1257 | jpye | 1384 | |
1258 | \family typewriter | ||
1259 | R :== 1{GAS_C} | ||
1260 | \family default | ||
1261 | yields the correct value of the thermodynamic gas constant. | ||
1262 | johnpye | 828 | Users can define additional units. |
1263 | \end_layout | ||
1264 | |||
1265 | \end_deeper | ||
1266 | \begin_layout List | ||
1267 | \labelwidthstring 00000.00000.00000.000 | ||
1268 | |||
1269 | \bar under | ||
1270 | Units | ||
1271 | \bar default | ||
1272 | |||
1273 | \begin_inset LatexCommand \index{units} | ||
1274 | |||
1275 | \end_inset | ||
1276 | |||
1277 | jpye | 1384 | A Unit expression unit expression must be enclosed in curly braces |
1278 | \family typewriter | ||
1279 | {} | ||
1280 | \family default | ||
1281 | . | ||
1282 | johnpye | 828 | When a real number is used in a mathematical expression in ASCEND, it must |
1283 | have a set of units expressed with it. | ||
1284 | If it does not, ASCEND assumes the number is dimensionless, which may not | ||
1285 | be the intent of the modeler. | ||
1286 | An example is shown in the dimensionally consistent equation above where | ||
1287 | jpye | 1384 | the number 3 has the units |
1288 | \family typewriter | ||
1289 | {ft/s} | ||
1290 | \family default | ||
1291 | associated with it. | ||
1292 | johnpye | 828 | |
1293 | \end_layout | ||
1294 | |||
1295 | \begin_deeper | ||
1296 | \begin_layout Standard | ||
1297 | Examples: | ||
1298 | \end_layout | ||
1299 | |||
1300 | \begin_layout LyX-Code | ||
1301 | \align block | ||
1302 | {kg_mole/s/m} same as {(kg_mole/s)/m} | ||
1303 | \end_layout | ||
1304 | |||
1305 | \begin_layout LyX-Code | ||
1306 | \align block | ||
1307 | {m^3/yr} | ||
1308 | \end_layout | ||
1309 | |||
1310 | \begin_layout LyX-Code | ||
1311 | \align block | ||
1312 | {3/100*ft} same as {0.03*ft} | ||
1313 | \end_layout | ||
1314 | |||
1315 | \begin_layout LyX-Code | ||
1316 | \align block | ||
1317 | {s^-1} same as {1/s} | ||
1318 | \end_layout | ||
1319 | |||
1320 | \begin_layout Standard | ||
1321 | Illegal unit examples are | ||
1322 | \end_layout | ||
1323 | |||
1324 | \begin_layout LyX-Code | ||
1325 | \align block | ||
1326 | {m/(K*kg_mole)} | ||
1327 | \end_layout | ||
1328 | |||
1329 | \begin_deeper | ||
1330 | \begin_layout Standard | ||
1331 | grouped subexpression used in the denominator; should be written {m/K/kg_mole}. | ||
1332 | \end_layout | ||
1333 | |||
1334 | \end_deeper | ||
1335 | \begin_layout LyX-Code | ||
1336 | \align block | ||
1337 | {m^3.5} | ||
1338 | \end_layout | ||
1339 | |||
1340 | \begin_deeper | ||
1341 | \begin_layout Standard | ||
1342 | power of units or dimensions must be integer. | ||
1343 | \end_layout | ||
1344 | |||
1345 | \end_deeper | ||
1346 | \end_deeper | ||
1347 | \begin_layout List | ||
1348 | \labelwidthstring 00000.00000.00000.000 | ||
1349 | |||
1350 | \bar under | ||
1351 | Symbol\InsetSpace ~ | ||
1352 | Value | ||
1353 | \bar default | ||
1354 | |||
1355 | \begin_inset LatexCommand \index{value, symbol} | ||
1356 | |||
1357 | \end_inset | ||
1358 | |||
1359 | |||
1360 | \begin_inset LatexCommand \index{symbol value} | ||
1361 | |||
1362 | \end_inset | ||
1363 | |||
1364 | The format for a symbol is that of an arbitrary character string enclosed | ||
1365 | between two single quotes. | ||
1366 | There is no way to embed a single quote | ||
1367 | \begin_inset LatexCommand \index{'} | ||
1368 | |||
1369 | \end_inset | ||
1370 | |||
1371 | |||
1372 | \begin_inset LatexCommand \index{single quote} | ||
1373 | |||
1374 | \end_inset | ||
1375 | |||
1376 | in a symbol: we are not in the escape sequence business at this time. | ||
1377 | The following are legal symbols in ASCEND: | ||
1378 | \end_layout | ||
1379 | |||
1380 | \begin_deeper | ||
1381 | \begin_layout LyX-Code | ||
1382 | 'H2O' | ||
1383 | \end_layout | ||
1384 | |||
1385 | \begin_layout LyX-Code | ||
1386 | 'r1' | ||
1387 | \end_layout | ||
1388 | |||
1389 | \begin_layout LyX-Code | ||
1390 | 'Bill said,foo to whom?' | ||
1391 | \end_layout | ||
1392 | |||
1393 | \begin_layout Standard | ||
1394 | while the following are not legal symbol values: | ||
1395 | \end_layout | ||
1396 | |||
1397 | \begin_layout LyX-Code | ||
1398 | "ethanol" (double quotes not allowed) | ||
1399 | \end_layout | ||
1400 | |||
1401 | \begin_layout LyX-Code | ||
1402 | water (no single quotes given) | ||
1403 | \end_layout | ||
1404 | |||
1405 | \begin_layout LyX-Code | ||
1406 | i cant do this (no embedded quotes) | ||
1407 | \end_layout | ||
1408 | |||
1409 | \begin_layout Standard | ||
1410 | There is an arbitrary upper limit to the number of characters in a symbol | ||
1411 | (something like 10,000) so that we may detect a missing close quote in | ||
1412 | a bad input file without crashing. | ||
1413 | \end_layout | ||
1414 | |||
1415 | \end_deeper | ||
1416 | \begin_layout List | ||
1417 | \labelwidthstring 00000.00000.00000.000 | ||
1418 | Sets\InsetSpace ~ | ||
1419 | values | ||
1420 | \begin_inset LatexCommand \index{values, set} | ||
1421 | |||
1422 | \end_inset | ||
1423 | |||
1424 | |||
1425 | \begin_inset LatexCommand \index{set values} | ||
1426 | |||
1427 | \end_inset | ||
1428 | |||
1429 | jpye | 1384 | Set values are lists of elements, all of type |
1430 | \family sans | ||
1431 | integer_constant | ||
1432 | \family default | ||
1433 | or all of type | ||
1434 | \family sans | ||
1435 | symbol_constant | ||
1436 | \family default | ||
1437 | , enclosed between square brackets | ||
1438 | \family typewriter | ||
1439 | [] | ||
1440 | \family default | ||
1441 | . | ||
1442 | johnpye | 828 | The following are examples of sets: |
1443 | \end_layout | ||
1444 | |||
1445 | \begin_deeper | ||
1446 | \begin_layout LyX-Code | ||
1447 | \align block | ||
1448 | ['methane', 'ethane', 'propane'] | ||
1449 | \end_layout | ||
1450 | |||
1451 | \begin_layout LyX-Code | ||
1452 | \align block | ||
1453 | [1..5, 7, 15] | ||
1454 | \end_layout | ||
1455 | |||
1456 | \begin_layout LyX-Code | ||
1457 | \align block | ||
1458 | [2..n_stages] | ||
1459 | \end_layout | ||
1460 | |||
1461 | \begin_layout LyX-Code | ||
1462 | \align block | ||
1463 | [1, 4, 2, 1, 16] | ||
1464 | \end_layout | ||
1465 | |||
1466 | \begin_layout LyX-Code | ||
1467 | \align block | ||
1468 | [] | ||
1469 | \end_layout | ||
1470 | |||
1471 | \end_deeper | ||
1472 | \begin_layout List | ||
1473 | \labelwidthstring 00000.00000.00000.000 | ||
1474 | More\InsetSpace ~ | ||
1475 | about\InsetSpace ~ | ||
1476 | sets | ||
1477 | \begin_inset LatexCommand \index{sets} | ||
1478 | |||
1479 | \end_inset | ||
1480 | |||
1481 | \InsetSpace ~ | ||
1482 | in\InsetSpace ~ | ||
1483 | Section\InsetSpace ~ | ||
1484 | |||
1485 | \begin_inset LatexCommand \vref{sub:x.2.2Sets} | ||
1486 | |||
1487 | \end_inset | ||
1488 | |||
1489 | . | ||
1490 | \end_layout | ||
1491 | |||
1492 | \begin_deeper | ||
1493 | \begin_layout Standard | ||
1494 | jpye | 1384 | The value range |
1495 | \family typewriter | ||
1496 | 1..5 | ||
1497 | \family default | ||
1498 | is an allowable shorthand for the integers 1, 2, 3, 4 and 5 while the value | ||
1499 | range | ||
1500 | \family typewriter | ||
1501 | 2..n_stages | ||
1502 | \family default | ||
1503 | (where | ||
1504 | \family typewriter | ||
1505 | n_stages | ||
1506 | \family default | ||
1507 | must be of type | ||
1508 | \family sans | ||
1509 | integer_constant | ||
1510 | \family default | ||
1511 | ) means all integers from 2 to | ||
1512 | \family typewriter | ||
1513 | n_stages | ||
1514 | \family default | ||
1515 | . | ||
1516 | If | ||
1517 | \family typewriter | ||
1518 | n_stages | ||
1519 | \family default | ||
1520 | is less than 2, then the third set is empty. | ||
1521 | The repeated occurrence of | ||
1522 | \family typewriter | ||
1523 | 1 | ||
1524 | \family default | ||
1525 | in the fourth set is ignored. | ||
1526 | johnpye | 828 | The fifth set is the empty set |
1527 | \begin_inset LatexCommand \index{empty set} | ||
1528 | |||
1529 | \end_inset | ||
1530 | |||
1531 | |||
1532 | \begin_inset LatexCommand \index{set, empty} | ||
1533 | |||
1534 | \end_inset | ||
1535 | |||
1536 | . | ||
1537 | \end_layout | ||
1538 | |||
1539 | \begin_layout Standard | ||
1540 | We use the term set in an almost pure mathematical sense. | ||
1541 | The elements have no order. | ||
1542 | One can only ask two things of a set: (1) if an element is a member of | ||
1543 | it and (2) its cardinality | ||
1544 | \begin_inset LatexCommand \index{cardinality} | ||
1545 | |||
1546 | \end_inset | ||
1547 | |||
1548 | jpye | 1384 | ( |
1549 | \family sans | ||
1550 | CARD | ||
1551 | \family default | ||
1552 | |||
1553 | johnpye | 828 | \begin_inset LatexCommand \index{CARD} |
1554 | |||
1555 | \end_inset | ||
1556 | |||
1557 | jpye | 1384 | |
1558 | \family typewriter | ||
1559 | (set) | ||
1560 | \family default | ||
1561 | ). | ||
1562 | johnpye | 828 | Repeated elements used in defining a set are ignored. |
1563 | The elements of sets cannot themselves be sets in ASCEND; i.e., there can | ||
1564 | be no sets of set. | ||
1565 | \end_layout | ||
1566 | |||
1567 | \end_deeper | ||
1568 | \begin_layout List | ||
1569 | \labelwidthstring 00000.00000.00000.000 | ||
1570 | Sets\InsetSpace ~ | ||
1571 | are\InsetSpace ~ | ||
1572 | unordered. | ||
1573 | A set of integers may appear to be ordered to the modeler as the natural | ||
1574 | numbers have an order. | ||
1575 | However, it is the user imposing and using the ordering, not ASCEND. | ||
1576 | ASCEND sees these integers as elements in the set with NO ordering. | ||
1577 | Therefore, there are no operators in ASCEND such as successor or precursor | ||
1578 | member of a set. | ||
1579 | \end_layout | ||
1580 | |||
1581 | \begin_layout List | ||
1582 | \labelwidthstring 00000.00000.00000.000 | ||
1583 | |||
1584 | \bar under | ||
1585 | Arrays | ||
1586 | \bar default | ||
1587 | |||
1588 | \begin_inset LatexCommand \index{arrays} | ||
1589 | |||
1590 | \end_inset | ||
1591 | |||
1592 | An array is a list of instances indexed over a set, in computer-speak, | ||
1593 | an associative array of objects. | ||
1594 | The instances are all of the same base type (as that is the only way they | ||
1595 | can be defined). | ||
1596 | An individual member of a list may later be more refined than the other | ||
1597 | members (we shall illustrate that possibility). | ||
1598 | The following are arrays in ASCEND. | ||
1599 | \end_layout | ||
1600 | |||
1601 | \begin_deeper | ||
1602 | \begin_layout LyX-Code | ||
1603 | \align block | ||
1604 | stage[1..n_stages] | ||
1605 | \end_layout | ||
1606 | |||
1607 | \begin_layout LyX-Code | ||
1608 | \align block | ||
1609 | y[components] | ||
1610 | \end_layout | ||
1611 | |||
1612 | \begin_layout LyX-Code | ||
1613 | \align block | ||
1614 | column[areas][processes] | ||
1615 | \end_layout | ||
1616 | |||
1617 | \begin_layout Standard | ||
1618 | where components, areas and processes are sets. | ||
1619 | jpye | 1384 | For example components could be the set of symbols |
1620 | \family typewriter | ||
1621 | ['ethylene', 'propylene'] | ||
1622 | \family default | ||
1623 | , areas the set of symbols | ||
1624 | \family typewriter | ||
1625 | ['feed_prep', 'prod_purification'] | ||
1626 | \family default | ||
1627 | while processes could be the set | ||
1628 | \family typewriter | ||
1629 | ['alcohol_manuf', 'poly_propropylene_manuf'] | ||
1630 | \family default | ||
1631 | . | ||
1632 | Note that the third example ( | ||
1633 | \family typewriter | ||
1634 | column | ||
1635 | \family default | ||
1636 | ) is a list of lists (the way that ASCEND permits a multiply subscripted | ||
1637 | array). | ||
1638 | johnpye | 828 | |
1639 | \end_layout | ||
1640 | |||
1641 | \begin_layout Standard | ||
1642 | The following are elements in the above arrays: | ||
1643 | \end_layout | ||
1644 | |||
1645 | \begin_layout LyX-Code | ||
1646 | stage[1] | ||
1647 | \end_layout | ||
1648 | |||
1649 | \begin_layout LyX-Code | ||
1650 | y['ethylene'] | ||
1651 | \end_layout | ||
1652 | |||
1653 | \begin_layout LyX-Code | ||
1654 | column['feed_prep'][alcohol_manuf'] | ||
1655 | \end_layout | ||
1656 | |||
1657 | \begin_layout Standard | ||
1658 | jpye | 1384 | provided that |
1659 | \family typewriter | ||
1660 | n_stages | ||
1661 | \family default | ||
1662 | is 1 or larger. | ||
1663 | johnpye | 828 | |
1664 | \end_layout | ||
1665 | |||
1666 | \begin_layout Standard | ||
1667 | There can be any number of subscripts | ||
1668 | \begin_inset LatexCommand \index{subscripts} | ||
1669 | |||
1670 | \end_inset | ||
1671 | |||
1672 | for an array. | ||
1673 | We point out, however, that in virtually every application of arrays requiring | ||
1674 | more than two subscripts, there is usually a some underlying concept that | ||
1675 | is much better modeled as an object than as part of a deeply subscripted | ||
1676 | \begin_inset LatexCommand \index{subscripted, deeply} | ||
1677 | |||
1678 | \end_inset | ||
1679 | |||
1680 | |||
1681 | \begin_inset LatexCommand \index{deeply subscripted} | ||
1682 | |||
1683 | \end_inset | ||
1684 | |||
1685 | array. | ||
1686 | In the following jagged array example, there are really the concepts of | ||
1687 | unit operation and stream that would be better understood if made explicit. | ||
1688 | \end_layout | ||
1689 | |||
1690 | \end_deeper | ||
1691 | \begin_layout List | ||
1692 | \labelwidthstring 00000.00000.00000.000 | ||
1693 | |||
1694 | \bar under | ||
1695 | Arrays\InsetSpace ~ | ||
1696 | can\InsetSpace ~ | ||
1697 | be\InsetSpace ~ | ||
1698 | jagged | ||
1699 | \bar default | ||
1700 | |||
1701 | \begin_inset LatexCommand \label{lyx:Arrays-can-be} | ||
1702 | |||
1703 | \end_inset | ||
1704 | |||
1705 | jpye | 1384 | Arrays can be sparse |
1706 | johnpye | 828 | \begin_inset LatexCommand \index{sparse} |
1707 | |||
1708 | \end_inset | ||
1709 | |||
1710 | or jagged | ||
1711 | \begin_inset LatexCommand \index{jagged} | ||
1712 | |||
1713 | \end_inset | ||
1714 | |||
1715 | . | ||
1716 | For example: | ||
1717 | \end_layout | ||
1718 | |||
1719 | \begin_deeper | ||
1720 | \begin_layout LyX-Code | ||
1721 | process[1..3] IS_A set OF integer; | ||
1722 | \end_layout | ||
1723 | |||
1724 | \begin_layout LyX-Code | ||
1725 | process[1] :== [2]; | ||
1726 | \end_layout | ||
1727 | |||
1728 | \begin_layout LyX-Code | ||
1729 | process[2] :== [7,5,3]; | ||
1730 | \end_layout | ||
1731 | |||
1732 | \begin_layout LyX-Code | ||
1733 | process[3] :== [4,6]; | ||
1734 | \end_layout | ||
1735 | |||
1736 | \begin_layout LyX-Code | ||
1737 | FOR i in [1..3] CREATE | ||
1738 | \end_layout | ||
1739 | |||
1740 | \begin_layout LyX-Code | ||
1741 | FOR j IN process[i] CREATE | ||
1742 | \end_layout | ||
1743 | |||
1744 | \begin_layout LyX-Code | ||
1745 | flow[i][j] IS_A mass; | ||
1746 | \end_layout | ||
1747 | |||
1748 | \begin_layout LyX-Code | ||
1749 | END FOR; | ||
1750 | \end_layout | ||
1751 | |||
1752 | \begin_layout LyX-Code | ||
1753 | END FOR; | ||
1754 | \end_layout | ||
1755 | |||
1756 | \begin_layout Standard | ||
1757 | process is an array of sets (not to be confused with a set of sets which | ||
1758 | ASCEND does not have) and flow is an array with six elements spread over | ||
1759 | three rows: | ||
1760 | \end_layout | ||
1761 | |||
1762 | \begin_layout LyX-Code | ||
1763 | flow[1][2] | ||
1764 | \end_layout | ||
1765 | |||
1766 | \begin_layout LyX-Code | ||
1767 | flow[2][7], flow[2][3], flow[2][5] | ||
1768 | \end_layout | ||
1769 | |||
1770 | \begin_layout LyX-Code | ||
1771 | flow[3][4], flow[3][6] | ||
1772 | \end_layout | ||
1773 | |||
1774 | \end_deeper | ||
1775 | \begin_layout List | ||
1776 | \labelwidthstring 00000.00000.00000.000 | ||
1777 | Arrays\InsetSpace ~ | ||
1778 | are\InsetSpace ~ | ||
1779 | also\InsetSpace ~ | ||
1780 | instances | ||
1781 | \end_layout | ||
1782 | |||
1783 | \begin_deeper | ||
1784 | \begin_layout Standard | ||
1785 | Each array is itself an object. | ||
1786 | jpye | 1384 | That is, when you write |
1787 | \family typewriter | ||
1788 | a[1..2] IS_A real | ||
1789 | \family default | ||
1790 | , three objects get created: | ||
1791 | \family typewriter | ||
1792 | a[1] | ||
1793 | \family default | ||
1794 | , | ||
1795 | \family typewriter | ||
1796 | a[2] | ||
1797 | \family default | ||
1798 | , and | ||
1799 | \family typewriter | ||
1800 | a | ||
1801 | \family default | ||
1802 | . | ||
1803 | The object | ||
1804 | \family typewriter | ||
1805 | a | ||
1806 | \family default | ||
1807 | is an array instance which has parts named | ||
1808 | \family typewriter | ||
1809 | [1] | ||
1810 | \family default | ||
1811 | and | ||
1812 | \family typewriter | ||
1813 | [2] | ||
1814 | \family default | ||
1815 | that are real instances. | ||
1816 | johnpye | 828 | When a parameterized model requires an array, you pass it the single item |
1817 | jpye | 1384 | |
1818 | \family typewriter | ||
1819 | a | ||
1820 | \family default | ||
1821 | , not the elements | ||
1822 | \family typewriter | ||
1823 | a[1..2] | ||
1824 | \family default | ||
1825 | . | ||
1826 | johnpye | 828 | \end_layout |
1827 | |||
1828 | \end_deeper | ||
1829 | \begin_layout List | ||
1830 | \labelwidthstring 00000.00000.00000.000 | ||
1831 | No\InsetSpace ~ | ||
1832 | contiguous\InsetSpace ~ | ||
1833 | storage | ||
1834 | \begin_inset LatexCommand \index{contiguous storage, no} | ||
1835 | |||
1836 | \end_inset | ||
1837 | |||
1838 | |||
1839 | \end_layout | ||
1840 | |||
1841 | \begin_deeper | ||
1842 | \begin_layout Standard | ||
1843 | Just in case you still have not caught on, ASCEND arrays are not blocks | ||
1844 | of memory such as are seen in low-level languages like C | ||
1845 | \begin_inset LatexCommand \index{C, computer language} | ||
1846 | |||
1847 | \end_inset | ||
1848 | |||
1849 | , FORTRAN | ||
1850 | \begin_inset LatexCommand \index{FORTRAN} | ||
1851 | |||
1852 | \end_inset | ||
1853 | |||
1854 | , and Matlab | ||
1855 | \begin_inset LatexCommand \index{Matlab} | ||
1856 | |||
1857 | \end_inset | ||
1858 | |||
1859 | . | ||
1860 | The modeling language does not provide things like MatMult | ||
1861 | \begin_inset LatexCommand \index{MatMult} | ||
1862 | |||
1863 | \end_inset | ||
1864 | |||
1865 | , Transpose | ||
1866 | \begin_inset LatexCommand \index{Transpose} | ||
1867 | |||
1868 | \end_inset | ||
1869 | |||
1870 | , and Inverse | ||
1871 | \begin_inset LatexCommand \index{Inverse} | ||
1872 | |||
1873 | \end_inset | ||
1874 | |||
1875 | because these are procedural solving tools. | ||
1876 | If you are dedicated, you could write METHODs that implement matrix algebra, | ||
1877 | but this is a really dumb idea. | ||
1878 | We aim to structure our software so that it can interact openly with separate, | ||
1879 | dedicated tools (such as Matlab) when those tools are needed. | ||
1880 | \end_layout | ||
1881 | |||
1882 | \end_deeper | ||
1883 | \begin_layout List | ||
1884 | \labelwidthstring 00000.00000.00000.000 | ||
1885 | Index\InsetSpace ~ | ||
1886 | variable | ||
1887 | \begin_inset LatexCommand \index{index variable} | ||
1888 | |||
1889 | \end_inset | ||
1890 | |||
1891 | One can introduce a variable as an index ranging over a set. | ||
1892 | Index variables are local to the statements in which they occur. | ||
1893 | An example of using an index variable is the following FOR statement: | ||
1894 | \end_layout | ||
1895 | |||
1896 | \begin_deeper | ||
1897 | \begin_layout LyX-Code | ||
1898 | FOR i IN components CREATE | ||
1899 | \end_layout | ||
1900 | |||
1901 | \begin_layout LyX-Code | ||
1902 | VLE_equil[i]: y[i] = K[i]*x[i]; | ||
1903 | \end_layout | ||
1904 | |||
1905 | \begin_layout LyX-Code | ||
1906 | END FOR; | ||
1907 | \end_layout | ||
1908 | |||
1909 | \begin_layout Standard | ||
1910 | In this example i implicitly is of the same type as the values in the set | ||
1911 | components. | ||
1912 | If another object i exists in the model containing the FOR loop, it is | ||
1913 | ignored while executing the statements in that loop. | ||
1914 | This may cause unexpected results and the compiler will generate warnings | ||
1915 | about loop index shadowed variables. | ||
1916 | \end_layout | ||
1917 | |||
1918 | \end_deeper | ||
1919 | \begin_layout List | ||
1920 | \labelwidthstring 00000.00000.00000.000 | ||
1921 | Label | ||
1922 | \begin_inset LatexCommand \index{label} | ||
1923 | |||
1924 | \end_inset | ||
1925 | |||
1926 | : One can label statements which define arithmetic relationships (objective | ||
1927 | functions, equalities, and inequalities) in ASCEND. | ||
1928 | Labeling is highly recommended because it makes models much more readable | ||
1929 | and more easily debugged. | ||
1930 | Labels are also necessary for relations which are going to be used in condition | ||
1931 | al modeling or differentiation functions. | ||
1932 | A label is a sequence of alphanumeric characters ending in a colon. | ||
1933 | An example of a labeled equation is: | ||
1934 | \end_layout | ||
1935 | |||
1936 | \begin_deeper | ||
1937 | \begin_layout LyX-Code | ||
1938 | mass_balance: m_in = m_out; | ||
1939 | \end_layout | ||
1940 | |||
1941 | \begin_layout Standard | ||
1942 | An example of a labeled objective function is: | ||
1943 | \end_layout | ||
1944 | |||
1945 | \begin_layout LyX-Code | ||
1946 | obj1: MAXIMIZE revenue - cost; | ||
1947 | \end_layout | ||
1948 | |||
1949 | \begin_layout Standard | ||
1950 | If a relation is defined within a FOR statement, it must have an array indexed | ||
1951 | label so that each instance created using the statement is distinguishable | ||
1952 | from the others. | ||
1953 | An example is: | ||
1954 | \end_layout | ||
1955 | |||
1956 | \begin_layout LyX-Code | ||
1957 | FOR i IN components CREATE | ||
1958 | \end_layout | ||
1959 | |||
1960 | \begin_layout LyX-Code | ||
1961 | equil[i]: y[i] = K[i]*x[i]; | ||
1962 | \end_layout | ||
1963 | |||
1964 | \begin_layout LyX-Code | ||
1965 | END FOR; | ||
1966 | \end_layout | ||
1967 | |||
1968 | \begin_layout Standard | ||
1969 | The ASCEND interactive user interface identifies relationships by their | ||
1970 | labels. | ||
1971 | If one has not provided such a label, the system generates the label: | ||
1972 | \end_layout | ||
1973 | |||
1974 | \begin_layout LyX-Code | ||
1975 | |||
1976 | \emph on | ||
1977 | modelname_equationnumber | ||
1978 | \end_layout | ||
1979 | |||
1980 | \begin_layout Standard | ||
1981 | where modelname and equationnumber are the name of the model and the equation | ||
1982 | number in the model. | ||
1983 | An example is | ||
1984 | \end_layout | ||
1985 | |||
1986 | \begin_layout LyX-Code | ||
1987 | mixture_14 | ||
1988 | \end_layout | ||
1989 | |||
1990 | \begin_layout Standard | ||
1991 | for the unlabeled 14th relation in the mixture definition. | ||
1992 | If there is a conflict caused with an existing name, the generated name | ||
1993 | has enough letters added after equationnumber to make it a unique name. | ||
1994 | Remember that each model in a refinement hierarchy inherits the equations | ||
1995 | of its less refined ancestors, so the first equation appearing in the source | ||
1996 | code of a refining model may actually be the nth relation in that model. | ||
1997 | \end_layout | ||
1998 | |||
1999 | \end_deeper | ||
2000 | \begin_layout List | ||
2001 | \labelwidthstring 00000.00000.00000.000 | ||
2002 | |||
2003 | \bar under | ||
2004 | Lists | ||
2005 | \bar default | ||
2006 | |||
2007 | \begin_inset LatexCommand \index{lists} | ||
2008 | |||
2009 | \end_inset | ||
2010 | |||
2011 | Often in a statement one can include a list of names or expression. | ||
2012 | A name list is one or more names where multiple list entries are separated | ||
2013 | from each other by commas. | ||
2014 | Examples of a list of names are: | ||
2015 | \end_layout | ||
2016 | |||
2017 | \begin_deeper | ||
2018 | \begin_layout LyX-Code | ||
2019 | \align block | ||
2020 | T1, inlet_T, outlet_T | ||
2021 | \end_layout | ||
2022 | |||
2023 | \begin_layout LyX-Code | ||
2024 | \align block | ||
2025 | y[components], y_in | ||
2026 | \end_layout | ||
2027 | |||
2028 | \begin_layout LyX-Code | ||
2029 | \align block | ||
2030 | stage[1..n_stages] | ||
2031 | \end_layout | ||
2032 | |||
2033 | \end_deeper | ||
2034 | \begin_layout List | ||
2035 | \labelwidthstring 00000.00000.00000.000 | ||
2036 | |||
2037 | \bar under | ||
2038 | Ordered\InsetSpace ~ | ||
2039 | lists | ||
2040 | \begin_inset LatexCommand \index{lists, ordered} | ||
2041 | |||
2042 | \end_inset | ||
2043 | |||
2044 | |||
2045 | \begin_inset LatexCommand \index{ordered lists} | ||
2046 | |||
2047 | \end_inset | ||
2048 | |||
2049 | : | ||
2050 | \bar default | ||
2051 | If the ordering of names in a list matters, that list is enclosed in (). | ||
2052 | Order matters in: calling externally defined methods or models, calling | ||
2053 | most real-valued functions, passing parameters to ASCEND models or methods, | ||
2054 | and declaring the controlling parameters that SELECT, SWITCH, and WHEN | ||
2055 | statements make decisions on. | ||
2056 | \end_layout | ||
2057 | |||
2058 | \begin_deeper | ||
2059 | jpye | 1384 | \begin_layout Section |
2060 | johnpye | 828 | Basic Concepts |
2061 | \end_layout | ||
2062 | |||
2063 | \end_deeper | ||
2064 | \begin_layout List | ||
2065 | \labelwidthstring 00000.00000.00000.000 | ||
2066 | |||
2067 | \bar under | ||
2068 | Instances | ||
2069 | \begin_inset LatexCommand \index{instances} | ||
2070 | |||
2071 | \end_inset | ||
2072 | |||
2073 | \InsetSpace ~ | ||
2074 | and\InsetSpace ~ | ||
2075 | types | ||
2076 | \bar default | ||
2077 | |||
2078 | \begin_inset LatexCommand \index{types} | ||
2079 | |||
2080 | \end_inset | ||
2081 | |||
2082 | This is an opportune time to emphasize the distinction between the terms | ||
2083 | instance and type. | ||
2084 | A type in ASCEND is what we define when we declare an ASCEND model or atom. | ||
2085 | It is the formal definition of the attributes (parts) and attribute default | ||
2086 | values that an object will have if it is created using the type definition. | ||
2087 | Methods are associated with types. | ||
2088 | \end_layout | ||
2089 | |||
2090 | \begin_deeper | ||
2091 | \begin_layout Standard | ||
2092 | In ASCEND there are two meanings (closely related) of an instance. | ||
2093 | |||
2094 | \end_layout | ||
2095 | |||
2096 | \begin_layout Itemize | ||
2097 | An instance is a named part that exists within a type definition. | ||
2098 | |||
2099 | \end_layout | ||
2100 | |||
2101 | \begin_layout Itemize | ||
2102 | An instance is a compiled object. | ||
2103 | |||
2104 | \end_layout | ||
2105 | |||
2106 | \begin_layout Standard | ||
2107 | If one is in the context of the ASCEND interface, the system compiles an | ||
2108 | instance of a model type to create an object with which one carries out | ||
2109 | computations. | ||
2110 | The system requires the user to give a simple name for this simulation | ||
2111 | instance. | ||
2112 | This name given is then the first part of the qualified name for all the | ||
2113 | parts of the compiled object. | ||
2114 | \end_layout | ||
2115 | |||
2116 | \end_deeper | ||
2117 | \begin_layout List | ||
2118 | \labelwidthstring 00000.00000.00000.000 | ||
2119 | |||
2120 | \bar under | ||
2121 | Implicit\InsetSpace ~ | ||
2122 | types | ||
2123 | \bar default | ||
2124 | |||
2125 | \begin_inset LatexCommand \index{types, implicit} | ||
2126 | |||
2127 | \end_inset | ||
2128 | |||
2129 | |||
2130 | \begin_inset LatexCommand \index{types, implicit} | ||
2131 | |||
2132 | \end_inset | ||
2133 | |||
2134 | It is possible to create an instance that does not have a corresponding | ||
2135 | type definition in the library. | ||
2136 | jpye | 1384 | The type of such an instance is said to be |
2137 | \series bold | ||
2138 | implicit | ||
2139 | \series default | ||
2140 | |||
2141 | \begin_inset Foot | ||
2142 | status collapsed | ||
2143 | |||
2144 | \begin_layout Standard | ||
2145 | (Some people use the word | ||
2146 | \emph on | ||
2147 | anonymous | ||
2148 | \emph default | ||
2149 | |||
2150 | johnpye | 828 | \begin_inset LatexCommand \index{type, anonymous} |
2151 | |||
2152 | \end_inset | ||
2153 | |||
2154 | |||
2155 | \begin_inset LatexCommand \index{anonymous type} | ||
2156 | |||
2157 | \end_inset | ||
2158 | |||
2159 | . | ||
2160 | However, no computable type is anonymous and the implicit type of an instance | ||
2161 | jpye | 1384 | is theoretically computable) |
2162 | \end_layout | ||
2163 | |||
2164 | \end_inset | ||
2165 | |||
2166 | . | ||
2167 | johnpye | 828 | The simplest example of an implicit type is the type of an instance compiled |
2168 | jpye | 1384 | from the built-in definition |
2169 | \family sans | ||
2170 | integer_constant | ||
2171 | \family default | ||
2172 | . | ||
2173 | johnpye | 828 | For example: |
2174 | \end_layout | ||
2175 | |||
2176 | \begin_deeper | ||
2177 | \begin_layout LyX-Code | ||
2178 | i, j IS_A integer_constant; | ||
2179 | \end_layout | ||
2180 | |||
2181 | \begin_layout LyX-Code | ||
2182 | i:== 2; | ||
2183 | \end_layout | ||
2184 | |||
2185 | \begin_layout LyX-Code | ||
2186 | j:== 3; | ||
2187 | \end_layout | ||
2188 | |||
2189 | \begin_layout Standard | ||
2190 | jpye | 1384 | Instances |
2191 | \family typewriter | ||
2192 | i | ||
2193 | \family default | ||
2194 | and | ||
2195 | \family typewriter | ||
2196 | j | ||
2197 | \family default | ||
2198 | , though of the same formal type, are implicit type incompatible because | ||
2199 | they have been assigned distinct values. | ||
2200 | johnpye | 828 | \end_layout |
2201 | |||
2202 | \begin_layout Standard | ||
2203 | Instances which are either formally or implicitly type incompatible cannot | ||
2204 | be merged. | ||
2205 | This will be discussed further in Section | ||
2206 | \begin_inset LatexCommand \vref{sec:x.3Declarative-statements} | ||
2207 | |||
2208 | \end_inset | ||
2209 | |||
2210 | . | ||
2211 | \end_layout | ||
2212 | |||
2213 | \end_deeper | ||
2214 | \begin_layout List | ||
2215 | \labelwidthstring 00000.00000.00000.000 | ||
2216 | Parsing | ||
2217 | \begin_inset LatexCommand \index{parsing} | ||
2218 | |||
2219 | \end_inset | ||
2220 | |||
2221 | Most errors in the declaration of an ASCEND model can be caught at parse | ||
2222 | time because the object type of any well-formed name in an ASCEND definition | ||
2223 | can be resolved or proved ambiguous. | ||
2224 | We cannot prove at parse time whether a specific array element will exist, | ||
2225 | but we can know that should such an element exist, it must be of the type | ||
2226 | with which the array is defined. | ||
2227 | |||
2228 | \end_layout | ||
2229 | |||
2230 | \begin_deeper | ||
2231 | \begin_layout Standard | ||
2232 | Ambiguity is warned about loudly because it is caused by either misspelling | ||
2233 | or poor modeling style. | ||
2234 | The simplest example of ambiguity follows. | ||
2235 | \end_layout | ||
2236 | |||
2237 | \begin_layout Standard | ||
2238 | Assume a type, stream, and a refinement of stream, heat_stream, which adds | ||
2239 | jpye | 1384 | the new variable |
2240 | \family typewriter | ||
2241 | H | ||
2242 | \family default | ||
2243 | . | ||
2244 | johnpye | 828 | Now, if we write: |
2245 | \end_layout | ||
2246 | |||
2247 | \begin_layout LyX-Code | ||
2248 | MODEL mixer; | ||
2249 | \end_layout | ||
2250 | |||
2251 | \begin_layout LyX-Code | ||
2252 | input[1..2] IS_A stream; | ||
2253 | \end_layout | ||
2254 | |||
2255 | \begin_layout LyX-Code | ||
2256 | output IS_A heat_stream; | ||
2257 | \end_layout | ||
2258 | |||
2259 | \begin_layout LyX-Code | ||
2260 | input[1].H + input[2].H = output.H; | ||
2261 | \end_layout | ||
2262 | |||
2263 | \begin_layout LyX-Code | ||
2264 | END mixer; | ||
2265 | \end_layout | ||
2266 | |||
2267 | \begin_layout Standard | ||
2268 | We see the parser can find the definition of H in the type heat_stream, | ||
2269 | jpye | 1384 | so |
2270 | \family typewriter | ||
2271 | output.H | ||
2272 | \family default | ||
2273 | is well defined. | ||
2274 | The author of the mixer model may intend to refine | ||
2275 | \family typewriter | ||
2276 | input[1] | ||
2277 | \family default | ||
2278 | and | ||
2279 | \family typewriter | ||
2280 | input[2] | ||
2281 | \family default | ||
2282 | johnpye | 828 | to be objects of different types, say steam_stream and electric_stream, |
2283 | jpye | 1384 | where each defines an |
2284 | \family typewriter | ||
2285 | H | ||
2286 | \family default | ||
2287 | suitable for use in the equation. | ||
2288 | The parser cannot read the authors mind, so it warns that | ||
2289 | \family typewriter | ||
2290 | input[1].H | ||
2291 | \family default | ||
2292 | and | ||
2293 | \family typewriter | ||
2294 | input[2].H | ||
2295 | \family default | ||
2296 | are ambiguous in the mixer definition. | ||
2297 | johnpye | 828 | The mixer model is not highly reusable except by the author, but sometimes |
2298 | reusability is not a high priority objective. | ||
2299 | The mixer definition is allowed, but it may cause problems in instantiation | ||
2300 | if the author has forgotten the assumption that is not explicitly stated | ||
2301 | in the model and neglects to refine the input streams appropriately. | ||
2302 | \end_layout | ||
2303 | |||
2304 | \end_deeper | ||
2305 | \begin_layout List | ||
2306 | \labelwidthstring 00000.00000.00000.000 | ||
2307 | |||
2308 | \bar under | ||
2309 | Instantiation | ||
2310 | \bar default | ||
2311 | |||
2312 | \begin_inset LatexCommand \index{instantiation} | ||
2313 | |||
2314 | \end_inset | ||
2315 | |||
2316 | Creating an simulation based on a type definition is a multi-phase | ||
2317 | \begin_inset LatexCommand \index{multi-phase} | ||
2318 | |||
2319 | \end_inset | ||
2320 | |||
2321 | process called compiling | ||
2322 | \begin_inset LatexCommand \index{compiling} | ||
2323 | |||
2324 | \end_inset | ||
2325 | |||
2326 | (or instantiation). | ||
2327 | When an instantiation cannot be completed because some structural parameter | ||
2328 | (a symbol_constant, real_constant, boolean_constant, integer_constant, | ||
2329 | or set) does not have a value there will be PENDING | ||
2330 | \begin_inset LatexCommand \index{PENDING} | ||
2331 | |||
2332 | \end_inset | ||
2333 | |||
2334 | statements. | ||
2335 | The user interface will warn that something is incomplete. | ||
2336 | \end_layout | ||
2337 | |||
2338 | \begin_deeper | ||
2339 | \begin_layout Standard | ||
2340 | In phase | ||
2341 | \begin_inset LatexCommand \index{phases, compiler} | ||
2342 | |||
2343 | \end_inset | ||
2344 | |||
2345 | 1 all statements that create instance structures or assign constant values | ||
2346 | are executed. | ||
2347 | This phase theoretically requires an infinite number of passes through | ||
2348 | the structural statements of a definition. | ||
2349 | We allow a maximum of 5 and have never needed more than 3. | ||
2350 | There may be pending statements at the end of phase 1. | ||
2351 | The compiler or interface will issue warnings about pending statements, | ||
2352 | starting with warnings about unassigned constants. | ||
2353 | \end_layout | ||
2354 | |||
2355 | \begin_layout Standard | ||
2356 | Phase 2 compiles as many real arithmetic relation definitions as possible. | ||
2357 | Some relations may be impossible to compile because the constants or sets | ||
2358 | they depend on do not have values assigned. | ||
2359 | Other relations may be impossible because they reference variables that | ||
2360 | do not exist. | ||
2361 | This is determined in a single pass. | ||
2362 | \end_layout | ||
2363 | |||
2364 | \begin_layout Standard | ||
2365 | Phase 3 compiles as many logical arithmetic relation definitions as possible. | ||
2366 | Some relations may be impossible to compile because the constants or sets | ||
2367 | they depend on do not have values assigned. | ||
2368 | Other relations may be impossible because they reference real arithmetic | ||
2369 | relations that do not exist. | ||
2370 | This is determined in a single pass. | ||
2371 | \end_layout | ||
2372 | |||
2373 | \begin_layout Standard | ||
2374 | jpye | 1384 | Phase 4 compiles as many conditional programming statements ( |
2375 | \family sans | ||
2376 | WHEN | ||
2377 | \family default | ||
2378 | s) as possible. | ||
2379 | Some | ||
2380 | \family sans | ||
2381 | WHEN | ||
2382 | \family default | ||
2383 | relations may be impossible to compile because the discrete variables, | ||
2384 | models, or relations they depend on do not exist. | ||
2385 | johnpye | 828 | This is determined in a single pass. |
2386 | \end_layout | ||
2387 | |||
2388 | \begin_layout Standard | ||
2389 | Phase 5 executes the variable defaulting statements made in the declarative | ||
2390 | jpye | 1384 | section of each model |
2391 | \emph on | ||
2392 | if and only if | ||
2393 | \emph default | ||
2394 | there are no pending statements from phases 1-4 anywhere in the simulation. | ||
2395 | johnpye | 828 | \end_layout |
2396 | |||
2397 | \end_deeper | ||
2398 | \begin_layout List | ||
2399 | \labelwidthstring 00000.00000.00000.000 | ||
2400 | default_self | ||
2401 | \begin_inset LatexCommand \index{default\_self} | ||
2402 | |||
2403 | \end_inset | ||
2404 | |||
2405 | After all phases are done, the method default_self is called in the top-most | ||
2406 | model of the simulation, if this method exists. | ||
2407 | \end_layout | ||
2408 | |||
2409 | \begin_deeper | ||
2410 | \begin_layout Standard | ||
2411 | The first occurrence of each impossible statement will be explained during | ||
2412 | a failed compilation. | ||
2413 | Impossible statements include: | ||
2414 | \end_layout | ||
2415 | |||
2416 | \begin_layout Itemize | ||
2417 | Relations containing undefinable variables (often misspellings). | ||
2418 | \end_layout | ||
2419 | |||
2420 | \begin_layout Itemize | ||
2421 | Assignments that are dimensionally inconsistent or containing mismatched | ||
2422 | types. | ||
2423 | \end_layout | ||
2424 | |||
2425 | \begin_layout Itemize | ||
2426 | Structure building or modifying statements that refer to model parts which | ||
2427 | cannot exist or that require a type-incompatible argument, refinement, | ||
2428 | or merge. | ||
2429 | \end_layout | ||
2430 | |||
2431 | jpye | 1384 | \begin_layout Chapter |
2432 | johnpye | 828 | Data Type Declarations |
2433 | \begin_inset LatexCommand \index{data type declarations} | ||
2434 | |||
2435 | \end_inset | ||
2436 | |||
2437 | |||
2438 | \end_layout | ||
2439 | |||
2440 | \begin_layout Standard | ||
2441 | In the spectrum of OO languages, ASCEND is best considered as being class-based | ||
2442 | \begin_inset LatexCommand \index{class-based} | ||
2443 | |||
2444 | \end_inset | ||
2445 | |||
2446 | , though it is rather more a hybrid. | ||
2447 | jpye | 1384 | We have atom and model definitions, called |
2448 | \series bold | ||
2449 | types | ||
2450 | \series default | ||
2451 | , and the compiled objects themselves, called | ||
2452 | \series bold | ||
2453 | instances | ||
2454 | \series default | ||
2455 | . | ||
2456 | johnpye | 828 | ASCEND instances have a record of what type they were constructed from. |
2457 | \end_layout | ||
2458 | |||
2459 | \end_deeper | ||
2460 | \begin_layout List | ||
2461 | \labelwidthstring 00000.00000.00000.000 | ||
2462 | |||
2463 | \bar under | ||
2464 | Type\InsetSpace ~ | ||
2465 | qualifiers | ||
2466 | \begin_inset LatexCommand \index{type qualifiers} | ||
2467 | |||
2468 | \end_inset | ||
2469 | |||
2470 | : | ||
2471 | \end_layout | ||
2472 | |||
2473 | \begin_layout List | ||
2474 | \labelwidthstring 00000.00000.00000.000 | ||
2475 | jpye | 1384 | |
2476 | \family sans | ||
2477 | johnpye | 828 | UNIVERSAL |
2478 | jpye | 1384 | \family default |
2479 | |||
2480 | johnpye | 828 | \begin_inset LatexCommand \index{UNIVERSAL} |
2481 | |||
2482 | \end_inset | ||
2483 | |||
2484 | jpye | 1384 | Universal is an optional modifier of all |
2485 | \family sans | ||
2486 | ATOM | ||
2487 | \family default | ||
2488 | , | ||
2489 | \family sans | ||
2490 | CONSTANT | ||
2491 | \family default | ||
2492 | and | ||
2493 | \family sans | ||
2494 | MODEL | ||
2495 | \family default | ||
2496 | definitions. | ||
2497 | If | ||
2498 | \family sans | ||
2499 | UNIVERSAL | ||
2500 | \family default | ||
2501 | precedes the definition, then | ||
2502 | \emph on | ||
2503 | all | ||
2504 | \emph default | ||
2505 | instances of that type will actually refer to the first instance of the | ||
2506 | type that is created. | ||
2507 | johnpye | 828 | This saves memory and ensures global consistency of data. |
2508 | |||
2509 | \end_layout | ||
2510 | |||
2511 | \begin_deeper | ||
2512 | \begin_layout Standard | ||
2513 | Examples of universal type definitions are | ||
2514 | \end_layout | ||
2515 | |||
2516 | \begin_layout LyX-Code | ||
2517 | UNIVERSAL MODEL methane | ||
2518 | \end_layout | ||
2519 | |||
2520 | \begin_layout LyX-Code | ||
2521 | REFINES generic_component_model; | ||
2522 | \end_layout | ||
2523 | |||
2524 | \begin_layout LyX-Code | ||
2525 | UNIVERSAL CONSTANT circle_constant | ||
2526 | \end_layout | ||
2527 | |||
2528 | \begin_layout LyX-Code | ||
2529 | REFINES real_constant :== 1{PI}; | ||
2530 | \end_layout | ||
2531 | |||
2532 | \begin_layout LyX-Code | ||
2533 | UNIVERSAL ATOM counter_1 | ||
2534 | \end_layout | ||
2535 | |||
2536 | \begin_layout LyX-Code | ||
2537 | REFINES integer; | ||
2538 | \end_layout | ||
2539 | |||
2540 | \end_deeper | ||
2541 | \begin_layout List | ||
2542 | \labelwidthstring 00000.00000.00000.000 | ||
2543 | Tip:\InsetSpace ~ | ||
2544 | Do\InsetSpace ~ | ||
2545 | not\InsetSpace ~ | ||
2546 | use\InsetSpace ~ | ||
2547 | jpye | 1384 | |
2548 | \family sans | ||
2549 | UNIVERSAL | ||
2550 | \family default | ||
2551 | \InsetSpace ~ | ||
2552 | johnpye | 828 | variables\InsetSpace ~ |
2553 | in\InsetSpace ~ | ||
2554 | relations. | ||
2555 | \end_layout | ||
2556 | |||
2557 | \begin_deeper | ||
2558 | \begin_layout Standard | ||
2559 | jpye | 1384 | It is important to note that, because |
2560 | \emph on | ||
2561 | variables | ||
2562 | \emph default | ||
2563 | must store information about which relations they occur in, it is a very | ||
2564 | bad idea to use | ||
2565 | \family sans | ||
2566 | UNIVERSAL | ||
2567 | \family default | ||
2568 | typed variables in relations. | ||
2569 | johnpye | 828 | The construction and maintenance of the relation list becomes very expensive |
2570 | for universal variables. | ||
2571 | jpye | 1384 | |
2572 | \family sans | ||
2573 | UNIVERSAL | ||
2574 | \family default | ||
2575 | |||
2576 | \emph on | ||
2577 | constants | ||
2578 | \emph default | ||
2579 | are fine to use, though, because there are no relation links for constants. | ||
2580 | johnpye | 828 | \end_layout |
2581 | |||
2582 | jpye | 1384 | \begin_layout Section |
2583 | johnpye | 828 | Models |
2584 | \end_layout | ||
2585 | |||
2586 | \end_deeper | ||
2587 | \begin_layout List | ||
2588 | \labelwidthstring 00000.00000.00000.000 | ||
2589 | jpye | 1384 | |
2590 | \family sans | ||
2591 | johnpye | 828 | MODEL |
2592 | jpye | 1384 | \family default |
2593 | |||
2594 | johnpye | 828 | \begin_inset LatexCommand \index{MODEL} |
2595 | |||
2596 | \end_inset | ||
2597 | |||
2598 | An ASCEND model has a declarative part and an optional procedural part | ||
2599 | headed by the METHODS word. | ||
2600 | Models are essentially containers for variables and relations. | ||
2601 | We will explain the various statements that can be made within models in | ||
2602 | Section | ||
2603 | \begin_inset LatexCommand \vref{sec:x.3Declarative-statements} | ||
2604 | |||
2605 | \end_inset | ||
2606 | |||
2607 | and Section | ||
2608 | \begin_inset LatexCommand \vref{sec:x.4Procedural-statements} | ||
2609 | |||
2610 | \end_inset | ||
2611 | |||
2612 | . | ||
2613 | \end_layout | ||
2614 | |||
2615 | \begin_layout Standard | ||
2616 | Simple\InsetSpace ~ | ||
2617 | models | ||
2618 | \begin_inset LatexCommand \index{models, simple} | ||
2619 | |||
2620 | \end_inset | ||
2621 | |||
2622 | : | ||
2623 | \end_layout | ||
2624 | |||
2625 | \begin_layout List | ||
2626 | \labelwidthstring 00000.00000.00000.000 | ||
2627 | foo | ||
2628 | \family typewriter | ||
2629 | \InsetSpace ~ | ||
2630 | \InsetSpace ~ | ||
2631 | \InsetSpace ~ | ||
2632 | \InsetSpace ~ | ||
2633 | MODEL foo; | ||
2634 | \end_layout | ||
2635 | |||
2636 | \begin_deeper | ||
2637 | \begin_layout LyX-Code | ||
2638 | (* statements about foo go here*) | ||
2639 | \end_layout | ||
2640 | |||
2641 | \begin_layout LyX-Code | ||
2642 | METHODS | ||
2643 | \end_layout | ||
2644 | |||
2645 | \begin_layout LyX-Code | ||
2646 | (* METHODs for foo go here*) | ||
2647 | \end_layout | ||
2648 | |||
2649 | \begin_layout LyX-Code | ||
2650 | END foo; | ||
2651 | \end_layout | ||
2652 | |||
2653 | \end_deeper | ||
2654 | \begin_layout List | ||
2655 | \labelwidthstring 00000.00000.00000.000 | ||
2656 | bar | ||
2657 | \family typewriter | ||
2658 | \InsetSpace ~ | ||
2659 | \InsetSpace ~ | ||
2660 | \InsetSpace ~ | ||
2661 | \InsetSpace ~ | ||
2662 | MODEL bar REFINES foo; | ||
2663 | \end_layout | ||
2664 | |||
2665 | \begin_deeper | ||
2666 | \begin_layout LyX-Code | ||
2667 | (*additional statements about foo *) | ||
2668 | \end_layout | ||
2669 | |||
2670 | \begin_layout LyX-Code | ||
2671 | METHODS | ||
2672 | \end_layout | ||
2673 | |||
2674 | \begin_layout LyX-Code | ||
2675 | (* additional METHODs for bar *) | ||
2676 | \end_layout | ||
2677 | |||
2678 | \begin_layout LyX-Code | ||
2679 | END bar; | ||
2680 | \end_layout | ||
2681 | |||
2682 | \end_deeper | ||
2683 | \begin_layout List | ||
2684 | \labelwidthstring 00000.00000.00000.000 | ||
2685 | |||
2686 | \bar under | ||
2687 | Parameterized\InsetSpace ~ | ||
2688 | Models | ||
2689 | \bar default | ||
2690 | |||
2691 | \begin_inset LatexCommand \index{models, parameterized} | ||
2692 | |||
2693 | \end_inset | ||
2694 | |||
2695 | jpye | 1384 | Parameterizing models makes them easier to understand and faster for the |
2696 | system to compile. | ||
2697 | johnpye | 828 | The syntax for a parameterized model vaguely resembles a function call |
2698 | in imperative languages, but it is NOT. | ||
2699 | When constructing a reusable model, all the constants that determine the | ||
2700 | sizes of arrays and other structures should be declared in the parameter | ||
2701 | list so that | ||
2702 | \end_layout | ||
2703 | |||
2704 | \begin_deeper | ||
2705 | \begin_layout Itemize | ||
2706 | the user knows what is required to reuse the model. | ||
2707 | \end_layout | ||
2708 | |||
2709 | \begin_layout Itemize | ||
2710 | the compiler knows what values must be set before it should bother attempting | ||
2711 | to compile the model. | ||
2712 | \end_layout | ||
2713 | |||
2714 | \begin_layout Standard | ||
2715 | There is no reason that other items could not also go in the parameter list, | ||
2716 | such as key variables which might be considered inputs or outputs or control | ||
2717 | parameters in the mathematical application of the model. | ||
2718 | A simple example of parameterization would be: | ||
2719 | \end_layout | ||
2720 | |||
2721 | \end_deeper | ||
2722 | \begin_layout List | ||
2723 | \labelwidthstring 00000.00000.00000.000 | ||
2724 | column(n,s) | ||
2725 | \end_layout | ||
2726 | |||
2727 | \begin_deeper | ||
2728 | \begin_layout LyX-Code | ||
2729 | MODEL column( | ||
2730 | \end_layout | ||
2731 | |||
2732 | \begin_layout LyX-Code | ||
2733 | ntrays WILL_BE integer_constant; | ||
2734 | \end_layout | ||
2735 | |||
2736 | \begin_layout LyX-Code | ||
2737 | components IS_A set of symbol_constant; | ||
2738 | \end_layout | ||
2739 | |||
2740 | \begin_layout LyX-Code | ||
2741 | ); | ||
2742 | \end_layout | ||
2743 | |||
2744 | \begin_layout LyX-Code | ||
2745 | stage[1..ntrays] IS_A simple_tray; | ||
2746 | \end_layout | ||
2747 | |||
2748 | \begin_layout LyX-Code | ||
2749 | END column; | ||
2750 | \end_layout | ||
2751 | |||
2752 | \end_deeper | ||
2753 | \begin_layout List | ||
2754 | \labelwidthstring 00000.00000.00000.000 | ||
2755 | flowsheet | ||
2756 | \end_layout | ||
2757 | |||
2758 | \begin_deeper | ||
2759 | \begin_layout LyX-Code | ||
2760 | MODEL flowsheet; | ||
2761 | \end_layout | ||
2762 | |||
2763 | \begin_layout LyX-Code | ||
2764 | tower4size IS_A integer_constant; | ||
2765 | \end_layout | ||
2766 | |||
2767 | \begin_layout LyX-Code | ||
2768 | tower4size :== 22; | ||
2769 | \end_layout | ||
2770 | |||
2771 | \begin_layout LyX-Code | ||
2772 | ct IS_A column(tower4size,[c5,c6]); | ||
2773 | \end_layout | ||
2774 | |||
2775 | \begin_layout LyX-Code | ||
2776 | (* additional flowsheet statements *) | ||
2777 | \end_layout | ||
2778 | |||
2779 | \begin_layout LyX-Code | ||
2780 | END flowsheet; | ||
2781 | \end_layout | ||
2782 | |||
2783 | \begin_layout Standard | ||
2784 | In this example, the column model takes the first argument, ntrays, by reference. | ||
2785 | jpye | 1384 | That is, |
2786 | \family typewriter | ||
2787 | ct.ntrays | ||
2788 | \family default | ||
2789 | is an alias for the flowsheet instance | ||
2790 | \family typewriter | ||
2791 | tower4size | ||
2792 | \family default | ||
2793 | . | ||
2794 | johnpye | 828 | |
2795 | jpye | 1384 | \family typewriter |
2796 | tower4size | ||
2797 | \family default | ||
2798 | must be compiled and assigned a value before we will attempt to compile | ||
2799 | the column model instance | ||
2800 | \family typewriter | ||
2801 | ct | ||
2802 | \family default | ||
2803 | . | ||
2804 | The second argument is taken by value, | ||
2805 | \family typewriter | ||
2806 | [c5,c6] | ||
2807 | \family default | ||
2808 | , and assigned to components, a column part that was declared with | ||
2809 | \family sans | ||
2810 | IS_A | ||
2811 | \family default | ||
2812 | in the parameter list. | ||
2813 | There is only one name for this set, | ||
2814 | \family typewriter | ||
2815 | ct.components | ||
2816 | \family default | ||
2817 | . | ||
2818 | Note that in the | ||
2819 | \family typewriter | ||
2820 | flowsheet | ||
2821 | \family default | ||
2822 | model there is no part that is a set of | ||
2823 | \family sans | ||
2824 | symbol_constant | ||
2825 | \family default | ||
2826 | . | ||
2827 | |||
2828 | johnpye | 828 | \end_layout |
2829 | |||
2830 | \begin_layout Standard | ||
2831 | The use of parameters in ASCEND modeling requires some thought, and we will | ||
2832 | present that set of thoughts in Section | ||
2833 | \begin_inset LatexCommand \vref{sec:x.5Parameterized-models} | ||
2834 | |||
2835 | \end_inset | ||
2836 | |||
2837 | . | ||
2838 | Beginners may wish to create new models without parameters until they are | ||
2839 | comfortable using the existing parameterized library definitions. | ||
2840 | Parameters are intended to support model reuse and efficient compilation | ||
2841 | which are not issues in the very earliest phase of developing novel models. | ||
2842 | \end_layout | ||
2843 | |||
2844 | jpye | 1384 | \begin_layout Section |
2845 | johnpye | 828 | Sets |
2846 | \begin_inset LatexCommand \index{sets} | ||
2847 | |||
2848 | \end_inset | ||
2849 | |||
2850 | |||
2851 | \begin_inset LatexCommand \label{sub:x.2.2Sets} | ||
2852 | |||
2853 | \end_inset | ||
2854 | |||
2855 | |||
2856 | \end_layout | ||
2857 | |||
2858 | \begin_layout Standard | ||
2859 | Arrays in ASCEND, as already discussed in Section | ||
2860 | \begin_inset LatexCommand \vref{sub:x.1.2Basic-Elements} | ||
2861 | |||
2862 | \end_inset | ||
2863 | |||
2864 | , are defined over sets. | ||
2865 | A set is simply an instance with a set value. | ||
2866 | jpye | 1384 | The elements of sets are |
2867 | \emph on | ||
2868 | not | ||
2869 | \emph default | ||
2870 | instances or sets. | ||
2871 | johnpye | 828 | \end_layout |
2872 | |||
2873 | \end_deeper | ||
2874 | \begin_layout List | ||
2875 | \labelwidthstring 00000.00000.00000.000 | ||
2876 | |||
2877 | \bar under | ||
2878 | Set\InsetSpace ~ | ||
2879 | Declaration: | ||
2880 | \bar default | ||
2881 | A set is made of either symbol_constants or integer_constants, so a set | ||
2882 | object is declared in one of two ways: | ||
2883 | \end_layout | ||
2884 | |||
2885 | \begin_deeper | ||
2886 | \begin_layout LyX-Code | ||
2887 | my_integer_set IS_A set OF integer_constant; | ||
2888 | \end_layout | ||
2889 | |||
2890 | \begin_layout Standard | ||
2891 | or | ||
2892 | \end_layout | ||
2893 | |||
2894 | \begin_layout LyX-Code | ||
2895 | my_symbol_set IS_A set OF symbol_constant; | ||
2896 | \end_layout | ||
2897 | |||
2898 | \end_deeper | ||
2899 | \begin_layout List | ||
2900 | \labelwidthstring 00000.00000.00000.000 | ||
2901 | jpye | 1384 | |
2902 | \family typewriter | ||
2903 | johnpye | 828 | :== |
2904 | jpye | 1384 | \family default |
2905 | |||
2906 | johnpye | 828 | \begin_inset LatexCommand \index{:==} |
2907 | |||
2908 | \end_inset | ||
2909 | |||
2910 | A set is assigned a value like so: | ||
2911 | \end_layout | ||
2912 | |||
2913 | \begin_deeper | ||
2914 | \begin_layout LyX-Code | ||
2915 | my_integer_set :== [1,4]; | ||
2916 | \end_layout | ||
2917 | |||
2918 | \begin_layout Standard | ||
2919 | The RHS of such an assignment must be either the name of another set instance | ||
2920 | or an expression enclosed in square brackets and made up of only set operators, | ||
2921 | other sets, and the names of integer_constants or symbol_constants. | ||
2922 | Sets can only be assigned once. | ||
2923 | \end_layout | ||
2924 | |||
2925 | \end_deeper | ||
2926 | \begin_layout List | ||
2927 | \labelwidthstring 00000.00000.00000.000 | ||
2928 | |||
2929 | \bar under | ||
2930 | Set\InsetSpace ~ | ||
2931 | Operations | ||
2932 | \bar default | ||
2933 | jpye | 1384 | |
2934 | \family sans | ||
2935 | UNION | ||
2936 | \family default | ||
2937 | |||
2938 | johnpye | 828 | \begin_inset LatexCommand \index{UNION} |
2939 | |||
2940 | \end_inset | ||
2941 | |||
2942 | jpye | 1384 | |
2943 | \family typewriter | ||
2944 | johnpye | 828 | [setlist] |
2945 | \end_layout | ||
2946 | |||
2947 | \begin_deeper | ||
2948 | \begin_layout Standard | ||
2949 | A function taken over a list of sets. | ||
2950 | The result is the set that includes all the members of all the sets in | ||
2951 | the list. | ||
2952 | jpye | 1384 | Note that the result of the |
2953 | \family sans | ||
2954 | UNION | ||
2955 | \family default | ||
2956 | operation is an unordered set and the argument order to the union function | ||
2957 | does not matter. | ||
2958 | johnpye | 828 | The syntax is: |
2959 | \end_layout | ||
2960 | |||
2961 | \end_deeper | ||
2962 | \begin_layout List | ||
2963 | \labelwidthstring 00000.00000.00000.000 | ||
2964 | + | ||
2965 | \begin_inset LatexCommand \index{+, sets} | ||
2966 | |||
2967 | \end_inset | ||
2968 | |||
2969 | jpye | 1384 | |
2970 | \family typewriter | ||
2971 | UNION[list_of_sets] | ||
2972 | johnpye | 828 | \end_layout |
2973 | |||
2974 | \begin_layout List | ||
2975 | \labelwidthstring 00000.00000.00000.000 | ||
2976 | jpye | 1384 | |
2977 | \family typewriter | ||
2978 | A+B | ||
2979 | \family default | ||
2980 | \InsetSpace ~ | ||
2981 | johnpye | 828 | is\InsetSpace ~ |
2982 | shorthand\InsetSpace ~ | ||
2983 | jpye | 1384 | for |
2984 | \family typewriter | ||
2985 | UNION[A,B] | ||
2986 | johnpye | 828 | \end_layout |
2987 | |||
2988 | \begin_deeper | ||
2989 | \begin_layout Standard | ||
2990 | Consider the following sets for the examples to follow. | ||
2991 | \end_layout | ||
2992 | |||
2993 | \begin_layout LyX-Code | ||
2994 | A := [1, 2, 3, 5, 9]; | ||
2995 | \end_layout | ||
2996 | |||
2997 | \begin_layout LyX-Code | ||
2998 | B := [2, 4, 6, 8]; | ||
2999 | \end_layout | ||
3000 | |||
3001 | \begin_layout Standard | ||
3002 | jpye | 1384 | Then |
3003 | \family typewriter | ||
3004 | UNION[A, B] | ||
3005 | \family default | ||
3006 | is equal to the set | ||
3007 | \family typewriter | ||
3008 | [1, 2, 3, 4, 5, 6, 8, 9] | ||
3009 | \family default | ||
3010 | which equals | ||
3011 | \family typewriter | ||
3012 | [1..6, 8, 9] | ||
3013 | \family default | ||
3014 | which equals | ||
3015 | \family typewriter | ||
3016 | [[1..9] - [7]] | ||
3017 | \family default | ||
3018 | . | ||
3019 | johnpye | 828 | \end_layout |
3020 | |||
3021 | \end_deeper | ||
3022 | \begin_layout List | ||
3023 | \labelwidthstring 00000.00000.00000.000 | ||
3024 | jpye | 1384 | |
3025 | \family sans | ||
3026 | johnpye | 828 | INTERSECTION |
3027 | jpye | 1384 | \family default |
3028 | |||
3029 | johnpye | 828 | \begin_inset LatexCommand \index{INTERSECTION} |
3030 | |||
3031 | \end_inset | ||
3032 | |||
3033 | [] INTERSECTION[list of set expressions]. | ||
3034 | Finds the intersection (and) of the sets listed. | ||
3035 | |||
3036 | \end_layout | ||
3037 | |||
3038 | \begin_layout List | ||
3039 | \labelwidthstring 00000.00000.00000.000 | ||
3040 | * | ||
3041 | \begin_inset LatexCommand \index{*, sets} | ||
3042 | |||
3043 | \end_inset | ||
3044 | |||
3045 | jpye | 1384 | Equivalent to |
3046 | \family sans | ||
3047 | INTERSECTION | ||
3048 | \family typewriter | ||
3049 | [list_of_sets] | ||
3050 | \family default | ||
3051 | . | ||
3052 | johnpye | 828 | \end_layout |
3053 | |||
3054 | \begin_layout List | ||
3055 | \labelwidthstring 00000.00000.00000.000 | ||
3056 | jpye | 1384 | |
3057 | \family typewriter | ||
3058 | A*B | ||
3059 | \family default | ||
3060 | \InsetSpace ~ | ||
3061 | johnpye | 828 | is\InsetSpace ~ |
3062 | shorthand\InsetSpace ~ | ||
3063 | for\InsetSpace ~ | ||
3064 | jpye | 1384 | I |
3065 | \family typewriter | ||
3066 | NTERSECTION[A,B] | ||
3067 | johnpye | 828 | \end_layout |
3068 | |||
3069 | \begin_deeper | ||
3070 | \begin_layout Standard | ||
3071 | jpye | 1384 | For the sets A and B defined just above, |
3072 | \family typewriter | ||
3073 | INTERSECTION[A, B] | ||
3074 | \family default | ||
3075 | is the set | ||
3076 | \family typewriter | ||
3077 | [2] | ||
3078 | \family default | ||
3079 | . | ||
3080 | The | ||
3081 | \family typewriter | ||
3082 | * | ||
3083 | \family default | ||
3084 | shorthand for intersection is | ||
3085 | \emph on | ||
3086 | not | ||
3087 | \emph default | ||
3088 | recommended for use except in libraries no one will look at. | ||
3089 | johnpye | 828 | \end_layout |
3090 | |||
3091 | \end_deeper | ||
3092 | \begin_layout List | ||
3093 | \labelwidthstring 00000.00000.00000.000 | ||
3094 | Set\InsetSpace ~ | ||
3095 | difference | ||
3096 | \begin_inset LatexCommand \index{set difference} | ||
3097 | |||
3098 | \end_inset | ||
3099 | |||
3100 | : One can subtract one set from another. | ||
3101 | The result is the first set less any members in the set union of the first | ||
3102 | and second set. | ||
3103 | The syntax is | ||
3104 | \end_layout | ||
3105 | |||
3106 | jpye | 1384 | \begin_deeper |
3107 | \begin_layout LyX-Code | ||
3108 | |||
3109 | \family typewriter | ||
3110 | first_set | ||
3111 | \family default | ||
3112 | johnpye | 828 | - |
3113 | \begin_inset LatexCommand \index{-, sets} | ||
3114 | |||
3115 | \end_inset | ||
3116 | |||
3117 | jpye | 1384 | |
3118 | johnpye | 828 | \family typewriter |
3119 | jpye | 1384 | second_set |
3120 | johnpye | 828 | \end_layout |
3121 | |||
3122 | \begin_layout Standard | ||
3123 | jpye | 1384 | For the sets |
3124 | \family typewriter | ||
3125 | A | ||
3126 | \family default | ||
3127 | and | ||
3128 | \family typewriter | ||
3129 | B | ||
3130 | \family default | ||
3131 | defined above, the set difference | ||
3132 | \family typewriter | ||
3133 | A - B | ||
3134 | \family default | ||
3135 | is the set | ||
3136 | \family typewriter | ||
3137 | [1, 3, 5, 9] | ||
3138 | \family default | ||
3139 | while the set difference | ||
3140 | \family typewriter | ||
3141 | B - A | ||
3142 | \family default | ||
3143 | is the set | ||
3144 | \family typewriter | ||
3145 | [4, 6, 8] | ||
3146 | \family default | ||
3147 | . | ||
3148 | johnpye | 828 | \end_layout |
3149 | |||
3150 | \end_deeper | ||
3151 | \begin_layout List | ||
3152 | \labelwidthstring 00000.00000.00000.000 | ||
3153 | jpye | 1384 | |
3154 | \family sans | ||
3155 | johnpye | 828 | CARD |
3156 | jpye | 1384 | \family default |
3157 | |||
3158 | johnpye | 828 | \begin_inset LatexCommand \index{CARD} |
3159 | |||
3160 | \end_inset | ||
3161 | |||
3162 | [set] Cardinality | ||
3163 | \begin_inset LatexCommand \index{cardinality} | ||
3164 | |||
3165 | \end_inset | ||
3166 | |||
3167 | . | ||
3168 | Returns an integer constant value that is the number of items in the set. | ||
3169 | \end_layout | ||
3170 | |||
3171 | \begin_layout List | ||
3172 | \labelwidthstring 00000.00000.00000.000 | ||
3173 | jpye | 1384 | |
3174 | \family sans | ||
3175 | johnpye | 828 | CHOICE |
3176 | jpye | 1384 | \family default |
3177 | |||
3178 | johnpye | 828 | \begin_inset LatexCommand \index{CHOICE} |
3179 | |||
3180 | \end_inset | ||
3181 | |||
3182 | [set] Choose one. | ||
3183 | jpye | 1384 | The result of running the |
3184 | \family sans | ||
3185 | CHOICE | ||
3186 | \family default | ||
3187 | function over a set is an arbitrary (but consistent: for any set instance | ||
3188 | you always get the same result) single element of that set. | ||
3189 | johnpye | 828 | |
3190 | \end_layout | ||
3191 | |||
3192 | \begin_deeper | ||
3193 | \begin_layout Standard | ||
3194 | jpye | 1384 | Running |
3195 | \family typewriter | ||
3196 | CHOICE[A] | ||
3197 | \family default | ||
3198 | gives any member from the set A. | ||
3199 | johnpye | 828 | The result is a member, not a set. |
3200 | To make the result into a set, it must be enclosed in square brackets. | ||
3201 | jpye | 1384 | Thus |
3202 | \family typewriter | ||
3203 | [CHOICE[A]] | ||
3204 | \family default | ||
3205 | is a set with a single element arbitrarily chosen from the set A. | ||
3206 | johnpye | 828 | Good modelers do not leave modeling decisions to the compiler; they do |
3207 | jpye | 1384 | not use |
3208 | \family sans | ||
3209 | CHOICE | ||
3210 | \family default | ||
3211 | . | ||
3212 | johnpye | 828 | We are stuck with it for historical reasons. |
3213 | \end_layout | ||
3214 | |||
3215 | \begin_layout Standard | ||
3216 | To reduce a set by one element, one can use the following | ||
3217 | \end_layout | ||
3218 | |||
3219 | \begin_layout LyX-Code | ||
3220 | A_less_one IS_A set OF integer; | ||
3221 | \end_layout | ||
3222 | |||
3223 | \begin_layout LyX-Code | ||
3224 | A_less_one :== A - [CHOICE[A]]; | ||
3225 | \end_layout | ||
3226 | |||
3227 | \end_deeper | ||
3228 | \begin_layout List | ||
3229 | \labelwidthstring 00000.00000.00000.000 | ||
3230 | jpye | 1384 | |
3231 | \family sans | ||
3232 | johnpye | 828 | IN |
3233 | jpye | 1384 | \family default |
3234 | |||
3235 | johnpye | 828 | \begin_inset LatexCommand \index{IN} |
3236 | |||
3237 | \end_inset | ||
3238 | |||
3239 | jpye | 1384 | |
3240 | \family typewriter | ||
3241 | lhs IN rhs | ||
3242 | \family default | ||
3243 | can only be well explained by examples. | ||
3244 | |||
3245 | \family sans | ||
3246 | IN | ||
3247 | \family default | ||
3248 | is used in index expressions. | ||
3249 | If | ||
3250 | \family typewriter | ||
3251 | lhs | ||
3252 | \family default | ||
3253 | is a simple and not previously defined name, it is created as a temporary | ||
3254 | loop index which will take on the values of the rhs set definition. | ||
3255 | If lhs is something that already exists, the result of | ||
3256 | \family typewriter | ||
3257 | lhs IN rhs | ||
3258 | \family default | ||
3259 | is a boolean value; stare at the model | ||
3260 | \family typewriter | ||
3261 | set_example | ||
3262 | \family default | ||
3263 | below which demonstrates both | ||
3264 | \family sans | ||
3265 | IN | ||
3266 | \family default | ||
3267 | and | ||
3268 | \family sans | ||
3269 | SUCH_THAT | ||
3270 | \family default | ||
3271 | . | ||
3272 | If you still are not satisfied, you might examine [[westerbergksets]] | ||
3273 | \begin_inset Note Note | ||
3274 | status open | ||
3275 | |||
3276 | \begin_layout Standard | ||
3277 | fix this reference | ||
3278 | johnpye | 828 | \end_layout |
3279 | |||
3280 | jpye | 1384 | \end_inset |
3281 | |||
3282 | . | ||
3283 | \end_layout | ||
3284 | |||
3285 | johnpye | 828 | \begin_layout List |
3286 | \labelwidthstring 00000.00000.00000.000 | ||
3287 | jpye | 1384 | |
3288 | \family sans | ||
3289 | johnpye | 828 | SUCH_THAT |
3290 | jpye | 1384 | \family default |
3291 | |||
3292 | johnpye | 828 | \begin_inset LatexCommand \index{SUCH\_THAT} |
3293 | |||
3294 | \end_inset | ||
3295 | |||
3296 | jpye | 1384 | Set expressions can be rather clever. |
3297 | johnpye | 828 | We will give a detailed example from chemistry because unordered sets are |
3298 | unfamiliar to most people and set arithmetic is quite powerful. | ||
3299 | In this example we see arrays of sets and sparse arrays. | ||
3300 | |||
3301 | \end_layout | ||
3302 | |||
3303 | \begin_layout LyX-Code | ||
3304 | MODEL set_example; | ||
3305 | \end_layout | ||
3306 | |||
3307 | \begin_layout LyX-Code | ||
3308 | jpye | 1384 | (* we define a sparse matrix of reaction |
3309 | johnpye | 828 | \end_layout |
3310 | |||
3311 | \begin_layout LyX-Code | ||
3312 | jpye | 1384 | coefficient information and the species |
3313 | johnpye | 828 | \end_layout |
3314 | |||
3315 | \begin_layout LyX-Code | ||
3316 | jpye | 1384 | balance equations. |
3317 | johnpye | 828 | *) |
3318 | \end_layout | ||
3319 | |||
3320 | \begin_layout LyX-Code | ||
3321 | jpye | 1384 | rxns IS_A set OF integer_constant; |
3322 | johnpye | 828 | \end_layout |
3323 | |||
3324 | \begin_layout LyX-Code | ||
3325 | jpye | 1384 | rxns :== [1..3]; |
3326 | johnpye | 828 | \end_layout |
3327 | |||
3328 | \begin_layout LyX-Code | ||
3329 | jpye | 1384 | species IS_A set OF symbol_constant; |
3330 | johnpye | 828 | \end_layout |
3331 | |||
3332 | \begin_layout LyX-Code | ||
3333 | jpye | 1384 | species :== ['A','B','C','D']; |
3334 | johnpye | 828 | \end_layout |
3335 | |||
3336 | \begin_layout LyX-Code | ||
3337 | jpye | 1384 | reactants[rxns] IS_A set OF symbol_constant; (* species |
3338 | johnpye | 828 | \end_layout |
3339 | |||
3340 | \begin_layout LyX-Code | ||
3341 | jpye | 1384 | in each rxn_j *) |
3342 | johnpye | 828 | \end_layout |
3343 | |||
3344 | \begin_layout LyX-Code | ||
3345 | jpye | 1384 | reactants[1] :== ['A','B','C']; |
3346 | johnpye | 828 | \end_layout |
3347 | |||
3348 | \begin_layout LyX-Code | ||
3349 | jpye | 1384 | reactants[2] :== ['A','C']; |
3350 | johnpye | 828 | \end_layout |
3351 | |||
3352 | \begin_layout LyX-Code | ||
3353 | jpye | 1384 | reactants[3] :== ['A','B','D']; |
3354 | johnpye | 828 | \end_layout |
3355 | |||
3356 | \begin_layout LyX-Code | ||
3357 | jpye | 1384 | reactions[species] IS_A set OF integer_constant; |
3358 | johnpye | 828 | \end_layout |
3359 | |||
3360 | \begin_layout LyX-Code | ||
3361 | jpye | 1384 | FOR i IN species CREATE (* rxns for each species i *) |
3362 | johnpye | 828 | \end_layout |
3363 | |||
3364 | \begin_layout LyX-Code | ||
3365 | jpye | 1384 | reactions[i] :== [j IN rxns SUCH_THAT i IN reactants[j]]; |
3366 | johnpye | 828 | \end_layout |
3367 | |||
3368 | \begin_layout LyX-Code | ||
3369 | jpye | 1384 | END FOR; |
3370 | johnpye | 828 | \end_layout |
3371 | |||
3372 | \begin_layout LyX-Code | ||
3373 | jpye | 1384 | (* Define sparse stoichiometric matrix. |
3374 | johnpye | 828 | Values of eta_ij |
3375 | \end_layout | ||
3376 | |||
3377 | \begin_layout LyX-Code | ||
3378 | jpye | 1384 | set later.*) |
3379 | johnpye | 828 | \end_layout |
3380 | |||
3381 | \begin_layout LyX-Code | ||
3382 | jpye | 1384 | FOR j IN rxns CREATE |
3383 | johnpye | 828 | \end_layout |
3384 | |||
3385 | \begin_layout LyX-Code | ||
3386 | jpye | 1384 | FOR i IN reactants[j] CREATE |
3387 | johnpye | 828 | \end_layout |
3388 | |||
3389 | \begin_layout LyX-Code | ||
3390 | jpye | 1384 | (* eta_ij --> mole i/mole rxn j*) |
3391 | johnpye | 828 | \end_layout |
3392 | |||
3393 | \begin_layout LyX-Code | ||
3394 | jpye | 1384 | eta[i][j] IS_A real_constant; |
3395 | johnpye | 828 | \end_layout |
3396 | |||
3397 | \begin_layout LyX-Code | ||
3398 | jpye | 1384 | END FOR; |
3399 | johnpye | 828 | \end_layout |
3400 | |||
3401 | \begin_layout LyX-Code | ||
3402 | jpye | 1384 | END FOR; |
3403 | johnpye | 828 | \end_layout |
3404 | |||
3405 | \begin_layout LyX-Code | ||
3406 | jpye | 1384 | production[species] IS_A molar_rate; |
3407 | johnpye | 828 | \end_layout |
3408 | |||
3409 | \begin_layout LyX-Code | ||
3410 | jpye | 1384 | rate[rxns] IS_A molar_rate; (* mole rxn j/time *) |
3411 | johnpye | 828 | \end_layout |
3412 | |||
3413 | \begin_layout LyX-Code | ||
3414 | jpye | 1384 | FOR i IN species CREATE |
3415 | johnpye | 828 | \end_layout |
3416 | |||
3417 | \begin_layout LyX-Code | ||
3418 | jpye | 1384 | gen_eqn[i]: production[i] = |
3419 | johnpye | 828 | \end_layout |
3420 | |||
3421 | \begin_layout LyX-Code | ||
3422 | jpye | 1384 | SUM[eta[i][j]*rate[j] | j IN reactions[i]]; |
3423 | johnpye | 828 | \end_layout |
3424 | |||
3425 | \begin_layout LyX-Code | ||
3426 | jpye | 1384 | END FOR; |
3427 | johnpye | 828 | \end_layout |
3428 | |||
3429 | \begin_layout LyX-Code | ||
3430 | END set_example; | ||
3431 | \end_layout | ||
3432 | |||
3433 | \begin_layout List | ||
3434 | \labelwidthstring 00000.00000.00000.000 | ||
3435 | jpye | 1384 | " |
3436 | \family typewriter | ||
3437 | | | ||
3438 | \family default | ||
3439 | |||
3440 | johnpye | 828 | \begin_inset LatexCommand \index{|} |
3441 | |||
3442 | \end_inset | ||
3443 | |||
3444 | jpye | 1384 | " is shorthand for |
3445 | \family sans | ||
3446 | SUCH_THAT | ||
3447 | \family default | ||
3448 | . | ||
3449 | johnpye | 828 | \end_layout |
3450 | |||
3451 | \begin_deeper | ||
3452 | \begin_layout Standard | ||
3453 | jpye | 1384 | The array |
3454 | \family typewriter | ||
3455 | eta | ||
3456 | \family default | ||
3457 | has only 8 elements, and we defined those elements in a set for each reaction. | ||
3458 | The equation needs to know about the set of reactions for a species | ||
3459 | \family typewriter | ||
3460 | i | ||
3461 | \family default | ||
3462 | , and that set is calculated automatically in the models first | ||
3463 | \family sans | ||
3464 | FOR/CREATE | ||
3465 | \family default | ||
3466 | johnpye | 828 | statement. |
3467 | |||
3468 | \end_layout | ||
3469 | |||
3470 | jpye | 1384 | \begin_layout Standard |
3471 | The | ||
3472 | \family typewriter | ||
3473 | johnpye | 828 | | |
3474 | jpye | 1384 | \family default |
3475 | symbol is the ASCEND III notation for | ||
3476 | \family sans | ||
3477 | SUCH_THAT | ||
3478 | \family default | ||
3479 | . | ||
3480 | We noted that " | ||
3481 | \family typewriter | ||
3482 | | | ||
3483 | \family default | ||
3484 | " is often read as "for all", which is different in that "for all" makes | ||
3485 | one think of a | ||
3486 | \family sans | ||
3487 | FOR | ||
3488 | \family default | ||
3489 | loop where the loop index is on the left of an | ||
3490 | \family sans | ||
3491 | IN | ||
3492 | \family default | ||
3493 | operator. | ||
3494 | For example, the | ||
3495 | \family typewriter | ||
3496 | j | ||
3497 | \family default | ||
3498 | loop in the | ||
3499 | \family sans | ||
3500 | SUM | ||
3501 | \family default | ||
3502 | of | ||
3503 | \family typewriter | ||
3504 | gen_eqn[i] | ||
3505 | \family default | ||
3506 | above. | ||
3507 | johnpye | 828 | |
3508 | \end_layout | ||
3509 | |||
3510 | jpye | 1384 | \begin_layout Section |
3511 | johnpye | 828 | Constants |
3512 | \begin_inset LatexCommand \index{constants} | ||
3513 | |||
3514 | \end_inset | ||
3515 | |||
3516 | |||
3517 | \end_layout | ||
3518 | |||
3519 | \begin_layout Standard | ||
3520 | ASCEND supports real, integer, boolean and character string constants. | ||
3521 | Constants in ASCEND do not have any attributes other than their value. | ||
3522 | Constants are scalar quantities that can be assigned exactly once. | ||
3523 | jpye | 1384 | Constants may only be assigned using the |
3524 | \family typewriter | ||
3525 | :== | ||
3526 | \family default | ||
3527 | operator and the RHS expression they are assigned from must itself be constant. | ||
3528 | johnpye | 828 | Constants do not have subparts. |
3529 | Integer and symbol constants may be used in determining the definitions | ||
3530 | of sets. | ||
3531 | |||
3532 | \end_layout | ||
3533 | |||
3534 | \begin_layout Standard | ||
3535 | Explicit refinements of the built-in constant types may be defined as exemplifie | ||
3536 | d in the description of real_constant. | ||
3537 | Implicit type refinements may be done by instantiating an incompletely | ||
3538 | defined constant and assigning its final value. | ||
3539 | |||
3540 | \end_layout | ||
3541 | |||
3542 | \begin_layout Standard | ||
3543 | Sets could be considered constant because they are assigned only once, however | ||
3544 | sets are described separately because they are not quite scalar quantities. | ||
3545 | \end_layout | ||
3546 | |||
3547 | \end_deeper | ||
3548 | \begin_layout List | ||
3549 | \labelwidthstring 00000.00000.00000.000 | ||
3550 | jpye | 1384 | |
3551 | \family sans | ||
3552 | johnpye | 828 | real_constant |
3553 | jpye | 1384 | \family default |
3554 | |||
3555 | johnpye | 828 | \begin_inset LatexCommand \index{real\_constant} |
3556 | |||
3557 | \end_inset | ||
3558 | |||
3559 | Real number with dimensionality. | ||
3560 | Note that the dimensionality of a real constant can be specified via the | ||
3561 | type definition without immediately defining the value, as in the following | ||
3562 | pair of definitions. | ||
3563 | \end_layout | ||
3564 | |||
3565 | \begin_layout List | ||
3566 | \labelwidthstring 00000.00000.00000.000 | ||
3567 | |||
3568 | \bar under | ||
3569 | CONSTANT\InsetSpace ~ | ||
3570 | declaration\InsetSpace ~ | ||
3571 | example: | ||
3572 | \end_layout | ||
3573 | |||
3574 | \begin_deeper | ||
3575 | \begin_layout LyX-Code | ||
3576 | CONSTANT molar_weight | ||
3577 | \end_layout | ||
3578 | |||
3579 | \begin_layout LyX-Code | ||
3580 | REFINES real_constant DIMENSION M/Q; | ||
3581 | \end_layout | ||
3582 | |||
3583 | \begin_layout LyX-Code | ||
3584 | CONSTANT hydrogen_weight | ||
3585 | \end_layout | ||
3586 | |||
3587 | \begin_layout LyX-Code | ||
3588 | REFINES molar_weight :== 1.004{g/mole}; | ||
3589 | \end_layout | ||
3590 | |||
3591 | \end_deeper | ||
3592 | \begin_layout List | ||
3593 | \labelwidthstring 00000.00000.00000.000 | ||
3594 | jpye | 1384 | |
3595 | \family sans | ||
3596 | johnpye | 828 | integer_constant |
3597 | jpye | 1384 | \family default |
3598 | |||
3599 | johnpye | 828 | \begin_inset LatexCommand \index{integer\_constant} |
3600 | |||
3601 | \end_inset | ||
3602 | |||
3603 | Integer number. | ||
3604 | Principally used in determining model structure. | ||
3605 | If appearing in equations, integers are evaluated as dimensionless reals. | ||
3606 | jpye | 1384 | Typical use is inside a |
3607 | \family sans | ||
3608 | MODEL | ||
3609 | \family default | ||
3610 | definition and looks like: | ||
3611 | johnpye | 828 | \end_layout |
3612 | |||
3613 | \begin_deeper | ||
3614 | \begin_layout LyX-Code | ||
3615 | n_trays IS_A integer_constant; | ||
3616 | \end_layout | ||
3617 | |||
3618 | \begin_layout LyX-Code | ||
3619 | n_trays :== 50; | ||
3620 | \end_layout | ||
3621 | |||
3622 | \begin_layout LyX-Code | ||
3623 | tray[1..n_trays] IS_A vl_equilibrium_tray; | ||
3624 | \end_layout | ||
3625 | |||
3626 | \end_deeper | ||
3627 | \begin_layout List | ||
3628 | \labelwidthstring 00000.00000.00000.000 | ||
3629 | jpye | 1384 | |
3630 | \family sans | ||
3631 | johnpye | 828 | symbol_constant |
3632 | jpye | 1384 | \family default |
3633 | |||
3634 | johnpye | 828 | \begin_inset LatexCommand \index{symbol\_constant} |
3635 | |||
3636 | \end_inset | ||
3637 | |||
3638 | Object with a symbol value. | ||
3639 | May be used in determining model structure. | ||
3640 | \end_layout | ||
3641 | |||
3642 | \begin_layout List | ||
3643 | \labelwidthstring 00000.00000.00000.000 | ||
3644 | jpye | 1384 | |
3645 | \family sans | ||
3646 | johnpye | 828 | boolean_constant |
3647 | jpye | 1384 | \family default |
3648 | |||
3649 | johnpye | 828 | \begin_inset LatexCommand \index{boolean\_constant} |
3650 | |||
3651 | \end_inset | ||
3652 | |||
3653 | Logical value. | ||
3654 | May be used in determining model structure. | ||
3655 | \end_layout | ||
3656 | |||
3657 | \begin_layout List | ||
3658 | \labelwidthstring 00000.00000.00000.000 | ||
3659 | |||
3660 | \bar under | ||
3661 | Setting\InsetSpace ~ | ||
3662 | constants | ||
3663 | \bar default | ||
3664 | |||
3665 | \begin_inset LatexCommand \index{constants, setting} | ||
3666 | |||
3667 | \end_inset | ||
3668 | |||
3669 | |||
3670 | \end_layout | ||
3671 | |||
3672 | \begin_layout List | ||
3673 | \labelwidthstring 00000.00000.00000.000 | ||
3674 | :== | ||
3675 | \begin_inset LatexCommand \index{:==} | ||
3676 | |||
3677 | \end_inset | ||
3678 | |||
3679 | Constant and set assignment operator. | ||
3680 | |||
3681 | \end_layout | ||
3682 | |||
3683 | \begin_deeper | ||
3684 | \begin_layout Standard | ||
3685 | It is suggested, but not required, that names of all types that refine the | ||
3686 | built-in constant types have names that end in _constant. | ||
3687 | \end_layout | ||
3688 | |||
3689 | \begin_layout LyX-Code | ||
3690 | LHS_list :== RHS; | ||
3691 | \end_layout | ||
3692 | |||
3693 | \begin_layout Standard | ||
3694 | Here it is required that the one or more items in the LHS be of the same | ||
3695 | constant type and that RHS is a single-valued expression made up of values, | ||
3696 | operators, and other constants. | ||
3697 | jpye | 1384 | The |
3698 | \family typewriter | ||
3699 | :== | ||
3700 | \family default | ||
3701 | is used to make clear to both the user and the system what scalar objects | ||
3702 | are constants. | ||
3703 | johnpye | 828 | |
3704 | \end_layout | ||
3705 | |||
3706 | jpye | 1384 | \begin_layout Section |
3707 | johnpye | 828 | Variables |
3708 | \begin_inset LatexCommand \index{variables} | ||
3709 | |||
3710 | \end_inset | ||
3711 | |||
3712 | |||
3713 | \end_layout | ||
3714 | |||
3715 | \begin_layout Standard | ||
3716 | There are four built-in types which may be used to construct variables: | ||
3717 | symbol, boolean, integer, and real. | ||
3718 | At this time symbol types have special restrictions. | ||
3719 | jpye | 1384 | Refinements of these variable base types are defined with the |
3720 | \family sans | ||
3721 | ATOM | ||
3722 | \family default | ||
3723 | statement. | ||
3724 | johnpye | 828 | Atom types may declare attribute fields with types real, integer, boolean, |
3725 | symbol, and set. | ||
3726 | jpye | 1384 | These attributes are |
3727 | \emph on | ||
3728 | not | ||
3729 | \emph default | ||
3730 | independent objects and therefore cannot be refined, merged, or put in | ||
3731 | a refinement clique ( | ||
3732 | \family sans | ||
3733 | ARE_ALIKE | ||
3734 | \family default | ||
3735 | d). | ||
3736 | johnpye | 828 | \end_layout |
3737 | |||
3738 | \end_deeper | ||
3739 | \begin_layout List | ||
3740 | \labelwidthstring 00000.00000.00000.000 | ||
3741 | jpye | 1384 | |
3742 | \family sans | ||
3743 | johnpye | 828 | ATOM |
3744 | jpye | 1384 | \family default |
3745 | |||
3746 | johnpye | 828 | \begin_inset LatexCommand \index{ATOM} |
3747 | |||
3748 | \end_inset | ||
3749 | |||
3750 | The syntax for declaring a new atom type is | ||
3751 | \end_layout | ||
3752 | |||
3753 | \begin_deeper | ||
3754 | \begin_layout LyX-Code | ||
3755 | ATOM | ||
3756 | \emph on | ||
3757 | atom_type_name | ||
3758 | \emph default | ||
3759 | REFINES | ||
3760 | \emph on | ||
3761 | variable_type | ||
3762 | \end_layout | ||
3763 | |||
3764 | \begin_layout LyX-Code | ||
3765 | «DIMENSION | ||
3766 | \emph on | ||
3767 | dimension_expression | ||
3768 | \emph default | ||
3769 | » | ||
3770 | \end_layout | ||
3771 | |||
3772 | \begin_layout LyX-Code | ||
3773 | «DEFAULT | ||
3774 | \emph on | ||
3775 | value | ||
3776 | \emph default | ||
3777 | »; (* note the ; *) | ||
3778 | \end_layout | ||
3779 | |||
3780 | \begin_layout LyX-Code | ||
3781 | « | ||
3782 | \emph on | ||
3783 | initial attribute assignment | ||
3784 | \emph default | ||
3785 | ;» | ||
3786 | \end_layout | ||
3787 | |||
3788 | \begin_layout LyX-Code | ||
3789 | END | ||
3790 | \emph on | ||
3791 | atom_type_name | ||
3792 | \emph default | ||
3793 | ; | ||
3794 | \end_layout | ||
3795 | |||
3796 | \end_deeper | ||
3797 | \begin_layout List | ||
3798 | \labelwidthstring 00000.00000.00000.000 | ||
3799 | jpye | 1384 | |
3800 | \family sans | ||
3801 | johnpye | 828 | DEFAULT |
3802 | jpye | 1384 | \family default |
3803 | |||
3804 | johnpye | 828 | \begin_inset LatexCommand \index{DEFAULT} |
3805 | |||
3806 | \end_inset | ||
3807 | |||
3808 | jpye | 1384 | , |
3809 | \family sans | ||
3810 | \InsetSpace ~ | ||
3811 | johnpye | 828 | DIMENSION |
3812 | jpye | 1384 | \family default |
3813 | |||
3814 | johnpye | 828 | \begin_inset LatexCommand \index{DIMENSION} |
3815 | |||
3816 | \end_inset | ||
3817 | |||
3818 | ,\InsetSpace ~ | ||
3819 | and\InsetSpace ~ | ||
3820 | jpye | 1384 | |
3821 | \family sans | ||
3822 | johnpye | 828 | DIMENSIONLESS |
3823 | jpye | 1384 | \family default |
3824 | |||
3825 | johnpye | 828 | \begin_inset LatexCommand \index{DIMENSIONLESS} |
3826 | |||
3827 | \end_inset | ||
3828 | |||
3829 | |||
3830 | \end_layout | ||
3831 | |||
3832 | \begin_deeper | ||
3833 | \begin_layout Standard | ||
3834 | jpye | 1384 | The |
3835 | \family sans | ||
3836 | DIMENSION | ||
3837 | \family default | ||
3838 | attribute is for variables whose base type is real. | ||
3839 | johnpye | 828 | It is an optional field. |
3840 | If not defined for any atom with base type real, the dimensions will be | ||
3841 | left as undefined. | ||
3842 | Any variable which is later declared to be one of these types will be given | ||
3843 | wild card dimensionality (represented in the interactive display by an | ||
3844 | asterisk (*)). | ||
3845 | The system will deduce the dimensionality from its use in the relationships | ||
3846 | in which it appears or in the declaring of default values for it, if possible. | ||
3847 | \end_layout | ||
3848 | |||
3849 | \end_deeper | ||
3850 | \begin_layout List | ||
3851 | \labelwidthstring 00000.00000.00000.000 | ||
3852 | jpye | 1384 | |
3853 | \family sans | ||
3854 | johnpye | 828 | solver_var |
3855 | jpye | 1384 | \family default |
3856 | |||
3857 | johnpye | 828 | \begin_inset LatexCommand \index{solver\_var} |
3858 | |||
3859 | \end_inset | ||
3860 | |||
3861 | jpye | 1384 | is a special case of |
3862 | \family sans | ||
3863 | ATOM | ||
3864 | \family default | ||
3865 | and we will say much more about it in Section | ||
3866 | johnpye | 828 | \begin_inset LatexCommand \vref{sub:x.6.1Variables-for-solvers} |
3867 | |||
3868 | \end_inset | ||
3869 | |||
3870 | . | ||
3871 | \end_layout | ||
3872 | |||
3873 | \begin_deeper | ||
3874 | \begin_layout LyX-Code | ||
3875 | ATOM solver_var REFINES real DEFAULT 0.5 {? | ||
3876 | \begin_inset LatexCommand \index{?} | ||
3877 | |||
3878 | \end_inset | ||
3879 | |||
3880 | }; | ||
3881 | \end_layout | ||
3882 | |||
3883 | \begin_layout LyX-Code | ||
3884 | lower_bound IS_A real; | ||
3885 | \end_layout | ||
3886 | |||
3887 | \begin_layout LyX-Code | ||
3888 | upper_bound IS_A real; | ||
3889 | \end_layout | ||
3890 | |||
3891 | \begin_layout LyX-Code | ||
3892 | nominal IS_A real; | ||
3893 | \end_layout | ||
3894 | |||
3895 | \begin_layout LyX-Code | ||
3896 | fixed IS_A boolean; | ||
3897 | \end_layout | ||
3898 | |||
3899 | \begin_layout LyX-Code | ||
3900 | fixed := FALSE; | ||
3901 | \end_layout | ||
3902 | |||
3903 | \begin_layout LyX-Code | ||
3904 | lower_bound := -1e20 {?}; | ||
3905 | \end_layout | ||
3906 | |||
3907 | \begin_layout LyX-Code | ||
3908 | upper_bound := 1e20 {?}; | ||
3909 | \end_layout | ||
3910 | |||
3911 | \begin_layout LyX-Code | ||
3912 | nominal := 0.5 {?}; | ||
3913 | \end_layout | ||
3914 | |||
3915 | \begin_layout LyX-Code | ||
3916 | END solver_var; | ||
3917 | \end_layout | ||
3918 | |||
3919 | \begin_layout Standard | ||
3920 | The default field is also optional. | ||
3921 | If the atom has a declared dimensionality, then this value must be expressed | ||
3922 | with units which are compatible with this dimensionality. | ||
3923 | In the solver_var example, we see a DEFAULT value of 0.5 with the unspecified | ||
3924 | unit | ||
3925 | \begin_inset LatexCommand \index{unit, unspecified} | ||
3926 | |||
3927 | \end_inset | ||
3928 | |||
3929 | |||
3930 | \begin_inset LatexCommand \index{unspecified unit} | ||
3931 | |||
3932 | \end_inset | ||
3933 | |||
3934 | {? | ||
3935 | \begin_inset LatexCommand \index{} | ||
3936 | |||
3937 | \end_inset | ||
3938 | |||
3939 | } which leaves the dimensionality wild | ||
3940 | \begin_inset LatexCommand \index{wild dimensionality} | ||
3941 | |||
3942 | \end_inset | ||
3943 | |||
3944 | . | ||
3945 | \end_layout | ||
3946 | |||
3947 | \end_deeper | ||
3948 | \begin_layout List | ||
3949 | \labelwidthstring 00000.00000.00000.000 | ||
3950 | real | ||
3951 | \begin_inset LatexCommand \index{real} | ||
3952 | |||
3953 | \end_inset | ||
3954 | |||
3955 | Real valued variable quantity. | ||
3956 | At present, all variables that you want to be attended to by solver tools | ||
3957 | must be refinements of the type solver_var. | ||
3958 | This is so that modifiable parametric values can be included in equations | ||
3959 | without treating them as variables. | ||
3960 | Strictly speaking, this is a characteristic of the solver interface and | ||
3961 | not the ASCEND language. | ||
3962 | Each tool in the total ASCEND system may have its own semantics that go | ||
3963 | beyond the ASCEND object definition language. | ||
3964 | \end_layout | ||
3965 | |||
3966 | \begin_layout List | ||
3967 | \labelwidthstring 00000.00000.00000.000 | ||
3968 | integer | ||
3969 | \begin_inset LatexCommand \index{integer} | ||
3970 | |||
3971 | \end_inset | ||
3972 | |||
3973 | Integer valued variable quantity. | ||
3974 | We find these mighty convenient for use in certain procedural computations | ||
3975 | and as attributes of solver_var atoms. | ||
3976 | \end_layout | ||
3977 | |||
3978 | \begin_layout List | ||
3979 | \labelwidthstring 00000.00000.00000.000 | ||
3980 | boolean | ||
3981 | \begin_inset LatexCommand \index{boolean} | ||
3982 | |||
3983 | \end_inset | ||
3984 | |||
3985 | Truth valued variable quantity. | ||
3986 | These are principally used as flags on solver_vars and relations. | ||
3987 | They can also be used procedurally and as variables in logical programming | ||
3988 | models, subject to the logical solver tools semantics. | ||
3989 | (Compare solver_boolean and boolean_var in Section | ||
3990 | \begin_inset LatexCommand \vref{sec:x.6Miscellany} | ||
3991 | |||
3992 | \end_inset | ||
3993 | |||
3994 | .) | ||
3995 | \end_layout | ||
3996 | |||
3997 | \begin_layout List | ||
3998 | \labelwidthstring 00000.00000.00000.000 | ||
3999 | symbol | ||
4000 | \begin_inset LatexCommand \index{symbol} | ||
4001 | |||
4002 | \end_inset | ||
4003 | |||
4004 | jpye | 1384 | Symbol valued variable quantity. |
4005 | johnpye | 828 | We do not yet have operators for building symbols out of other symbols. |
4006 | \end_layout | ||
4007 | |||
4008 | \begin_layout List | ||
4009 | \labelwidthstring 00000.00000.00000.000 | ||
4010 | |||
4011 | \bar under | ||
4012 | Setting\InsetSpace ~ | ||
4013 | variables | ||
4014 | \bar default | ||
4015 | |||
4016 | \begin_inset LatexCommand \index{variables, setting} | ||
4017 | |||
4018 | \end_inset | ||
4019 | |||
4020 | |||
4021 | \end_layout | ||
4022 | |||
4023 | \begin_layout List | ||
4024 | \labelwidthstring 00000.00000.00000.000 | ||
4025 | := | ||
4026 | \begin_inset LatexCommand \index{:=} | ||
4027 | |||
4028 | \end_inset | ||
4029 | |||
4030 | Procedural equals | ||
4031 | \begin_inset LatexCommand \index{equals, procedural} | ||
4032 | |||
4033 | \end_inset | ||
4034 | |||
4035 | differs from the ordinary equals (=) in that it means the left-hand-side | ||
4036 | (LHS) variables are to be assigned the value of the right-hand-side (RHS) | ||
4037 | expression when this statement is processed. | ||
4038 | Processing happens in the last phase of compiling (instantiation) or when | ||
4039 | executing a method interactively through the ASCEND user interface. | ||
4040 | The order the system encounters these statements matters, therefore, with | ||
4041 | a later result overwriting an earlier one if both statements have the same | ||
4042 | the same LHS variable. | ||
4043 | |||
4044 | \end_layout | ||
4045 | |||
4046 | \begin_deeper | ||
4047 | \begin_layout Standard | ||
4048 | Note that variable assignments (also known as defaulting statements) written | ||
4049 | in the declarative section are executed only after an instance has been | ||
4050 | fully created. | ||
4051 | This is a frequent source of confusion and errors, therefore we recommend | ||
4052 | that you DO NOT ASSIGN VARIABLES IN THE DECLARATIVE SECTION. | ||
4053 | |||
4054 | \end_layout | ||
4055 | |||
4056 | \end_deeper | ||
4057 | \begin_layout List | ||
4058 | \labelwidthstring 00000.00000.00000.000 | ||
4059 | Note\InsetSpace ~ | ||
4060 | that\InsetSpace ~ | ||
4061 | :=\InsetSpace ~ | ||
4062 | IS\InsetSpace ~ | ||
4063 | NOT\InsetSpace ~ | ||
4064 | =. | ||
4065 | \end_layout | ||
4066 | |||
4067 | \begin_deeper | ||
4068 | \begin_layout Standard | ||
4069 | We use an ordinary equals (=) when defining a real valued equation to state | ||
4070 | that the LHS expression is to equal the RHS expression at the solution | ||
4071 | for the model. | ||
4072 | We use == for logical equations. | ||
4073 | \end_layout | ||
4074 | |||
4075 | \end_deeper | ||
4076 | \begin_layout List | ||
4077 | \labelwidthstring 00000.00000.00000.000 | ||
4078 | jpye | 1384 | \begin_inset Note Note |
4079 | status open | ||
4080 | johnpye | 828 | |
4081 | jpye | 1384 | \begin_layout List |
4082 | \labelwidthstring 00000.00000.00000.000 | ||
4083 | |||
4084 | johnpye | 828 | \bar under |
4085 | Tabular\InsetSpace ~ | ||
4086 | assignments | ||
4087 |