/[ascend]/trunk/doc/syntax.lyx
ViewVC logotype

Contents of /trunk/doc/syntax.lyx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 828 - (show annotations) (download) (as text)
Tue Aug 22 02:24:05 2006 UTC (18 years, 3 months ago) by johnpye
File MIME type: application/x-lyx
File size: 162966 byte(s)
Woops, forgot to copy this file to code/branches/extfn/doc.
1 #LyX 1.4.1 created this file. For more info see http://www.lyx.org/
2 \lyxformat 245
3 \begin_document
4 \begin_header
5 \textclass book
6 \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 Syntax and semantics
38 \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 \begin_layout Section
132 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 \begin_layout Subsection
242 Punctuation
243 \begin_inset LatexCommand \index{punctuation}
244
245 \end_inset
246
247
248 \end_layout
249
250 \begin_layout Standard
251 This section covers both the punctuation that must be understood to read
252 this document and the punctuation of ASCEND code.
253 \end_layout
254
255 \end_deeper
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 *3*
289 \begin_inset LatexCommand \index{*3*}
290
291 \end_inset
292
293 :
294 \bar default
295 This indicates that what follows is specific to ASCEND IIIc and may disappear
296 in a future version of ASCEND IV.
297 Generally ASCEND IV will provide some equivalent functionality at 1/10th
298 of the ASCEND III price.
299 \end_layout
300
301 \begin_layout List
302 \labelwidthstring 00000.00000.00000.000
303
304 \bar under
305 *4*
306 \bar default
307
308 \begin_inset LatexCommand \index{*4*}
309
310 \end_inset
311
312 This indicates that what follows is specific to ASCEND IV and may not be
313 available in ASCEND IIIc.
314 Generally ASCEND III may provide some very klugey equivalent functionality,
315 often at a very high price in terms of increased compilation time or debugging
316 difficulty.
317 \end_layout
318
319 \begin_layout List
320 \labelwidthstring 00000.00000.00000.000
321
322 \bar under
323 *4+*
324 \bar default
325
326 \begin_inset LatexCommand \index{*4+*}
327
328 \end_inset
329
330 ASCEND IV functionality that is not fully implemented at the time of this
331 writing.
332 The precise syntax of the final implementation may vary slightly from what
333 is presented here.
334 A revision of this document will be made at the time of implementation.
335 \end_layout
336
337 \begin_layout List
338 \labelwidthstring 00000.00000.00000.000
339
340 \bar under
341 LHS
342 \begin_inset LatexCommand \index{LHS}
343
344 \end_inset
345
346 :
347 \bar default
348 Left Hand Side.
349 Abbreviation used frequently.
350 \end_layout
351
352 \begin_layout List
353 \labelwidthstring 00000.00000.00000.000
354
355 \bar under
356 RHS
357 \begin_inset LatexCommand \index{RHS}
358
359 \end_inset
360
361 :
362 \bar default
363 Right Hand Side.
364 Abbreviation used frequently.
365 \end_layout
366
367 \begin_layout List
368 \labelwidthstring 00000.00000.00000.000
369
370 \bar under
371 Simple\InsetSpace ~
372 names
373 \begin_inset LatexCommand \index{simple names}
374
375 \end_inset
376
377 :
378 \bar default
379 In ASCEND simple names are made of the characters a through z, A through
380 Z, _, (*4+*: $).
381 The underscore is used as a letter, but it cannot be the first letter in
382 a name.
383 The $
384 \begin_inset LatexCommand \index{\$}
385
386 \end_inset
387
388 character is used exclusively as the first character in the name of system
389 defined built-in parts.
390 "$" is explained in more detail in Section
391 \begin_inset LatexCommand \vref{sub:x.6.2Supported-attributes}
392
393 \end_inset
394
395 .
396 Simple names should be no more than 80 characters long.
397
398 \end_layout
399
400 \begin_layout List
401 \labelwidthstring 00000.00000.00000.000
402
403 \bar under
404 Compound\InsetSpace ~
405 names
406 \begin_inset LatexCommand \index{compound names}
407
408 \end_inset
409
410 :
411 \bar default
412 Compound names are simple names strung together with dots (.).
413 See the description of "." below.
414 \end_layout
415
416 \begin_layout List
417 \labelwidthstring 00000.00000.00000.000
418
419 \bar under
420 Groupings:
421 \end_layout
422
423 \begin_layout List
424 \labelwidthstring 00000.00000.00000.000
425
426 \bar under
427 «\InsetSpace ~
428 »
429 \bar default
430 In documentation optional fields
431 \begin_inset LatexCommand \index{optional fields}
432
433 \end_inset
434
435 are surrounded by these markers.
436 \end_layout
437
438 \begin_layout List
439 \labelwidthstring 00000.00000.00000.000
440 (*\InsetSpace ~
441 *)
442 \begin_inset LatexCommand \index{(* *)}
443
444 \end_inset
445
446 Comment.
447 *3* Anything inside these is a comment.
448 Comments DO NOT nest in ASCEND IIIc.
449 Comments may extend over many lines.
450 *4* Comments DO nest
451 \begin_inset LatexCommand \index{nest}
452
453 \end_inset
454
455 in ASCEND IV.
456 \end_layout
457
458 \begin_layout List
459 \labelwidthstring 00000.00000.00000.000
460 (\InsetSpace ~
461 )
462 \begin_inset LatexCommand \index{( )}
463
464 \end_inset
465
466 Rounded parentheses
467 \begin_inset LatexCommand \index{parentheses}
468
469 \end_inset
470
471
472 \begin_inset LatexCommand \index{rounded parentheses}
473
474 \end_inset
475
476 .
477 Used to enclose arguments for functions or models where the order of the
478 arguments matters.
479 Also used to group terms in complex arithmetic, logical, or set expressions
480 where the order of operations needs to be specified.
481
482 \end_layout
483
484 \begin_layout List
485 \labelwidthstring 00000.00000.00000.000
486 Efficiency\InsetSpace ~
487 tip: The compiler can simplify relation definitions in a particularly
488 efficient manner if constants are grouped together.
489 \end_layout
490
491 \begin_layout List
492 \labelwidthstring 00000.00000.00000.000
493 {\InsetSpace ~
494 }
495 \begin_inset LatexCommand \index{{ }}
496
497 \end_inset
498
499 Curly braces
500 \begin_inset LatexCommand \index{Curly braces}
501
502 \end_inset
503
504 .
505 Used to enclose units.
506 For example, 1 {kg_mole/s}.
507 Also used to enclose the body of annotations.
508 Note: Curly braces are also used in TCL, the language of the ASCEND user
509 interface, about which we will say more in another chapter.
510 \end_layout
511
512 \begin_layout List
513 \labelwidthstring 00000.00000.00000.000
514 [\InsetSpace ~
515 ]
516 \begin_inset LatexCommand \index{[ ]}
517
518 \end_inset
519
520 Square brackets
521 \begin_inset LatexCommand \index{square brackets}
522
523 \end_inset
524
525 .
526 Used to enclose sets or elements of sets.
527 Examples: my_integer_set :== [1,2,3], demonstrates the use of square brackets
528 in the assignment of a set.
529 My_array[1] demonstrates the use of square brackets in naming an array
530 object indexed over an integer set which includes the element 1.
531 \end_layout
532
533 \begin_layout List
534 \labelwidthstring 00000.00000.00000.000
535 .
536 \begin_inset LatexCommand \index{.}
537
538 \end_inset
539
540 Dot
541 \begin_inset LatexCommand \index{dot}
542
543 \end_inset
544
545 .
546 The dot is used, as in PASCAL and C, to construct the names of nested objects.
547 Examples: if object a has a part b, then the way to refer to b is as a.b.
548 Tray[1].vle shows a dot following a square bracket; here Tray[1] has a part
549 named vle.
550 \end_layout
551
552 \begin_layout List
553 \labelwidthstring 00000.00000.00000.000
554 ..
555 \begin_inset LatexCommand \index{..}
556
557 \end_inset
558
559 Dot-dot or double dot
560 \begin_inset LatexCommand \index{double dot}
561
562 \end_inset
563
564 .
565 Integer range shorthand.
566 For example, my_integer_set :== [1,2,3] and my_integer_set :== [1..3] are
567 equivalent.
568 If ..
569 appears in a context requiring (), such as the ALIASES/IS_A statement,
570 then the range is expanded and ordered as we would naturally expect.
571 \end_layout
572
573 \begin_layout List
574 \labelwidthstring 00000.00000.00000.000
575 :
576 \begin_inset LatexCommand \index{:}
577
578 \end_inset
579
580 Colon
581 \begin_inset LatexCommand \index{colon}
582
583 \end_inset
584
585 .
586 A separator used in various ways, principally to set the name of an arithmetic
587 relation apart from the definition.
588 \end_layout
589
590 \begin_layout List
591 \labelwidthstring 00000.00000.00000.000
592 ::
593 \begin_inset LatexCommand \index{::}
594
595 \end_inset
596
597 Double colon
598 \begin_inset LatexCommand \index{double colon}
599
600 \end_inset
601
602 .
603 A separator used in the methods section for accessing methods defined on
604 types other than the type the method is part of.
605 Explained in Section
606 \begin_inset LatexCommand \vref{sec:x.4Procedural-statements}
607
608 \end_inset
609
610 .[
611 \end_layout
612
613 \begin_layout List
614 \labelwidthstring 00000.00000.00000.000
615 ;
616 \begin_inset LatexCommand \index{;}
617
618 \end_inset
619
620 Semicolon
621 \begin_inset LatexCommand \index{semicolon}
622
623 \end_inset
624
625 .
626 The separator of statements.
627 \end_layout
628
629 \begin_deeper
630 \begin_layout Subsection
631 Basic Elements
632 \begin_inset LatexCommand \index{basic elements}
633
634 \end_inset
635
636
637 \begin_inset LatexCommand \label{sub:x.1.2Basic-Elements}
638
639 \end_inset
640
641
642 \end_layout
643
644 \end_deeper
645 \begin_layout List
646 \labelwidthstring 00000.00000.00000.000
647
648 \bar under
649 Boolean\InsetSpace ~
650 value
651 \bar default
652
653 \begin_inset LatexCommand \index{value, Boolean}
654
655 \end_inset
656
657
658 \begin_inset LatexCommand \index{Boolean value}
659
660 \end_inset
661
662 TRUE
663 \begin_inset LatexCommand \index{TRUE}
664
665 \end_inset
666
667 or FALSE
668 \begin_inset LatexCommand \index{FALSE}
669
670 \end_inset
671
672 .
673 Can't get much simpler, eh? In the language definition TRUE and FALSE do
674 not map to 1 and 0 or any other type of numeric value.
675 (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 MAX_INTEGER
708 \begin_inset LatexCommand \index{MAX\_INTEGER}
709
710 \end_inset
711
712 is machine dependent.
713 Examples are:
714 \end_layout
715
716 \begin_deeper
717 \begin_layout LyX-Code
718 \align block
719 123
720 \end_layout
721
722 \begin_layout LyX-Code
723 \align block
724 -5
725 \end_layout
726
727 \begin_layout LyX-Code
728 \align block
729 MAX_INTEGER, typically 2147483647.
730 \end_layout
731
732 \end_deeper
733 \begin_layout List
734 \labelwidthstring 00000.00000.00000.000
735
736 \bar under
737 Real\InsetSpace ~
738 value
739 \bar default
740
741 \begin_inset LatexCommand \index{value. real}
742
743 \end_inset
744
745
746 \begin_inset LatexCommand \index{real value}
747
748 \end_inset
749
750 ASCEND represents reals almost exactly as any other mathematically oriented
751 programming language does.
752 The mantissa
753 \begin_inset LatexCommand \index{mantissa}
754
755 \end_inset
756
757 has an optional negative sign followed by a string of digits and at most
758 one decimal point.
759 The exponent is the letter e or E followed by an integer.
760 The number must not exceed the largest the computer is able to handle.
761 There can be no blank characters in a real.
762 MAX_REAL
763 \begin_inset LatexCommand \index{MAX\_REAL}
764
765 \end_inset
766
767 is machine dependent.
768 The following are legitimate reals in ASCEND:
769 \end_layout
770
771 \begin_deeper
772 \begin_layout LyX-Code
773 \align block
774 -1
775 \end_layout
776
777 \begin_layout LyX-Code
778 \align block
779 1.2
780 \end_layout
781
782 \begin_layout LyX-Code
783 \align block
784 1.3e-2
785 \end_layout
786
787 \begin_layout LyX-Code
788 \align block
789 7.888888e+34
790 \end_layout
791
792 \begin_layout LyX-Code
793 \align block
794 .6E21
795 \end_layout
796
797 \begin_layout LyX-Code
798 \align block
799 MAX_REAL, typically about 1.79E+308.
800 \end_layout
801
802 \begin_layout Standard
803 while the following are not:
804 \end_layout
805
806 \begin_layout LyX-Code
807 \align block
808 1.
809 2 (*contains a blank within it*)
810 \end_layout
811
812 \begin_layout LyX-Code
813 \align block
814 1.3e2.0 (*exponent has a decimal in it*)
815 \end_layout
816
817 \begin_layout List
818 \labelwidthstring 00000.00000.00000.000
819 +1.3 (* illegal unary + sign.
820 x = +1.3 not allowed*)
821 \end_layout
822
823 \end_deeper
824 \begin_layout List
825 \labelwidthstring 00000.00000.00000.000
826
827 \bar under
828 Reals\InsetSpace ~
829 stored\InsetSpace ~
830 in\InsetSpace ~
831 SI
832 \begin_inset LatexCommand \index{SI}
833
834 \end_inset
835
836 \InsetSpace ~
837 units
838 \bar default
839
840 \end_layout
841
842 \begin_deeper
843 \begin_layout Standard
844 We store all real values as double precision
845 \begin_inset LatexCommand \index{double precision}
846
847 \end_inset
848
849 numbers in the MKS
850 \begin_inset LatexCommand \index{MKS}
851
852 \end_inset
853
854 system of units.
855 This eliminates many common errors in the modeling of physical systems.
856 Since we also place the burden of scaling equations on system routines
857 and a simple modeling methodology, the internal units are not of concern
858 to most users.
859 \end_layout
860
861 \end_deeper
862 \begin_layout List
863 \labelwidthstring 00000.00000.00000.000
864
865 \bar under
866 Dimensionality
867 \begin_inset LatexCommand \index{dimensionality}
868
869 \end_inset
870
871 :
872 \bar default
873 Real values have dimensionality such as length/time for velocity.
874 Dimensionality is to be distinguished from the units such as ft/s.
875 ASCEND takes care of mapping between units
876 \begin_inset LatexCommand \index{units}
877
878 \end_inset
879
880 and dimensions.
881 A value without units (this includes integer values) is taken to be dimensionle
882 ss
883 \begin_inset LatexCommand \index{dimensionless}
884
885 \end_inset
886
887 .
888 Dimensionality is built up from the following base dimensions:
889 \end_layout
890
891 \begin_layout List
892 \labelwidthstring 00000.00000.00000.000
893 Name
894 \bar under
895 definition; typical units
896 \end_layout
897
898 \begin_layout List
899 \labelwidthstring 00000.00000.00000.000
900 L
901 \begin_inset LatexCommand \index{L, length dimension}
902
903 \end_inset
904
905 length
906 \begin_inset LatexCommand \index{length}
907
908 \end_inset
909
910 ; meter, m
911 \end_layout
912
913 \begin_layout List
914 \labelwidthstring 00000.00000.00000.000
915 M
916 \begin_inset LatexCommand \index{M, mass dimension}
917
918 \end_inset
919
920 mass
921 \begin_inset LatexCommand \index{mass}
922
923 \end_inset
924
925 ; kilogram, kg
926 \end_layout
927
928 \begin_layout List
929 \labelwidthstring 00000.00000.00000.000
930 T
931 \begin_inset LatexCommand \index{T, time dimension}
932
933 \end_inset
934
935 time
936 \begin_inset LatexCommand \index{time}
937
938 \end_inset
939
940 ; second, s
941 \end_layout
942
943 \begin_layout List
944 \labelwidthstring 00000.00000.00000.000
945 E
946 \begin_inset LatexCommand \index{E, electric current dimension}
947
948 \end_inset
949
950 electric current
951 \begin_inset LatexCommand \index{electric current}
952
953 \end_inset
954
955 ; ampere, A
956 \end_layout
957
958 \begin_layout List
959 \labelwidthstring 00000.00000.00000.000
960 Q
961 \begin_inset LatexCommand \index{Q, quantity dimension}
962
963 \end_inset
964
965 quantity
966 \begin_inset LatexCommand \index{quantity}
967
968 \end_inset
969
970 ; mole, mole
971 \end_layout
972
973 \begin_layout List
974 \labelwidthstring 00000.00000.00000.000
975 TMP
976 \begin_inset LatexCommand \index{TMP, temperature dimension}
977
978 \end_inset
979
980 temperature
981 \begin_inset LatexCommand \index{temperature}
982
983 \end_inset
984
985 ; Kelvin, K
986 \end_layout
987
988 \begin_layout List
989 \labelwidthstring 00000.00000.00000.000
990 LUM
991 \begin_inset LatexCommand \index{LUM, luminous intensity dimension}
992
993 \end_inset
994
995 luminous intensity
996 \begin_inset LatexCommand \index{luminous intensity}
997
998 \end_inset
999
1000 ; candela, cd
1001 \end_layout
1002
1003 \begin_layout List
1004 \labelwidthstring 00000.00000.00000.000
1005 P
1006 \begin_inset LatexCommand \index{P, phase angle dimension}
1007
1008 \end_inset
1009
1010 plane angle
1011 \begin_inset LatexCommand \index{plane angle}
1012
1013 \end_inset
1014
1015 ; radian, rad
1016 \end_layout
1017
1018 \begin_layout List
1019 \labelwidthstring 00000.00000.00000.000
1020 S
1021 \begin_inset LatexCommand \index{S, solid angle dimension}
1022
1023 \end_inset
1024
1025 solid angle
1026 \begin_inset LatexCommand \index{solid angle}
1027
1028 \end_inset
1029
1030 ; steradian, srad
1031 \end_layout
1032
1033 \begin_layout List
1034 \labelwidthstring 00000.00000.00000.000
1035 C
1036 \begin_inset LatexCommand \index{C, currency dimension}
1037
1038 \end_inset
1039
1040 currency
1041 \begin_inset LatexCommand \index{currency}
1042
1043 \end_inset
1044
1045 ; currency, CR
1046 \end_layout
1047
1048 \begin_deeper
1049 \begin_layout Standard
1050 The atom and constant definitions in the library illustrate the use of dimension
1051 ality.
1052 \end_layout
1053
1054 \begin_layout Standard
1055 Dimensions may be any combination of these symbols along with rounded parenthese
1056 s, (), and the operators *, ^ and /.
1057 Examples include M/T or M*L^2/T^2/TMP {this latter means (M*(L^2)/(T^2))/TMP}.
1058 The second operand for the to the power operator, ^, must be an integer
1059 value (e.g., -2 or 3) because fractional powers of dimensional numbers are
1060 physically undefined.
1061 \end_layout
1062
1063 \begin_layout Standard
1064 If the dimensionality for a real value is undefined, then ASCEND gives it
1065 a wild card dimensionality
1066 \begin_inset LatexCommand \index{wild card dimensionality}
1067
1068 \end_inset
1069
1070 .
1071 If ASCEND can later deduce its dimensionality from its use in a model definitio
1072 n it will do so.
1073 For example consider the real variable a, suppose a has wild card dimensionalit
1074 y, b has dimensionality of L/T.
1075 Then the statement:
1076 \end_layout
1077
1078 \end_deeper
1079 \begin_layout List
1080 \labelwidthstring 00000.00000.00000.000
1081 Example\InsetSpace ~
1082 of\InsetSpace ~
1083 a\InsetSpace ~
1084 dimensionally\InsetSpace ~
1085 consistent
1086 \begin_inset LatexCommand \index{dimensionally consistent}
1087
1088 \end_inset
1089
1090 \InsetSpace ~
1091 equation.
1092
1093 \end_layout
1094
1095 \begin_layout List
1096 \labelwidthstring 00000.00000.00000.000
1097 \InsetSpace ~
1098 a + b = 3 {ft/s};
1099 \end_layout
1100
1101 \begin_deeper
1102 \begin_layout Standard
1103 requires that a have the same dimensionality as the other two terms, namely,
1104 L/T.
1105 ASCEND will assign this dimensionality to a.
1106 The user will be warned of dimensionally inconsistent equations.
1107 \end_layout
1108
1109 \end_deeper
1110 \begin_layout List
1111 \labelwidthstring 00000.00000.00000.000
1112
1113 \bar under
1114 Unit\InsetSpace ~
1115 expression
1116 \bar default
1117 A unit expression
1118 \begin_inset LatexCommand \index{unit expression}
1119
1120 \end_inset
1121
1122 may be composed of any combination of unit names defined by the system
1123 and any numerical constants combined with times (*), divide(/) and to the
1124 power (^) operators.
1125 The RHS of ^ must be an integer.
1126 Parentheses can be used to group subexpressions EXCEPT a divide operator
1127 may not be followed by a grouped subexpression.
1128
1129 \end_layout
1130
1131 \begin_deeper
1132 \begin_layout Standard
1133 So, {kg/m/s} is fine, but {kg/(m*s)} is not.
1134 Although the two expressions are mathematically equivalent, it makes the
1135 system programming and output formatting easier to code and faster to execute
1136 if we disallow expressions of the latter sort.
1137 \end_layout
1138
1139 \begin_layout Standard
1140 The units understood by the system are defined in the
1141 \begin_inset Quotes eld
1142 \end_inset
1143
1144 howTo
1145 \begin_inset LatexCommand \cite{key-1}
1146
1147 \end_inset
1148
1149
1150 \begin_inset Quotes erd
1151 \end_inset
1152
1153 book available on the ASCEND web site.
1154 Note that several units defined are really values of interesting constants
1155 in SI, e.g.
1156 R :== 1{GAS_C} yields the correct value of the thermodynamic gas constant.
1157 Users can define additional units.
1158 \end_layout
1159
1160 \end_deeper
1161 \begin_layout List
1162 \labelwidthstring 00000.00000.00000.000
1163
1164 \bar under
1165 Units
1166 \bar default
1167
1168 \begin_inset LatexCommand \index{units}
1169
1170 \end_inset
1171
1172 A Unit expression unit expression must be enclosed in curly braces {}.
1173 When a real number is used in a mathematical expression in ASCEND, it must
1174 have a set of units expressed with it.
1175 If it does not, ASCEND assumes the number is dimensionless, which may not
1176 be the intent of the modeler.
1177 An example is shown in the dimensionally consistent equation above where
1178 the number 3 has the units {ft/s} associated with it.
1179
1180 \end_layout
1181
1182 \begin_deeper
1183 \begin_layout Standard
1184 Examples:
1185 \end_layout
1186
1187 \begin_layout LyX-Code
1188 \align block
1189 {kg_mole/s/m} same as {(kg_mole/s)/m}
1190 \end_layout
1191
1192 \begin_layout LyX-Code
1193 \align block
1194 {m^3/yr}
1195 \end_layout
1196
1197 \begin_layout LyX-Code
1198 \align block
1199 {3/100*ft} same as {0.03*ft}
1200 \end_layout
1201
1202 \begin_layout LyX-Code
1203 \align block
1204 {s^-1} same as {1/s}
1205 \end_layout
1206
1207 \begin_layout Standard
1208 Illegal unit examples are
1209 \end_layout
1210
1211 \begin_layout LyX-Code
1212 \align block
1213 {m/(K*kg_mole)}
1214 \end_layout
1215
1216 \begin_deeper
1217 \begin_layout Standard
1218 grouped subexpression used in the denominator; should be written {m/K/kg_mole}.
1219 \end_layout
1220
1221 \end_deeper
1222 \begin_layout LyX-Code
1223 \align block
1224 {m^3.5}
1225 \end_layout
1226
1227 \begin_deeper
1228 \begin_layout Standard
1229 power of units or dimensions must be integer.
1230 \end_layout
1231
1232 \end_deeper
1233 \end_deeper
1234 \begin_layout List
1235 \labelwidthstring 00000.00000.00000.000
1236
1237 \bar under
1238 Symbol\InsetSpace ~
1239 Value
1240 \bar default
1241
1242 \begin_inset LatexCommand \index{value, symbol}
1243
1244 \end_inset
1245
1246
1247 \begin_inset LatexCommand \index{symbol value}
1248
1249 \end_inset
1250
1251 The format for a symbol is that of an arbitrary character string enclosed
1252 between two single quotes.
1253 There is no way to embed a single quote
1254 \begin_inset LatexCommand \index{'}
1255
1256 \end_inset
1257
1258
1259 \begin_inset LatexCommand \index{single quote}
1260
1261 \end_inset
1262
1263 in a symbol: we are not in the escape sequence business at this time.
1264 The following are legal symbols in ASCEND:
1265 \end_layout
1266
1267 \begin_deeper
1268 \begin_layout LyX-Code
1269 'H2O'
1270 \end_layout
1271
1272 \begin_layout LyX-Code
1273 'r1'
1274 \end_layout
1275
1276 \begin_layout LyX-Code
1277 'Bill said,foo to whom?'
1278 \end_layout
1279
1280 \begin_layout Standard
1281 while the following are not legal symbol values:
1282 \end_layout
1283
1284 \begin_layout LyX-Code
1285 "ethanol" (double quotes not allowed)
1286 \end_layout
1287
1288 \begin_layout LyX-Code
1289 water (no single quotes given)
1290 \end_layout
1291
1292 \begin_layout LyX-Code
1293 i cant do this (no embedded quotes)
1294 \end_layout
1295
1296 \begin_layout Standard
1297 There is an arbitrary upper limit to the number of characters in a symbol
1298 (something like 10,000) so that we may detect a missing close quote in
1299 a bad input file without crashing.
1300 \end_layout
1301
1302 \end_deeper
1303 \begin_layout List
1304 \labelwidthstring 00000.00000.00000.000
1305 Sets\InsetSpace ~
1306 values
1307 \begin_inset LatexCommand \index{values, set}
1308
1309 \end_inset
1310
1311
1312 \begin_inset LatexCommand \index{set values}
1313
1314 \end_inset
1315
1316 Set values are lists of elements, all of type integer_constant or all of
1317 type symbol_constant, enclosed between square brackets [].
1318 The following are examples of sets:
1319 \end_layout
1320
1321 \begin_deeper
1322 \begin_layout LyX-Code
1323 \align block
1324 ['methane', 'ethane', 'propane']
1325 \end_layout
1326
1327 \begin_layout LyX-Code
1328 \align block
1329 [1..5, 7, 15]
1330 \end_layout
1331
1332 \begin_layout LyX-Code
1333 \align block
1334 [2..n_stages]
1335 \end_layout
1336
1337 \begin_layout LyX-Code
1338 \align block
1339 [1, 4, 2, 1, 16]
1340 \end_layout
1341
1342 \begin_layout LyX-Code
1343 \align block
1344 []
1345 \end_layout
1346
1347 \end_deeper
1348 \begin_layout List
1349 \labelwidthstring 00000.00000.00000.000
1350 More\InsetSpace ~
1351 about\InsetSpace ~
1352 sets
1353 \begin_inset LatexCommand \index{sets}
1354
1355 \end_inset
1356
1357 \InsetSpace ~
1358 in\InsetSpace ~
1359 Section\InsetSpace ~
1360
1361 \begin_inset LatexCommand \vref{sub:x.2.2Sets}
1362
1363 \end_inset
1364
1365 .
1366 \end_layout
1367
1368 \begin_deeper
1369 \begin_layout Standard
1370 The value range 1..5 is an allowable shorthand for the integers 1, 2, 3, 4
1371 and 5 while the value range 2..n_stages (where n_stages must be of type integer_c
1372 onstant) means all integers from 2 to n_stages.
1373 If n_stages is less than 2, then the third set is empty.
1374 The repeated occurrence of 1 in the fourth set is ignored.
1375 The fifth set is the empty set
1376 \begin_inset LatexCommand \index{empty set}
1377
1378 \end_inset
1379
1380
1381 \begin_inset LatexCommand \index{set, empty}
1382
1383 \end_inset
1384
1385 .
1386 \end_layout
1387
1388 \begin_layout Standard
1389 We use the term set in an almost pure mathematical sense.
1390 The elements have no order.
1391 One can only ask two things of a set: (1) if an element is a member of
1392 it and (2) its cardinality
1393 \begin_inset LatexCommand \index{cardinality}
1394
1395 \end_inset
1396
1397 (CARD
1398 \begin_inset LatexCommand \index{CARD}
1399
1400 \end_inset
1401
1402 (set)).
1403 Repeated elements used in defining a set are ignored.
1404 The elements of sets cannot themselves be sets in ASCEND; i.e., there can
1405 be no sets of set.
1406 \end_layout
1407
1408 \end_deeper
1409 \begin_layout List
1410 \labelwidthstring 00000.00000.00000.000
1411 Sets\InsetSpace ~
1412 are\InsetSpace ~
1413 unordered.
1414 A set of integers may appear to be ordered to the modeler as the natural
1415 numbers have an order.
1416 However, it is the user imposing and using the ordering, not ASCEND.
1417 ASCEND sees these integers as elements in the set with NO ordering.
1418 Therefore, there are no operators in ASCEND such as successor or precursor
1419 member of a set.
1420 \end_layout
1421
1422 \begin_layout List
1423 \labelwidthstring 00000.00000.00000.000
1424
1425 \bar under
1426 Arrays
1427 \bar default
1428
1429 \begin_inset LatexCommand \index{arrays}
1430
1431 \end_inset
1432
1433 An array is a list of instances indexed over a set, in computer-speak,
1434 an associative array of objects.
1435 The instances are all of the same base type (as that is the only way they
1436 can be defined).
1437 An individual member of a list may later be more refined than the other
1438 members (we shall illustrate that possibility).
1439 The following are arrays in ASCEND.
1440 \end_layout
1441
1442 \begin_deeper
1443 \begin_layout LyX-Code
1444 \align block
1445 stage[1..n_stages]
1446 \end_layout
1447
1448 \begin_layout LyX-Code
1449 \align block
1450 y[components]
1451 \end_layout
1452
1453 \begin_layout LyX-Code
1454 \align block
1455 column[areas][processes]
1456 \end_layout
1457
1458 \begin_layout Standard
1459 where components, areas and processes are sets.
1460 For example components could be the set of symbols ['ethylene', 'propylene'],
1461 areas the set of symbols ['feed_prep', 'prod_purification'] while processes
1462 could be the set ['alcohol_manuf', 'poly_propropylene_manuf'].
1463 Note that the third example (column) is a list of lists (the way that ASCEND
1464 permits a multiply subscripted array).
1465
1466 \end_layout
1467
1468 \begin_layout Standard
1469 The following are elements in the above arrays:
1470 \end_layout
1471
1472 \begin_layout LyX-Code
1473 stage[1]
1474 \end_layout
1475
1476 \begin_layout LyX-Code
1477 y['ethylene']
1478 \end_layout
1479
1480 \begin_layout LyX-Code
1481 column['feed_prep'][alcohol_manuf']
1482 \end_layout
1483
1484 \begin_layout Standard
1485 provided that n_stages is 1 or larger.
1486
1487 \end_layout
1488
1489 \begin_layout Standard
1490 There can be any number of subscripts
1491 \begin_inset LatexCommand \index{subscripts}
1492
1493 \end_inset
1494
1495 for an array.
1496 We point out, however, that in virtually every application of arrays requiring
1497 more than two subscripts, there is usually a some underlying concept that
1498 is much better modeled as an object than as part of a deeply subscripted
1499 \begin_inset LatexCommand \index{subscripted, deeply}
1500
1501 \end_inset
1502
1503
1504 \begin_inset LatexCommand \index{deeply subscripted}
1505
1506 \end_inset
1507
1508 array.
1509 In the following jagged array example, there are really the concepts of
1510 unit operation and stream that would be better understood if made explicit.
1511 \end_layout
1512
1513 \end_deeper
1514 \begin_layout List
1515 \labelwidthstring 00000.00000.00000.000
1516
1517 \bar under
1518 Arrays\InsetSpace ~
1519 can\InsetSpace ~
1520 be\InsetSpace ~
1521 jagged
1522 \bar default
1523
1524 \begin_inset LatexCommand \label{lyx:Arrays-can-be}
1525
1526 \end_inset
1527
1528 (* 4 *) Arrays can be sparse
1529 \begin_inset LatexCommand \index{sparse}
1530
1531 \end_inset
1532
1533 or jagged
1534 \begin_inset LatexCommand \index{jagged}
1535
1536 \end_inset
1537
1538 .
1539 For example:
1540 \end_layout
1541
1542 \begin_deeper
1543 \begin_layout LyX-Code
1544 process[1..3] IS_A set OF integer;
1545 \end_layout
1546
1547 \begin_layout LyX-Code
1548 process[1] :== [2];
1549 \end_layout
1550
1551 \begin_layout LyX-Code
1552 process[2] :== [7,5,3];
1553 \end_layout
1554
1555 \begin_layout LyX-Code
1556 process[3] :== [4,6];
1557 \end_layout
1558
1559 \begin_layout LyX-Code
1560 FOR i in [1..3] CREATE
1561 \end_layout
1562
1563 \begin_layout LyX-Code
1564 FOR j IN process[i] CREATE
1565 \end_layout
1566
1567 \begin_layout LyX-Code
1568 flow[i][j] IS_A mass;
1569 \end_layout
1570
1571 \begin_layout LyX-Code
1572 END FOR;
1573 \end_layout
1574
1575 \begin_layout LyX-Code
1576 END FOR;
1577 \end_layout
1578
1579 \begin_layout Standard
1580 process is an array of sets (not to be confused with a set of sets which
1581 ASCEND does not have) and flow is an array with six elements spread over
1582 three rows:
1583 \end_layout
1584
1585 \begin_layout LyX-Code
1586 flow[1][2]
1587 \end_layout
1588
1589 \begin_layout LyX-Code
1590 flow[2][7], flow[2][3], flow[2][5]
1591 \end_layout
1592
1593 \begin_layout LyX-Code
1594 flow[3][4], flow[3][6]
1595 \end_layout
1596
1597 \begin_layout Standard
1598 Sparse arrays of models and variables are new to ASCEND IV.
1599 \end_layout
1600
1601 \end_deeper
1602 \begin_layout List
1603 \labelwidthstring 00000.00000.00000.000
1604 Arrays\InsetSpace ~
1605 are\InsetSpace ~
1606 also\InsetSpace ~
1607 instances
1608 \end_layout
1609
1610 \begin_deeper
1611 \begin_layout Standard
1612 Each array is itself an object.
1613 That is, when you write "a[1..2] IS_A real;" three objects get created: a[1],
1614 a[2], and a.
1615 a is an array instance which has parts named [1] and [2] that are real
1616 instances.
1617 When a parameterized model requires an array, you pass it the single item
1618 a, not the elements a[1..2].
1619 \end_layout
1620
1621 \end_deeper
1622 \begin_layout List
1623 \labelwidthstring 00000.00000.00000.000
1624 No\InsetSpace ~
1625 contiguous\InsetSpace ~
1626 storage
1627 \begin_inset LatexCommand \index{contiguous storage, no}
1628
1629 \end_inset
1630
1631
1632 \end_layout
1633
1634 \begin_deeper
1635 \begin_layout Standard
1636 Just in case you still have not caught on, ASCEND arrays are not blocks
1637 of memory such as are seen in low-level languages like C
1638 \begin_inset LatexCommand \index{C, computer language}
1639
1640 \end_inset
1641
1642 , FORTRAN
1643 \begin_inset LatexCommand \index{FORTRAN}
1644
1645 \end_inset
1646
1647 , and Matlab
1648 \begin_inset LatexCommand \index{Matlab}
1649
1650 \end_inset
1651
1652 .
1653 The modeling language does not provide things like MatMult
1654 \begin_inset LatexCommand \index{MatMult}
1655
1656 \end_inset
1657
1658 , Transpose
1659 \begin_inset LatexCommand \index{Transpose}
1660
1661 \end_inset
1662
1663 , and Inverse
1664 \begin_inset LatexCommand \index{Inverse}
1665
1666 \end_inset
1667
1668 because these are procedural solving tools.
1669 If you are dedicated, you could write METHODs that implement matrix algebra,
1670 but this is a really dumb idea.
1671 We aim to structure our software so that it can interact openly with separate,
1672 dedicated tools (such as Matlab) when those tools are needed.
1673 \end_layout
1674
1675 \end_deeper
1676 \begin_layout List
1677 \labelwidthstring 00000.00000.00000.000
1678 Index\InsetSpace ~
1679 variable
1680 \begin_inset LatexCommand \index{index variable}
1681
1682 \end_inset
1683
1684 One can introduce a variable as an index ranging over a set.
1685 Index variables are local to the statements in which they occur.
1686 An example of using an index variable is the following FOR statement:
1687 \end_layout
1688
1689 \begin_deeper
1690 \begin_layout LyX-Code
1691 FOR i IN components CREATE
1692 \end_layout
1693
1694 \begin_layout LyX-Code
1695 VLE_equil[i]: y[i] = K[i]*x[i];
1696 \end_layout
1697
1698 \begin_layout LyX-Code
1699 END FOR;
1700 \end_layout
1701
1702 \begin_layout Standard
1703 In this example i implicitly is of the same type as the values in the set
1704 components.
1705 If another object i exists in the model containing the FOR loop, it is
1706 ignored while executing the statements in that loop.
1707 This may cause unexpected results and the compiler will generate warnings
1708 about loop index shadowed variables.
1709 \end_layout
1710
1711 \end_deeper
1712 \begin_layout List
1713 \labelwidthstring 00000.00000.00000.000
1714 Label
1715 \begin_inset LatexCommand \index{label}
1716
1717 \end_inset
1718
1719 : One can label statements which define arithmetic relationships (objective
1720 functions, equalities, and inequalities) in ASCEND.
1721 Labeling is highly recommended because it makes models much more readable
1722 and more easily debugged.
1723 Labels are also necessary for relations which are going to be used in condition
1724 al modeling or differentiation functions.
1725 A label is a sequence of alphanumeric characters ending in a colon.
1726 An example of a labeled equation is:
1727 \end_layout
1728
1729 \begin_deeper
1730 \begin_layout LyX-Code
1731 mass_balance: m_in = m_out;
1732 \end_layout
1733
1734 \begin_layout Standard
1735 An example of a labeled objective function is:
1736 \end_layout
1737
1738 \begin_layout LyX-Code
1739 obj1: MAXIMIZE revenue - cost;
1740 \end_layout
1741
1742 \begin_layout Standard
1743 If a relation is defined within a FOR statement, it must have an array indexed
1744 label so that each instance created using the statement is distinguishable
1745 from the others.
1746 An example is:
1747 \end_layout
1748
1749 \begin_layout LyX-Code
1750 FOR i IN components CREATE
1751 \end_layout
1752
1753 \begin_layout LyX-Code
1754 equil[i]: y[i] = K[i]*x[i];
1755 \end_layout
1756
1757 \begin_layout LyX-Code
1758 END FOR;
1759 \end_layout
1760
1761 \begin_layout Standard
1762 The ASCEND interactive user interface identifies relationships by their
1763 labels.
1764 If one has not provided such a label, the system generates the label:
1765 \end_layout
1766
1767 \begin_layout LyX-Code
1768
1769 \emph on
1770 modelname_equationnumber
1771 \end_layout
1772
1773 \begin_layout Standard
1774 where modelname and equationnumber are the name of the model and the equation
1775 number in the model.
1776 An example is
1777 \end_layout
1778
1779 \begin_layout LyX-Code
1780 mixture_14
1781 \end_layout
1782
1783 \begin_layout Standard
1784 for the unlabeled 14th relation in the mixture definition.
1785 If there is a conflict caused with an existing name, the generated name
1786 has enough letters added after equationnumber to make it a unique name.
1787 Remember that each model in a refinement hierarchy inherits the equations
1788 of its less refined ancestors, so the first equation appearing in the source
1789 code of a refining model may actually be the nth relation in that model.
1790 \end_layout
1791
1792 \end_deeper
1793 \begin_layout List
1794 \labelwidthstring 00000.00000.00000.000
1795
1796 \bar under
1797 Lists
1798 \bar default
1799
1800 \begin_inset LatexCommand \index{lists}
1801
1802 \end_inset
1803
1804 Often in a statement one can include a list of names or expression.
1805 A name list is one or more names where multiple list entries are separated
1806 from each other by commas.
1807 Examples of a list of names are:
1808 \end_layout
1809
1810 \begin_deeper
1811 \begin_layout LyX-Code
1812 \align block
1813 T1, inlet_T, outlet_T
1814 \end_layout
1815
1816 \begin_layout LyX-Code
1817 \align block
1818 y[components], y_in
1819 \end_layout
1820
1821 \begin_layout LyX-Code
1822 \align block
1823 stage[1..n_stages]
1824 \end_layout
1825
1826 \end_deeper
1827 \begin_layout List
1828 \labelwidthstring 00000.00000.00000.000
1829
1830 \bar under
1831 Ordered\InsetSpace ~
1832 lists
1833 \begin_inset LatexCommand \index{lists, ordered}
1834
1835 \end_inset
1836
1837
1838 \begin_inset LatexCommand \index{ordered lists}
1839
1840 \end_inset
1841
1842 :
1843 \bar default
1844 If the ordering of names in a list matters, that list is enclosed in ().
1845 Order matters in: calling externally defined methods or models, calling
1846 most real-valued functions, passing parameters to ASCEND models or methods,
1847 and declaring the controlling parameters that SELECT, SWITCH, and WHEN
1848 statements make decisions on.
1849 \end_layout
1850
1851 \begin_deeper
1852 \begin_layout Subsection
1853 Basic Concepts
1854 \end_layout
1855
1856 \end_deeper
1857 \begin_layout List
1858 \labelwidthstring 00000.00000.00000.000
1859
1860 \bar under
1861 Instances
1862 \begin_inset LatexCommand \index{instances}
1863
1864 \end_inset
1865
1866 \InsetSpace ~
1867 and\InsetSpace ~
1868 types
1869 \bar default
1870
1871 \begin_inset LatexCommand \index{types}
1872
1873 \end_inset
1874
1875 This is an opportune time to emphasize the distinction between the terms
1876 instance and type.
1877 A type in ASCEND is what we define when we declare an ASCEND model or atom.
1878 It is the formal definition of the attributes (parts) and attribute default
1879 values that an object will have if it is created using the type definition.
1880 Methods are associated with types.
1881 \end_layout
1882
1883 \begin_deeper
1884 \begin_layout Standard
1885 In ASCEND there are two meanings (closely related) of an instance.
1886
1887 \end_layout
1888
1889 \begin_layout Itemize
1890 An instance is a named part that exists within a type definition.
1891
1892 \end_layout
1893
1894 \begin_layout Itemize
1895 An instance is a compiled object.
1896
1897 \end_layout
1898
1899 \begin_layout Standard
1900 If one is in the context of the ASCEND interface, the system compiles an
1901 instance of a model type to create an object with which one carries out
1902 computations.
1903 The system requires the user to give a simple name for this simulation
1904 instance.
1905 This name given is then the first part of the qualified name for all the
1906 parts of the compiled object.
1907 \end_layout
1908
1909 \end_deeper
1910 \begin_layout List
1911 \labelwidthstring 00000.00000.00000.000
1912
1913 \bar under
1914 Implicit\InsetSpace ~
1915 types
1916 \bar default
1917
1918 \begin_inset LatexCommand \index{types, implicit}
1919
1920 \end_inset
1921
1922
1923 \begin_inset LatexCommand \index{types, implicit}
1924
1925 \end_inset
1926
1927 It is possible to create an instance that does not have a corresponding
1928 type definition in the library.
1929 The type of such an instance is said to be implicit.
1930 (Some people use the word anonymous
1931 \begin_inset LatexCommand \index{type, anonymous}
1932
1933 \end_inset
1934
1935
1936 \begin_inset LatexCommand \index{anonymous type}
1937
1938 \end_inset
1939
1940 .
1941 However, no computable type is anonymous and the implicit type of an instance
1942 is theoretically computable).
1943 The simplest example of an implicit type is the type of an instance compiled
1944 from the built-in definition integer_constant.
1945 For example:
1946 \end_layout
1947
1948 \begin_deeper
1949 \begin_layout LyX-Code
1950 i, j IS_A integer_constant;
1951 \end_layout
1952
1953 \begin_layout LyX-Code
1954 i:== 2;
1955 \end_layout
1956
1957 \begin_layout LyX-Code
1958 j:== 3;
1959 \end_layout
1960
1961 \begin_layout Standard
1962 Instances i and j, though of the same formal type, are implicit type incompatibl
1963 e because they have been assigned distinct values.
1964 \end_layout
1965
1966 \begin_layout Standard
1967 Instances which are either formally or implicitly type incompatible cannot
1968 be merged.
1969 This will be discussed further in Section
1970 \begin_inset LatexCommand \vref{sec:x.3Declarative-statements}
1971
1972 \end_inset
1973
1974 .
1975 \end_layout
1976
1977 \end_deeper
1978 \begin_layout List
1979 \labelwidthstring 00000.00000.00000.000
1980 Parsing
1981 \begin_inset LatexCommand \index{parsing}
1982
1983 \end_inset
1984
1985 Most errors in the declaration of an ASCEND model can be caught at parse
1986 time because the object type of any well-formed name in an ASCEND definition
1987 can be resolved or proved ambiguous.
1988 We cannot prove at parse time whether a specific array element will exist,
1989 but we can know that should such an element exist, it must be of the type
1990 with which the array is defined.
1991
1992 \end_layout
1993
1994 \begin_deeper
1995 \begin_layout Standard
1996 Ambiguity is warned about loudly because it is caused by either misspelling
1997 or poor modeling style.
1998 The simplest example of ambiguity follows.
1999 \end_layout
2000
2001 \begin_layout Standard
2002 Assume a type, stream, and a refinement of stream, heat_stream, which adds
2003 the new variable H.
2004 Now, if we write:
2005 \end_layout
2006
2007 \begin_layout LyX-Code
2008 MODEL mixer;
2009 \end_layout
2010
2011 \begin_layout LyX-Code
2012 input[1..2] IS_A stream;
2013 \end_layout
2014
2015 \begin_layout LyX-Code
2016 output IS_A heat_stream;
2017 \end_layout
2018
2019 \begin_layout LyX-Code
2020 input[1].H + input[2].H = output.H;
2021 \end_layout
2022
2023 \begin_layout LyX-Code
2024 END mixer;
2025 \end_layout
2026
2027 \begin_layout Standard
2028 We see the parser can find the definition of H in the type heat_stream,
2029 so output.H is well defined.
2030 The author of the mixer model may intend to refine input[1] and input[2]
2031 to be objects of different types, say steam_stream and electric_stream,
2032 where each defines an H suitable for use in the equation.
2033 The parser cannot read the authors mind, so it warns that input[1].H and
2034 input[2].H are ambiguous in the mixer definition.
2035 The mixer model is not highly reusable except by the author, but sometimes
2036 reusability is not a high priority objective.
2037 The mixer definition is allowed, but it may cause problems in instantiation
2038 if the author has forgotten the assumption that is not explicitly stated
2039 in the model and neglects to refine the input streams appropriately.
2040 \end_layout
2041
2042 \end_deeper
2043 \begin_layout List
2044 \labelwidthstring 00000.00000.00000.000
2045
2046 \bar under
2047 Instantiation
2048 \bar default
2049
2050 \begin_inset LatexCommand \index{instantiation}
2051
2052 \end_inset
2053
2054 Creating an simulation based on a type definition is a multi-phase
2055 \begin_inset LatexCommand \index{multi-phase}
2056
2057 \end_inset
2058
2059 process called compiling
2060 \begin_inset LatexCommand \index{compiling}
2061
2062 \end_inset
2063
2064 (or instantiation).
2065 When an instantiation cannot be completed because some structural parameter
2066 (a symbol_constant, real_constant, boolean_constant, integer_constant,
2067 or set) does not have a value there will be PENDING
2068 \begin_inset LatexCommand \index{PENDING}
2069
2070 \end_inset
2071
2072 statements.
2073 The user interface will warn that something is incomplete.
2074 \end_layout
2075
2076 \begin_deeper
2077 \begin_layout Standard
2078 In phase
2079 \begin_inset LatexCommand \index{phases, compiler}
2080
2081 \end_inset
2082
2083 1 all statements that create instance structures or assign constant values
2084 are executed.
2085 This phase theoretically requires an infinite number of passes through
2086 the structural statements of a definition.
2087 We allow a maximum of 5 and have never needed more than 3.
2088 There may be pending statements at the end of phase 1.
2089 The compiler or interface will issue warnings about pending statements,
2090 starting with warnings about unassigned constants.
2091 \end_layout
2092
2093 \begin_layout Standard
2094 Phase 2 compiles as many real arithmetic relation definitions as possible.
2095 Some relations may be impossible to compile because the constants or sets
2096 they depend on do not have values assigned.
2097 Other relations may be impossible because they reference variables that
2098 do not exist.
2099 This is determined in a single pass.
2100 \end_layout
2101
2102 \begin_layout Standard
2103 Phase 3 compiles as many logical arithmetic relation definitions as possible.
2104 Some relations may be impossible to compile because the constants or sets
2105 they depend on do not have values assigned.
2106 Other relations may be impossible because they reference real arithmetic
2107 relations that do not exist.
2108 This is determined in a single pass.
2109 \end_layout
2110
2111 \begin_layout Standard
2112 Phase 4 compiles as many conditional programming statements (WHENs) as possible.
2113 Some WHEN relations may be impossible to compile because the discrete variables
2114 , models, or relations they depend on do not exist.
2115 This is determined in a single pass.
2116 \end_layout
2117
2118 \begin_layout Standard
2119 Phase 5 executes the variable defaulting statements made in the declarative
2120 section of each model IF AND ONLY IF there are no pending statements from
2121 phases 1-4 anywhere in the simulation.
2122 \end_layout
2123
2124 \end_deeper
2125 \begin_layout List
2126 \labelwidthstring 00000.00000.00000.000
2127 default_self
2128 \begin_inset LatexCommand \index{default\_self}
2129
2130 \end_inset
2131
2132 After all phases are done, the method default_self is called in the top-most
2133 model of the simulation, if this method exists.
2134 \end_layout
2135
2136 \begin_deeper
2137 \begin_layout Standard
2138 The first occurrence of each impossible statement will be explained during
2139 a failed compilation.
2140 Impossible statements include:
2141 \end_layout
2142
2143 \begin_layout Itemize
2144 Relations containing undefinable variables (often misspellings).
2145 \end_layout
2146
2147 \begin_layout Itemize
2148 Assignments that are dimensionally inconsistent or containing mismatched
2149 types.
2150 \end_layout
2151
2152 \begin_layout Itemize
2153 Structure building or modifying statements that refer to model parts which
2154 cannot exist or that require a type-incompatible argument, refinement,
2155 or merge.
2156 \end_layout
2157
2158 \begin_layout Section
2159 Data Type Declarations
2160 \begin_inset LatexCommand \index{data type declarations}
2161
2162 \end_inset
2163
2164
2165 \end_layout
2166
2167 \begin_layout Standard
2168 In the spectrum of OO languages, ASCEND is best considered as being class-based
2169 \begin_inset LatexCommand \index{class-based}
2170
2171 \end_inset
2172
2173 , though it is rather more a hybrid.
2174 We have atom and model definitions, called types, and the compiled objects
2175 themselves, called instances.
2176 ASCEND instances have a record of what type they were constructed from.
2177 \end_layout
2178
2179 \end_deeper
2180 \begin_layout List
2181 \labelwidthstring 00000.00000.00000.000
2182
2183 \bar under
2184 Type\InsetSpace ~
2185 qualifiers
2186 \begin_inset LatexCommand \index{type qualifiers}
2187
2188 \end_inset
2189
2190 :
2191 \end_layout
2192
2193 \begin_layout List
2194 \labelwidthstring 00000.00000.00000.000
2195 UNIVERSAL
2196 \begin_inset LatexCommand \index{UNIVERSAL}
2197
2198 \end_inset
2199
2200 Universal is an optional modifier of all ATOM, CONSTANT.
2201 and MODEL definitions.
2202 If UNIVERSAL precedes the definition, then ALL instances of that type will
2203 actually refer to the first instance of the type that is created.
2204 This saves memory and ensures global consistency of data.
2205
2206 \end_layout
2207
2208 \begin_deeper
2209 \begin_layout Standard
2210 Examples of universal type definitions are
2211 \end_layout
2212
2213 \begin_layout LyX-Code
2214 UNIVERSAL MODEL methane
2215 \end_layout
2216
2217 \begin_layout LyX-Code
2218 REFINES generic_component_model;
2219 \end_layout
2220
2221 \begin_layout LyX-Code
2222 UNIVERSAL CONSTANT circle_constant
2223 \end_layout
2224
2225 \begin_layout LyX-Code
2226 REFINES real_constant :== 1{PI};
2227 \end_layout
2228
2229 \begin_layout LyX-Code
2230 UNIVERSAL ATOM counter_1
2231 \end_layout
2232
2233 \begin_layout LyX-Code
2234 REFINES integer;
2235 \end_layout
2236
2237 \end_deeper
2238 \begin_layout List
2239 \labelwidthstring 00000.00000.00000.000
2240 Tip:\InsetSpace ~
2241 Do\InsetSpace ~
2242 not\InsetSpace ~
2243 use\InsetSpace ~
2244 UNIVERSAL\InsetSpace ~
2245 variables\InsetSpace ~
2246 in\InsetSpace ~
2247 relations.
2248 \end_layout
2249
2250 \begin_deeper
2251 \begin_layout Standard
2252 It is important to note that, because variables must store information about
2253 which relations they occur in, it is a very bad idea to use UNIVERSAL typed
2254 variables in relations.
2255 The construction and maintenance of the relation list becomes very expensive
2256 for universal variables.
2257 UNIVERSAL constants are fine to use, though, because there are no relation
2258 links for constants.
2259 \end_layout
2260
2261 \begin_layout Subsection
2262 Models
2263 \end_layout
2264
2265 \end_deeper
2266 \begin_layout List
2267 \labelwidthstring 00000.00000.00000.000
2268 MODEL
2269 \begin_inset LatexCommand \index{MODEL}
2270
2271 \end_inset
2272
2273 An ASCEND model has a declarative part and an optional procedural part
2274 headed by the METHODS word.
2275 Models are essentially containers for variables and relations.
2276 We will explain the various statements that can be made within models in
2277 Section
2278 \begin_inset LatexCommand \vref{sec:x.3Declarative-statements}
2279
2280 \end_inset
2281
2282 and Section
2283 \begin_inset LatexCommand \vref{sec:x.4Procedural-statements}
2284
2285 \end_inset
2286
2287 .
2288 \end_layout
2289
2290 \begin_layout Standard
2291 Simple\InsetSpace ~
2292 models
2293 \begin_inset LatexCommand \index{models, simple}
2294
2295 \end_inset
2296
2297 :
2298 \end_layout
2299
2300 \begin_layout List
2301 \labelwidthstring 00000.00000.00000.000
2302 foo
2303 \family typewriter
2304 \InsetSpace ~
2305 \InsetSpace ~
2306 \InsetSpace ~
2307 \InsetSpace ~
2308 MODEL foo;
2309 \end_layout
2310
2311 \begin_deeper
2312 \begin_layout LyX-Code
2313 (* statements about foo go here*)
2314 \end_layout
2315
2316 \begin_layout LyX-Code
2317 METHODS
2318 \end_layout
2319
2320 \begin_layout LyX-Code
2321 (* METHODs for foo go here*)
2322 \end_layout
2323
2324 \begin_layout LyX-Code
2325 END foo;
2326 \end_layout
2327
2328 \end_deeper
2329 \begin_layout List
2330 \labelwidthstring 00000.00000.00000.000
2331 bar
2332 \family typewriter
2333 \InsetSpace ~
2334 \InsetSpace ~
2335 \InsetSpace ~
2336 \InsetSpace ~
2337 MODEL bar REFINES foo;
2338 \end_layout
2339
2340 \begin_deeper
2341 \begin_layout LyX-Code
2342 (*additional statements about foo *)
2343 \end_layout
2344
2345 \begin_layout LyX-Code
2346 METHODS
2347 \end_layout
2348
2349 \begin_layout LyX-Code
2350 (* additional METHODs for bar *)
2351 \end_layout
2352
2353 \begin_layout LyX-Code
2354 END bar;
2355 \end_layout
2356
2357 \end_deeper
2358 \begin_layout List
2359 \labelwidthstring 00000.00000.00000.000
2360
2361 \bar under
2362 Parameterized\InsetSpace ~
2363 Models
2364 \bar default
2365
2366 \begin_inset LatexCommand \index{models, parameterized}
2367
2368 \end_inset
2369
2370 (* 4 *) Parameterizing models makes them easier to understand and faster
2371 for the system to compile.
2372 The syntax for a parameterized model vaguely resembles a function call
2373 in imperative languages, but it is NOT.
2374 When constructing a reusable model, all the constants that determine the
2375 sizes of arrays and other structures should be declared in the parameter
2376 list so that
2377 \end_layout
2378
2379 \begin_deeper
2380 \begin_layout Itemize
2381 the user knows what is required to reuse the model.
2382 \end_layout
2383
2384 \begin_layout Itemize
2385 the compiler knows what values must be set before it should bother attempting
2386 to compile the model.
2387 \end_layout
2388
2389 \begin_layout Standard
2390 There is no reason that other items could not also go in the parameter list,
2391 such as key variables which might be considered inputs or outputs or control
2392 parameters in the mathematical application of the model.
2393 A simple example of parameterization would be:
2394 \end_layout
2395
2396 \end_deeper
2397 \begin_layout List
2398 \labelwidthstring 00000.00000.00000.000
2399 column(n,s)
2400 \end_layout
2401
2402 \begin_deeper
2403 \begin_layout LyX-Code
2404 MODEL column(
2405 \end_layout
2406
2407 \begin_layout LyX-Code
2408 ntrays WILL_BE integer_constant;
2409 \end_layout
2410
2411 \begin_layout LyX-Code
2412 components IS_A set of symbol_constant;
2413 \end_layout
2414
2415 \begin_layout LyX-Code
2416 );
2417 \end_layout
2418
2419 \begin_layout LyX-Code
2420 stage[1..ntrays] IS_A simple_tray;
2421 \end_layout
2422
2423 \begin_layout LyX-Code
2424 END column;
2425 \end_layout
2426
2427 \end_deeper
2428 \begin_layout List
2429 \labelwidthstring 00000.00000.00000.000
2430 flowsheet
2431 \end_layout
2432
2433 \begin_deeper
2434 \begin_layout LyX-Code
2435 MODEL flowsheet;
2436 \end_layout
2437
2438 \begin_layout LyX-Code
2439 tower4size IS_A integer_constant;
2440 \end_layout
2441
2442 \begin_layout LyX-Code
2443 tower4size :== 22;
2444 \end_layout
2445
2446 \begin_layout LyX-Code
2447 ct IS_A column(tower4size,[c5,c6]);
2448 \end_layout
2449
2450 \begin_layout LyX-Code
2451 (* additional flowsheet statements *)
2452 \end_layout
2453
2454 \begin_layout LyX-Code
2455 END flowsheet;
2456 \end_layout
2457
2458 \begin_layout Standard
2459 In this example, the column model takes the first argument, ntrays, by reference.
2460 That is, ct.ntrays is an alias for the flowsheet instance tower4size.
2461 tower4size must be compiled and assigned a value before we will attempt
2462 to compile the column model instance ct.
2463 The second argument is taken by value, [c5,c6], and assigned to components,
2464 a column part that was declared with IS_A in the parameter list.
2465 There is only one name for this set, ct.components.
2466 Note that in the flowsheet model there is no part that is a set of symbol_const
2467 ant.
2468
2469 \end_layout
2470
2471 \begin_layout Standard
2472 The use of parameters in ASCEND modeling requires some thought, and we will
2473 present that set of thoughts in Section
2474 \begin_inset LatexCommand \vref{sec:x.5Parameterized-models}
2475
2476 \end_inset
2477
2478 .
2479 Beginners may wish to create new models without parameters until they are
2480 comfortable using the existing parameterized library definitions.
2481 Parameters are intended to support model reuse and efficient compilation
2482 which are not issues in the very earliest phase of developing novel models.
2483 \end_layout
2484
2485 \begin_layout Subsection
2486 Sets
2487 \begin_inset LatexCommand \index{sets}
2488
2489 \end_inset
2490
2491
2492 \begin_inset LatexCommand \label{sub:x.2.2Sets}
2493
2494 \end_inset
2495
2496
2497 \end_layout
2498
2499 \begin_layout Standard
2500 Arrays in ASCEND, as already discussed in Section
2501 \begin_inset LatexCommand \vref{sub:x.1.2Basic-Elements}
2502
2503 \end_inset
2504
2505 , are defined over sets.
2506 A set is simply an instance with a set value.
2507 The elements of sets are NOT instances or sets.
2508 \end_layout
2509
2510 \end_deeper
2511 \begin_layout List
2512 \labelwidthstring 00000.00000.00000.000
2513
2514 \bar under
2515 Set\InsetSpace ~
2516 Declaration:
2517 \bar default
2518 A set is made of either symbol_constants or integer_constants, so a set
2519 object is declared in one of two ways:
2520 \end_layout
2521
2522 \begin_deeper
2523 \begin_layout LyX-Code
2524 my_integer_set IS_A set OF integer_constant;
2525 \end_layout
2526
2527 \begin_layout Standard
2528 or
2529 \end_layout
2530
2531 \begin_layout LyX-Code
2532 my_symbol_set IS_A set OF symbol_constant;
2533 \end_layout
2534
2535 \end_deeper
2536 \begin_layout List
2537 \labelwidthstring 00000.00000.00000.000
2538 :==
2539 \begin_inset LatexCommand \index{:==}
2540
2541 \end_inset
2542
2543 A set is assigned a value like so:
2544 \end_layout
2545
2546 \begin_deeper
2547 \begin_layout LyX-Code
2548 my_integer_set :== [1,4];
2549 \end_layout
2550
2551 \begin_layout Standard
2552 The RHS of such an assignment must be either the name of another set instance
2553 or an expression enclosed in square brackets and made up of only set operators,
2554 other sets, and the names of integer_constants or symbol_constants.
2555 Sets can only be assigned once.
2556 \end_layout
2557
2558 \end_deeper
2559 \begin_layout List
2560 \labelwidthstring 00000.00000.00000.000
2561
2562 \bar under
2563 Set\InsetSpace ~
2564 Operations
2565 \bar default
2566 UNION
2567 \begin_inset LatexCommand \index{UNION}
2568
2569 \end_inset
2570
2571 [setlist]
2572 \end_layout
2573
2574 \begin_deeper
2575 \begin_layout Standard
2576 A function taken over a list of sets.
2577 The result is the set that includes all the members of all the sets in
2578 the list.
2579 Note that the result of the UNION operation is an unordered set and the
2580 argument order to the union function does not matter.
2581 The syntax is:
2582 \end_layout
2583
2584 \end_deeper
2585 \begin_layout List
2586 \labelwidthstring 00000.00000.00000.000
2587 +
2588 \begin_inset LatexCommand \index{+, sets}
2589
2590 \end_inset
2591
2592 UNION[list_of_sets]
2593 \end_layout
2594
2595 \begin_layout List
2596 \labelwidthstring 00000.00000.00000.000
2597 A+B\InsetSpace ~
2598 is\InsetSpace ~
2599 shorthand\InsetSpace ~
2600 for UNION[A,B]
2601 \end_layout
2602
2603 \begin_deeper
2604 \begin_layout Standard
2605 Consider the following sets for the examples to follow.
2606 \end_layout
2607
2608 \begin_layout LyX-Code
2609 A := [1, 2, 3, 5, 9];
2610 \end_layout
2611
2612 \begin_layout LyX-Code
2613 B := [2, 4, 6, 8];
2614 \end_layout
2615
2616 \begin_layout Standard
2617 Then UNION[A, B] is equal to the set [1, 2, 3, 4, 5, 6, 8, 9] which equals
2618 [1..6, 8, 9] which equals [[1..9] - [7]].
2619 \end_layout
2620
2621 \end_deeper
2622 \begin_layout List
2623 \labelwidthstring 00000.00000.00000.000
2624 INTERSECTION
2625 \begin_inset LatexCommand \index{INTERSECTION}
2626
2627 \end_inset
2628
2629 [] INTERSECTION[list of set expressions].
2630 Finds the intersection (and) of the sets listed.
2631
2632 \end_layout
2633
2634 \begin_layout List
2635 \labelwidthstring 00000.00000.00000.000
2636 *
2637 \begin_inset LatexCommand \index{*, sets}
2638
2639 \end_inset
2640
2641 Equivalent to INTERSECTION[list_of_sets].
2642 \end_layout
2643
2644 \begin_layout List
2645 \labelwidthstring 00000.00000.00000.000
2646 A*B\InsetSpace ~
2647 is\InsetSpace ~
2648 shorthand\InsetSpace ~
2649 for\InsetSpace ~
2650 INTERSECTION[A,B]
2651 \end_layout
2652
2653 \begin_deeper
2654 \begin_layout Standard
2655 For the sets A and B defined just above, INTERSECTION[A, B] is the set [2].
2656 The * shorthand for intersection is NOT recommended for use except in libraries
2657 no one will look at.
2658 \end_layout
2659
2660 \end_deeper
2661 \begin_layout List
2662 \labelwidthstring 00000.00000.00000.000
2663 Set\InsetSpace ~
2664 difference
2665 \begin_inset LatexCommand \index{set difference}
2666
2667 \end_inset
2668
2669 : One can subtract one set from another.
2670 The result is the first set less any members in the set union of the first
2671 and second set.
2672 The syntax is
2673 \end_layout
2674
2675 \begin_layout List
2676 \labelwidthstring 00000.00000.00000.000
2677 -
2678 \begin_inset LatexCommand \index{-, sets}
2679
2680 \end_inset
2681
2682
2683 \family typewriter
2684 \InsetSpace ~
2685 \InsetSpace ~
2686 \InsetSpace ~
2687 first_set - second_set
2688 \end_layout
2689
2690 \begin_deeper
2691 \begin_layout Standard
2692 For the sets A and B defined above, the set difference A - B is the set
2693 [1, 3, 5, 9] while the set difference B - A is the set [4, 6, 8].
2694 \end_layout
2695
2696 \end_deeper
2697 \begin_layout List
2698 \labelwidthstring 00000.00000.00000.000
2699 CARD
2700 \begin_inset LatexCommand \index{CARD}
2701
2702 \end_inset
2703
2704 [set] Cardinality
2705 \begin_inset LatexCommand \index{cardinality}
2706
2707 \end_inset
2708
2709 .
2710 Returns an integer constant value that is the number of items in the set.
2711 \end_layout
2712
2713 \begin_layout List
2714 \labelwidthstring 00000.00000.00000.000
2715 CHOICE
2716 \begin_inset LatexCommand \index{CHOICE}
2717
2718 \end_inset
2719
2720 [set] Choose one.
2721 The result of running the CHOICE function over a set is an arbitrary (but
2722 consistent: for any set instance you always get the same result) single
2723 element of that set.
2724
2725 \end_layout
2726
2727 \begin_deeper
2728 \begin_layout Standard
2729 Running CHOICE[A] gives any member from the set A.
2730 The result is a member, not a set.
2731 To make the result into a set, it must be enclosed in square brackets.
2732 Thus [CHOICE[A]] is a set with a single element arbitrarily chosen from
2733 the set A.
2734 Good modelers do not leave modeling decisions to the compiler; they do
2735 not use CHOICE[].
2736 We are stuck with it for historical reasons.
2737 \end_layout
2738
2739 \begin_layout Standard
2740 To reduce a set by one element, one can use the following
2741 \end_layout
2742
2743 \begin_layout LyX-Code
2744 A_less_one IS_A set OF integer;
2745 \end_layout
2746
2747 \begin_layout LyX-Code
2748 A_less_one :== A - [CHOICE[A]];
2749 \end_layout
2750
2751 \end_deeper
2752 \begin_layout List
2753 \labelwidthstring 00000.00000.00000.000
2754 IN
2755 \begin_inset LatexCommand \index{IN}
2756
2757 \end_inset
2758
2759 lhs IN rhs can only be well explained by examples.
2760 IN is used in index expressions.
2761 If lhs is a simple and not previously defined name, it is created as a
2762 temporary loop index which will take on the values of the rhs set definition.
2763 If lhs is something that already exists, the result of lhs IN rhs is a
2764 boolean value; stare at the model set_example below which demonstrates
2765 both IN and SUCH_THAT.
2766 If you still are not satisfied, you might examine [[westerbergksets]].
2767 \end_layout
2768
2769 \begin_layout List
2770 \labelwidthstring 00000.00000.00000.000
2771 SUCH_THAT
2772 \begin_inset LatexCommand \index{SUCH\_THAT}
2773
2774 \end_inset
2775
2776 \InsetSpace ~
2777 (*\InsetSpace ~
2778 4\InsetSpace ~
2779 *) Set expressions can be rather clever.
2780 We will give a detailed example from chemistry because unordered sets are
2781 unfamiliar to most people and set arithmetic is quite powerful.
2782 In this example we see arrays of sets and sparse arrays.
2783
2784 \end_layout
2785
2786 \begin_layout LyX-Code
2787 MODEL set_example;
2788 \end_layout
2789
2790 \begin_layout LyX-Code
2791 (* we define a sparse matrix of reaction
2792 \end_layout
2793
2794 \begin_layout LyX-Code
2795 coefficient information and the species
2796 \end_layout
2797
2798 \begin_layout LyX-Code
2799 balance equations.
2800 *)
2801 \end_layout
2802
2803 \begin_layout LyX-Code
2804 rxns IS_A set OF integer_constant;
2805 \end_layout
2806
2807 \begin_layout LyX-Code
2808 rxns :== [1..3];
2809 \end_layout
2810
2811 \begin_layout LyX-Code
2812 species IS_A set OF symbol_constant;
2813 \end_layout
2814
2815 \begin_layout LyX-Code
2816 species :== ['A','B','C','D'];
2817 \end_layout
2818
2819 \begin_layout LyX-Code
2820 reactants[rxns] IS_A set OF symbol_constant; (* species
2821 \end_layout
2822
2823 \begin_layout LyX-Code
2824 in each rxn_j *)
2825 \end_layout
2826
2827 \begin_layout LyX-Code
2828 reactants[1] :== ['A','B','C'];
2829 \end_layout
2830
2831 \begin_layout LyX-Code
2832 reactants[2] :== ['A','C'];
2833 \end_layout
2834
2835 \begin_layout LyX-Code
2836 reactants[3] :== ['A','B','D'];
2837 \end_layout
2838
2839 \begin_layout LyX-Code
2840 reactions[species] IS_A set OF integer_constant;
2841 \end_layout
2842
2843 \begin_layout LyX-Code
2844 FOR i IN species CREATE (* rxns for each species i *)
2845 \end_layout
2846
2847 \begin_layout LyX-Code
2848 reactions[i] :== [j IN rxns SUCH_THAT i IN reactants[j]];
2849 \end_layout
2850
2851 \begin_layout LyX-Code
2852 END FOR;
2853 \end_layout
2854
2855 \begin_layout LyX-Code
2856 (* Define sparse stoichiometric matrix.
2857 Values of eta_ij
2858 \end_layout
2859
2860 \begin_layout LyX-Code
2861 set later.*)
2862 \end_layout
2863
2864 \begin_layout LyX-Code
2865 FOR j IN rxns CREATE
2866 \end_layout
2867
2868 \begin_layout LyX-Code
2869 FOR i IN reactants[j] CREATE
2870 \end_layout
2871
2872 \begin_layout LyX-Code
2873 (* eta_ij --> mole i/mole rxn j*)
2874 \end_layout
2875
2876 \begin_layout LyX-Code
2877 eta[i][j] IS_A real_constant;
2878 \end_layout
2879
2880 \begin_layout LyX-Code
2881 END FOR;
2882 \end_layout
2883
2884 \begin_layout LyX-Code
2885 END FOR;
2886 \end_layout
2887
2888 \begin_layout LyX-Code
2889 production[species] IS_A molar_rate;
2890 \end_layout
2891
2892 \begin_layout LyX-Code
2893 rate[rxns] IS_A molar_rate; (* mole rxn j/time *)
2894 \end_layout
2895
2896 \begin_layout LyX-Code
2897 FOR i IN species CREATE
2898 \end_layout
2899
2900 \begin_layout LyX-Code
2901 gen_eqn[i]: production[i] =
2902 \end_layout
2903
2904 \begin_layout LyX-Code
2905 SUM[eta[i][j]*rate[j] | j IN reactions[i]];
2906 \end_layout
2907
2908 \begin_layout LyX-Code
2909 END FOR;
2910 \end_layout
2911
2912 \begin_layout LyX-Code
2913 END set_example;
2914 \end_layout
2915
2916 \begin_layout List
2917 \labelwidthstring 00000.00000.00000.000
2918 "|
2919 \begin_inset LatexCommand \index{|}
2920
2921 \end_inset
2922
2923 " is shorthand for SUCH_THAT.
2924 \end_layout
2925
2926 \begin_deeper
2927 \begin_layout Standard
2928 The array eta has only 8 elements, and we defined those elements in a set
2929 for each reaction.
2930 The equation needs to know about the set of reactions for a species i,
2931 and that set is calculated automatically in the models first FOR/CREATE
2932 statement.
2933
2934 \end_layout
2935
2936 \end_deeper
2937 \begin_layout List
2938 \labelwidthstring 00000.00000.00000.000
2939 |
2940 \end_layout
2941
2942 \begin_deeper
2943 \begin_layout Standard
2944 The | symbol is the ASCEND III notation for SUCH_THAT.
2945 We noted that "|" is often read as "for all", which is different in that
2946 "for all" makes one think of a FOR loop where the loop index is on the
2947 left of an IN operator.
2948 For example, the j loop in the SUM of gen_eqn[i] above.
2949
2950 \end_layout
2951
2952 \begin_layout Subsection
2953 Constants
2954 \begin_inset LatexCommand \index{constants}
2955
2956 \end_inset
2957
2958
2959 \end_layout
2960
2961 \begin_layout Standard
2962 ASCEND supports real, integer, boolean and character string constants.
2963 Constants in ASCEND do not have any attributes other than their value.
2964 Constants are scalar quantities that can be assigned exactly once.
2965 Constants may only be assigned using the :== operator and the RHS expression
2966 they are assigned from must itself be constant.
2967 Constants do not have subparts.
2968 Integer and symbol constants may be used in determining the definitions
2969 of sets.
2970
2971 \end_layout
2972
2973 \begin_layout Standard
2974 Explicit refinements of the built-in constant types may be defined as exemplifie
2975 d in the description of real_constant.
2976 Implicit type refinements may be done by instantiating an incompletely
2977 defined constant and assigning its final value.
2978
2979 \end_layout
2980
2981 \begin_layout Standard
2982 Sets could be considered constant because they are assigned only once, however
2983 sets are described separately because they are not quite scalar quantities.
2984 \end_layout
2985
2986 \end_deeper
2987 \begin_layout List
2988 \labelwidthstring 00000.00000.00000.000
2989 real_constant
2990 \begin_inset LatexCommand \index{real\_constant}
2991
2992 \end_inset
2993
2994 Real number with dimensionality.
2995 Note that the dimensionality of a real constant can be specified via the
2996 type definition without immediately defining the value, as in the following
2997 pair of definitions.
2998 \end_layout
2999
3000 \begin_layout List
3001 \labelwidthstring 00000.00000.00000.000
3002
3003 \bar under
3004 CONSTANT\InsetSpace ~
3005 declaration\InsetSpace ~
3006 example:
3007 \end_layout
3008
3009 \begin_deeper
3010 \begin_layout LyX-Code
3011 CONSTANT molar_weight
3012 \end_layout
3013
3014 \begin_layout LyX-Code
3015 REFINES real_constant DIMENSION M/Q;
3016 \end_layout
3017
3018 \begin_layout LyX-Code
3019 CONSTANT hydrogen_weight
3020 \end_layout
3021
3022 \begin_layout LyX-Code
3023 REFINES molar_weight :== 1.004{g/mole};
3024 \end_layout
3025
3026 \end_deeper
3027 \begin_layout List
3028 \labelwidthstring 00000.00000.00000.000
3029 integer_constant
3030 \begin_inset LatexCommand \index{integer\_constant}
3031
3032 \end_inset
3033
3034 Integer number.
3035 Principally used in determining model structure.
3036 If appearing in equations, integers are evaluated as dimensionless reals.
3037 Typical use is inside a MODEL definition and looks like:
3038 \end_layout
3039
3040 \begin_deeper
3041 \begin_layout LyX-Code
3042 n_trays IS_A integer_constant;
3043 \end_layout
3044
3045 \begin_layout LyX-Code
3046 n_trays :== 50;
3047 \end_layout
3048
3049 \begin_layout LyX-Code
3050 tray[1..n_trays] IS_A vl_equilibrium_tray;
3051 \end_layout
3052
3053 \end_deeper
3054 \begin_layout List
3055 \labelwidthstring 00000.00000.00000.000
3056 symbol_constant
3057 \begin_inset LatexCommand \index{symbol\_constant}
3058
3059 \end_inset
3060
3061 Object with a symbol value.
3062 May be used in determining model structure.
3063 \end_layout
3064
3065 \begin_layout List
3066 \labelwidthstring 00000.00000.00000.000
3067 boolean_constant
3068 \begin_inset LatexCommand \index{boolean\_constant}
3069
3070 \end_inset
3071
3072 Logical value.
3073 May be used in determining model structure.
3074 \end_layout
3075
3076 \begin_layout List
3077 \labelwidthstring 00000.00000.00000.000
3078
3079 \bar under
3080 Setting\InsetSpace ~
3081 constants
3082 \bar default
3083
3084 \begin_inset LatexCommand \index{constants, setting}
3085
3086 \end_inset
3087
3088
3089 \end_layout
3090
3091 \begin_layout List
3092 \labelwidthstring 00000.00000.00000.000
3093 :==
3094 \begin_inset LatexCommand \index{:==}
3095
3096 \end_inset
3097
3098 Constant and set assignment operator.
3099
3100 \end_layout
3101
3102 \begin_deeper
3103 \begin_layout Standard
3104 It is suggested, but not required, that names of all types that refine the
3105 built-in constant types have names that end in _constant.
3106 \end_layout
3107
3108 \begin_layout LyX-Code
3109 LHS_list :== RHS;
3110 \end_layout
3111
3112 \begin_layout Standard
3113 Here it is required that the one or more items in the LHS be of the same
3114 constant type and that RHS is a single-valued expression made up of values,
3115 operators, and other constants.
3116 The :== is used to make clear to both the user and the system what scalar
3117 objects are constants.
3118
3119 \end_layout
3120
3121 \begin_layout Subsection
3122 Variables
3123 \begin_inset LatexCommand \index{variables}
3124
3125 \end_inset
3126
3127
3128 \end_layout
3129
3130 \begin_layout Standard
3131 There are four built-in types which may be used to construct variables:
3132 symbol, boolean, integer, and real.
3133 At this time symbol types have special restrictions.
3134 Refinements of these variable base types are defined with the ATOM statement.
3135 Atom types may declare attribute fields with types real, integer, boolean,
3136 symbol, and set.
3137 These attributes are NOT independent objects and therefore cannot be refined,
3138 merged, or put in a refinement clique (ARE_ALIKEd).
3139 \end_layout
3140
3141 \end_deeper
3142 \begin_layout List
3143 \labelwidthstring 00000.00000.00000.000
3144 ATOM
3145 \begin_inset LatexCommand \index{ATOM}
3146
3147 \end_inset
3148
3149 The syntax for declaring a new atom type is
3150 \end_layout
3151
3152 \begin_deeper
3153 \begin_layout LyX-Code
3154 ATOM
3155 \emph on
3156 atom_type_name
3157 \emph default
3158 REFINES
3159 \emph on
3160 variable_type
3161 \end_layout
3162
3163 \begin_layout LyX-Code
3164 «DIMENSION
3165 \emph on
3166 dimension_expression
3167 \emph default
3168 »
3169 \end_layout
3170
3171 \begin_layout LyX-Code
3172 «DEFAULT
3173 \emph on
3174 value
3175 \emph default
3176 »; (* note the ; *)
3177 \end_layout
3178
3179 \begin_layout LyX-Code
3180 «
3181 \emph on
3182 initial attribute assignment
3183 \emph default
3184
3185 \end_layout
3186
3187 \begin_layout LyX-Code
3188 END
3189 \emph on
3190 atom_type_name
3191 \emph default
3192 ;
3193 \end_layout
3194
3195 \end_deeper
3196 \begin_layout List
3197 \labelwidthstring 00000.00000.00000.000
3198 DEFAULT
3199 \begin_inset LatexCommand \index{DEFAULT}
3200
3201 \end_inset
3202
3203 ,\InsetSpace ~
3204 DIMENSION
3205 \begin_inset LatexCommand \index{DIMENSION}
3206
3207 \end_inset
3208
3209 ,\InsetSpace ~
3210 and\InsetSpace ~
3211 DIMENSIONLESS
3212 \begin_inset LatexCommand \index{DIMENSIONLESS}
3213
3214 \end_inset
3215
3216
3217 \end_layout
3218
3219 \begin_deeper
3220 \begin_layout Standard
3221 The DIMENSION attribute is for variables whose base type is real.
3222 It is an optional field.
3223 If not defined for any atom with base type real, the dimensions will be
3224 left as undefined.
3225 Any variable which is later declared to be one of these types will be given
3226 wild card dimensionality (represented in the interactive display by an
3227 asterisk (*)).
3228 The system will deduce the dimensionality from its use in the relationships
3229 in which it appears or in the declaring of default values for it, if possible.
3230 \end_layout
3231
3232 \end_deeper
3233 \begin_layout List
3234 \labelwidthstring 00000.00000.00000.000
3235 solver_var
3236 \begin_inset LatexCommand \index{solver\_var}
3237
3238 \end_inset
3239
3240 is a special case of ATOM and we will say much more about it in Section
3241
3242 \begin_inset LatexCommand \vref{sub:x.6.1Variables-for-solvers}
3243
3244 \end_inset
3245
3246 .
3247 \end_layout
3248
3249 \begin_deeper
3250 \begin_layout LyX-Code
3251 ATOM solver_var REFINES real DEFAULT 0.5 {?
3252 \begin_inset LatexCommand \index{?}
3253
3254 \end_inset
3255
3256 };
3257 \end_layout
3258
3259 \begin_layout LyX-Code
3260 lower_bound IS_A real;
3261 \end_layout
3262
3263 \begin_layout LyX-Code
3264 upper_bound IS_A real;
3265 \end_layout
3266
3267 \begin_layout LyX-Code
3268 nominal IS_A real;
3269 \end_layout
3270
3271 \begin_layout LyX-Code
3272 fixed IS_A boolean;
3273 \end_layout
3274
3275 \begin_layout LyX-Code
3276 fixed := FALSE;
3277 \end_layout
3278
3279 \begin_layout LyX-Code
3280 lower_bound := -1e20 {?};
3281 \end_layout
3282
3283 \begin_layout LyX-Code
3284 upper_bound := 1e20 {?};
3285 \end_layout
3286
3287 \begin_layout LyX-Code
3288 nominal := 0.5 {?};
3289 \end_layout
3290
3291 \begin_layout LyX-Code
3292 END solver_var;
3293 \end_layout
3294
3295 \begin_layout Standard
3296 The default field is also optional.
3297 If the atom has a declared dimensionality, then this value must be expressed
3298 with units which are compatible with this dimensionality.
3299 In the solver_var example, we see a DEFAULT value of 0.5 with the unspecified
3300 unit
3301 \begin_inset LatexCommand \index{unit, unspecified}
3302
3303 \end_inset
3304
3305
3306 \begin_inset LatexCommand \index{unspecified unit}
3307
3308 \end_inset
3309
3310 {?
3311 \begin_inset LatexCommand \index{}
3312
3313 \end_inset
3314
3315 } which leaves the dimensionality wild
3316 \begin_inset LatexCommand \index{wild dimensionality}
3317
3318 \end_inset
3319
3320 .
3321 \end_layout
3322
3323 \end_deeper
3324 \begin_layout List
3325 \labelwidthstring 00000.00000.00000.000
3326 real
3327 \begin_inset LatexCommand \index{real}
3328
3329 \end_inset
3330
3331 Real valued variable quantity.
3332 At present, all variables that you want to be attended to by solver tools
3333 must be refinements of the type solver_var.
3334 This is so that modifiable parametric values can be included in equations
3335 without treating them as variables.
3336 Strictly speaking, this is a characteristic of the solver interface and
3337 not the ASCEND language.
3338 Each tool in the total ASCEND system may have its own semantics that go
3339 beyond the ASCEND object definition language.
3340 \end_layout
3341
3342 \begin_layout List
3343 \labelwidthstring 00000.00000.00000.000
3344 integer
3345 \begin_inset LatexCommand \index{integer}
3346
3347 \end_inset
3348
3349 Integer valued variable quantity.
3350 We find these mighty convenient for use in certain procedural computations
3351 and as attributes of solver_var atoms.
3352 \end_layout
3353
3354 \begin_layout List
3355 \labelwidthstring 00000.00000.00000.000
3356 boolean
3357 \begin_inset LatexCommand \index{boolean}
3358
3359 \end_inset
3360
3361 Truth valued variable quantity.
3362 These are principally used as flags on solver_vars and relations.
3363 They can also be used procedurally and as variables in logical programming
3364 models, subject to the logical solver tools semantics.
3365 (Compare solver_boolean and boolean_var in Section
3366 \begin_inset LatexCommand \vref{sec:x.6Miscellany}
3367
3368 \end_inset
3369
3370 .)
3371 \end_layout
3372
3373 \begin_layout List
3374 \labelwidthstring 00000.00000.00000.000
3375 symbol
3376 \begin_inset LatexCommand \index{symbol}
3377
3378 \end_inset
3379
3380 * 4 * Symbol valued variable quantity.
3381 We do not yet have operators for building symbols out of other symbols.
3382 \end_layout
3383
3384 \begin_layout List
3385 \labelwidthstring 00000.00000.00000.000
3386
3387 \bar under
3388 Setting\InsetSpace ~
3389 variables
3390 \bar default
3391
3392 \begin_inset LatexCommand \index{variables, setting}
3393
3394 \end_inset
3395
3396
3397 \end_layout
3398
3399 \begin_layout List
3400 \labelwidthstring 00000.00000.00000.000
3401 :=
3402 \begin_inset LatexCommand \index{:=}
3403
3404 \end_inset
3405
3406 Procedural equals
3407 \begin_inset LatexCommand \index{equals, procedural}
3408
3409 \end_inset
3410
3411 differs from the ordinary equals (=) in that it means the left-hand-side
3412 (LHS) variables are to be assigned the value of the right-hand-side (RHS)
3413 expression when this statement is processed.
3414 Processing happens in the last phase of compiling (instantiation) or when
3415 executing a method interactively through the ASCEND user interface.
3416 The order the system encounters these statements matters, therefore, with
3417 a later result overwriting an earlier one if both statements have the same
3418 the same LHS variable.
3419
3420 \end_layout
3421
3422 \begin_deeper
3423 \begin_layout Standard
3424 Note that variable assignments (also known as defaulting statements) written
3425 in the declarative section are executed only after an instance has been
3426 fully created.
3427 This is a frequent source of confusion and errors, therefore we recommend
3428 that you DO NOT ASSIGN VARIABLES IN THE DECLARATIVE SECTION.
3429
3430 \end_layout
3431
3432 \end_deeper
3433 \begin_layout List
3434 \labelwidthstring 00000.00000.00000.000
3435 Note\InsetSpace ~
3436 that\InsetSpace ~
3437 :=\InsetSpace ~
3438 IS\InsetSpace ~
3439 NOT\InsetSpace ~
3440 =.
3441 \end_layout
3442
3443 \begin_deeper
3444 \begin_layout Standard
3445 We use an ordinary equals (=) when defining a real valued equation to state
3446 that the LHS expression is to equal the RHS expression at the solution
3447 for the model.
3448 We use == for logical equations.
3449 \end_layout
3450
3451 \end_deeper
3452 \begin_layout List
3453 \labelwidthstring 00000.00000.00000.000
3454
3455 \bar under
3456 Tabular\InsetSpace ~
3457 assignments
3458 \bar default
3459
3460 \begin_inset LatexCommand \index{assignments, tabular}
3461
3462 \end_inset
3463
3464 (* 4+ *) Assigning values en masse to arrays of variables that are defined
3465 associatively on sets without order presents a minor challenge.
3466 The solution proposed in ASCEND IV (but not yet implemented as weve not
3467 had time or significant user demand) is to allow a tabular data statement
3468 to be used to assign the elements of arrays of variables or constants.
3469 The DATA statement may be used to assign variables in the declarative or
3470 methods section of a model (though we discourage its use declaratively
3471 for variable initialization) or to assign constant arrays of any type,
3472 including sets, in the declarative section.
3473 Here are some examples:
3474 \end_layout
3475
3476 \begin_deeper
3477 \begin_layout LyX-Code
3478 DATA ~(* ~4+ ~*)
3479 \end_layout
3480
3481 \begin_layout LyX-Code
3482 MODEL tabular_ex;
3483 \end_layout
3484
3485 \begin_layout LyX-Code
3486 lset,rset,cset IS_A set OF integer_constant;
3487 \end_layout
3488
3489 \begin_layout LyX-Code
3490 rset :== [1..3];
3491 \end_layout
3492
3493 \begin_layout LyX-Code
3494 cset :== rset - [2];
3495 \end_layout
3496
3497 \begin_layout LyX-Code
3498 lset :== [5,7];
3499 \end_layout
3500
3501 \begin_layout LyX-Code
3502 a[rset][cset] IS_A real;
3503 \end_layout
3504
3505 \begin_layout LyX-Code
3506 b[lset][cset][rset] IS_A real_constant;
3507 \end_layout
3508
3509 \begin_layout LyX-Code
3510 (* rectangle table *)
3511 \end_layout
3512
3513 \begin_layout LyX-Code
3514 DATA FOR a:
3515 \end_layout
3516
3517 \begin_layout LyX-Code
3518 COLUMNS 1,3; (*order last subscript cset*)
3519 \end_layout
3520
3521 \begin_layout LyX-Code
3522 UNITS {kg/s}, {s}; (* columnar units *)
3523 \end_layout
3524
3525 \begin_layout LyX-Code
3526 (* give leading subscripts *)
3527 \end_layout
3528
3529 \begin_layout LyX-Code
3530 [1] 2.8, 0.3;
3531 \end_layout
3532
3533 \begin_layout LyX-Code
3534 [2] 2.7, 1.3;
3535 \end_layout
3536
3537 \begin_layout LyX-Code
3538 [3] 3.3, 0.6;
3539 \end_layout
3540
3541 \begin_layout LyX-Code
3542 END DATA;
3543 \end_layout
3544
3545 \begin_layout LyX-Code
3546 (* 2 layer rectangle table *)
3547 \end_layout
3548
3549 \begin_layout LyX-Code
3550 CONSTANT DATA FOR b:
3551 \end_layout
3552
3553 \begin_layout LyX-Code
3554 COLUMNS 1..3; (* order last subscript
3555 \end_layout
3556
3557 \begin_layout LyX-Code
3558 rset *)
3559 \end_layout
3560
3561 \begin_layout LyX-Code
3562 (* UNITS omitted, so either the user gives
3563 \end_layout
3564
3565 \begin_layout LyX-Code
3566 value in the table or values given are
3567 \end_layout
3568
3569 \begin_layout LyX-Code
3570 DIMENSIONLESS.
3571 *)
3572 \end_layout
3573
3574 \begin_layout LyX-Code
3575 (* ordering over [lset][cset] required *)
3576 \end_layout
3577
3578 \begin_layout LyX-Code
3579 [5][1] 3 {m}, 2{m}, 1{m};
3580 \end_layout
3581
3582 \begin_layout LyX-Code
3583 [5][3] 0.1, 0.2, 0.3;
3584 \end_layout
3585
3586 \begin_layout LyX-Code
3587 [7][1] -3 {m/s}, -2{m/s}, -1{m/s};
3588 \end_layout
3589
3590 \begin_layout LyX-Code
3591 [7][3] 4.1 {1/s}, 4.2 {1/s}, 4.3 {1/s};
3592 \end_layout
3593
3594 \begin_layout LyX-Code
3595 END DATA;
3596 \end_layout
3597
3598 \begin_layout LyX-Code
3599 END tabular_ex;
3600 \end_layout
3601
3602 \begin_layout Standard
3603 For sparse arrays of variables or constants, the COLUMNS and (possibly)
3604 UNITS keywords are omitted and the array subscripts are simply enumerated
3605 along with the values to be assigned.
3606 \end_layout
3607
3608 \begin_layout Subsection
3609 Relations
3610 \begin_inset LatexCommand \index{relations}
3611
3612 \end_inset
3613
3614
3615 \end_layout
3616
3617 \end_deeper
3618 \begin_layout List
3619 \labelwidthstring 00000.00000.00000.000
3620
3621 \bar under
3622 Mathematical\InsetSpace ~
3623 expression
3624 \begin_inset LatexCommand \index{mathematical expression}
3625
3626 \end_inset
3627
3628
3629 \begin_inset LatexCommand \index{expression, math}
3630
3631 \end_inset
3632
3633 :
3634 \end_layout
3635
3636 \begin_deeper
3637 \begin_layout Standard
3638 The syntax for a mathematical expression is any legal combination of variable
3639 names and arithmetic operators in the normal notation.
3640 An expression may contain any number of matched rounded parentheses, (),
3641 to clarify meaning.
3642 The following is a legal arithmetic expression:
3643 \end_layout
3644
3645 \begin_layout LyX-Code
3646 y^2+(sin(x)-tan(z))*q
3647 \end_layout
3648
3649 \begin_layout Standard
3650 Each additive term in a mathematical expression (terms are separated by
3651 + or - operators) must have the same dimensionality.
3652 \end_layout
3653
3654 \begin_layout Standard
3655 An expression may contain an index variable as a part of the calculation
3656 if that index variable is over a set whose elements are of type integer.
3657 (See the FOR/CREATE and FOR/DO statements below.) An example is:
3658 \end_layout
3659
3660 \begin_layout LyX-Code
3661 term[i] = a[i]*x^(i-1);
3662 \end_layout
3663
3664 \end_deeper
3665 \begin_layout List
3666 \labelwidthstring 00000.00000.00000.000
3667
3668 \bar under
3669 Numerical\InsetSpace ~
3670 relations
3671 \bar default
3672
3673 \begin_inset LatexCommand \index{relations, numerical}
3674
3675 \end_inset
3676
3677
3678 \begin_inset LatexCommand \index{numerical relations}
3679
3680 \end_inset
3681
3682
3683 \end_layout
3684
3685 \begin_deeper
3686 \begin_layout Standard
3687 The syntax for a numeric relation is either
3688 \end_layout
3689
3690 \begin_layout LyX-Code
3691
3692 \emph on
3693 optional_label
3694 \emph default
3695 :
3696 \emph on
3697 LHS relational_operator RHS
3698 \emph default
3699 ;
3700 \end_layout
3701
3702 \begin_layout Standard
3703 or
3704 \end_layout
3705
3706 \begin_layout LyX-Code
3707
3708 \emph on
3709 optional_label
3710 \emph default
3711 :
3712 \emph on
3713 objective_type LHS
3714 \emph default
3715 ;
3716 \end_layout
3717
3718 \begin_layout Standard
3719 Objective_type is either MAXIMIZE or MINIMIZE.
3720 RHS and LHS must be one or more variables, constants, and operators in
3721 a normal algebraic expression.
3722 The operators allowed are defined below and in Section
3723 \begin_inset LatexCommand \vref{sub:x.6.3Single-operand-real}
3724
3725 \end_inset
3726
3727 .
3728 Variable integers, booleans, and symbols are not allowed as operands in
3729 numerical relations, nor are boolean constants.
3730 Integer indices declared in FOR/CREATE loops are allowed in relations,
3731 and they are treated as integer constants.
3732 \end_layout
3733
3734 \end_deeper
3735 \begin_layout List
3736 \labelwidthstring 00000.00000.00000.000
3737
3738 \bar under
3739 Relational\InsetSpace ~
3740 operators
3741 \begin_inset LatexCommand \index{operators, relational}
3742
3743 \end_inset
3744
3745
3746 \begin_inset LatexCommand \index{relational operators}
3747
3748 \end_inset
3749
3750 :
3751 \end_layout
3752
3753 \begin_layout List
3754 \labelwidthstring 00000.00000.00000.000
3755 =
3756 \begin_inset LatexCommand \index{=}
3757
3758 \end_inset
3759
3760 ,\InsetSpace ~
3761 >=
3762 \begin_inset LatexCommand \index{ >=}
3763
3764 \end_inset
3765
3766 ,\InsetSpace ~
3767 <=
3768 \begin_inset LatexCommand \index{<=}
3769
3770 \end_inset
3771
3772 ,\InsetSpace ~
3773 <
3774 \begin_inset LatexCommand \index{<}
3775
3776 \end_inset
3777
3778 ,\InsetSpace ~
3779 >
3780 \begin_inset LatexCommand \index{>}
3781
3782 \end_inset
3783
3784 ,\InsetSpace ~
3785 <>
3786 \begin_inset LatexCommand \index{<>}
3787
3788 \end_inset
3789
3790 These are the numerical relational operators for declarative use.
3791 \end_layout
3792
3793 \begin_deeper
3794 \begin_layout LyX-Code
3795 Ftot*y['methane'] = m['methane'];
3796 \end_layout
3797
3798 \begin_layout LyX-Code
3799 y['ethanol'] >= 0;
3800 \end_layout
3801
3802 \begin_layout Standard
3803 Equations must be dimensionally correct.
3804 \end_layout
3805
3806 \end_deeper
3807 \begin_layout List
3808 \labelwidthstring 00000.00000.00000.000
3809 MAXIMIZE
3810 \begin_inset LatexCommand \index{MAXIMIZE}
3811
3812 \end_inset
3813
3814 ,\InsetSpace ~
3815 MINIMIZE
3816 \begin_inset LatexCommand \index{MINIMIZE}
3817
3818 \end_inset
3819
3820
3821 \end_layout
3822
3823 \begin_deeper
3824 \begin_layout Standard
3825 Objective function indicators.
3826
3827 \end_layout
3828
3829 \end_deeper
3830 \begin_layout List
3831 \labelwidthstring 00000.00000.00000.000
3832
3833 \bar under
3834 Binary\InsetSpace ~
3835 Operators
3836 \begin_inset LatexCommand \index{operators, binary}
3837
3838 \end_inset
3839
3840
3841 \begin_inset LatexCommand \index{binary operators}
3842
3843 \end_inset
3844
3845 :
3846 \bar default
3847 +, -, *, /, ^.
3848 We follow the usual algebraic order of operations for binary operators.
3849 \end_layout
3850
3851 \begin_layout List
3852 \labelwidthstring 00000.00000.00000.000
3853 +
3854 \begin_inset LatexCommand \index{+, binary math}
3855
3856 \end_inset
3857
3858 Plus.
3859 Numerical addition or set union.
3860 \end_layout
3861
3862 \begin_layout List
3863 \labelwidthstring 00000.00000.00000.000
3864 -
3865 \begin_inset LatexCommand \index{-, binary math}
3866
3867 \end_inset
3868
3869 Minus.
3870 Numerical subtraction or set difference.
3871 \end_layout
3872
3873 \begin_layout List
3874 \labelwidthstring 00000.00000.00000.000
3875 *
3876 \begin_inset LatexCommand \index{*, binary math}
3877
3878 \end_inset
3879
3880 Times.
3881 Numerical multiplication or set intersection.
3882 \end_layout
3883
3884 \begin_layout List
3885 \labelwidthstring 00000.00000.00000.000
3886 /
3887 \begin_inset LatexCommand \index{/}
3888
3889 \end_inset
3890
3891 Divide.
3892 Numeric division.
3893 In most cases it implies real division and not integer division.
3894 \end_layout
3895
3896 \begin_layout List
3897 \labelwidthstring 00000.00000.00000.000
3898 ^ Power
3899 \begin_inset LatexCommand \index{power}
3900
3901 \end_inset
3902
3903 .
3904 Numeric exponentiation.
3905 If the value of y in x^y is not integer, then x must be greater than 0.0
3906 and dimensionless.
3907 \end_layout
3908
3909 \begin_layout List
3910 \labelwidthstring 00000.00000.00000.000
3911
3912 \bar under
3913 Unary\InsetSpace ~
3914 Operators
3915 \begin_inset LatexCommand \index{operators, unary}
3916
3917 \end_inset
3918
3919
3920 \begin_inset LatexCommand \index{unary operators}
3921
3922 \end_inset
3923
3924 :
3925 \bar default
3926 -
3927 \begin_inset LatexCommand \index{-, unary}
3928
3929 \end_inset
3930
3931 , ordered_function()
3932 \end_layout
3933
3934 \begin_layout List
3935 \labelwidthstring 00000.00000.00000.000
3936 - Unary minus.
3937 Numeric negation.
3938 There is no unary +
3939 \begin_inset LatexCommand \index{+, math unary}
3940
3941 \end_inset
3942
3943 operator.
3944 \end_layout
3945
3946 \begin_layout List
3947 \labelwidthstring 00000.00000.00000.000
3948 ordered_function
3949 \begin_inset LatexCommand \index{ordered\_function}
3950
3951 \end_inset
3952
3953 () unary real valued functions.
3954 The unary real functions we support are given in section Section
3955 \begin_inset LatexCommand \vref{sub:x.6.3Single-operand-real}
3956
3957 \end_inset
3958
3959 .
3960 \end_layout
3961
3962 \begin_layout List
3963 \labelwidthstring 00000.00000.00000.000
3964 Real\InsetSpace ~
3965 functions\InsetSpace ~
3966 of\InsetSpace ~
3967 sets\InsetSpace ~
3968 of\InsetSpace ~
3969 real\InsetSpace ~
3970 terms:
3971 \end_layout
3972
3973 \begin_layout List
3974 \labelwidthstring 00000.00000.00000.000
3975 SUM
3976 \begin_inset LatexCommand \index{SUM}
3977
3978 \end_inset
3979
3980 [term\InsetSpace ~
3981 set] Add all expressions in the functions list.
3982 \end_layout
3983
3984 \begin_deeper
3985 \begin_layout Standard
3986 For the SUM, the base type real items can be arbitrary arithmetic expressions.
3987 The resulting items must all be dimensionally compatible.
3988 \end_layout
3989
3990 \begin_layout Standard
3991 An examples of the use is:
3992 \end_layout
3993
3994 \begin_layout LyX-Code
3995 SUM[y[components]] = 1;
3996 \end_layout
3997
3998 \begin_layout Standard
3999 or, equivalently, one could write:
4000 \end_layout
4001
4002 \begin_layout LyX-Code
4003 SUM[y[i] | i IN components] = 1;
4004 \end_layout
4005
4006 \end_deeper
4007 \begin_layout List
4008 \labelwidthstring 00000.00000.00000.000
4009
4010 \bar under
4011 Empty\InsetSpace ~
4012 SUM[]\InsetSpace ~
4013 yields\InsetSpace ~
4014 wild\InsetSpace ~
4015 0.
4016 \end_layout
4017
4018 \begin_deeper
4019 \begin_layout Standard
4020 When a SUM is compiled over a list which is empty it generates a wild dimensione
4021 d 0.
4022 This will sometimes cause our dimension checking routines to fail.
4023 The best way to prevent this is to make sure the SUM never actually encounters
4024 an empty list.
4025 For example:
4026 \end_layout
4027
4028 \begin_layout LyX-Code
4029 SUM[Q[possibly_empty_set], 0{watt}];
4030 \end_layout
4031
4032 \begin_layout Standard
4033 In the above, the variables Q[i] (if they exist) have the dimensionality
4034 associated with an energy rate.
4035 When the set is empty, the 0 is the only term in the SUM and establishes
4036 the dimensionality of the result.
4037 When the set is NOT empty the compiler will simplify away the trailing
4038 0 in the sum.
4039 \end_layout
4040
4041 \end_deeper
4042 \begin_layout List
4043 \labelwidthstring 00000.00000.00000.000
4044 PROD
4045 \begin_inset LatexCommand \index{PROD}
4046
4047 \end_inset
4048
4049 [term\InsetSpace ~
4050 set] Multiply all the expressions in the products list.
4051 The product of an empty list is a dimensionless value, 1.0.
4052 \end_layout
4053
4054 \begin_layout List
4055 \labelwidthstring 00000.00000.00000.000
4056
4057 \bar under
4058 Possible\InsetSpace ~
4059 future\InsetSpace ~
4060 functions:
4061 \end_layout
4062
4063 \begin_deeper
4064 \begin_layout Standard
4065 (Not implemented - only under confused consideration at this time.) The following
4066 functions only work in methods as they are not smooth function and would
4067 destroy a Newton-based solution algorithm if used in defining a model equation:
4068 \end_layout
4069
4070 \end_deeper
4071 \begin_layout List
4072 \labelwidthstring 00000.00000.00000.000
4073 MAX
4074 \begin_inset LatexCommand \index{MAX}
4075
4076 \end_inset
4077
4078 [term\InsetSpace ~
4079 set] (* 4+ *) maximum value on list of arguments
4080 \end_layout
4081
4082 \begin_layout List
4083 \labelwidthstring 00000.00000.00000.000
4084 MIN
4085 \begin_inset LatexCommand \index{MIN}
4086
4087 \end_inset
4088
4089 [term\InsetSpace ~
4090 set] (* 4+ *) minimum value on list of arguments
4091 \end_layout
4092
4093 \begin_deeper
4094 \begin_layout Subsection
4095 Derivatives
4096 \begin_inset LatexCommand \index{derivatives}
4097
4098 \end_inset
4099
4100 in relations (* 4+ *)
4101 \end_layout
4102
4103 \begin_layout Standard
4104 Simply put, we would like to have general partial and full derivatives usable
4105 in writing equations, as there are many mathematically interesting things
4106 that can be said about both.
4107 We have not implemented such things yet for lack of time and because with
4108 several implementations (see gPROMS and OMOLA, among others) already out
4109 there we cant see too many research points to be gained by more derivative
4110 work.
4111 \end_layout
4112
4113 \begin_layout Subsection
4114 External relations
4115 \begin_inset LatexCommand \index{relations, external}
4116
4117 \end_inset
4118
4119
4120 \begin_inset LatexCommand \index{external relations}
4121
4122 \end_inset
4123
4124
4125 \end_layout
4126
4127 \begin_layout Standard
4128 We cannot document these at the present time.
4129 The only reference for them is [[abbottthesis]].
4130
4131 \end_layout
4132
4133 \begin_layout Subsection
4134 Conditional relations
4135 \begin_inset LatexCommand \index{relations, conditional}
4136
4137 \end_inset
4138
4139
4140 \begin_inset LatexCommand \index{conditional relations}
4141
4142 \end_inset
4143
4144 (* 4 *)
4145 \end_layout
4146
4147 \begin_layout Standard
4148 The syntax is
4149 \end_layout
4150
4151 \begin_layout LyX-Code
4152 CONDITIONAL
4153 \end_layout
4154
4155 \begin_layout LyX-Code
4156
4157 \emph on
4158 list_of_relation_statements
4159 \end_layout
4160
4161 \begin_layout LyX-Code
4162 END CONDITIONAL;
4163 \end_layout
4164
4165 \begin_layout Standard
4166 A CONDITIONAL statement can appear anywhere in the declarative portion of
4167 the model and it contains only relations to be used as boundaries.
4168 That is, these real arithmetic equations are used in expressing logical
4169 condition equations via the SATISFIED operator.
4170 \end_layout
4171
4172 \begin_layout Subsection
4173 Logical relations (* 4 *)
4174 \end_layout
4175
4176 \end_deeper
4177 \begin_layout List
4178 \labelwidthstring 00000.00000.00000.000
4179
4180 \bar under
4181 Logical\InsetSpace ~
4182 expression
4183 \bar default
4184
4185 \begin_inset LatexCommand \index{expression, logical}
4186
4187 \end_inset
4188
4189
4190 \begin_inset LatexCommand \index{logical expression}
4191
4192 \end_inset
4193
4194 An expression whose value is TRUE or FALSE is a logical expression.
4195 Such expressions may contain boolean variables.
4196 If A,B, and laminar are boolean, then the following is a logical expression:
4197 \end_layout
4198
4199 \begin_deeper
4200 \begin_layout LyX-Code
4201 A + (B * laminar)
4202 \end_layout
4203
4204 \begin_layout Standard
4205 as is (and probably more clearly)
4206 \end_layout
4207
4208 \begin_layout LyX-Code
4209 A OR (B AND laminar)
4210 \end_layout
4211
4212 \begin_layout Standard
4213 The plus operator acts like an OR among the terms while the times operator
4214 acts like an AND.
4215 Think of TRUE being equal to 1 and FALSE being equal to 0 with the 1+1=0+1=1+0=
4216 1, 0+0=0, 1*1=1 and 0*1=1*0=0*0=0.
4217 If A = FALSE, B=TRUE and laminar is TRUE, this expression has the value
4218 \end_layout
4219
4220 \begin_layout LyX-Code
4221 FALSE OR (TRUE AND TRUE) -->TRUE
4222 \end_layout
4223
4224 \begin_layout Standard
4225 or in terms of ones and zeros
4226 \end_layout
4227
4228 \begin_layout LyX-Code
4229 0 + (1 * 1) --> 1.
4230 \end_layout
4231
4232 \begin_layout Standard
4233 Logical relations are then made by putting together logical expressions
4234 with the boolean relational operators == and !=.
4235 Since we have no logical solving engine we have not pushed the implementation
4236 of logical relations very hard yet.
4237 \end_layout
4238
4239 \begin_layout Subsection
4240 NOTES
4241 \begin_inset LatexCommand \index{NOTES}
4242
4243 \end_inset
4244
4245 (* 4 *)
4246 \end_layout
4247
4248 \begin_layout Standard
4249 Within a MODEL (or METHOD) definition annotations (hereafter called notes)
4250 may be made on a part declared in the MODEL, or on the MODEL (or METHOD)
4251 itself.
4252 Short notes may be made when defining or refining an object by enclosing
4253 the note in "double quotes." Longer notes may be made in a block statement.
4254 \end_layout
4255
4256 \begin_layout Standard
4257 Each note is entered in a database with the name of the file, name of MODEL,
4258 name of METHOD if applicable, and the language (a kind of keyword) in which
4259 the note is written.
4260 Users, user interfaces, and other programs may query this database for
4261 information on models and simulations.
4262 The block notes may include code fragments in other languages that you
4263 wish to embed in your MODEL or any other kind of text.
4264 \end_layout
4265
4266 \begin_layout Standard
4267 Short notes should be included as you write any model to clarify the roles
4268 of parts and variables.
4269 All short notes have the language 'inline.' Here are some examples of short
4270 notes:
4271 \end_layout
4272
4273 \begin_layout LyX-Code
4274 L[1..10] "L[i] is the length of the ith rod"
4275 \end_layout
4276
4277 \begin_layout LyX-Code
4278 IS_A distance;
4279 \end_layout
4280
4281 \begin_layout LyX-Code
4282 thetaM "angle between horizon and moon",
4283 \end_layout
4284
4285 \begin_layout LyX-Code
4286 thetaJ "angle between horizon and jupiter"
4287 \end_layout
4288
4289 \begin_layout LyX-Code
4290 IS_A angle;
4291 \end_layout
4292
4293 \begin_layout LyX-Code
4294 car.tires "using car in Minnesota, you betcha"
4295 \end_layout
4296
4297 \begin_layout LyX-Code
4298 IS_REFINED_TO snow_tire;
4299 \end_layout
4300
4301 \begin_layout Standard
4302 In the second IS_A statement concerning two angles, we see that a short
4303 note in double quotes goes with the name immediately to its left.
4304 We also see that the note comes before the comma if the name is part of
4305 a list of names.
4306 In the third statement, we see that not only simple names but also qualified
4307 names may be annotated.
4308
4309 \end_layout
4310
4311 \begin_layout Standard
4312 Longer notes are made in block statements of the form below.
4313 These blocks can appear in a METHOD or MODEL.
4314 These blocks can also be written separately before or after a model as
4315 we shall see.
4316 \end_layout
4317
4318 \begin_layout LyX-Code
4319 NOTES
4320 \end_layout
4321
4322 \begin_layout LyX-Code
4323 'language or keyword' list.of, names {
4324 \end_layout
4325
4326 \begin_layout LyX-Code
4327 free-form block of text to store in the
4328 \end_layout
4329
4330 \begin_layout LyX-Code
4331 database exactly as written.
4332 \end_layout
4333
4334 \begin_layout LyX-Code
4335 }
4336 \end_layout
4337
4338 \begin_layout LyX-Code
4339 some.other.name {
4340 \end_layout
4341
4342 \begin_layout LyX-Code
4343 this note has the same language or keyword as
4344 \end_layout
4345
4346 \begin_layout LyX-Code
4347 the first since we didn't define a new keyword
4348 \end_layout
4349
4350 \begin_layout LyX-Code
4351 in single quotes before the name list.
4352 \end_layout
4353
4354 \begin_layout LyX-Code
4355 }
4356 \end_layout
4357
4358 \begin_layout LyX-Code
4359 'another language' some.other.name {
4360 \end_layout
4361
4362 \begin_layout LyX-Code
4363 en espanol
4364 \end_layout
4365
4366 \begin_layout LyX-Code
4367 }
4368 \end_layout
4369
4370 \begin_layout LyX-Code
4371 'fortran' SELF {
4372 \end_layout
4373
4374 \begin_layout LyX-Code
4375 This model should be solved with subroutine
4376 \end_layout
4377
4378 \begin_layout LyX-Code
4379 LSODE.
4380 \end_layout
4381
4382 \begin_layout LyX-Code
4383 This note demonstrates that "SELF" can be used
4384 \end_layout
4385
4386 \begin_layout LyX-Code
4387 to annotate the entire model instead of a
4388 \end_layout
4389
4390 \begin_layout LyX-Code
4391 named part.
4392 \end_layout
4393
4394 \begin_layout LyX-Code
4395 }
4396 \end_layout
4397
4398 \begin_layout LyX-Code
4399 END NOTES;
4400 \end_layout
4401
4402 \begin_layout Standard
4403 Notes made outside the scope of a model definition look like one of the
4404 following:
4405 \end_layout
4406
4407 \begin_layout LyX-Code
4408 ADD NOTES IN name_of_model;
4409 \end_layout
4410
4411 \begin_layout LyX-Code
4412 'language or keyword' list.of, names {
4413 \end_layout
4414
4415 \begin_layout LyX-Code
4416 more text
4417 \end_layout
4418
4419 \begin_layout LyX-Code
4420 } (* more than one note may be made in this
4421 \end_layout
4422
4423 \begin_layout LyX-Code
4424 block if desired.
4425 *)
4426 \end_layout
4427
4428 \begin_layout LyX-Code
4429 END NOTES;
4430 \end_layout
4431
4432 \begin_layout LyX-Code
4433 ADD NOTES IN name_of_model METHOD
4434 \end_layout
4435
4436 \begin_layout LyX-Code
4437 name_of_method;
4438 \end_layout
4439
4440 \begin_layout LyX-Code
4441 'language or keyword' SELF {
4442 \end_layout
4443
4444 \begin_layout LyX-Code
4445 This method proves Fermat's last theorem and
4446 \end_layout
4447
4448 \begin_layout LyX-Code
4449 makes toast.
4450 \end_layout
4451
4452 \begin_layout LyX-Code
4453 }
4454 \end_layout
4455
4456 \begin_layout LyX-Code
4457 'humor' SELF {
4458 \end_layout
4459
4460 \begin_layout LyX-Code
4461 ASCEND is not expected to make either proving
4462 \end_layout
4463
4464 \begin_layout LyX-Code
4465 FLT or toasting possible.
4466 \end_layout
4467
4468 \begin_layout LyX-Code
4469 }
4470 \end_layout
4471
4472 \begin_layout LyX-Code
4473 END NOTES;
4474 \end_layout
4475
4476 \begin_layout Standard
4477 We can add notes to the database before or after defining the annotated
4478 model.
4479 This is handy for several reasons including:
4480 \end_layout
4481
4482 \begin_layout Itemize
4483 Lengthy notes mixed with model and method code can make that code very hard
4484 to read.
4485
4486 \end_layout
4487
4488 \begin_layout Itemize
4489 Separate notes describing a family of models can be loaded and browsed before
4490 loading that library family.
4491 \end_layout
4492
4493 \begin_layout Itemize
4494 Users other than the author of a model can annotate that model without fear
4495 of introducing typographical errors into the model.
4496 \end_layout
4497
4498 \begin_layout Standard
4499 These advantages come with a disadvantage that all documentation has.
4500 If you change the model, you ought to change the documentation at the same
4501 time.
4502 To make finding these documentation locations in need of change easier,
4503 the name of the file containing each note is included in the loaded database.
4504 \end_layout
4505
4506 \begin_layout Standard
4507 Experience has shown that even documentation embedded directly in models
4508 or in other computer programs gets out-dated if the person changing the
4509 program is in a hurry and is not required to document properly as part
4510 of the task at hand.
4511 Neither ASCEND nor any other software system can eliminate the garbage
4512 code and documentation that results from undisciplined modeling.
4513 \end_layout
4514
4515 \begin_layout Section
4516 Declarative statements
4517 \begin_inset LatexCommand \index{statements, declarative}
4518
4519 \end_inset
4520
4521
4522 \begin_inset LatexCommand \index{declarative statements}
4523
4524 \end_inset
4525
4526
4527 \begin_inset LatexCommand \label{sec:x.3Declarative-statements}
4528
4529 \end_inset
4530
4531
4532 \end_layout
4533
4534 \begin_layout Standard
4535 We have already seen several examples that included declarative statements.
4536 Here we will be more systematic in defining things.
4537 The statements we describe are legal within the declarative portion of
4538 an ATOM or MODEL definition.
4539 The declarative portion stops at the keyword METHODS if it is present in
4540 the definition or at the end of the definition.
4541 \end_layout
4542
4543 \end_deeper
4544 \begin_layout List
4545 \labelwidthstring 00000.00000.00000.000
4546
4547 \bar under
4548 Statements
4549 \bar default
4550
4551 \begin_inset LatexCommand \index{statements}
4552
4553 \end_inset
4554
4555 Statements in ASCEND terminate with a semicolon (;).
4556 Statements may extend over any number of lines.
4557 They may have blank lines in the middle of them.
4558 There may be several statements on a single line.
4559
4560 \end_layout
4561
4562 \begin_layout List
4563 \labelwidthstring 00000.00000.00000.000
4564
4565 \bar under
4566 Compound\InsetSpace ~
4567 statements
4568 \bar default
4569
4570 \begin_inset LatexCommand \index{statements, compound}
4571
4572 \end_inset
4573
4574
4575 \begin_inset LatexCommand \index{compound statements}
4576
4577 \end_inset
4578
4579 Some statements in ASCEND can contain other statements as a part of them.
4580 The declarative compound statements are the ALIASES/IS_A, CONDITIONAL,
4581 FOR/CREATE, SELECT/CASE, and WHEN/CASE statements.
4582 The procedural compound statements allowed only in methods are the FOR/DO,
4583 FOR/CHECK, SWITCH (* 4 *) and the IF statements.
4584 Compound statements end with "END word;", where word matches the beginning
4585 of the syntax block, e.g.
4586 END FOR.and they can be nested, with some exceptions which are noted later.
4587
4588 \end_layout
4589
4590 \begin_layout List
4591 \labelwidthstring 00000.00000.00000.000
4592
4593 \bar under
4594 CASE\InsetSpace ~
4595 statements
4596 \bar default
4597
4598 \begin_inset LatexCommand \index{statements, CASE}
4599
4600 \end_inset
4601
4602
4603 \begin_inset LatexCommand \index{CASE statements}
4604
4605 \end_inset
4606
4607 (*4*) WHEN/CASE, CONDITIONAL, and SELECT/CASE handle modeling alternatives
4608 within a single definition.
4609 The easy way to remember the difference is that the first picks which equations
4610 to solve WHEN discrete variables have certain values, while the second
4611 SELECTs which statements to compile based on discrete constants.
4612 (* 4 *) SWITCH statements handle flow of control in methods, in a slightly
4613 more generalized form than the C language switch statement.
4614 \end_layout
4615
4616 \begin_layout List
4617 \labelwidthstring 00000.00000.00000.000
4618 Type\InsetSpace ~
4619 declarations
4620 \begin_inset LatexCommand \index{declarations, type}
4621
4622 \end_inset
4623
4624
4625 \begin_inset LatexCommand \index{yype declarations}
4626
4627 \end_inset
4628
4629 are not compound statements.
4630 \end_layout
4631
4632 \begin_deeper
4633 \begin_layout Standard
4634 MODEL and ATOM type definitions and METHOD definitions are not really compound
4635 statements because they require a name following their END word that matches
4636 the name given at the beginning of the definition.
4637 These definitions cannot be nested.
4638 \end_layout
4639
4640 \end_deeper
4641 \begin_layout List
4642 \labelwidthstring 00000.00000.00000.000
4643 ASCEND\InsetSpace ~
4644 operator\InsetSpace ~
4645 synopses:
4646 \end_layout
4647
4648 \begin_deeper
4649 \begin_layout Standard
4650 Well start with an extremely brief synopsis of what each does and then give
4651 detailed descriptions.
4652 It is helpful to remember that an instance may have many names, even in
4653 the same scope, but each name may only be defined once.
4654 \end_layout
4655
4656 \end_deeper
4657 \begin_layout List
4658 \labelwidthstring 00000.00000.00000.000
4659 IS_A
4660 \begin_inset LatexCommand \index{IS\_A}
4661
4662 \end_inset
4663
4664 Constructor.
4665 Calls for one or more named instances to be compiled using the type specified.
4666 (* 4 *) If the type is one that requires parameters, the parameters must
4667 be supplied in () following the type name.
4668 \end_layout
4669
4670 \begin_layout List
4671 \labelwidthstring 00000.00000.00000.000
4672 IS_REFINED_TO
4673 \begin_inset LatexCommand \index{IS\_REFINED\_TO}
4674
4675 \end_inset
4676
4677 Reconstructor.
4678 Causes the already compiled instance(s) named to have their type changed
4679 to a more refined type.
4680 This causes an incremental recompilation of the instance(s).
4681 IS_REFINED_TO is not a redefinition of the named instances because refinement
4682 can only add compatible information.
4683 The instances retain all the structure that originally defined them.
4684 (* 4 *) If the type being refined to requires arguments, these must be
4685 supplied, even if the same arguments were required in the IS_A of the originall
4686 y less refined declaration of the instance.
4687
4688 \end_layout
4689
4690 \begin_layout List
4691 \labelwidthstring 00000.00000.00000.000
4692 ALIASES
4693 \begin_inset LatexCommand \index{ALIASES}
4694
4695 \end_inset
4696
4697 \InsetSpace ~
4698 (*\InsetSpace ~
4699 4\InsetSpace ~
4700 *) Part alternate naming statement.
4701 Establishes another name for an instance at the same scope or in a child
4702 instance.
4703 The equivalent of an ALIASES in ASCEND III is to create another part with
4704 the desired name and merge it immediately via ARE_THE_SAME with the part
4705 being renamed, a rather expensive and unintuitive process.
4706 \end_layout
4707
4708 \begin_layout List
4709 \labelwidthstring 00000.00000.00000.000
4710 ALIASES/IS_A
4711 \begin_inset LatexCommand \index{ALIASES/IS\_A}
4712
4713 \end_inset
4714
4715 \InsetSpace ~
4716 (*\InsetSpace ~
4717 4\InsetSpace ~
4718 *)
4719 \end_layout
4720
4721 \begin_deeper
4722 \begin_layout Standard
4723 Creates an array of alternate names for a list of existing instances with
4724 some common base type and creates the set over which the elements of the
4725 array are indexed.
4726 Useful for making collections of related objects in ways the original author
4727 of the model didnt anticipate.
4728 Also useful for assembling array arguments to parameterized type definitions.
4729 \end_layout
4730
4731 \end_deeper
4732 \begin_layout List
4733 \labelwidthstring 00000.00000.00000.000
4734 WILL_BE
4735 \begin_inset LatexCommand \index{WILL\_BE}
4736
4737 \end_inset
4738
4739 \InsetSpace ~
4740 (*\InsetSpace ~
4741 4\InsetSpace ~
4742 *) Forward declaration statement.
4743 Promises that a part with the given type will be constructed by an as yet
4744 unknown IS_A statement above the current scope.
4745 At present WILL_BE is legal only in defining parameters.
4746 Were it legal in the body of a model, compiling models would be very expensive.
4747 \end_layout
4748
4749 \begin_layout List
4750 \labelwidthstring 00000.00000.00000.000
4751 ARE_THE_SAME
4752 \begin_inset LatexCommand \index{ARE\_THE\_SAME}
4753
4754 \end_inset
4755
4756 Merge.
4757 Calls for two or more instances already compiled to be merged recursively.
4758 This essentially means combining all the values in the instances into the
4759 most refined of the instances and then destroying all the extra, possibly
4760 less refined, instances.
4761 The remaining instance has its original name and also all the names of
4762 the instances destroyed during the merge.
4763 \end_layout
4764
4765 \begin_layout List
4766 \labelwidthstring 00000.00000.00000.000
4767 WILL_BE_THE_SAME
4768 \begin_inset LatexCommand \index{WILL\_BE\_THE\_SAME}
4769
4770 \end_inset
4771
4772 \InsetSpace ~
4773 (*\InsetSpace ~
4774 4\InsetSpace ~
4775 *)
4776 \end_layout
4777
4778 \begin_deeper
4779 \begin_layout Standard
4780 Structural condition statement restricting objects in a forward declaration.
4781 The objects passed to a parameterized type definition can be constrained
4782 to have arbitrary parts in common before the parameterized object is constructe
4783 d.
4784 \end_layout
4785
4786 \end_deeper
4787 \begin_layout List
4788 \labelwidthstring 00000.00000.00000.000
4789 WILL_NOT_BE_THE_SAME
4790 \begin_inset LatexCommand \index{WILL\_NOT\_BE\_THE\_SAME}
4791
4792 \end_inset
4793
4794 \InsetSpace ~
4795 (*\InsetSpace ~
4796 4\InsetSpace ~
4797 *)
4798 \end_layout
4799
4800 \begin_deeper
4801 \begin_layout Standard
4802 Structural condition statement restricting objects in a forward declaration.
4803 We apologize for the length of this key word, but we bet it is easy to
4804 remember.
4805 The objects passed to a parameterized type definition can be constrained
4806 to have arbitrary parts be distinct instances before the parameterized
4807 object is constructed.
4808 At present the constraint is only enforced when the objects are being passed.
4809 \end_layout
4810
4811 \end_deeper
4812 \begin_layout List
4813 \labelwidthstring 00000.00000.00000.000
4814 ARE_NOT_THE_SAME
4815 \begin_inset LatexCommand \index{ARE\_NOT\_THE\_SAME}
4816
4817 \end_inset
4818
4819 \InsetSpace ~
4820 (*\InsetSpace ~
4821 4+\InsetSpace ~
4822 *)
4823 \end_layout
4824
4825 \begin_deeper
4826 \begin_layout Standard
4827 Cannot be merged.
4828 We believe it is useful to say that two objects cannot be merged and still
4829 represent a valid model.
4830 This is not yet implemented, however, mainly for lack of time.
4831 The implementation is simple.
4832 \end_layout
4833
4834 \end_deeper
4835 \begin_layout List
4836 \labelwidthstring 00000.00000.00000.000
4837 ARE_ALIKE
4838 \begin_inset LatexCommand \index{ARE\_ALIKE}
4839
4840 \end_inset
4841
4842 Refinement clique
4843 \begin_inset LatexCommand \index{clique}
4844
4845 \end_inset
4846
4847 constructor.
4848 Causes a group of instances to always be of the same formal type.
4849 Refining one of them causes a refinement of all the others.
4850 Does not propagate implicit type information, such as assignments to constants
4851 or part refinements made from a scope other than the scope of the formal
4852 definition.
4853 \end_layout
4854
4855 \begin_layout List
4856 \labelwidthstring 00000.00000.00000.000
4857 FOR/CREATE
4858 \begin_inset LatexCommand \index{FOR/CREATE}
4859
4860 \end_inset
4861
4862 Indexed execution of other declarative statements.
4863 Required for creating arrays of relations and sparse arrays of other types.
4864 \end_layout
4865
4866 \begin_layout List
4867 \labelwidthstring 00000.00000.00000.000
4868 FOR/CHECK
4869 \begin_inset LatexCommand \index{FOR/CHECK}
4870
4871 \end_inset
4872
4873 Indexed checking of the conditions (WHERE
4874 \begin_inset LatexCommand \index{WHERE}
4875
4876 \end_inset
4877
4878 statements) of a parameterized model.
4879 \end_layout
4880
4881 \begin_layout List
4882 \labelwidthstring 00000.00000.00000.000
4883 SELECT/CASE
4884 \begin_inset LatexCommand \index{SELECT/CASE}
4885
4886 \end_inset
4887
4888 \InsetSpace ~
4889 (*\InsetSpace ~
4890 4\InsetSpace ~
4891 *)
4892 \end_layout
4893
4894 \begin_deeper
4895 \begin_layout Standard
4896 Select a subset of statements to compile.
4897 Given the values of the specified constants, SELECT compiles all cases
4898 that match those values.
4899 A name cannot be defined two different ways inside the SELECT statement,
4900 but it may be defined outside the case statement and then refined in different
4901 ways in separate cases.
4902 \end_layout
4903
4904 \end_deeper
4905 \begin_layout List
4906 \labelwidthstring 00000.00000.00000.000
4907 CONDITIONAL
4908 \begin_inset LatexCommand \index{CONDITIONAL}
4909
4910 \end_inset
4911
4912 \InsetSpace ~
4913 (*\InsetSpace ~
4914 4\InsetSpace ~
4915 *)
4916 \end_layout
4917
4918 \begin_deeper
4919 \begin_layout Standard
4920 Describe bounding relations.
4921 The relations written inside a CONDITIONAL statement must all be labelled.
4922 These relations can be used to define regions in which alternate sets of
4923 equations apply using the WHEN statement.
4924 \end_layout
4925
4926 \end_deeper
4927 \begin_layout List
4928 \labelwidthstring 00000.00000.00000.000
4929 WHEN/CASE
4930 \begin_inset LatexCommand \index{WHEN/CASE}
4931
4932 \end_inset
4933
4934 \InsetSpace ~
4935 (*\InsetSpace ~
4936 4\InsetSpace ~
4937 *) When logical variables have certain values, use certain relations
4938 or model parts in defining a mathematical problem.
4939 The relations are not defined inside the WHEN statement because all the
4940 relations must be compiled regardless of which values the logical variables
4941 have at any given moment.
4942
4943 \end_layout
4944
4945 \begin_layout List
4946 \labelwidthstring 00000.00000.00000.000
4947 Reminder: In the following detailed statement descriptions, we show keywords
4948 in capital letters.
4949 These words must appear in capital letters as shown in ASCEND statements.
4950 We show optional parts to a statement enclosed in double angle brackets
4951 (« ») and user supplied names in lower-case italic letters.
4952 (Remember that ASCEND treats the underscore (_) as a letter).
4953 The user may substitute any name desired for these names.
4954 We use names that describe the kind of name the user should use.
4955 \end_layout
4956
4957 \begin_layout List
4958 \labelwidthstring 00000.00000.00000.000
4959
4960 \bar under
4961 Operators\InsetSpace ~
4962 in\InsetSpace ~
4963 detail:
4964 \end_layout
4965
4966 \begin_layout List
4967 \labelwidthstring 00000.00000.00000.000
4968 IS_A
4969 \begin_inset LatexCommand \index{IS\_A}
4970
4971 \end_inset
4972
4973 This statement has the syntax
4974 \end_layout
4975
4976 \begin_deeper
4977 \begin_layout LyX-Code
4978
4979 \emph on
4980 list_of_instance_names
4981 \emph default
4982 IS_A
4983 \emph on
4984 model_name
4985 \end_layout
4986
4987 \begin_layout LyX-Code
4988 «(arguments_if_needed)»;
4989 \end_layout
4990
4991 \begin_layout Standard
4992 The IS_A statement allows us to declare instances of a given type to exist
4993 within a model definition.
4994 If type has not been defined (loaded in the ASCEND environment) then this
4995 statement is an error and the MODEL it appears in is irreparably damaged
4996 (at least until you delete the type definitions and reload a corrected
4997 file).
4998 Similarly, if the arguments needed are not supplied or if provably incorrect
4999 arguments are supplied, the statement is in error.
5000 The construction of the instances does not occur until all the arguments
5001 satisfy the definition of type.
5002 \end_layout
5003
5004 \begin_layout Standard
5005 If a name is used twice in WILL_BE/IS_A/ALIASES statements of the same model,
5006 ASCEND will complain bitterly when the definition is parsed.
5007 Duplicate naming is a serious error.
5008 Labels on relations share the same name space as other objects.
5009 \end_layout
5010
5011 \end_deeper
5012 \begin_layout List
5013 \labelwidthstring 00000.00000.00000.000
5014 IS_REFINED_TO
5015 \begin_inset LatexCommand \index{IS\_REFINED\_TO}
5016
5017 \end_inset
5018
5019 This statement has the syntax
5020 \end_layout
5021
5022 \begin_deeper
5023 \begin_layout LyX-Code
5024 list_of_instances IS_REFINED_TO
5025 \emph on
5026 type_name
5027 \end_layout
5028
5029 \begin_layout LyX-Code
5030 «(arguments_if_needed)»;
5031 \end_layout
5032
5033 \begin_layout Standard
5034 We use this statement to change the type of each of the instances listed
5035 to the type type_name.
5036 The modeler has to have defined each member on the list of instances.
5037 The type_name has to be a type which refines the types of all the instances
5038 on the list.
5039 \end_layout
5040
5041 \begin_layout Standard
5042 An example of its use is as follows.
5043 First we define the parts called fl1, fl2 and fl3 which are of type flash.
5044 \end_layout
5045
5046 \begin_layout LyX-Code
5047 fl1, fl2, fl3 IS_A flash;
5048 \end_layout
5049
5050 \begin_layout Standard
5051 Assume that there exists in the previously defined model definitions the
5052 type adiabatic_flash that is a refinement of flash.
5053 Then we can make fl1 and fl3 into more refined types by stating:
5054 \end_layout
5055
5056 \begin_layout LyX-Code
5057 fl1, fl3 IS_REFINED_TO adiabatic_flash;
5058 \end_layout
5059
5060 \begin_layout Standard
5061 This reconstruction does not occur until the arguments to the type satisfy
5062 the definition type_name.
5063 \end_layout
5064
5065 \end_deeper
5066 \begin_layout List
5067 \labelwidthstring 00000.00000.00000.000
5068 ALIASES
5069 \begin_inset LatexCommand \index{ALIASES}
5070
5071 \end_inset
5072
5073 \InsetSpace ~
5074 (*\InsetSpace ~
5075 4\InsetSpace ~
5076 *) This statement has the syntax
5077 \end_layout
5078
5079 \begin_deeper
5080 \begin_layout LyX-Code
5081
5082 \emph on
5083 list_of_instances
5084 \emph default
5085 ALIASES
5086 \emph on
5087 instance_name
5088 \emph default
5089 ;
5090 \end_layout
5091
5092 \begin_layout Standard
5093 We use this statement to point at an already existing instance of any type
5094 other than relation, logical_relation, or when.
5095 For example, say we want a flash tank model to have a variable T, the temperatu
5096 re of the vapor-liquid equilibrium mixture in the tank.
5097 \end_layout
5098
5099 \begin_layout LyX-Code
5100 MODEL tank;
5101 \end_layout
5102
5103 \begin_layout LyX-Code
5104 feed, liquid, vapor IS_A stream;
5105 \end_layout
5106
5107 \begin_layout LyX-Code
5108 state IS_A VLE_mixture;
5109 \end_layout
5110
5111 \begin_layout LyX-Code
5112 T ALIASES state.T;
5113 \end_layout
5114
5115 \begin_layout LyX-Code
5116 liquor_temperature ALIASES T;
5117 \end_layout
5118
5119 \begin_layout LyX-Code
5120 END tank;
5121 \end_layout
5122
5123 \begin_layout Standard
5124 We might also want a more descriptive name than T, so ALIASES can also be
5125 used to establish a second name at the same scope, e.g.
5126 liquor_temperature.
5127 \end_layout
5128
5129 \begin_layout Standard
5130 An ALIASES statement will not be executed until the RHS instance has been
5131 created with an IS_A.
5132 The compiler schedules ALIASES instructions appropriately and issues warnings
5133 if recursion is detected.
5134 An array of aliases, e.g.
5135
5136 \end_layout
5137
5138 \begin_layout LyX-Code
5139 b[1..n], c ALIASES a;
5140 \end_layout
5141
5142 \begin_layout Standard
5143 is permitted (though we cant think why anyone would want such an array),
5144 and the sets over which the array is defined must be completed before the
5145 statement is executed.
5146 So, in the example of b and c, the array b will not be created until a
5147 exists and n is assigned a value.
5148 b and c will be created at the same time since they are defined in the
5149 same statement.
5150 This suggests the following rule: if you must use an array of aliases,
5151 do not declare it in the same statement with a scalar alias.
5152 \end_layout
5153
5154 \begin_layout Standard
5155 The ALIASES RHS can be an element or portion of a larger array with the
5156 following exception.
5157 The existing RHS instance cannot be a relation or array of relations (including
5158 logical relations and whens) because of the rule in the language that a
5159 relation instance is associated with exactly one model.
5160 \end_layout
5161
5162 \end_deeper
5163 \begin_layout List
5164 \labelwidthstring 00000.00000.00000.000
5165 ALIASES/IS_A
5166 \begin_inset LatexCommand \index{ALIASES/IS\_A}
5167
5168 \end_inset
5169
5170 \InsetSpace ~
5171 (*\InsetSpace ~
5172 4\InsetSpace ~
5173 *)
5174 \end_layout
5175
5176 \begin_deeper
5177 \begin_layout Standard
5178 The ALIASES/IS_A statement syntax is subject to change, though some equivalent
5179 will always exist.
5180 We take a set of symbol_constant or integer_constant and pair it with a
5181 list of instances to create an array.
5182 For the moment, the syntax and semantics is as follows.
5183 \end_layout
5184
5185 \begin_layout LyX-Code
5186
5187 \emph on
5188 alias_array_instance[aset]
5189 \emph default
5190
5191 \end_layout
5192
5193 \begin_layout LyX-Code
5194 ALIASES (
5195 \emph on
5196 list_of_instances)
5197 \emph default
5198
5199 \end_layout
5200
5201 \begin_layout LyX-Code
5202 WHERE
5203 \emph on
5204 aset
5205 \emph default
5206 IS_A set OF
5207 \emph on
5208 settype
5209 \emph default
5210 ;
5211 \end_layout
5212
5213 \begin_layout Standard
5214 or
5215 \end_layout
5216
5217 \begin_layout LyX-Code
5218
5219 \emph on
5220 alias_array_instance[aset]
5221 \emph default
5222
5223 \end_layout
5224
5225 \begin_layout LyX-Code
5226 ALIASES (
5227 \emph on
5228 list_of_instances
5229 \emph default
5230 )
5231 \end_layout
5232
5233 \begin_layout LyX-Code
5234 WHERE
5235 \emph on
5236 aset
5237 \emph default
5238 IS_A set OF
5239 \emph on
5240 settype
5241 \emph default
5242
5243 \end_layout
5244
5245 \begin_layout LyX-Code
5246 WITH_VALUE (
5247 \emph on
5248 value_list_matching_settype
5249 \emph default
5250 );
5251 \end_layout
5252
5253 \begin_layout Standard
5254 aset is the name of the set that will be created by the IS_A to index the
5255 array of aliases.
5256 If value_list_matching_set_type is not given, the compiler will make one
5257 up out of the integers (1..number of names in list_of_instances) or symbols
5258 derived from the individual names given.
5259 If the value list is given, it must have the same number of elements as
5260 the list of instances does.
5261 The value list elements must be unique because they form a set.
5262 The list of instances can contain duplicates.
5263 If any of these conditions are not met properly, the statement is in error.
5264 \end_layout
5265
5266 \begin_layout Standard
5267 ALIASES/IS_A can be used inside a FOR statement.
5268 When this occurs, the definition of aset must be indexed and it must be
5269 the last subscript of alias_array_instance.
5270 The statement must look like:
5271 \end_layout
5272
5273 \begin_layout LyX-Code
5274
5275 \emph on
5276 array_instance[FOR_index][aset[FORindex]]
5277 \end_layout
5278
5279 \begin_layout LyX-Code
5280 ALIASES (
5281 \emph on
5282 list_of_instances
5283 \emph default
5284 )
5285 \end_layout
5286
5287 \begin_layout LyX-Code
5288 WHERE
5289 \emph on
5290 aset[FORindex]
5291 \emph default
5292 IS_A set OF
5293 \emph on
5294 settype
5295 \emph default
5296
5297 \end_layout
5298
5299 \begin_layout LyX-Code
5300 WITH_VALUE (
5301 \emph on
5302 value_list_matching_settype
5303 \emph default
5304 );
5305 \end_layout
5306
5307 \begin_layout Standard
5308 Here, as with the unindexed version, the WITH_VALUE portion is optional.
5309 \end_layout
5310
5311 \begin_layout Standard
5312 If this explanation is unclear, just try it out.
5313 The compiler error messages for ALIASES/IS_A are particularly good because
5314 we know it is a bit tricky to explain.
5315
5316 \end_layout
5317
5318 \end_deeper
5319 \begin_layout List
5320 \labelwidthstring 00000.00000.00000.000
5321 WILL_BE
5322 \begin_inset LatexCommand \index{WILL\_BE}
5323
5324 \end_inset
5325
5326 \InsetSpace ~
5327 (*\InsetSpace ~
5328 4\InsetSpace ~
5329 *) instance WILL_BE type_name;
5330 \end_layout
5331
5332 \begin_deeper
5333 \begin_layout Standard
5334 The most common use of this forward declaration is as a statement within
5335 the parameter list of a model definition.
5336 In parameter lists, list_of_instances must contain exactly one instance.
5337 When a model definition includes a parameter defined by WILL_BE, that model
5338 cannot be compiled until a compiled instance at least as refined as the
5339 type specified by type_name is passed to it.
5340 \end_layout
5341
5342 \begin_layout Standard
5343 (* 4+ *) The second potential use of WILL_BE is to establish that an array
5344 of a common base type exists and its elements will be filled in individually
5345 by IS_A or ARE_THE_SAME or ALIASES statements.
5346 WILL_BE allows us to avoid costly reconstruction or merge operations by
5347 establishing a placeholder instance which contains just enough type information
5348 to let us check the validity of other statements that require type compatibilit
5349 y while delaying construction until it is called for by the filling in statement
5350 s.
5351 Instances declared with WILL_BE are never compiled if they are not ultimately
5352 resolved to another instance created with IS_A.
5353 Unresolved WILL_BE instances will appear in the user interface as objects
5354 of type PENDING_INSTANCE_model_name.
5355 Because of the many implementation and explanation difficulties this usage
5356 of WILL_BE creates, it is not allowed.
5357 The ALIASES/IS_A construct does the same job in a much simpler way.
5358 \end_layout
5359
5360 \end_deeper
5361 \begin_layout List
5362 \labelwidthstring 00000.00000.00000.000
5363 ARE_THE_SAME
5364 \begin_inset LatexCommand \index{ARE\_THE\_SAME}
5365
5366 \end_inset
5367
5368 The format for this instruction is
5369 \end_layout
5370
5371 \begin_deeper
5372 \begin_layout LyX-Code
5373
5374 \emph on
5375 list_of_instances
5376 \emph default
5377 ARE_THE_SAME;
5378 \end_layout
5379
5380 \begin_layout Standard
5381 \begin_inset Float figure
5382 wide false
5383 sideways false
5384 status open
5385
5386 \begin_layout Standard
5387 \begin_inset Graphics
5388 filename syntaxFig1.eps
5389
5390 \end_inset
5391
5392
5393 \end_layout
5394
5395 \begin_layout Caption
5396 Diagram of the Model Type Hierarchy for A, B, C, D, and E Example
5397 \begin_inset LatexCommand \label{fig:HierarchyDiagram}
5398
5399 \end_inset
5400
5401
5402 \end_layout
5403
5404 \end_inset
5405
5406
5407 \end_layout
5408
5409 \begin_layout Standard
5410 All items on the list must have compatible types.
5411 For the example in Figure
5412 \begin_inset LatexCommand \ref{fig:HierarchyDiagram}
5413
5414 \end_inset
5415
5416 , consider a model where we define the following parts:
5417 \end_layout
5418
5419 \begin_layout LyX-Code
5420 a1 IS_A A;
5421 \end_layout
5422
5423 \begin_layout LyX-Code
5424 b1 IS_A B;
5425 \end_layout
5426
5427 \begin_layout LyX-Code
5428 c1 IS_A C;
5429 \end_layout
5430
5431 \begin_layout LyX-Code
5432 d1 IS_A D;
5433 \end_layout
5434
5435 \begin_layout LyX-Code
5436 e1 IS_A E;
5437 \end_layout
5438
5439 \begin_layout Standard
5440 Then the following ARE_THE_SAME statement is legal
5441 \end_layout
5442
5443 \begin_layout LyX-Code
5444 a1, b1, c1 ARE_THE_SAME;
5445 \end_layout
5446
5447 \begin_layout Standard
5448 while the following are not
5449 \end_layout
5450
5451 \begin_layout LyX-Code
5452 b1, d1 ARE_THE_SAME;
5453 \end_layout
5454
5455 \begin_layout LyX-Code
5456 a1, c1, d1 ARE_THE_SAME;
5457 \end_layout
5458
5459 \begin_layout LyX-Code
5460 b1, e1 ARE_THE_SAME;
5461 \end_layout
5462
5463 \begin_layout Standard
5464 When compiling a model, ASCEND will put all of the instances mentioned as
5465 being the same into an ARE_THE_SAME clique.
5466 ASCEND lists members of this clique when one asks via the interface for
5467 the aliases of any object in a compiled model.
5468 \end_layout
5469
5470 \begin_layout Standard
5471 Merging any other item with a member of the clique makes it the same as
5472 all the other items in the clique, i.e., it adds the newly mentioned items
5473 to the existing clique.
5474 \end_layout
5475
5476 \begin_layout Standard
5477 ASCEND merges all members of a clique by first checking that all members
5478 of the clique are type compatible.
5479 It then changes the type designation of all clique members to that of the
5480 most refined member.
5481 \end_layout
5482
5483 \begin_layout Standard
5484 It next looks inside each of the instances, all of which are now of the
5485 same type, and puts all of the parts with the same name into their respective
5486 ARE_THE_SAME cliques.
5487 The process repeats by processing these cliques until all parts of all
5488 parts of all parts, etc., are their respective most refined type or discovered
5489 to be type incompatible.
5490 \end_layout
5491
5492 \begin_layout Standard
5493 There are now lots of cliques associated with the instances being merged.
5494 The type associated with each such clique is now either a model, an array,
5495 or an atom (i.e., a variable, constant, or set).
5496 If a model, only one member of the clique generates its equations.
5497 If a variable, it assigns all members to the same storage location.
5498 \end_layout
5499
5500 \begin_layout Standard
5501 Note that the values of constants and sets are essentially type information,
5502 so merging two already assigned constants is only possible if merging them
5503 does not force one of them to be assigned a new value.
5504 Merging arrays with mismatching ranges of elements is an error.
5505 \end_layout
5506
5507 \end_deeper
5508 \begin_layout List
5509 \labelwidthstring 00000.00000.00000.000
5510 WILL_BE_THE_SAME\InsetSpace ~
5511 (*\InsetSpace ~
5512 4\InsetSpace ~
5513 *)
5514 \end_layout
5515
5516 \begin_deeper
5517 \begin_layout Standard
5518 There is no further explanation of this operator.
5519
5520 \end_layout
5521
5522 \end_deeper
5523 \begin_layout List
5524 \labelwidthstring 00000.00000.00000.000
5525 WILL_NOT_BE_THE_SAME\InsetSpace ~
5526 (*\InsetSpace ~
5527 4\InsetSpace ~
5528 *)
5529 \end_layout
5530
5531 \begin_deeper
5532 \begin_layout Standard
5533 There is no further explanation of this operator.
5534 \end_layout
5535
5536 \end_deeper
5537 \begin_layout List
5538 \labelwidthstring 00000.00000.00000.000
5539 ARE_NOT_THE_SAME\InsetSpace ~
5540 (*\InsetSpace ~
5541 4+\InsetSpace ~
5542 *)
5543 \end_layout
5544
5545 \begin_deeper
5546 \begin_layout Standard
5547 ARE_NOT_THE_SAME will be documented further when it is implemented.
5548 \end_layout
5549
5550 \end_deeper
5551 \begin_layout List
5552 \labelwidthstring 00000.00000.00000.000
5553 ARE_ALIKE
5554 \begin_inset LatexCommand \index{ARE\_ALIKE}
5555
5556 \end_inset
5557
5558 The format for this statement is
5559 \end_layout
5560
5561 \begin_deeper
5562 \begin_layout LyX-Code
5563
5564 \emph on
5565 list_of_instance_names
5566 \emph default
5567 ARE_ALIKE;
5568 \end_layout
5569
5570 \begin_layout Standard
5571 The compiler places all instances in the list into an ARE_ALIKE clique.
5572 It checks that the members are formally type compatible and then it converts
5573 each into the most refined type of any instance in the clique.
5574 At that point the compiler stops.
5575 It does not continue by placing the parts into cliques nor does it merge
5576 anything.
5577 \end_layout
5578
5579 \begin_layout Standard
5580 There are important consequences of modeling with such a partial merge.
5581 The consequences we are about to describe can be much more reliably achieved
5582 by use of parameterized types, when the types are well understood.
5583 When we are exploring new ways of modeling, ARE_ALIKE still has its uses.
5584 When a model and its initial uses are understood well enough to be put
5585 into a reusable library, then parameterization and the explicit statement
5586 of structural constraints by operators such as WILL_NOT_BE_THE_SAME should
5587 be the preferred method of ensuring correct use.
5588 \end_layout
5589
5590 \begin_layout Standard
5591 One consequence of ARE_ALIKE is to prevent extreme model misuse when configuring
5592 models.
5593 For example, suppose a modeler creates a new pressure changing model.
5594 The modeler is not yet concerned about the type of the streams into and
5595 out of the device but does care that these streams are of the same final
5596 type.
5597 For example, the modeler wants both to be liquid streams if either is or
5598 both to be vapor streams if either is.
5599 By declaring both to be streams only but declaring the two streams to be
5600 alike, the modeler accomplishes this intent.
5601 Suppose the modeler merges the inlet stream with a liquid outlet stream
5602 from a reactor.
5603 The merge operation makes the inlet stream into a liquid stream.
5604 The outlet stream, being in an ARE_ALIKE clique with the inlet stream,
5605 also becomes a liquid stream.
5606 Any subsequent merge of the outlet stream with a vapor stream will lead
5607 to an error due to type incompatibility when ASCEND attempts to compile
5608 that merge.
5609 Without the ARE_ALIKE statement, the compiler can detect no such incompatibilit
5610 y unless parameterized models are used.
5611 \end_layout
5612
5613 \begin_layout Standard
5614 Another purpose is the propagation of types through a model.
5615 Altering the type of the inlet stream through merging it with a liquid
5616 stream automatically made the outlet stream into a liquid stream.
5617 \end_layout
5618
5619 \begin_layout Standard
5620 If all the liquid streams within a distillation column are alike, then the
5621 modeler can make them all into streams with a particular set of components
5622 in them and with the same method used for physical property evaluation
5623 by merging only one of them with a liquid stream of this type.
5624 This is the primary example which has been used to justify the existence
5625 of ARE_ALIKE.
5626 We have observed that its use makes a column library very difficult to
5627 compile efficiently.
5628 But since we now have parameterized types to help us keep the column library
5629 semantically consistent, ARE_ALIKE can be left to its proper role: the
5630 rapid prototyping of partially understood models.
5631 We have yet to see anyone use ARE_ALIKE in a prototyping context, however.
5632 \end_layout
5633
5634 \begin_layout Standard
5635 Finally, because ARE_ALIKE does not recursively put the parts of ARE_ALIKEd
5636 instances into ARE_ALIKE cliques, it is possible to ARE_ALIKE model instances
5637 which have compatible formal types but incompatible implicit types.
5638 This can lead to unexpected problems later and makes the ARE_ALIKE instruction
5639 a source of non-reusability.
5640 \end_layout
5641
5642 \end_deeper
5643 \begin_layout List
5644 \labelwidthstring 00000.00000.00000.000
5645 FOR/CREATE
5646 \begin_inset LatexCommand \index{FOR/CREATE}
5647
5648 \end_inset
5649
5650 The FOR/CREATE statement is a compound statement that looks like a loop.
5651 It isnt, however, necessarily compiled as a loop.
5652 What FOR really does is specify an index set value.
5653 Its format is:
5654 \end_layout
5655
5656 \begin_deeper
5657 \begin_layout LyX-Code
5658 FOR
5659 \emph on
5660 index_variable
5661 \emph default
5662 IN
5663 \emph on
5664 set
5665 \emph default
5666 CREATE
5667 \end_layout
5668
5669 \begin_layout LyX-Code
5670
5671 \emph on
5672 list_of_statements;
5673 \end_layout
5674
5675 \begin_layout LyX-Code
5676 END FOR;
5677 \end_layout
5678
5679 \begin_layout Standard
5680 This statement can be in the declarative part of the model definition only.
5681 Every statement in the list should have at least one occurrence of the
5682 index variable, or the statement should be moved outside the FOR to avoid
5683 redundant execution.
5684 A correct example is
5685 \end_layout
5686
5687 \begin_layout LyX-Code
5688 FOR i IN components CREATE
5689 \end_layout
5690
5691 \begin_layout LyX-Code
5692 a.y[i], b[i] ARE_THE_SAME;
5693 \end_layout
5694
5695 \begin_layout LyX-Code
5696 y[i] = K[i]*x[i];
5697 \end_layout
5698
5699 \begin_layout LyX-Code
5700 END FOR;
5701 \end_layout
5702
5703 \begin_layout Standard
5704 FOR loops can be nested to produce sparse arrays as illustrated in Arrays
5705 can be jagged(
5706 \begin_inset LatexCommand \vpageref{lyx:Arrays-can-be}
5707
5708 \end_inset
5709
5710 .
5711 IS_A and ALIASES statements are allowed in FOR loops, provided the statements
5712 are properly indexed, a new feature in ASCEND IV.
5713 \end_layout
5714
5715 \end_deeper
5716 \begin_layout List
5717 \labelwidthstring 00000.00000.00000.000
5718 SELECT/CASE
5719 \begin_inset LatexCommand \index{SELECT/CASE}
5720
5721 \end_inset
5722
5723 \InsetSpace ~
5724 (*\InsetSpace ~
5725 4\InsetSpace ~
5726 *)
5727 \end_layout
5728
5729 \begin_deeper
5730 \begin_layout Standard
5731 Declarative.
5732 Order does not matter.
5733 All matching cases are executed.
5734 The OTHERWISE
5735 \begin_inset LatexCommand \index{OTHERWISE}
5736
5737 \end_inset
5738
5739 is executed if present and no other CASEs match.
5740 SELECT is not allowed inside FOR.
5741 Writing FOR statements inside SELECT is allowed.
5742 \end_layout
5743
5744 \end_deeper
5745 \begin_layout List
5746 \labelwidthstring 00000.00000.00000.000
5747 CONDITIONAL
5748 \begin_inset LatexCommand \index{CONDITIONAL}
5749
5750 \end_inset
5751
5752 \InsetSpace ~
5753 (*\InsetSpace ~
5754 4\InsetSpace ~
5755 *)
5756 \end_layout
5757
5758 \begin_deeper
5759 \begin_layout Standard
5760 Both real and logical relations are allowed in CONDITIONAL statements.
5761 CONDITIONAL is really just a shorthand for setting the $boundary flag on
5762 a whole batch of relations, since $boundary is a write-once attribute invisible
5763 through the user interface and methods at this time.
5764 \end_layout
5765
5766 \end_deeper
5767 \begin_layout List
5768 \labelwidthstring 00000.00000.00000.000
5769 WHEN/CASE
5770 \begin_inset LatexCommand \index{WHEN/CASE}
5771
5772 \end_inset
5773
5774 \InsetSpace ~
5775 (*\InsetSpace ~
5776 4\InsetSpace ~
5777 *) Inside each CASE, relations or model parts to be used are specified
5778 by writing, for example, USE mass_balance_1;.
5779 The method of dealing with the combined logical/nonlinear model is left
5780 to the solver.
5781 All matching CASEs are included in the problem to be solved.
5782
5783 \end_layout
5784
5785 \begin_deeper
5786 \begin_layout Section
5787 Procedural statements
5788 \begin_inset LatexCommand \index{statements, procedural}
5789
5790 \end_inset
5791
5792
5793 \begin_inset LatexCommand \index{procedural statements}
5794
5795 \end_inset
5796
5797
5798 \begin_inset LatexCommand \label{sec:x.4Procedural-statements}
5799
5800 \end_inset
5801
5802
5803 \end_layout
5804
5805 \end_deeper
5806 \begin_layout List
5807 \labelwidthstring 00000.00000.00000.000
5808 METHODS
5809 \begin_inset LatexCommand \index{METHODS}
5810
5811 \end_inset
5812
5813 This statement separates the method definitions in ASCEND from the declarative
5814 statements.
5815 All statements following this statement are to define methods in ASCEND
5816 while all before it are for the declarative part of ASCEND.
5817 The syntax for this statement is simply
5818 \end_layout
5819
5820 \begin_deeper
5821 \begin_layout LyX-Code
5822 METHODS
5823 \end_layout
5824
5825 \begin_layout Standard
5826 with no punctuation.
5827 The next code must be a METHOD or the END of the type being defined.
5828 If there are no method definitions, this statement may be omitted.
5829 \end_layout
5830
5831 \begin_layout Standard
5832 METHOD definitions for a type can also be added or replaced after the type
5833 has been defined.
5834 This is to make creating and debugging of methods as interactive as possible.
5835 In ASCEND III an instance must be destroyed and recreated each time a new
5836 or revised method is added to the type definition.
5837 This is a very expensive process when working with models of significant
5838 size.
5839 \end_layout
5840
5841 \begin_layout Standard
5842 The detailed semantics of method inheritance, addition, and replacement
5843 of methods are given at the end of this section.
5844 \end_layout
5845
5846 \end_deeper
5847 \begin_layout List
5848 \labelwidthstring 00000.00000.00000.000
5849 ADD\InsetSpace ~
5850 METHODS\InsetSpace ~
5851 IN
5852 \begin_inset LatexCommand \index{ADD METHODS IN}
5853
5854 \end_inset
5855
5856 \InsetSpace ~
5857 type_name;\InsetSpace ~
5858 (*\InsetSpace ~
5859 4\InsetSpace ~
5860 *)
5861 \end_layout
5862
5863 \begin_deeper
5864 \begin_layout Standard
5865 This statement allows new methods to be added to an already loaded type
5866 definition.
5867 The next code must be a METHOD or the END METHODS; statement.
5868 If a method of the same name already exists in type_name, the statement
5869 is in error.
5870 If other types refine type_name then the addition follows the method inheritanc
5871 e rules.
5872 Any type which inherited methods from type_name now inherits the methods
5873 added to type_name.
5874 If a refinement of type_name already defines a method ADDed to type_name,
5875 then the existing method in the more refined type is not disturbed.
5876 \end_layout
5877
5878 \end_deeper
5879 \begin_layout List
5880 \labelwidthstring 00000.00000.00000.000
5881 REPLACE\InsetSpace ~
5882 METHODS\InsetSpace ~
5883 IN
5884 \begin_inset LatexCommand \index{REPLACE METHODS IN}
5885
5886 \end_inset
5887
5888 \InsetSpace ~
5889 type_name;\InsetSpace ~
5890 (*\InsetSpace ~
5891 4\InsetSpace ~
5892 *)
5893 \end_layout
5894
5895 \begin_deeper
5896 \begin_layout Standard
5897 This statement allows existing methods to be replaced in an already loaded
5898 type definition.
5899 The next code must be a METHOD or the END METHODS; statement.
5900 If a method of the same name does not exist in type_name, the statement
5901 is in error.
5902 If other types refine type_name then the replacement follows the method
5903 inheritance rules.
5904 Any type which inherited the old method now inherits the replacment method
5905 instead.
5906 \end_layout
5907
5908 \end_deeper
5909 \begin_layout List
5910 \labelwidthstring 00000.00000.00000.000
5911 ADD\InsetSpace ~
5912 METHODS\InsetSpace ~
5913 IN\InsetSpace ~
5914 DEFINITION\InsetSpace ~
5915 MODEL;
5916 \end_layout
5917
5918 \begin_deeper
5919 \begin_layout Standard
5920 This statement allows methods to be added globally.
5921 It should be used very sparingly.
5922 Library basemodel.a4l contains the example of this statement.
5923 Methods in the global model definition are inherited by all models.
5924 There is no actual global model definition, but it has a method list for
5925 practical purposes.
5926
5927 \end_layout
5928
5929 \end_deeper
5930 \begin_layout List
5931 \labelwidthstring 00000.00000.00000.000
5932
5933 \bar under
5934 Initialization\InsetSpace ~
5935 routines
5936 \begin_inset LatexCommand \index{routines, initialization}
5937
5938 \end_inset
5939
5940
5941 \begin_inset LatexCommand \index{initialization routines}
5942
5943 \end_inset
5944
5945 :
5946 \end_layout
5947
5948 \begin_layout List
5949 \labelwidthstring 00000.00000.00000.000
5950 METHOD
5951 \begin_inset LatexCommand \index{METHOD}
5952
5953 \end_inset
5954
5955 A method in ASCEND must appear following the METHODS statement within a
5956 model.
5957 The system executes procedural statements of the method in the order they
5958 are written.
5959
5960 \end_layout
5961
5962 \begin_deeper
5963 \begin_layout Standard
5964 At present, there are no local variables or other structures in methods
5965 except loop indices.
5966 A method may be written recursively, but there is an arbitrary stack depth
5967 limit (currently set to 20 in compiler/initialize.h) to prevent the system
5968 from crashing on infinite recursions.
5969
5970 \end_layout
5971
5972 \begin_layout Standard
5973 Specifically disallowed in ASCEND III methods are IS_A, ALIASES, WILL_BE,
5974 IS, IS_REFINED_TO, ARE_THE_SAME and ARE_ALIKE statements as these declare
5975 the structure of the model and belong only in the declarative section.
5976 \end_layout
5977
5978 \begin_layout Standard
5979 (* 4+ *) In the near future, declarations of local instances (which are
5980 automatically destroyed when the method exits) will be allowed.
5981 Since methods are imperative, these local structure definitions are processed
5982 in the order they are written.
5983 Local structures are not allowed to shadow structures in the model context
5984 with which the method is called.
5985 When local structures are allowed, it will also be possible to define methods
5986 which take parameters and return values, thereby making the imperative
5987 ASCEND methods a rapid prototyping tool every bit as powerful and easy
5988 to use as the declarative ASCEND language.
5989 \end_layout
5990
5991 \begin_layout Standard
5992 The syntax for a method declaration is
5993 \end_layout
5994
5995 \begin_layout LyX-Code
5996 METHOD
5997 \emph on
5998 method_name
5999 \emph default
6000 ;
6001 \end_layout
6002
6003 \begin_layout LyX-Code
6004 «procedural statement;» (*one or more*)
6005 \end_layout
6006
6007 \begin_layout LyX-Code
6008 END
6009 \emph on
6010 method_name
6011 \emph default
6012 ;
6013 \end_layout
6014
6015 \end_deeper
6016 \begin_layout List
6017 \labelwidthstring 00000.00000.00000.000
6018
6019 \bar under
6020 Procedural\InsetSpace ~
6021 assignment
6022 \bar default
6023
6024 \begin_inset LatexCommand \index{assignment, procedural}
6025
6026 \end_inset
6027
6028
6029 \begin_inset LatexCommand \index{procedural assignment}
6030
6031 \end_inset
6032
6033
6034 \end_layout
6035
6036 \begin_deeper
6037 \begin_layout Standard
6038 The syntax is
6039 \end_layout
6040
6041 \begin_layout LyX-Code
6042
6043 \emph on
6044 instance_name
6045 \emph default
6046 :=
6047 \emph on
6048 mathematical_expression
6049 \emph default
6050 ;
6051 \end_layout
6052
6053 \begin_layout Standard
6054 or
6055 \end_layout
6056
6057 \begin_layout LyX-Code
6058
6059 \emph on
6060 array_name[set_name]
6061 \emph default
6062 :=
6063 \emph on
6064 expression
6065 \emph default
6066 ;
6067 \end_layout
6068
6069 \begin_layout Standard
6070 or
6071 \end_layout
6072
6073 \begin_layout LyX-Code
6074
6075 \emph on
6076 list_of_instance_names
6077 \emph default
6078 := expression.
6079 \end_layout
6080
6081 \begin_layout Standard
6082 Its meaning is that the value for the variable(s) on the LHS is set to the
6083 value of the expression on the RHS.
6084
6085 \end_layout
6086
6087 \begin_layout Standard
6088 DATA (* 4+ *) statements can (should, rather) also appear in methods.
6089
6090 \end_layout
6091
6092 \end_deeper
6093 \begin_layout List
6094 \labelwidthstring 00000.00000.00000.000
6095 FOR/DO
6096 \begin_inset LatexCommand \index{FOR/DO}
6097
6098 \end_inset
6099
6100 statement
6101 \end_layout
6102
6103 \begin_deeper
6104 \begin_layout Standard
6105 This statement is similar to the FOR/CREATE statement except it can only
6106 appear in a method definition.
6107 An example would be
6108 \end_layout
6109
6110 \begin_layout LyX-Code
6111 FOR i IN [1..n_stages] DO
6112 \end_layout
6113
6114 \begin_layout LyX-Code
6115 T[i] := T[1] + (i-1)*DT;
6116 \end_layout
6117
6118 \begin_layout LyX-Code
6119 ...
6120 \end_layout
6121
6122 \begin_layout LyX-Code
6123 END FOR;
6124 \end_layout
6125
6126 \begin_layout Standard
6127 Here we actually execute using the values of i in the sequence given.
6128 So,
6129 \end_layout
6130
6131 \begin_layout LyX-Code
6132 FOR i IN [n_stages..1] DO ...
6133
6134 \end_layout
6135
6136 \begin_layout LyX-Code
6137 END FOR;
6138 \end_layout
6139
6140 \begin_layout Standard
6141 is an empty loop, while
6142 \end_layout
6143
6144 \begin_layout LyX-Code
6145 FOR i IN [n_stages..1] DECREASING DO ...
6146
6147 \end_layout
6148
6149 \begin_layout LyX-Code
6150 END FOR;
6151 \end_layout
6152
6153 \begin_layout Standard
6154 is a backward loop.
6155 \end_layout
6156
6157 \end_deeper
6158 \begin_layout List
6159 \labelwidthstring 00000.00000.00000.000
6160 IF
6161 \begin_inset LatexCommand \index{IF}
6162
6163 \end_inset
6164
6165
6166 \end_layout
6167
6168 \begin_deeper
6169 \begin_layout Standard
6170 The IF statement can only appear in a method definition.
6171 Its syntax is
6172 \end_layout
6173
6174 \begin_layout LyX-Code
6175 IF
6176 \emph on
6177 logical_expression
6178 \emph default
6179 THEN
6180 \end_layout
6181
6182 \begin_layout LyX-Code
6183
6184 \emph on
6185 list_of_statements
6186 \end_layout
6187
6188 \begin_layout LyX-Code
6189 ELSE
6190 \end_layout
6191
6192 \begin_layout LyX-Code
6193
6194 \emph on
6195 list_of_statements
6196 \end_layout
6197
6198 \begin_layout LyX-Code
6199 END IF;
6200 \end_layout
6201
6202 \begin_layout Standard
6203 or
6204 \end_layout
6205
6206 \begin_layout LyX-Code
6207 IF
6208 \emph on
6209 logical_expression
6210 \emph default
6211 THEN
6212 \end_layout
6213
6214 \begin_layout LyX-Code
6215
6216 \emph on
6217 list_of_statements
6218 \end_layout
6219
6220 \begin_layout LyX-Code
6221 END IF;
6222 \end_layout
6223
6224 \begin_layout Standard
6225 If the logical expression has a value of TRUE, ASCEND will execute the statement
6226 s in the THEN part.
6227 If the value is FALSE, ASCEND executes the statements in the optional ELSE
6228 part.
6229 Please use () to make the precedence of AND, OR, NOT, ==, and != clear
6230 to both the user and the system.
6231 \end_layout
6232
6233 \end_deeper
6234 \begin_layout List
6235 \labelwidthstring 00000.00000.00000.000
6236 SWITCH
6237 \begin_inset LatexCommand \index{SWITCH}
6238
6239 \end_inset
6240
6241 \InsetSpace ~
6242 (*\InsetSpace ~
6243 4\InsetSpace ~
6244 *) Essentially roughly equivalent to the C switch statement, except that
6245 ASCEND allows wildcard matches, allows any number of controlling variables
6246 to be given in a list, and assumes BREAK at the end of each CASE.
6247
6248 \end_layout
6249
6250 \begin_layout List
6251 \labelwidthstring 00000.00000.00000.000
6252 CALL
6253 \begin_inset LatexCommand \index{CALL}
6254
6255 \end_inset
6256
6257 External calls are not presently well defined, pending debugging of the
6258 EXTERNAL
6259 \begin_inset LatexCommand \index{EXTERNAL}
6260
6261 \end_inset
6262
6263 connection prototype originally created by Kirk Abbott.
6264 \end_layout
6265
6266 \begin_layout List
6267 \labelwidthstring 00000.00000.00000.000
6268 RUN
6269 \begin_inset LatexCommand \index{RUN}
6270
6271 \end_inset
6272
6273 This statement can appear only in a method.
6274 Its format is:
6275 \end_layout
6276
6277 \begin_deeper
6278 \begin_layout LyX-Code
6279 RUN
6280 \emph on
6281 name_of_method
6282 \emph default
6283 ;
6284 \end_layout
6285
6286 \begin_layout Standard
6287 or
6288 \end_layout
6289
6290 \begin_layout LyX-Code
6291 RUN
6292 \emph on
6293 part_name.name_of_method
6294 \emph default
6295 ;
6296 \end_layout
6297
6298 \begin_layout Standard
6299 or
6300 \end_layout
6301
6302 \begin_layout LyX-Code
6303 RUN
6304 \emph on
6305 model_type::name_of_method
6306 \emph default
6307 ;
6308 \end_layout
6309
6310 \begin_layout Standard
6311 The named method can be defined in the current model (the first syntax),
6312 or in any of its parts (the second syntax).
6313 Methods defined in a part will be run in the scope of that part, not at
6314 the scope of the RUN statement.
6315 \end_layout
6316
6317 \end_deeper
6318 \begin_layout List
6319 \labelwidthstring 00000.00000.00000.000
6320