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

Contents of /trunk/doc/syntax.lyx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1384 - (show annotations) (download) (as text)
Fri Apr 6 16:15:11 2007 UTC (18 years, 8 months ago) by jpye
File MIME type: application/x-lyx
File size: 177739 byte(s)
Some work on the formatting. Some editing out of old comments about 'new ascend 4'
1 #LyX 1.4.3 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 reference
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 Chapter
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 Section
242 Punctuation
243 \begin_inset LatexCommand \index{punctuation}
244
245 \end_inset
246
247
248 \end_layout
249
250 \end_deeper
251 \begin_layout Standard
252 This section covers both the punctuation that must be understood to read
253 this document and the punctuation of ASCEND code.
254 \end_layout
255
256 \begin_layout List
257 \labelwidthstring 00000.00000.00000.000
258 keywords
259 \begin_inset LatexCommand \index{keywords}
260
261 \end_inset
262
263 : ASCEND keywords and type names are given in the left column in bold format.
264 It is generally clear from the main text which are keywords and which are
265 type names.
266 \end_layout
267
268 \begin_layout List
269 \labelwidthstring 00000.00000.00000.000
270
271 \bar under
272 Minor\InsetSpace ~
273 items:
274 \bar default
275 Minor headings that are helpful in finding details are given in the left
276 column in underline format.
277 \end_layout
278
279 \begin_layout List
280 \labelwidthstring 00000.00000.00000.000
281 Tips: Special notes and hints are sometimes placed on the left.
282 \end_layout
283
284 \begin_layout List
285 \labelwidthstring 00000.00000.00000.000
286
287 \bar under
288 LHS
289 \begin_inset LatexCommand \index{LHS}
290
291 \end_inset
292
293 :
294 \bar default
295 Left Hand Side.
296 Abbreviation used frequently.
297 \end_layout
298
299 \begin_layout List
300 \labelwidthstring 00000.00000.00000.000
301
302 \bar under
303 RHS
304 \begin_inset LatexCommand \index{RHS}
305
306 \end_inset
307
308 :
309 \bar default
310 Right Hand Side.
311 Abbreviation used frequently.
312 \end_layout
313
314 \begin_layout List
315 \labelwidthstring 00000.00000.00000.000
316
317 \bar under
318 Simple\InsetSpace ~
319 names
320 \begin_inset LatexCommand \index{simple names}
321
322 \end_inset
323
324 :
325 \bar default
326 In ASCEND simple names are made of the characters a through z, A through
327 Z, _, (*4+*: $).
328 The underscore is used as a letter, but it cannot be the first letter in
329 a name.
330 The $
331 \begin_inset LatexCommand \index{\$}
332
333 \end_inset
334
335 character is used exclusively as the first character in the name of system
336 defined built-in parts.
337 "$" is explained in more detail in Section
338 \begin_inset LatexCommand \vref{sub:x.6.2Supported-attributes}
339
340 \end_inset
341
342 .
343 Simple names should be no more than 80 characters long.
344
345 \end_layout
346
347 \begin_layout List
348 \labelwidthstring 00000.00000.00000.000
349
350 \bar under
351 Compound\InsetSpace ~
352 names
353 \begin_inset LatexCommand \index{compound names}
354
355 \end_inset
356
357 :
358 \bar default
359 Compound names are simple names strung together with dots (.).
360 See the description of "." below.
361 \end_layout
362
363 \begin_layout List
364 \labelwidthstring 00000.00000.00000.000
365
366 \bar under
367 Groupings:
368 \end_layout
369
370 \begin_layout List
371 \labelwidthstring 00000.00000.00000.000
372
373 \bar under
374 «\InsetSpace ~
375 »
376 \bar default
377 In documentation
378 \series bold
379 optional fields
380 \series default
381
382 \begin_inset LatexCommand \index{optional fields}
383
384 \end_inset
385
386 are surrounded by these markers.
387 \end_layout
388
389 \begin_layout List
390 \labelwidthstring 00000.00000.00000.000
391
392 \family typewriter
393 (*\InsetSpace ~
394 *)
395 \family default
396
397 \begin_inset LatexCommand \index{(* *)}
398
399 \end_inset
400
401 Comment.
402 Anything inside these is a comment.
403 Comments can nest
404 \begin_inset LatexCommand \index{nest}
405
406 \end_inset
407
408 in ASCEND and span several lines.
409 \end_layout
410
411 \begin_layout List
412 \labelwidthstring 00000.00000.00000.000
413
414 \family typewriter
415 (\InsetSpace ~
416 )
417 \family default
418
419 \begin_inset LatexCommand \index{( )}
420
421 \end_inset
422
423 Rounded parentheses
424 \begin_inset LatexCommand \index{parentheses}
425
426 \end_inset
427
428
429 \begin_inset LatexCommand \index{rounded parentheses}
430
431 \end_inset
432
433 .
434 Used to enclose arguments for functions or models where the order of the
435 arguments matters.
436 Also used to group terms in complex arithmetic, logical, or set expressions
437 where the order of operations needs to be specified.
438
439 \end_layout
440
441 \begin_layout List
442 \labelwidthstring 00000.00000.00000.000
443 Efficiency\InsetSpace ~
444 tip: The compiler can simplify relation definitions in a particularly
445 efficient manner if constants are grouped together.
446 \end_layout
447
448 \begin_layout List
449 \labelwidthstring 00000.00000.00000.000
450
451 \family typewriter
452 {\InsetSpace ~
453 }
454 \family default
455
456 \begin_inset LatexCommand \index{{ }}
457
458 \end_inset
459
460 Curly braces
461 \begin_inset LatexCommand \index{Curly braces}
462
463 \end_inset
464
465 .
466 Used to enclose units.
467 For example, 1 {kg_mole/s}.
468 Also used to enclose the body of annotations.
469 Note: Curly braces are also used in TCL, the language of the ASCEND user
470 interface, about which we will say more in another chapter.
471 \end_layout
472
473 \begin_layout List
474 \labelwidthstring 00000.00000.00000.000
475
476 \family typewriter
477 [\InsetSpace ~
478 ]
479 \family default
480
481 \begin_inset LatexCommand \index{[ ]}
482
483 \end_inset
484
485 Square brackets
486 \begin_inset LatexCommand \index{square brackets}
487
488 \end_inset
489
490 .
491 Used to enclose sets or elements of sets.
492 Examples: my_integer_set :== [1,2,3], demonstrates the use of square brackets
493 in the assignment of a set.
494 My_array[1] demonstrates the use of square brackets in naming an array
495 object indexed over an integer set which includes the element 1.
496 \end_layout
497
498 \begin_layout List
499 \labelwidthstring 00000.00000.00000.000
500
501 \family typewriter
502 .
503 \family default
504
505 \begin_inset LatexCommand \index{.}
506
507 \end_inset
508
509 Dot
510 \begin_inset LatexCommand \index{dot}
511
512 \end_inset
513
514 .
515 The dot is used, as in PASCAL and C, to construct the names of nested objects.
516 Examples: if object a has a part b, then the way to refer to b is as a.b.
517 Tray[1].vle shows a dot following a square bracket; here Tray[1] has a part
518 named vle.
519 \end_layout
520
521 \begin_layout List
522 \labelwidthstring 00000.00000.00000.000
523
524 \family typewriter
525 ..
526 \family default
527
528 \begin_inset LatexCommand \index{..}
529
530 \end_inset
531
532 Dot-dot or double dot
533 \begin_inset LatexCommand \index{double dot}
534
535 \end_inset
536
537 .
538 Integer range shorthand.
539 For example, my_integer_set :== [1,2,3] and my_integer_set :== [1..3] are
540 equivalent.
541 If ..
542 appears in a context requiring (), such as the ALIASES/IS_A statement,
543 then the range is expanded and ordered as we would naturally expect.
544 \end_layout
545
546 \begin_layout List
547 \labelwidthstring 00000.00000.00000.000
548
549 \family typewriter
550 :
551 \family default
552
553 \begin_inset LatexCommand \index{:}
554
555 \end_inset
556
557 Colon
558 \begin_inset LatexCommand \index{colon}
559
560 \end_inset
561
562 .
563 A separator used in various ways, principally to set the name of an arithmetic
564 relation apart from the definition.
565 \end_layout
566
567 \begin_layout List
568 \labelwidthstring 00000.00000.00000.000
569
570 \family typewriter
571 ::
572 \family default
573
574 \begin_inset LatexCommand \index{::}
575
576 \end_inset
577
578 Double colon
579 \begin_inset LatexCommand \index{double colon}
580
581 \end_inset
582
583 .
584 A separator used in the methods section for accessing methods defined on
585 types other than the type the method is part of.
586 Explained in Section
587 \begin_inset LatexCommand \vref{sec:x.4Procedural-statements}
588
589 \end_inset
590
591 .[
592 \end_layout
593
594 \begin_layout List
595 \labelwidthstring 00000.00000.00000.000
596
597 \family typewriter
598 ;
599 \family default
600
601 \begin_inset LatexCommand \index{;}
602
603 \end_inset
604
605 Semicolon
606 \begin_inset LatexCommand \index{semicolon}
607
608 \end_inset
609
610 .
611 The separator of statements.
612 \end_layout
613
614 \begin_deeper
615 \begin_layout Section
616 Basic Elements
617 \begin_inset LatexCommand \index{basic elements}
618
619 \end_inset
620
621
622 \begin_inset LatexCommand \label{sub:x.1.2Basic-Elements}
623
624 \end_inset
625
626
627 \end_layout
628
629 \end_deeper
630 \begin_layout List
631 \labelwidthstring 00000.00000.00000.000
632
633 \bar under
634 Boolean\InsetSpace ~
635 value
636 \bar default
637
638 \begin_inset LatexCommand \index{value, Boolean}
639
640 \end_inset
641
642
643 \begin_inset LatexCommand \index{Boolean value}
644
645 \end_inset
646
647
648 \family sans
649 TRUE
650 \family default
651
652 \begin_inset LatexCommand \index{TRUE}
653
654 \end_inset
655
656 or
657 \family sans
658 FALSE
659 \family default
660
661 \begin_inset LatexCommand \index{FALSE}
662
663 \end_inset
664
665 .
666 Can't get much simpler, eh? In the language definition
667 \family sans
668 TRUE
669 \family default
670 and
671 \family sans
672 FALSE
673 \family default
674 do not map to 1 and 0 or any other type of numeric value.
675 (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
708 \family sans
709 MAX_INTEGER
710 \family default
711
712 \begin_inset LatexCommand \index{MAX\_INTEGER}
713
714 \end_inset
715
716 is machine dependent.
717 Examples are:
718 \end_layout
719
720 \begin_deeper
721 \begin_layout LyX-Code
722 \align block
723 123
724 \end_layout
725
726 \begin_layout LyX-Code
727 \align block
728 -5
729 \end_layout
730
731 \begin_layout LyX-Code
732 \align block
733 MAX_INTEGER, typically 2147483647.
734 \end_layout
735
736 \end_deeper
737 \begin_layout List
738 \labelwidthstring 00000.00000.00000.000
739
740 \bar under
741 Real\InsetSpace ~
742 value
743 \bar default
744
745 \begin_inset LatexCommand \index{value. real}
746
747 \end_inset
748
749
750 \begin_inset LatexCommand \index{real value}
751
752 \end_inset
753
754 ASCEND represents reals almost exactly as any other mathematically oriented
755 programming language does.
756 The mantissa
757 \begin_inset LatexCommand \index{mantissa}
758
759 \end_inset
760
761 has an optional negative sign followed by a string of digits and at most
762 one decimal point.
763 The exponent is the letter
764 \family typewriter
765 e
766 \family default
767 or
768 \family typewriter
769 E
770 \family default
771 followed by an integer.
772 The number must not exceed the largest the computer is able to handle.
773 There can be no blank characters in a real.
774
775 \family sans
776 MAX_REAL
777 \family default
778
779 \begin_inset LatexCommand \index{MAX\_REAL}
780
781 \end_inset
782
783 is machine dependent.
784 The following are legitimate reals in ASCEND:
785 \end_layout
786
787 \begin_deeper
788 \begin_layout LyX-Code
789 \align block
790 -1
791 \end_layout
792
793 \begin_layout LyX-Code
794 \align block
795 1.2
796 \end_layout
797
798 \begin_layout LyX-Code
799 \align block
800 1.3e-2
801 \end_layout
802
803 \begin_layout LyX-Code
804 \align block
805 7.888888e+34
806 \end_layout
807
808 \begin_layout LyX-Code
809 \align block
810 .6E21
811 \end_layout
812
813 \begin_layout LyX-Code
814 \align block
815 MAX_REAL, typically about 1.79E+308.
816 \end_layout
817
818 \begin_layout Standard
819 while the following are not:
820 \end_layout
821
822 \begin_layout LyX-Code
823 \align block
824 1.
825 2 (*contains a blank within it*)
826 \end_layout
827
828 \begin_layout LyX-Code
829 \align block
830 1.3e2.0 (*exponent has a decimal in it*)
831 \end_layout
832
833 \begin_layout LyX-Code
834
835 \family typewriter
836 +1.3 (* illegal unary + sign.
837 x = +1.3 not allowed*)
838 \end_layout
839
840 \end_deeper
841 \begin_layout List
842 \labelwidthstring 00000.00000.00000.000
843
844 \bar under
845 Reals\InsetSpace ~
846 stored\InsetSpace ~
847 in\InsetSpace ~
848 SI
849 \begin_inset LatexCommand \index{SI}
850
851 \end_inset
852
853 \InsetSpace ~
854 units
855 \bar default
856
857 \end_layout
858
859 \begin_deeper
860 \begin_layout Standard
861 We store all real values as double precision
862 \begin_inset LatexCommand \index{double precision}
863
864 \end_inset
865
866 numbers in the metre-kilogram-second (MKS)
867 \begin_inset LatexCommand \index{MKS}
868
869 \end_inset
870
871 system of units.
872 This eliminates many common errors in the modeling of physical systems.
873 Since we also place the burden of scaling equations on system routines
874 and a simple modeling methodology, the internal units are not of concern
875 to most users.
876 \end_layout
877
878 \end_deeper
879 \begin_layout List
880 \labelwidthstring 00000.00000.00000.000
881
882 \bar under
883 Dimensionality
884 \begin_inset LatexCommand \index{dimensionality}
885
886 \end_inset
887
888 :
889 \bar default
890 Real values have dimensionality such as length/time for velocity.
891
892 \series bold
893 Dimensionality
894 \series default
895 is to be distinguished from the
896 \series bold
897 units
898 \series default
899 such as ft/s.
900 ASCEND takes care of mapping between units
901 \begin_inset LatexCommand \index{units}
902
903 \end_inset
904
905 and dimensions.
906 A value without units (this includes integer values) is taken to be dimensionle
907 ss
908 \begin_inset LatexCommand \index{dimensionless}
909
910 \end_inset
911
912 .
913 Dimensionality is built up from the following base dimensions:
914 \end_layout
915
916 \begin_layout List
917 \labelwidthstring 00000.00000.00000.000
918 Name
919 \bar under
920 definition; typical units
921 \end_layout
922
923 \begin_layout List
924 \labelwidthstring 00000.00000.00000.000
925 L
926 \begin_inset LatexCommand \index{L, length dimension}
927
928 \end_inset
929
930 length
931 \begin_inset LatexCommand \index{length}
932
933 \end_inset
934
935 ; metre, m
936 \end_layout
937
938 \begin_layout List
939 \labelwidthstring 00000.00000.00000.000
940 M
941 \begin_inset LatexCommand \index{M, mass dimension}
942
943 \end_inset
944
945 mass
946 \begin_inset LatexCommand \index{mass}
947
948 \end_inset
949
950 ; kilogram, kg
951 \end_layout
952
953 \begin_layout List
954 \labelwidthstring 00000.00000.00000.000
955 T
956 \begin_inset LatexCommand \index{T, time dimension}
957
958 \end_inset
959
960 time
961 \begin_inset LatexCommand \index{time}
962
963 \end_inset
964
965 ; second, s
966 \end_layout
967
968 \begin_layout List
969 \labelwidthstring 00000.00000.00000.000
970 E
971 \begin_inset LatexCommand \index{E, electric current dimension}
972
973 \end_inset
974
975 electric current
976 \begin_inset LatexCommand \index{electric current}
977
978 \end_inset
979
980 ; ampere, A
981 \end_layout
982
983 \begin_layout List
984 \labelwidthstring 00000.00000.00000.000
985 Q
986 \begin_inset LatexCommand \index{Q, quantity dimension}
987
988 \end_inset
989
990 quantity
991 \begin_inset LatexCommand \index{quantity}
992
993 \end_inset
994
995 ; mole, mole
996 \end_layout
997
998 \begin_layout List
999 \labelwidthstring 00000.00000.00000.000
1000 TMP
1001 \begin_inset LatexCommand \index{TMP, temperature dimension}
1002
1003 \end_inset
1004
1005 temperature
1006 \begin_inset LatexCommand \index{temperature}
1007
1008 \end_inset
1009
1010 ; Kelvin, K
1011 \end_layout
1012
1013 \begin_layout List
1014 \labelwidthstring 00000.00000.00000.000
1015 LUM
1016 \begin_inset LatexCommand \index{LUM, luminous intensity dimension}
1017
1018 \end_inset
1019
1020 luminous intensity
1021 \begin_inset LatexCommand \index{luminous intensity}
1022
1023 \end_inset
1024
1025 ; candela, cd
1026 \end_layout
1027
1028 \begin_layout List
1029 \labelwidthstring 00000.00000.00000.000
1030 P
1031 \begin_inset LatexCommand \index{P, phase angle dimension}
1032
1033 \end_inset
1034
1035 plane angle
1036 \begin_inset LatexCommand \index{plane angle}
1037
1038 \end_inset
1039
1040 ; radian, rad
1041 \end_layout
1042
1043 \begin_layout List
1044 \labelwidthstring 00000.00000.00000.000
1045 S
1046 \begin_inset LatexCommand \index{S, solid angle dimension}
1047
1048 \end_inset
1049
1050 solid angle
1051 \begin_inset LatexCommand \index{solid angle}
1052
1053 \end_inset
1054
1055 ; steradian, srad
1056 \end_layout
1057
1058 \begin_layout List
1059 \labelwidthstring 00000.00000.00000.000
1060 C
1061 \begin_inset LatexCommand \index{C, currency dimension}
1062
1063 \end_inset
1064
1065 currency
1066 \begin_inset LatexCommand \index{currency}
1067
1068 \end_inset
1069
1070 ; currency, CR
1071 \end_layout
1072
1073 \begin_deeper
1074 \begin_layout Standard
1075 The atom and constant definitions in the library illustrate the use of dimension
1076 ality.
1077 \end_layout
1078
1079 \begin_layout Standard
1080 Dimensions may be any combination of these symbols along with rounded parenthese
1081 s, (), and the operators *,
1082 \family typewriter
1083 ^
1084 \family default
1085 and
1086 \family typewriter
1087 /
1088 \family default
1089 .
1090 Examples include
1091 \family typewriter
1092 M/T
1093 \family default
1094 or
1095 \family typewriter
1096 M*L^2/T^2/TMP
1097 \family default
1098 {this latter means
1099 \family typewriter
1100 (M*(L^2)/(T^2))/TMP
1101 \family default
1102 }.
1103 The second operand for the to-the-power-of operator,
1104 \family typewriter
1105 ^
1106 \family default
1107 , must be an integer value (e.g., -2 or 3) because fractional powers of dimensiona
1108 l numbers are physically undefined
1109 \begin_inset Note Note
1110 status open
1111
1112 \begin_layout Standard
1113 although we do seem them occasionally...
1114 \end_layout
1115
1116 \end_inset
1117
1118 .
1119 \end_layout
1120
1121 \begin_layout Standard
1122 If the dimensionality for a real value is undefined, then ASCEND gives it
1123 a wildcard dimensionality
1124 \begin_inset LatexCommand \index{wild card dimensionality}
1125
1126 \end_inset
1127
1128 .
1129 If ASCEND can later deduce its dimensionality from its use in a model definitio
1130 n it will do so.
1131 For example consider the real variable
1132 \family typewriter
1133 a
1134 \family default
1135 , suppose
1136 \family typewriter
1137 a
1138 \family default
1139 has wildcard dimensionality,
1140 \family typewriter
1141 b
1142 \family default
1143 has dimensionality of
1144 \family typewriter
1145 L/T
1146 \family default
1147 .
1148 Then the statement:
1149 \end_layout
1150
1151 \end_deeper
1152 \begin_layout List
1153 \labelwidthstring 00000.00000.00000.000
1154 Example\InsetSpace ~
1155 of\InsetSpace ~
1156 a\InsetSpace ~
1157 dimensionally\InsetSpace ~
1158 consistent
1159 \begin_inset LatexCommand \index{dimensionally consistent}
1160
1161 \end_inset
1162
1163 \InsetSpace ~
1164 equation.
1165
1166 \end_layout
1167
1168 \begin_layout List
1169 \labelwidthstring 00000.00000.00000.000
1170 \InsetSpace ~
1171
1172 \family typewriter
1173 a + b = 3 {ft/s};
1174 \end_layout
1175
1176 \begin_deeper
1177 \begin_layout Standard
1178 requires that
1179 \family typewriter
1180 a
1181 \family default
1182 have the same dimensionality as the other two terms, namely,
1183 \family typewriter
1184 L/T
1185 \family default
1186 .
1187 ASCEND will assign this dimensionality to
1188 \family typewriter
1189 a
1190 \family default
1191 .
1192 The user will be warned of dimensionally inconsistent equations.
1193 \end_layout
1194
1195 \end_deeper
1196 \begin_layout List
1197 \labelwidthstring 00000.00000.00000.000
1198
1199 \bar under
1200 Unit\InsetSpace ~
1201 expression
1202 \bar default
1203 A unit expression
1204 \begin_inset LatexCommand \index{unit expression}
1205
1206 \end_inset
1207
1208 may be composed of any combination of unit names defined by the system
1209 and any numerical constants combined with times (
1210 \family typewriter
1211 *
1212 \family default
1213 ), divide(
1214 \family typewriter
1215 /
1216 \family default
1217 ) and to the power (
1218 \family typewriter
1219 ^
1220 \family default
1221 ) operators.
1222 The RHS of
1223 \family typewriter
1224 ^
1225 \family default
1226 must be an integer.
1227 Parentheses can be used to group subexpressions with the exception that
1228 a divide operator may
1229 \emph on
1230 not
1231 \emph default
1232 be followed by a grouped subexpression.
1233
1234 \end_layout
1235
1236 \begin_deeper
1237 \begin_layout Standard
1238 So,
1239 \family typewriter
1240 {kg/m/s}
1241 \family default
1242 is fine, but
1243 \family typewriter
1244 {kg/(m*s)}
1245 \family default
1246 is not.
1247 Although the two expressions are mathematically equivalent, it makes the
1248 system programming and output formatting easier to code and faster to execute
1249 if we disallow expressions of the latter sort.
1250 \end_layout
1251
1252 \begin_layout Standard
1253 The units understood by the system are defined in the first part of this
1254 manual.
1255 Note that several units defined are really values of interesting constants
1256 in SI, e.g.
1257
1258 \family typewriter
1259 R :== 1{GAS_C}
1260 \family default
1261 yields the correct value of the thermodynamic gas constant.
1262 Users can define additional units.
1263 \end_layout
1264
1265 \end_deeper
1266 \begin_layout List
1267 \labelwidthstring 00000.00000.00000.000
1268
1269 \bar under
1270 Units
1271 \bar default
1272
1273 \begin_inset LatexCommand \index{units}
1274
1275 \end_inset
1276
1277 A Unit expression unit expression must be enclosed in curly braces
1278 \family typewriter
1279 {}
1280 \family default
1281 .
1282 When a real number is used in a mathematical expression in ASCEND, it must
1283 have a set of units expressed with it.
1284 If it does not, ASCEND assumes the number is dimensionless, which may not
1285 be the intent of the modeler.
1286 An example is shown in the dimensionally consistent equation above where
1287 the number 3 has the units
1288 \family typewriter
1289 {ft/s}
1290 \family default
1291 associated with it.
1292
1293 \end_layout
1294
1295 \begin_deeper
1296 \begin_layout Standard
1297 Examples:
1298 \end_layout
1299
1300 \begin_layout LyX-Code
1301 \align block
1302 {kg_mole/s/m} same as {(kg_mole/s)/m}
1303 \end_layout
1304
1305 \begin_layout LyX-Code
1306 \align block
1307 {m^3/yr}
1308 \end_layout
1309
1310 \begin_layout LyX-Code
1311 \align block
1312 {3/100*ft} same as {0.03*ft}
1313 \end_layout
1314
1315 \begin_layout LyX-Code
1316 \align block
1317 {s^-1} same as {1/s}
1318 \end_layout
1319
1320 \begin_layout Standard
1321 Illegal unit examples are
1322 \end_layout
1323
1324 \begin_layout LyX-Code
1325 \align block
1326 {m/(K*kg_mole)}
1327 \end_layout
1328
1329 \begin_deeper
1330 \begin_layout Standard
1331 grouped subexpression used in the denominator; should be written {m/K/kg_mole}.
1332 \end_layout
1333
1334 \end_deeper
1335 \begin_layout LyX-Code
1336 \align block
1337 {m^3.5}
1338 \end_layout
1339
1340 \begin_deeper
1341 \begin_layout Standard
1342 power of units or dimensions must be integer.
1343 \end_layout
1344
1345 \end_deeper
1346 \end_deeper
1347 \begin_layout List
1348 \labelwidthstring 00000.00000.00000.000
1349
1350 \bar under
1351 Symbol\InsetSpace ~
1352 Value
1353 \bar default
1354
1355 \begin_inset LatexCommand \index{value, symbol}
1356
1357 \end_inset
1358
1359
1360 \begin_inset LatexCommand \index{symbol value}
1361
1362 \end_inset
1363
1364 The format for a symbol is that of an arbitrary character string enclosed
1365 between two single quotes.
1366 There is no way to embed a single quote
1367 \begin_inset LatexCommand \index{'}
1368
1369 \end_inset
1370
1371
1372 \begin_inset LatexCommand \index{single quote}
1373
1374 \end_inset
1375
1376 in a symbol: we are not in the escape sequence business at this time.
1377 The following are legal symbols in ASCEND:
1378 \end_layout
1379
1380 \begin_deeper
1381 \begin_layout LyX-Code
1382 'H2O'
1383 \end_layout
1384
1385 \begin_layout LyX-Code
1386 'r1'
1387 \end_layout
1388
1389 \begin_layout LyX-Code
1390 'Bill said,foo to whom?'
1391 \end_layout
1392
1393 \begin_layout Standard
1394 while the following are not legal symbol values:
1395 \end_layout
1396
1397 \begin_layout LyX-Code
1398 "ethanol" (double quotes not allowed)
1399 \end_layout
1400
1401 \begin_layout LyX-Code
1402 water (no single quotes given)
1403 \end_layout
1404
1405 \begin_layout LyX-Code
1406 i cant do this (no embedded quotes)
1407 \end_layout
1408
1409 \begin_layout Standard
1410 There is an arbitrary upper limit to the number of characters in a symbol
1411 (something like 10,000) so that we may detect a missing close quote in
1412 a bad input file without crashing.
1413 \end_layout
1414
1415 \end_deeper
1416 \begin_layout List
1417 \labelwidthstring 00000.00000.00000.000
1418 Sets\InsetSpace ~
1419 values
1420 \begin_inset LatexCommand \index{values, set}
1421
1422 \end_inset
1423
1424
1425 \begin_inset LatexCommand \index{set values}
1426
1427 \end_inset
1428
1429 Set values are lists of elements, all of type
1430 \family sans
1431 integer_constant
1432 \family default
1433 or all of type
1434 \family sans
1435 symbol_constant
1436 \family default
1437 , enclosed between square brackets
1438 \family typewriter
1439 []
1440 \family default
1441 .
1442 The following are examples of sets:
1443 \end_layout
1444
1445 \begin_deeper
1446 \begin_layout LyX-Code
1447 \align block
1448 ['methane', 'ethane', 'propane']
1449 \end_layout
1450
1451 \begin_layout LyX-Code
1452 \align block
1453 [1..5, 7, 15]
1454 \end_layout
1455
1456 \begin_layout LyX-Code
1457 \align block
1458 [2..n_stages]
1459 \end_layout
1460
1461 \begin_layout LyX-Code
1462 \align block
1463 [1, 4, 2, 1, 16]
1464 \end_layout
1465
1466 \begin_layout LyX-Code
1467 \align block
1468 []
1469 \end_layout
1470
1471 \end_deeper
1472 \begin_layout List
1473 \labelwidthstring 00000.00000.00000.000
1474 More\InsetSpace ~
1475 about\InsetSpace ~
1476 sets
1477 \begin_inset LatexCommand \index{sets}
1478
1479 \end_inset
1480
1481 \InsetSpace ~
1482 in\InsetSpace ~
1483 Section\InsetSpace ~
1484
1485 \begin_inset LatexCommand \vref{sub:x.2.2Sets}
1486
1487 \end_inset
1488
1489 .
1490 \end_layout
1491
1492 \begin_deeper
1493 \begin_layout Standard
1494 The value range
1495 \family typewriter
1496 1..5
1497 \family default
1498 is an allowable shorthand for the integers 1, 2, 3, 4 and 5 while the value
1499 range
1500 \family typewriter
1501 2..n_stages
1502 \family default
1503 (where
1504 \family typewriter
1505 n_stages
1506 \family default
1507 must be of type
1508 \family sans
1509 integer_constant
1510 \family default
1511 ) means all integers from 2 to
1512 \family typewriter
1513 n_stages
1514 \family default
1515 .
1516 If
1517 \family typewriter
1518 n_stages
1519 \family default
1520 is less than 2, then the third set is empty.
1521 The repeated occurrence of
1522 \family typewriter
1523 1
1524 \family default
1525 in the fourth set is ignored.
1526 The fifth set is the empty set
1527 \begin_inset LatexCommand \index{empty set}
1528
1529 \end_inset
1530
1531
1532 \begin_inset LatexCommand \index{set, empty}
1533
1534 \end_inset
1535
1536 .
1537 \end_layout
1538
1539 \begin_layout Standard
1540 We use the term set in an almost pure mathematical sense.
1541 The elements have no order.
1542 One can only ask two things of a set: (1) if an element is a member of
1543 it and (2) its cardinality
1544 \begin_inset LatexCommand \index{cardinality}
1545
1546 \end_inset
1547
1548 (
1549 \family sans
1550 CARD
1551 \family default
1552
1553 \begin_inset LatexCommand \index{CARD}
1554
1555 \end_inset
1556
1557
1558 \family typewriter
1559 (set)
1560 \family default
1561 ).
1562 Repeated elements used in defining a set are ignored.
1563 The elements of sets cannot themselves be sets in ASCEND; i.e., there can
1564 be no sets of set.
1565 \end_layout
1566
1567 \end_deeper
1568 \begin_layout List
1569 \labelwidthstring 00000.00000.00000.000
1570 Sets\InsetSpace ~
1571 are\InsetSpace ~
1572 unordered.
1573 A set of integers may appear to be ordered to the modeler as the natural
1574 numbers have an order.
1575 However, it is the user imposing and using the ordering, not ASCEND.
1576 ASCEND sees these integers as elements in the set with NO ordering.
1577 Therefore, there are no operators in ASCEND such as successor or precursor
1578 member of a set.
1579 \end_layout
1580
1581 \begin_layout List
1582 \labelwidthstring 00000.00000.00000.000
1583
1584 \bar under
1585 Arrays
1586 \bar default
1587
1588 \begin_inset LatexCommand \index{arrays}
1589
1590 \end_inset
1591
1592 An array is a list of instances indexed over a set, in computer-speak,
1593 an associative array of objects.
1594 The instances are all of the same base type (as that is the only way they
1595 can be defined).
1596 An individual member of a list may later be more refined than the other
1597 members (we shall illustrate that possibility).
1598 The following are arrays in ASCEND.
1599 \end_layout
1600
1601 \begin_deeper
1602 \begin_layout LyX-Code
1603 \align block
1604 stage[1..n_stages]
1605 \end_layout
1606
1607 \begin_layout LyX-Code
1608 \align block
1609 y[components]
1610 \end_layout
1611
1612 \begin_layout LyX-Code
1613 \align block
1614 column[areas][processes]
1615 \end_layout
1616
1617 \begin_layout Standard
1618 where components, areas and processes are sets.
1619 For example components could be the set of symbols
1620 \family typewriter
1621 ['ethylene', 'propylene']
1622 \family default
1623 , areas the set of symbols
1624 \family typewriter
1625 ['feed_prep', 'prod_purification']
1626 \family default
1627 while processes could be the set
1628 \family typewriter
1629 ['alcohol_manuf', 'poly_propropylene_manuf']
1630 \family default
1631 .
1632 Note that the third example (
1633 \family typewriter
1634 column
1635 \family default
1636 ) is a list of lists (the way that ASCEND permits a multiply subscripted
1637 array).
1638
1639 \end_layout
1640
1641 \begin_layout Standard
1642 The following are elements in the above arrays:
1643 \end_layout
1644
1645 \begin_layout LyX-Code
1646 stage[1]
1647 \end_layout
1648
1649 \begin_layout LyX-Code
1650 y['ethylene']
1651 \end_layout
1652
1653 \begin_layout LyX-Code
1654 column['feed_prep'][alcohol_manuf']
1655 \end_layout
1656
1657 \begin_layout Standard
1658 provided that
1659 \family typewriter
1660 n_stages
1661 \family default
1662 is 1 or larger.
1663
1664 \end_layout
1665
1666 \begin_layout Standard
1667 There can be any number of subscripts
1668 \begin_inset LatexCommand \index{subscripts}
1669
1670 \end_inset
1671
1672 for an array.
1673 We point out, however, that in virtually every application of arrays requiring
1674 more than two subscripts, there is usually a some underlying concept that
1675 is much better modeled as an object than as part of a deeply subscripted
1676 \begin_inset LatexCommand \index{subscripted, deeply}
1677
1678 \end_inset
1679
1680
1681 \begin_inset LatexCommand \index{deeply subscripted}
1682
1683 \end_inset
1684
1685 array.
1686 In the following jagged array example, there are really the concepts of
1687 unit operation and stream that would be better understood if made explicit.
1688 \end_layout
1689
1690 \end_deeper
1691 \begin_layout List
1692 \labelwidthstring 00000.00000.00000.000
1693
1694 \bar under
1695 Arrays\InsetSpace ~
1696 can\InsetSpace ~
1697 be\InsetSpace ~
1698 jagged
1699 \bar default
1700
1701 \begin_inset LatexCommand \label{lyx:Arrays-can-be}
1702
1703 \end_inset
1704
1705 Arrays can be sparse
1706 \begin_inset LatexCommand \index{sparse}
1707
1708 \end_inset
1709
1710 or jagged
1711 \begin_inset LatexCommand \index{jagged}
1712
1713 \end_inset
1714
1715 .
1716 For example:
1717 \end_layout
1718
1719 \begin_deeper
1720 \begin_layout LyX-Code
1721 process[1..3] IS_A set OF integer;
1722 \end_layout
1723
1724 \begin_layout LyX-Code
1725 process[1] :== [2];
1726 \end_layout
1727
1728 \begin_layout LyX-Code
1729 process[2] :== [7,5,3];
1730 \end_layout
1731
1732 \begin_layout LyX-Code
1733 process[3] :== [4,6];
1734 \end_layout
1735
1736 \begin_layout LyX-Code
1737 FOR i in [1..3] CREATE
1738 \end_layout
1739
1740 \begin_layout LyX-Code
1741 FOR j IN process[i] CREATE
1742 \end_layout
1743
1744 \begin_layout LyX-Code
1745 flow[i][j] IS_A mass;
1746 \end_layout
1747
1748 \begin_layout LyX-Code
1749 END FOR;
1750 \end_layout
1751
1752 \begin_layout LyX-Code
1753 END FOR;
1754 \end_layout
1755
1756 \begin_layout Standard
1757 process is an array of sets (not to be confused with a set of sets which
1758 ASCEND does not have) and flow is an array with six elements spread over
1759 three rows:
1760 \end_layout
1761
1762 \begin_layout LyX-Code
1763 flow[1][2]
1764 \end_layout
1765
1766 \begin_layout LyX-Code
1767 flow[2][7], flow[2][3], flow[2][5]
1768 \end_layout
1769
1770 \begin_layout LyX-Code
1771 flow[3][4], flow[3][6]
1772 \end_layout
1773
1774 \end_deeper
1775 \begin_layout List
1776 \labelwidthstring 00000.00000.00000.000
1777 Arrays\InsetSpace ~
1778 are\InsetSpace ~
1779 also\InsetSpace ~
1780 instances
1781 \end_layout
1782
1783 \begin_deeper
1784 \begin_layout Standard
1785 Each array is itself an object.
1786 That is, when you write
1787 \family typewriter
1788 a[1..2] IS_A real
1789 \family default
1790 , three objects get created:
1791 \family typewriter
1792 a[1]
1793 \family default
1794 ,
1795 \family typewriter
1796 a[2]
1797 \family default
1798 , and
1799 \family typewriter
1800 a
1801 \family default
1802 .
1803 The object
1804 \family typewriter
1805 a
1806 \family default
1807 is an array instance which has parts named
1808 \family typewriter
1809 [1]
1810 \family default
1811 and
1812 \family typewriter
1813 [2]
1814 \family default
1815 that are real instances.
1816 When a parameterized model requires an array, you pass it the single item
1817
1818 \family typewriter
1819 a
1820 \family default
1821 , not the elements
1822 \family typewriter
1823 a[1..2]
1824 \family default
1825 .
1826 \end_layout
1827
1828 \end_deeper
1829 \begin_layout List
1830 \labelwidthstring 00000.00000.00000.000
1831 No\InsetSpace ~
1832 contiguous\InsetSpace ~
1833 storage
1834 \begin_inset LatexCommand \index{contiguous storage, no}
1835
1836 \end_inset
1837
1838
1839 \end_layout
1840
1841 \begin_deeper
1842 \begin_layout Standard
1843 Just in case you still have not caught on, ASCEND arrays are not blocks
1844 of memory such as are seen in low-level languages like C
1845 \begin_inset LatexCommand \index{C, computer language}
1846
1847 \end_inset
1848
1849 , FORTRAN
1850 \begin_inset LatexCommand \index{FORTRAN}
1851
1852 \end_inset
1853
1854 , and Matlab
1855 \begin_inset LatexCommand \index{Matlab}
1856
1857 \end_inset
1858
1859 .
1860 The modeling language does not provide things like MatMult
1861 \begin_inset LatexCommand \index{MatMult}
1862
1863 \end_inset
1864
1865 , Transpose
1866 \begin_inset LatexCommand \index{Transpose}
1867
1868 \end_inset
1869
1870 , and Inverse
1871 \begin_inset LatexCommand \index{Inverse}
1872
1873 \end_inset
1874
1875 because these are procedural solving tools.
1876 If you are dedicated, you could write METHODs that implement matrix algebra,
1877 but this is a really dumb idea.
1878 We aim to structure our software so that it can interact openly with separate,
1879 dedicated tools (such as Matlab) when those tools are needed.
1880 \end_layout
1881
1882 \end_deeper
1883 \begin_layout List
1884 \labelwidthstring 00000.00000.00000.000
1885 Index\InsetSpace ~
1886 variable
1887 \begin_inset LatexCommand \index{index variable}
1888
1889 \end_inset
1890
1891 One can introduce a variable as an index ranging over a set.
1892 Index variables are local to the statements in which they occur.
1893 An example of using an index variable is the following FOR statement:
1894 \end_layout
1895
1896 \begin_deeper
1897 \begin_layout LyX-Code
1898 FOR i IN components CREATE
1899 \end_layout
1900
1901 \begin_layout LyX-Code
1902 VLE_equil[i]: y[i] = K[i]*x[i];
1903 \end_layout
1904
1905 \begin_layout LyX-Code
1906 END FOR;
1907 \end_layout
1908
1909 \begin_layout Standard
1910 In this example i implicitly is of the same type as the values in the set
1911 components.
1912 If another object i exists in the model containing the FOR loop, it is
1913 ignored while executing the statements in that loop.
1914 This may cause unexpected results and the compiler will generate warnings
1915 about loop index shadowed variables.
1916 \end_layout
1917
1918 \end_deeper
1919 \begin_layout List
1920 \labelwidthstring 00000.00000.00000.000
1921 Label
1922 \begin_inset LatexCommand \index{label}
1923
1924 \end_inset
1925
1926 : One can label statements which define arithmetic relationships (objective
1927 functions, equalities, and inequalities) in ASCEND.
1928 Labeling is highly recommended because it makes models much more readable
1929 and more easily debugged.
1930 Labels are also necessary for relations which are going to be used in condition
1931 al modeling or differentiation functions.
1932 A label is a sequence of alphanumeric characters ending in a colon.
1933 An example of a labeled equation is:
1934 \end_layout
1935
1936 \begin_deeper
1937 \begin_layout LyX-Code
1938 mass_balance: m_in = m_out;
1939 \end_layout
1940
1941 \begin_layout Standard
1942 An example of a labeled objective function is:
1943 \end_layout
1944
1945 \begin_layout LyX-Code
1946 obj1: MAXIMIZE revenue - cost;
1947 \end_layout
1948
1949 \begin_layout Standard
1950 If a relation is defined within a FOR statement, it must have an array indexed
1951 label so that each instance created using the statement is distinguishable
1952 from the others.
1953 An example is:
1954 \end_layout
1955
1956 \begin_layout LyX-Code
1957 FOR i IN components CREATE
1958 \end_layout
1959
1960 \begin_layout LyX-Code
1961 equil[i]: y[i] = K[i]*x[i];
1962 \end_layout
1963
1964 \begin_layout LyX-Code
1965 END FOR;
1966 \end_layout
1967
1968 \begin_layout Standard
1969 The ASCEND interactive user interface identifies relationships by their
1970 labels.
1971 If one has not provided such a label, the system generates the label:
1972 \end_layout
1973
1974 \begin_layout LyX-Code
1975
1976 \emph on
1977 modelname_equationnumber
1978 \end_layout
1979
1980 \begin_layout Standard
1981 where modelname and equationnumber are the name of the model and the equation
1982 number in the model.
1983 An example is
1984 \end_layout
1985
1986 \begin_layout LyX-Code
1987 mixture_14
1988 \end_layout
1989
1990 \begin_layout Standard
1991 for the unlabeled 14th relation in the mixture definition.
1992 If there is a conflict caused with an existing name, the generated name
1993 has enough letters added after equationnumber to make it a unique name.
1994 Remember that each model in a refinement hierarchy inherits the equations
1995 of its less refined ancestors, so the first equation appearing in the source
1996 code of a refining model may actually be the nth relation in that model.
1997 \end_layout
1998
1999 \end_deeper
2000 \begin_layout List
2001 \labelwidthstring 00000.00000.00000.000
2002
2003 \bar under
2004 Lists
2005 \bar default
2006
2007 \begin_inset LatexCommand \index{lists}
2008
2009 \end_inset
2010
2011 Often in a statement one can include a list of names or expression.
2012 A name list is one or more names where multiple list entries are separated
2013 from each other by commas.
2014 Examples of a list of names are:
2015 \end_layout
2016
2017 \begin_deeper
2018 \begin_layout LyX-Code
2019 \align block
2020 T1, inlet_T, outlet_T
2021 \end_layout
2022
2023 \begin_layout LyX-Code
2024 \align block
2025 y[components], y_in
2026 \end_layout
2027
2028 \begin_layout LyX-Code
2029 \align block
2030 stage[1..n_stages]
2031 \end_layout
2032
2033 \end_deeper
2034 \begin_layout List
2035 \labelwidthstring 00000.00000.00000.000
2036
2037 \bar under
2038 Ordered\InsetSpace ~
2039 lists
2040 \begin_inset LatexCommand \index{lists, ordered}
2041
2042 \end_inset
2043
2044
2045 \begin_inset LatexCommand \index{ordered lists}
2046
2047 \end_inset
2048
2049 :
2050 \bar default
2051 If the ordering of names in a list matters, that list is enclosed in ().
2052 Order matters in: calling externally defined methods or models, calling
2053 most real-valued functions, passing parameters to ASCEND models or methods,
2054 and declaring the controlling parameters that SELECT, SWITCH, and WHEN
2055 statements make decisions on.
2056 \end_layout
2057
2058 \begin_deeper
2059 \begin_layout Section
2060 Basic Concepts
2061 \end_layout
2062
2063 \end_deeper
2064 \begin_layout List
2065 \labelwidthstring 00000.00000.00000.000
2066
2067 \bar under
2068 Instances
2069 \begin_inset LatexCommand \index{instances}
2070
2071 \end_inset
2072
2073 \InsetSpace ~
2074 and\InsetSpace ~
2075 types
2076 \bar default
2077
2078 \begin_inset LatexCommand \index{types}
2079
2080 \end_inset
2081
2082 This is an opportune time to emphasize the distinction between the terms
2083 instance and type.
2084 A type in ASCEND is what we define when we declare an ASCEND model or atom.
2085 It is the formal definition of the attributes (parts) and attribute default
2086 values that an object will have if it is created using the type definition.
2087 Methods are associated with types.
2088 \end_layout
2089
2090 \begin_deeper
2091 \begin_layout Standard
2092 In ASCEND there are two meanings (closely related) of an instance.
2093
2094 \end_layout
2095
2096 \begin_layout Itemize
2097 An instance is a named part that exists within a type definition.
2098
2099 \end_layout
2100
2101 \begin_layout Itemize
2102 An instance is a compiled object.
2103
2104 \end_layout
2105
2106 \begin_layout Standard
2107 If one is in the context of the ASCEND interface, the system compiles an
2108 instance of a model type to create an object with which one carries out
2109 computations.
2110 The system requires the user to give a simple name for this simulation
2111 instance.
2112 This name given is then the first part of the qualified name for all the
2113 parts of the compiled object.
2114 \end_layout
2115
2116 \end_deeper
2117 \begin_layout List
2118 \labelwidthstring 00000.00000.00000.000
2119
2120 \bar under
2121 Implicit\InsetSpace ~
2122 types
2123 \bar default
2124
2125 \begin_inset LatexCommand \index{types, implicit}
2126
2127 \end_inset
2128
2129
2130 \begin_inset LatexCommand \index{types, implicit}
2131
2132 \end_inset
2133
2134 It is possible to create an instance that does not have a corresponding
2135 type definition in the library.
2136 The type of such an instance is said to be
2137 \series bold
2138 implicit
2139 \series default
2140
2141 \begin_inset Foot
2142 status collapsed
2143
2144 \begin_layout Standard
2145 (Some people use the word
2146 \emph on
2147 anonymous
2148 \emph default
2149
2150 \begin_inset LatexCommand \index{type, anonymous}
2151
2152 \end_inset
2153
2154
2155 \begin_inset LatexCommand \index{anonymous type}
2156
2157 \end_inset
2158
2159 .
2160 However, no computable type is anonymous and the implicit type of an instance
2161 is theoretically computable)
2162 \end_layout
2163
2164 \end_inset
2165
2166 .
2167 The simplest example of an implicit type is the type of an instance compiled
2168 from the built-in definition
2169 \family sans
2170 integer_constant
2171 \family default
2172 .
2173 For example:
2174 \end_layout
2175
2176 \begin_deeper
2177 \begin_layout LyX-Code
2178 i, j IS_A integer_constant;
2179 \end_layout
2180
2181 \begin_layout LyX-Code
2182 i:== 2;
2183 \end_layout
2184
2185 \begin_layout LyX-Code
2186 j:== 3;
2187 \end_layout
2188
2189 \begin_layout Standard
2190 Instances
2191 \family typewriter
2192 i
2193 \family default
2194 and
2195 \family typewriter
2196 j
2197 \family default
2198 , though of the same formal type, are implicit type incompatible because
2199 they have been assigned distinct values.
2200 \end_layout
2201
2202 \begin_layout Standard
2203 Instances which are either formally or implicitly type incompatible cannot
2204 be merged.
2205 This will be discussed further in Section
2206 \begin_inset LatexCommand \vref{sec:x.3Declarative-statements}
2207
2208 \end_inset
2209
2210 .
2211 \end_layout
2212
2213 \end_deeper
2214 \begin_layout List
2215 \labelwidthstring 00000.00000.00000.000
2216 Parsing
2217 \begin_inset LatexCommand \index{parsing}
2218
2219 \end_inset
2220
2221 Most errors in the declaration of an ASCEND model can be caught at parse
2222 time because the object type of any well-formed name in an ASCEND definition
2223 can be resolved or proved ambiguous.
2224 We cannot prove at parse time whether a specific array element will exist,
2225 but we can know that should such an element exist, it must be of the type
2226 with which the array is defined.
2227
2228 \end_layout
2229
2230 \begin_deeper
2231 \begin_layout Standard
2232 Ambiguity is warned about loudly because it is caused by either misspelling
2233 or poor modeling style.
2234 The simplest example of ambiguity follows.
2235 \end_layout
2236
2237 \begin_layout Standard
2238 Assume a type, stream, and a refinement of stream, heat_stream, which adds
2239 the new variable
2240 \family typewriter
2241 H
2242 \family default
2243 .
2244 Now, if we write:
2245 \end_layout
2246
2247 \begin_layout LyX-Code
2248 MODEL mixer;
2249 \end_layout
2250
2251 \begin_layout LyX-Code
2252 input[1..2] IS_A stream;
2253 \end_layout
2254
2255 \begin_layout LyX-Code
2256 output IS_A heat_stream;
2257 \end_layout
2258
2259 \begin_layout LyX-Code
2260 input[1].H + input[2].H = output.H;
2261 \end_layout
2262
2263 \begin_layout LyX-Code
2264 END mixer;
2265 \end_layout
2266
2267 \begin_layout Standard
2268 We see the parser can find the definition of H in the type heat_stream,
2269 so
2270 \family typewriter
2271 output.H
2272 \family default
2273 is well defined.
2274 The author of the mixer model may intend to refine
2275 \family typewriter
2276 input[1]
2277 \family default
2278 and
2279 \family typewriter
2280 input[2]
2281 \family default
2282 to be objects of different types, say steam_stream and electric_stream,
2283 where each defines an
2284 \family typewriter
2285 H
2286 \family default
2287 suitable for use in the equation.
2288 The parser cannot read the authors mind, so it warns that
2289 \family typewriter
2290 input[1].H
2291 \family default
2292 and
2293 \family typewriter
2294 input[2].H
2295 \family default
2296 are ambiguous in the mixer definition.
2297 The mixer model is not highly reusable except by the author, but sometimes
2298 reusability is not a high priority objective.
2299 The mixer definition is allowed, but it may cause problems in instantiation
2300 if the author has forgotten the assumption that is not explicitly stated
2301 in the model and neglects to refine the input streams appropriately.
2302 \end_layout
2303
2304 \end_deeper
2305 \begin_layout List
2306 \labelwidthstring 00000.00000.00000.000
2307
2308 \bar under
2309 Instantiation
2310 \bar default
2311
2312 \begin_inset LatexCommand \index{instantiation}
2313
2314 \end_inset
2315
2316 Creating an simulation based on a type definition is a multi-phase
2317 \begin_inset LatexCommand \index{multi-phase}
2318
2319 \end_inset
2320
2321 process called compiling
2322 \begin_inset LatexCommand \index{compiling}
2323
2324 \end_inset
2325
2326 (or instantiation).
2327 When an instantiation cannot be completed because some structural parameter
2328 (a symbol_constant, real_constant, boolean_constant, integer_constant,
2329 or set) does not have a value there will be PENDING
2330 \begin_inset LatexCommand \index{PENDING}
2331
2332 \end_inset
2333
2334 statements.
2335 The user interface will warn that something is incomplete.
2336 \end_layout
2337
2338 \begin_deeper
2339 \begin_layout Standard
2340 In phase
2341 \begin_inset LatexCommand \index{phases, compiler}
2342
2343 \end_inset
2344
2345 1 all statements that create instance structures or assign constant values
2346 are executed.
2347 This phase theoretically requires an infinite number of passes through
2348 the structural statements of a definition.
2349 We allow a maximum of 5 and have never needed more than 3.
2350 There may be pending statements at the end of phase 1.
2351 The compiler or interface will issue warnings about pending statements,
2352 starting with warnings about unassigned constants.
2353 \end_layout
2354
2355 \begin_layout Standard
2356 Phase 2 compiles as many real arithmetic relation definitions as possible.
2357 Some relations may be impossible to compile because the constants or sets
2358 they depend on do not have values assigned.
2359 Other relations may be impossible because they reference variables that
2360 do not exist.
2361 This is determined in a single pass.
2362 \end_layout
2363
2364 \begin_layout Standard
2365 Phase 3 compiles as many logical arithmetic relation definitions as possible.
2366 Some relations may be impossible to compile because the constants or sets
2367 they depend on do not have values assigned.
2368 Other relations may be impossible because they reference real arithmetic
2369 relations that do not exist.
2370 This is determined in a single pass.
2371 \end_layout
2372
2373 \begin_layout Standard
2374 Phase 4 compiles as many conditional programming statements (
2375 \family sans
2376 WHEN
2377 \family default
2378 s) as possible.
2379 Some
2380 \family sans
2381 WHEN
2382 \family default
2383 relations may be impossible to compile because the discrete variables,
2384 models, or relations they depend on do not exist.
2385 This is determined in a single pass.
2386 \end_layout
2387
2388 \begin_layout Standard
2389 Phase 5 executes the variable defaulting statements made in the declarative
2390 section of each model
2391 \emph on
2392 if and only if
2393 \emph default
2394 there are no pending statements from phases 1-4 anywhere in the simulation.
2395 \end_layout
2396
2397 \end_deeper
2398 \begin_layout List
2399 \labelwidthstring 00000.00000.00000.000
2400 default_self
2401 \begin_inset LatexCommand \index{default\_self}
2402
2403 \end_inset
2404
2405 After all phases are done, the method default_self is called in the top-most
2406 model of the simulation, if this method exists.
2407 \end_layout
2408
2409 \begin_deeper
2410 \begin_layout Standard
2411 The first occurrence of each impossible statement will be explained during
2412 a failed compilation.
2413 Impossible statements include:
2414 \end_layout
2415
2416 \begin_layout Itemize
2417 Relations containing undefinable variables (often misspellings).
2418 \end_layout
2419
2420 \begin_layout Itemize
2421 Assignments that are dimensionally inconsistent or containing mismatched
2422 types.
2423 \end_layout
2424
2425 \begin_layout Itemize
2426 Structure building or modifying statements that refer to model parts which
2427 cannot exist or that require a type-incompatible argument, refinement,
2428 or merge.
2429 \end_layout
2430
2431 \begin_layout Chapter
2432 Data Type Declarations
2433 \begin_inset LatexCommand \index{data type declarations}
2434
2435 \end_inset
2436
2437
2438 \end_layout
2439
2440 \begin_layout Standard
2441 In the spectrum of OO languages, ASCEND is best considered as being class-based
2442 \begin_inset LatexCommand \index{class-based}
2443
2444 \end_inset
2445
2446 , though it is rather more a hybrid.
2447 We have atom and model definitions, called
2448 \series bold
2449 types
2450 \series default
2451 , and the compiled objects themselves, called
2452 \series bold
2453 instances
2454 \series default
2455 .
2456 ASCEND instances have a record of what type they were constructed from.
2457 \end_layout
2458
2459 \end_deeper
2460 \begin_layout List
2461 \labelwidthstring 00000.00000.00000.000
2462
2463 \bar under
2464 Type\InsetSpace ~
2465 qualifiers
2466 \begin_inset LatexCommand \index{type qualifiers}
2467
2468 \end_inset
2469
2470 :
2471 \end_layout
2472
2473 \begin_layout List
2474 \labelwidthstring 00000.00000.00000.000
2475
2476 \family sans
2477 UNIVERSAL
2478 \family default
2479
2480 \begin_inset LatexCommand \index{UNIVERSAL}
2481
2482 \end_inset
2483
2484 Universal is an optional modifier of all
2485 \family sans
2486 ATOM
2487 \family default
2488 ,
2489 \family sans
2490 CONSTANT
2491 \family default
2492 and
2493 \family sans
2494 MODEL
2495 \family default
2496 definitions.
2497 If
2498 \family sans
2499 UNIVERSAL
2500 \family default
2501 precedes the definition, then
2502 \emph on
2503 all
2504 \emph default
2505 instances of that type will actually refer to the first instance of the
2506 type that is created.
2507 This saves memory and ensures global consistency of data.
2508
2509 \end_layout
2510
2511 \begin_deeper
2512 \begin_layout Standard
2513 Examples of universal type definitions are
2514 \end_layout
2515
2516 \begin_layout LyX-Code
2517 UNIVERSAL MODEL methane
2518 \end_layout
2519
2520 \begin_layout LyX-Code
2521 REFINES generic_component_model;
2522 \end_layout
2523
2524 \begin_layout LyX-Code
2525 UNIVERSAL CONSTANT circle_constant
2526 \end_layout
2527
2528 \begin_layout LyX-Code
2529 REFINES real_constant :== 1{PI};
2530 \end_layout
2531
2532 \begin_layout LyX-Code
2533 UNIVERSAL ATOM counter_1
2534 \end_layout
2535
2536 \begin_layout LyX-Code
2537 REFINES integer;
2538 \end_layout
2539
2540 \end_deeper
2541 \begin_layout List
2542 \labelwidthstring 00000.00000.00000.000
2543 Tip:\InsetSpace ~
2544 Do\InsetSpace ~
2545 not\InsetSpace ~
2546 use\InsetSpace ~
2547
2548 \family sans
2549 UNIVERSAL
2550 \family default
2551 \InsetSpace ~
2552 variables\InsetSpace ~
2553 in\InsetSpace ~
2554 relations.
2555 \end_layout
2556
2557 \begin_deeper
2558 \begin_layout Standard
2559 It is important to note that, because
2560 \emph on
2561 variables
2562 \emph default
2563 must store information about which relations they occur in, it is a very
2564 bad idea to use
2565 \family sans
2566 UNIVERSAL
2567 \family default
2568 typed variables in relations.
2569 The construction and maintenance of the relation list becomes very expensive
2570 for universal variables.
2571
2572 \family sans
2573 UNIVERSAL
2574 \family default
2575
2576 \emph on
2577 constants
2578 \emph default
2579 are fine to use, though, because there are no relation links for constants.
2580 \end_layout
2581
2582 \begin_layout Section
2583 Models
2584 \end_layout
2585
2586 \end_deeper
2587 \begin_layout List
2588 \labelwidthstring 00000.00000.00000.000
2589
2590 \family sans
2591 MODEL
2592 \family default
2593
2594 \begin_inset LatexCommand \index{MODEL}
2595
2596 \end_inset
2597
2598 An ASCEND model has a declarative part and an optional procedural part
2599 headed by the METHODS word.
2600 Models are essentially containers for variables and relations.
2601 We will explain the various statements that can be made within models in
2602 Section
2603 \begin_inset LatexCommand \vref{sec:x.3Declarative-statements}
2604
2605 \end_inset
2606
2607 and Section
2608 \begin_inset LatexCommand \vref{sec:x.4Procedural-statements}
2609
2610 \end_inset
2611
2612 .
2613 \end_layout
2614
2615 \begin_layout Standard
2616 Simple\InsetSpace ~
2617 models
2618 \begin_inset LatexCommand \index{models, simple}
2619
2620 \end_inset
2621
2622 :
2623 \end_layout
2624
2625 \begin_layout List
2626 \labelwidthstring 00000.00000.00000.000
2627 foo
2628 \family typewriter
2629 \InsetSpace ~
2630 \InsetSpace ~
2631 \InsetSpace ~
2632 \InsetSpace ~
2633 MODEL foo;
2634 \end_layout
2635
2636 \begin_deeper
2637 \begin_layout LyX-Code
2638 (* statements about foo go here*)
2639 \end_layout
2640
2641 \begin_layout LyX-Code
2642 METHODS
2643 \end_layout
2644
2645 \begin_layout LyX-Code
2646 (* METHODs for foo go here*)
2647 \end_layout
2648
2649 \begin_layout LyX-Code
2650 END foo;
2651 \end_layout
2652
2653 \end_deeper
2654 \begin_layout List
2655 \labelwidthstring 00000.00000.00000.000
2656 bar
2657 \family typewriter
2658 \InsetSpace ~
2659 \InsetSpace ~
2660 \InsetSpace ~
2661 \InsetSpace ~
2662 MODEL bar REFINES foo;
2663 \end_layout
2664
2665 \begin_deeper
2666 \begin_layout LyX-Code
2667 (*additional statements about foo *)
2668 \end_layout
2669
2670 \begin_layout LyX-Code
2671 METHODS
2672 \end_layout
2673
2674 \begin_layout LyX-Code
2675 (* additional METHODs for bar *)
2676 \end_layout
2677
2678 \begin_layout LyX-Code
2679 END bar;
2680 \end_layout
2681
2682 \end_deeper
2683 \begin_layout List
2684 \labelwidthstring 00000.00000.00000.000
2685
2686 \bar under
2687 Parameterized\InsetSpace ~
2688 Models
2689 \bar default
2690
2691 \begin_inset LatexCommand \index{models, parameterized}
2692
2693 \end_inset
2694
2695 Parameterizing models makes them easier to understand and faster for the
2696 system to compile.
2697 The syntax for a parameterized model vaguely resembles a function call
2698 in imperative languages, but it is NOT.
2699 When constructing a reusable model, all the constants that determine the
2700 sizes of arrays and other structures should be declared in the parameter
2701 list so that
2702 \end_layout
2703
2704 \begin_deeper
2705 \begin_layout Itemize
2706 the user knows what is required to reuse the model.
2707 \end_layout
2708
2709 \begin_layout Itemize
2710 the compiler knows what values must be set before it should bother attempting
2711 to compile the model.
2712 \end_layout
2713
2714 \begin_layout Standard
2715 There is no reason that other items could not also go in the parameter list,
2716 such as key variables which might be considered inputs or outputs or control
2717 parameters in the mathematical application of the model.
2718 A simple example of parameterization would be:
2719 \end_layout
2720
2721 \end_deeper
2722 \begin_layout List
2723 \labelwidthstring 00000.00000.00000.000
2724 column(n,s)
2725 \end_layout
2726
2727 \begin_deeper
2728 \begin_layout LyX-Code
2729 MODEL column(
2730 \end_layout
2731
2732 \begin_layout LyX-Code
2733 ntrays WILL_BE integer_constant;
2734 \end_layout
2735
2736 \begin_layout LyX-Code
2737 components IS_A set of symbol_constant;
2738 \end_layout
2739
2740 \begin_layout LyX-Code
2741 );
2742 \end_layout
2743
2744 \begin_layout LyX-Code
2745 stage[1..ntrays] IS_A simple_tray;
2746 \end_layout
2747
2748 \begin_layout LyX-Code
2749 END column;
2750 \end_layout
2751
2752 \end_deeper
2753 \begin_layout List
2754 \labelwidthstring 00000.00000.00000.000
2755 flowsheet
2756 \end_layout
2757
2758 \begin_deeper
2759 \begin_layout LyX-Code
2760 MODEL flowsheet;
2761 \end_layout
2762
2763 \begin_layout LyX-Code
2764 tower4size IS_A integer_constant;
2765 \end_layout
2766
2767 \begin_layout LyX-Code
2768 tower4size :== 22;
2769 \end_layout
2770
2771 \begin_layout LyX-Code
2772 ct IS_A column(tower4size,[c5,c6]);
2773 \end_layout
2774
2775 \begin_layout LyX-Code
2776 (* additional flowsheet statements *)
2777 \end_layout
2778
2779 \begin_layout LyX-Code
2780 END flowsheet;
2781 \end_layout
2782
2783 \begin_layout Standard
2784 In this example, the column model takes the first argument, ntrays, by reference.
2785 That is,
2786 \family typewriter
2787 ct.ntrays
2788 \family default
2789 is an alias for the flowsheet instance
2790 \family typewriter
2791 tower4size
2792 \family default
2793 .
2794
2795 \family typewriter
2796 tower4size
2797 \family default
2798 must be compiled and assigned a value before we will attempt to compile
2799 the column model instance
2800 \family typewriter
2801 ct
2802 \family default
2803 .
2804 The second argument is taken by value,
2805 \family typewriter
2806 [c5,c6]
2807 \family default
2808 , and assigned to components, a column part that was declared with
2809 \family sans
2810 IS_A
2811 \family default
2812 in the parameter list.
2813 There is only one name for this set,
2814 \family typewriter
2815 ct.components
2816 \family default
2817 .
2818 Note that in the
2819 \family typewriter
2820 flowsheet
2821 \family default
2822 model there is no part that is a set of
2823 \family sans
2824 symbol_constant
2825 \family default
2826 .
2827
2828 \end_layout
2829
2830 \begin_layout Standard
2831 The use of parameters in ASCEND modeling requires some thought, and we will
2832 present that set of thoughts in Section
2833 \begin_inset LatexCommand \vref{sec:x.5Parameterized-models}
2834
2835 \end_inset
2836
2837 .
2838 Beginners may wish to create new models without parameters until they are
2839 comfortable using the existing parameterized library definitions.
2840 Parameters are intended to support model reuse and efficient compilation
2841 which are not issues in the very earliest phase of developing novel models.
2842 \end_layout
2843
2844 \begin_layout Section
2845 Sets
2846 \begin_inset LatexCommand \index{sets}
2847
2848 \end_inset
2849
2850
2851 \begin_inset LatexCommand \label{sub:x.2.2Sets}
2852
2853 \end_inset
2854
2855
2856 \end_layout
2857
2858 \begin_layout Standard
2859 Arrays in ASCEND, as already discussed in Section
2860 \begin_inset LatexCommand \vref{sub:x.1.2Basic-Elements}
2861
2862 \end_inset
2863
2864 , are defined over sets.
2865 A set is simply an instance with a set value.
2866 The elements of sets are
2867 \emph on
2868 not
2869 \emph default
2870 instances or sets.
2871 \end_layout
2872
2873 \end_deeper
2874 \begin_layout List
2875 \labelwidthstring 00000.00000.00000.000
2876
2877 \bar under
2878 Set\InsetSpace ~
2879 Declaration:
2880 \bar default
2881 A set is made of either symbol_constants or integer_constants, so a set
2882 object is declared in one of two ways:
2883 \end_layout
2884
2885 \begin_deeper
2886 \begin_layout LyX-Code
2887 my_integer_set IS_A set OF integer_constant;
2888 \end_layout
2889
2890 \begin_layout Standard
2891 or
2892 \end_layout
2893
2894 \begin_layout LyX-Code
2895 my_symbol_set IS_A set OF symbol_constant;
2896 \end_layout
2897
2898 \end_deeper
2899 \begin_layout List
2900 \labelwidthstring 00000.00000.00000.000
2901
2902 \family typewriter
2903 :==
2904 \family default
2905
2906 \begin_inset LatexCommand \index{:==}
2907
2908 \end_inset
2909
2910 A set is assigned a value like so:
2911 \end_layout
2912
2913 \begin_deeper
2914 \begin_layout LyX-Code
2915 my_integer_set :== [1,4];
2916 \end_layout
2917
2918 \begin_layout Standard
2919 The RHS of such an assignment must be either the name of another set instance
2920 or an expression enclosed in square brackets and made up of only set operators,
2921 other sets, and the names of integer_constants or symbol_constants.
2922 Sets can only be assigned once.
2923 \end_layout
2924
2925 \end_deeper
2926 \begin_layout List
2927 \labelwidthstring 00000.00000.00000.000
2928
2929 \bar under
2930 Set\InsetSpace ~
2931 Operations
2932 \bar default
2933
2934 \family sans
2935 UNION
2936 \family default
2937
2938 \begin_inset LatexCommand \index{UNION}
2939
2940 \end_inset
2941
2942
2943 \family typewriter
2944 [setlist]
2945 \end_layout
2946
2947 \begin_deeper
2948 \begin_layout Standard
2949 A function taken over a list of sets.
2950 The result is the set that includes all the members of all the sets in
2951 the list.
2952 Note that the result of the
2953 \family sans
2954 UNION
2955 \family default
2956 operation is an unordered set and the argument order to the union function
2957 does not matter.
2958 The syntax is:
2959 \end_layout
2960
2961 \end_deeper
2962 \begin_layout List
2963 \labelwidthstring 00000.00000.00000.000
2964 +
2965 \begin_inset LatexCommand \index{+, sets}
2966
2967 \end_inset
2968
2969
2970 \family typewriter
2971 UNION[list_of_sets]
2972 \end_layout
2973
2974 \begin_layout List
2975 \labelwidthstring 00000.00000.00000.000
2976
2977 \family typewriter
2978 A+B
2979 \family default
2980 \InsetSpace ~
2981 is\InsetSpace ~
2982 shorthand\InsetSpace ~
2983 for
2984 \family typewriter
2985 UNION[A,B]
2986 \end_layout
2987
2988 \begin_deeper
2989 \begin_layout Standard
2990 Consider the following sets for the examples to follow.
2991 \end_layout
2992
2993 \begin_layout LyX-Code
2994 A := [1, 2, 3, 5, 9];
2995 \end_layout
2996
2997 \begin_layout LyX-Code
2998 B := [2, 4, 6, 8];
2999 \end_layout
3000
3001 \begin_layout Standard
3002 Then
3003 \family typewriter
3004 UNION[A, B]
3005 \family default
3006 is equal to the set
3007 \family typewriter
3008 [1, 2, 3, 4, 5, 6, 8, 9]
3009 \family default
3010 which equals
3011 \family typewriter
3012 [1..6, 8, 9]
3013 \family default
3014 which equals
3015 \family typewriter
3016 [[1..9] - [7]]
3017 \family default
3018 .
3019 \end_layout
3020
3021 \end_deeper
3022 \begin_layout List
3023 \labelwidthstring 00000.00000.00000.000
3024
3025 \family sans
3026 INTERSECTION
3027 \family default
3028
3029 \begin_inset LatexCommand \index{INTERSECTION}
3030
3031 \end_inset
3032
3033 [] INTERSECTION[list of set expressions].
3034 Finds the intersection (and) of the sets listed.
3035
3036 \end_layout
3037
3038 \begin_layout List
3039 \labelwidthstring 00000.00000.00000.000
3040 *
3041 \begin_inset LatexCommand \index{*, sets}
3042
3043 \end_inset
3044
3045 Equivalent to
3046 \family sans
3047 INTERSECTION
3048 \family typewriter
3049 [list_of_sets]
3050 \family default
3051 .
3052 \end_layout
3053
3054 \begin_layout List
3055 \labelwidthstring 00000.00000.00000.000
3056
3057 \family typewriter
3058 A*B
3059 \family default
3060 \InsetSpace ~
3061 is\InsetSpace ~
3062 shorthand\InsetSpace ~
3063 for\InsetSpace ~
3064 I
3065 \family typewriter
3066 NTERSECTION[A,B]
3067 \end_layout
3068
3069 \begin_deeper
3070 \begin_layout Standard
3071 For the sets A and B defined just above,
3072 \family typewriter
3073 INTERSECTION[A, B]
3074 \family default
3075 is the set
3076 \family typewriter
3077 [2]
3078 \family default
3079 .
3080 The
3081 \family typewriter
3082 *
3083 \family default
3084 shorthand for intersection is
3085 \emph on
3086 not
3087 \emph default
3088 recommended for use except in libraries no one will look at.
3089 \end_layout
3090
3091 \end_deeper
3092 \begin_layout List
3093 \labelwidthstring 00000.00000.00000.000
3094 Set\InsetSpace ~
3095 difference
3096 \begin_inset LatexCommand \index{set difference}
3097
3098 \end_inset
3099
3100 : One can subtract one set from another.
3101 The result is the first set less any members in the set union of the first
3102 and second set.
3103 The syntax is
3104 \end_layout
3105
3106 \begin_deeper
3107 \begin_layout LyX-Code
3108
3109 \family typewriter
3110 first_set
3111 \family default
3112 -
3113 \begin_inset LatexCommand \index{-, sets}
3114
3115 \end_inset
3116
3117
3118 \family typewriter
3119 second_set
3120 \end_layout
3121
3122 \begin_layout Standard
3123 For the sets
3124 \family typewriter
3125 A
3126 \family default
3127 and
3128 \family typewriter
3129 B
3130 \family default
3131 defined above, the set difference
3132 \family typewriter
3133 A - B
3134 \family default
3135 is the set
3136 \family typewriter
3137 [1, 3, 5, 9]
3138 \family default
3139 while the set difference
3140 \family typewriter
3141 B - A
3142 \family default
3143 is the set
3144 \family typewriter
3145 [4, 6, 8]
3146 \family default
3147 .
3148 \end_layout
3149
3150 \end_deeper
3151 \begin_layout List
3152 \labelwidthstring 00000.00000.00000.000
3153
3154 \family sans
3155 CARD
3156 \family default
3157
3158 \begin_inset LatexCommand \index{CARD}
3159
3160 \end_inset
3161
3162 [set] Cardinality
3163 \begin_inset LatexCommand \index{cardinality}
3164
3165 \end_inset
3166
3167 .
3168 Returns an integer constant value that is the number of items in the set.
3169 \end_layout
3170
3171 \begin_layout List
3172 \labelwidthstring 00000.00000.00000.000
3173
3174 \family sans
3175 CHOICE
3176 \family default
3177
3178 \begin_inset LatexCommand \index{CHOICE}
3179
3180 \end_inset
3181
3182 [set] Choose one.
3183 The result of running the
3184 \family sans
3185 CHOICE
3186 \family default
3187 function over a set is an arbitrary (but consistent: for any set instance
3188 you always get the same result) single element of that set.
3189
3190 \end_layout
3191
3192 \begin_deeper
3193 \begin_layout Standard
3194 Running
3195 \family typewriter
3196 CHOICE[A]
3197 \family default
3198 gives any member from the set A.
3199 The result is a member, not a set.
3200 To make the result into a set, it must be enclosed in square brackets.
3201 Thus
3202 \family typewriter
3203 [CHOICE[A]]
3204 \family default
3205 is a set with a single element arbitrarily chosen from the set A.
3206 Good modelers do not leave modeling decisions to the compiler; they do
3207 not use
3208 \family sans
3209 CHOICE
3210 \family default
3211 .
3212 We are stuck with it for historical reasons.
3213 \end_layout
3214
3215 \begin_layout Standard
3216 To reduce a set by one element, one can use the following
3217 \end_layout
3218
3219 \begin_layout LyX-Code
3220 A_less_one IS_A set OF integer;
3221 \end_layout
3222
3223 \begin_layout LyX-Code
3224 A_less_one :== A - [CHOICE[A]];
3225 \end_layout
3226
3227 \end_deeper
3228 \begin_layout List
3229 \labelwidthstring 00000.00000.00000.000
3230
3231 \family sans
3232 IN
3233 \family default
3234
3235 \begin_inset LatexCommand \index{IN}
3236
3237 \end_inset
3238
3239
3240 \family typewriter
3241 lhs IN rhs
3242 \family default
3243 can only be well explained by examples.
3244
3245 \family sans
3246 IN
3247 \family default
3248 is used in index expressions.
3249 If
3250 \family typewriter
3251 lhs
3252 \family default
3253 is a simple and not previously defined name, it is created as a temporary
3254 loop index which will take on the values of the rhs set definition.
3255 If lhs is something that already exists, the result of
3256 \family typewriter
3257 lhs IN rhs
3258 \family default
3259 is a boolean value; stare at the model
3260 \family typewriter
3261 set_example
3262 \family default
3263 below which demonstrates both
3264 \family sans
3265 IN
3266 \family default
3267 and
3268 \family sans
3269 SUCH_THAT
3270 \family default
3271 .
3272 If you still are not satisfied, you might examine [[westerbergksets]]
3273 \begin_inset Note Note
3274 status open
3275
3276 \begin_layout Standard
3277 fix this reference
3278 \end_layout
3279
3280 \end_inset
3281
3282 .
3283 \end_layout
3284
3285 \begin_layout List
3286 \labelwidthstring 00000.00000.00000.000
3287
3288 \family sans
3289 SUCH_THAT
3290 \family default
3291
3292 \begin_inset LatexCommand \index{SUCH\_THAT}
3293
3294 \end_inset
3295
3296 Set expressions can be rather clever.
3297 We will give a detailed example from chemistry because unordered sets are
3298 unfamiliar to most people and set arithmetic is quite powerful.
3299 In this example we see arrays of sets and sparse arrays.
3300
3301 \end_layout
3302
3303 \begin_layout LyX-Code
3304 MODEL set_example;
3305 \end_layout
3306
3307 \begin_layout LyX-Code
3308 (* we define a sparse matrix of reaction
3309 \end_layout
3310
3311 \begin_layout LyX-Code
3312 coefficient information and the species
3313 \end_layout
3314
3315 \begin_layout LyX-Code
3316 balance equations.
3317 *)
3318 \end_layout
3319
3320 \begin_layout LyX-Code
3321 rxns IS_A set OF integer_constant;
3322 \end_layout
3323
3324 \begin_layout LyX-Code
3325 rxns :== [1..3];
3326 \end_layout
3327
3328 \begin_layout LyX-Code
3329 species IS_A set OF symbol_constant;
3330 \end_layout
3331
3332 \begin_layout LyX-Code
3333 species :== ['A','B','C','D'];
3334 \end_layout
3335
3336 \begin_layout LyX-Code
3337 reactants[rxns] IS_A set OF symbol_constant; (* species
3338 \end_layout
3339
3340 \begin_layout LyX-Code
3341 in each rxn_j *)
3342 \end_layout
3343
3344 \begin_layout LyX-Code
3345 reactants[1] :== ['A','B','C'];
3346 \end_layout
3347
3348 \begin_layout LyX-Code
3349 reactants[2] :== ['A','C'];
3350 \end_layout
3351
3352 \begin_layout LyX-Code
3353 reactants[3] :== ['A','B','D'];
3354 \end_layout
3355
3356 \begin_layout LyX-Code
3357 reactions[species] IS_A set OF integer_constant;
3358 \end_layout
3359
3360 \begin_layout LyX-Code
3361 FOR i IN species CREATE (* rxns for each species i *)
3362 \end_layout
3363
3364 \begin_layout LyX-Code
3365 reactions[i] :== [j IN rxns SUCH_THAT i IN reactants[j]];
3366 \end_layout
3367
3368 \begin_layout LyX-Code
3369 END FOR;
3370 \end_layout
3371
3372 \begin_layout LyX-Code
3373 (* Define sparse stoichiometric matrix.
3374 Values of eta_ij
3375 \end_layout
3376
3377 \begin_layout LyX-Code
3378 set later.*)
3379 \end_layout
3380
3381 \begin_layout LyX-Code
3382 FOR j IN rxns CREATE
3383 \end_layout
3384
3385 \begin_layout LyX-Code
3386 FOR i IN reactants[j] CREATE
3387 \end_layout
3388
3389 \begin_layout LyX-Code
3390 (* eta_ij --> mole i/mole rxn j*)
3391 \end_layout
3392
3393 \begin_layout LyX-Code
3394 eta[i][j] IS_A real_constant;
3395 \end_layout
3396
3397 \begin_layout LyX-Code
3398 END FOR;
3399 \end_layout
3400
3401 \begin_layout LyX-Code
3402 END FOR;
3403 \end_layout
3404
3405 \begin_layout LyX-Code
3406 production[species] IS_A molar_rate;
3407 \end_layout
3408
3409 \begin_layout LyX-Code
3410 rate[rxns] IS_A molar_rate; (* mole rxn j/time *)
3411 \end_layout
3412
3413 \begin_layout LyX-Code
3414 FOR i IN species CREATE
3415 \end_layout
3416
3417 \begin_layout LyX-Code
3418 gen_eqn[i]: production[i] =
3419 \end_layout
3420
3421 \begin_layout LyX-Code
3422 SUM[eta[i][j]*rate[j] | j IN reactions[i]];
3423 \end_layout
3424
3425 \begin_layout LyX-Code
3426 END FOR;
3427 \end_layout
3428
3429 \begin_layout LyX-Code
3430 END set_example;
3431 \end_layout
3432
3433 \begin_layout List
3434 \labelwidthstring 00000.00000.00000.000
3435 "
3436 \family typewriter
3437 |
3438 \family default
3439
3440 \begin_inset LatexCommand \index{|}
3441
3442 \end_inset
3443
3444 " is shorthand for
3445 \family sans
3446 SUCH_THAT
3447 \family default
3448 .
3449 \end_layout
3450
3451 \begin_deeper
3452 \begin_layout Standard
3453 The array
3454 \family typewriter
3455 eta
3456 \family default
3457 has only 8 elements, and we defined those elements in a set for each reaction.
3458 The equation needs to know about the set of reactions for a species
3459 \family typewriter
3460 i
3461 \family default
3462 , and that set is calculated automatically in the models first
3463 \family sans
3464 FOR/CREATE
3465 \family default
3466 statement.
3467
3468 \end_layout
3469
3470 \begin_layout Standard
3471 The
3472 \family typewriter
3473 |
3474 \family default
3475 symbol is the ASCEND III notation for
3476 \family sans
3477 SUCH_THAT
3478 \family default
3479 .
3480 We noted that "
3481 \family typewriter
3482 |
3483 \family default
3484 " is often read as "for all", which is different in that "for all" makes
3485 one think of a
3486 \family sans
3487 FOR
3488 \family default
3489 loop where the loop index is on the left of an
3490 \family sans
3491 IN
3492 \family default
3493 operator.
3494 For example, the
3495 \family typewriter
3496 j
3497 \family default
3498 loop in the
3499 \family sans
3500 SUM
3501 \family default
3502 of
3503 \family typewriter
3504 gen_eqn[i]
3505 \family default
3506 above.
3507
3508 \end_layout
3509
3510 \begin_layout Section
3511 Constants
3512 \begin_inset LatexCommand \index{constants}
3513
3514 \end_inset
3515
3516
3517 \end_layout
3518
3519 \begin_layout Standard
3520 ASCEND supports real, integer, boolean and character string constants.
3521 Constants in ASCEND do not have any attributes other than their value.
3522 Constants are scalar quantities that can be assigned exactly once.
3523 Constants may only be assigned using the
3524 \family typewriter
3525 :==
3526 \family default
3527 operator and the RHS expression they are assigned from must itself be constant.
3528 Constants do not have subparts.
3529 Integer and symbol constants may be used in determining the definitions
3530 of sets.
3531
3532 \end_layout
3533
3534 \begin_layout Standard
3535 Explicit refinements of the built-in constant types may be defined as exemplifie
3536 d in the description of real_constant.
3537 Implicit type refinements may be done by instantiating an incompletely
3538 defined constant and assigning its final value.
3539
3540 \end_layout
3541
3542 \begin_layout Standard
3543 Sets could be considered constant because they are assigned only once, however
3544 sets are described separately because they are not quite scalar quantities.
3545 \end_layout
3546
3547 \end_deeper
3548 \begin_layout List
3549 \labelwidthstring 00000.00000.00000.000
3550
3551 \family sans
3552 real_constant
3553 \family default
3554
3555 \begin_inset LatexCommand \index{real\_constant}
3556
3557 \end_inset
3558
3559 Real number with dimensionality.
3560 Note that the dimensionality of a real constant can be specified via the
3561 type definition without immediately defining the value, as in the following
3562 pair of definitions.
3563 \end_layout
3564
3565 \begin_layout List
3566 \labelwidthstring 00000.00000.00000.000
3567
3568 \bar under
3569 CONSTANT\InsetSpace ~
3570 declaration\InsetSpace ~
3571 example:
3572 \end_layout
3573
3574 \begin_deeper
3575 \begin_layout LyX-Code
3576 CONSTANT molar_weight
3577 \end_layout
3578
3579 \begin_layout LyX-Code
3580 REFINES real_constant DIMENSION M/Q;
3581 \end_layout
3582
3583 \begin_layout LyX-Code
3584 CONSTANT hydrogen_weight
3585 \end_layout
3586
3587 \begin_layout LyX-Code
3588 REFINES molar_weight :== 1.004{g/mole};
3589 \end_layout
3590
3591 \end_deeper
3592 \begin_layout List
3593 \labelwidthstring 00000.00000.00000.000
3594
3595 \family sans
3596 integer_constant
3597 \family default
3598
3599 \begin_inset LatexCommand \index{integer\_constant}
3600
3601 \end_inset
3602
3603 Integer number.
3604 Principally used in determining model structure.
3605 If appearing in equations, integers are evaluated as dimensionless reals.
3606 Typical use is inside a
3607 \family sans
3608 MODEL
3609 \family default
3610 definition and looks like:
3611 \end_layout
3612
3613 \begin_deeper
3614 \begin_layout LyX-Code
3615 n_trays IS_A integer_constant;
3616 \end_layout
3617
3618 \begin_layout LyX-Code
3619 n_trays :== 50;
3620 \end_layout
3621
3622 \begin_layout LyX-Code
3623 tray[1..n_trays] IS_A vl_equilibrium_tray;
3624 \end_layout
3625
3626 \end_deeper
3627 \begin_layout List
3628 \labelwidthstring 00000.00000.00000.000
3629
3630 \family sans
3631 symbol_constant
3632 \family default
3633
3634 \begin_inset LatexCommand \index{symbol\_constant}
3635
3636 \end_inset
3637
3638 Object with a symbol value.
3639 May be used in determining model structure.
3640 \end_layout
3641
3642 \begin_layout List
3643 \labelwidthstring 00000.00000.00000.000
3644
3645 \family sans
3646 boolean_constant
3647 \family default
3648
3649 \begin_inset LatexCommand \index{boolean\_constant}
3650
3651 \end_inset
3652
3653 Logical value.
3654 May be used in determining model structure.
3655 \end_layout
3656
3657 \begin_layout List
3658 \labelwidthstring 00000.00000.00000.000
3659
3660 \bar under
3661 Setting\InsetSpace ~
3662 constants
3663 \bar default
3664
3665 \begin_inset LatexCommand \index{constants, setting}
3666
3667 \end_inset
3668
3669
3670 \end_layout
3671
3672 \begin_layout List
3673 \labelwidthstring 00000.00000.00000.000
3674 :==
3675 \begin_inset LatexCommand \index{:==}
3676
3677 \end_inset
3678
3679 Constant and set assignment operator.
3680
3681 \end_layout
3682
3683 \begin_deeper
3684 \begin_layout Standard
3685 It is suggested, but not required, that names of all types that refine the
3686 built-in constant types have names that end in _constant.
3687 \end_layout
3688
3689 \begin_layout LyX-Code
3690 LHS_list :== RHS;
3691 \end_layout
3692
3693 \begin_layout Standard
3694 Here it is required that the one or more items in the LHS be of the same
3695 constant type and that RHS is a single-valued expression made up of values,
3696 operators, and other constants.
3697 The
3698 \family typewriter
3699 :==
3700 \family default
3701 is used to make clear to both the user and the system what scalar objects
3702 are constants.
3703
3704 \end_layout
3705
3706 \begin_layout Section
3707 Variables
3708 \begin_inset LatexCommand \index{variables}
3709
3710 \end_inset
3711
3712
3713 \end_layout
3714
3715 \begin_layout Standard
3716 There are four built-in types which may be used to construct variables:
3717 symbol, boolean, integer, and real.
3718 At this time symbol types have special restrictions.
3719 Refinements of these variable base types are defined with the
3720 \family sans
3721 ATOM
3722 \family default
3723 statement.
3724 Atom types may declare attribute fields with types real, integer, boolean,
3725 symbol, and set.
3726 These attributes are
3727 \emph on
3728 not
3729 \emph default
3730 independent objects and therefore cannot be refined, merged, or put in
3731 a refinement clique (
3732 \family sans
3733 ARE_ALIKE
3734 \family default
3735 d).
3736 \end_layout
3737
3738 \end_deeper
3739 \begin_layout List
3740 \labelwidthstring 00000.00000.00000.000
3741
3742 \family sans
3743 ATOM
3744 \family default
3745
3746 \begin_inset LatexCommand \index{ATOM}
3747
3748 \end_inset
3749
3750 The syntax for declaring a new atom type is
3751 \end_layout
3752
3753 \begin_deeper
3754 \begin_layout LyX-Code
3755 ATOM
3756 \emph on
3757 atom_type_name
3758 \emph default
3759 REFINES
3760 \emph on
3761 variable_type
3762 \end_layout
3763
3764 \begin_layout LyX-Code
3765 «DIMENSION
3766 \emph on
3767 dimension_expression
3768 \emph default
3769 »
3770 \end_layout
3771
3772 \begin_layout LyX-Code
3773 «DEFAULT
3774 \emph on
3775 value
3776 \emph default
3777 »; (* note the ; *)
3778 \end_layout
3779
3780 \begin_layout LyX-Code
3781 «
3782 \emph on
3783 initial attribute assignment
3784 \emph default
3785
3786 \end_layout
3787
3788 \begin_layout LyX-Code
3789 END
3790 \emph on
3791 atom_type_name
3792 \emph default
3793 ;
3794 \end_layout
3795
3796 \end_deeper
3797 \begin_layout List
3798 \labelwidthstring 00000.00000.00000.000
3799
3800 \family sans
3801 DEFAULT
3802 \family default
3803
3804 \begin_inset LatexCommand \index{DEFAULT}
3805
3806 \end_inset
3807
3808 ,
3809 \family sans
3810 \InsetSpace ~
3811 DIMENSION
3812 \family default
3813
3814 \begin_inset LatexCommand \index{DIMENSION}
3815
3816 \end_inset
3817
3818 ,\InsetSpace ~
3819 and\InsetSpace ~
3820
3821 \family sans
3822 DIMENSIONLESS
3823 \family default
3824
3825 \begin_inset LatexCommand \index{DIMENSIONLESS}
3826
3827 \end_inset
3828
3829
3830 \end_layout
3831
3832 \begin_deeper
3833 \begin_layout Standard
3834 The
3835 \family sans
3836 DIMENSION
3837 \family default
3838 attribute is for variables whose base type is real.
3839 It is an optional field.
3840 If not defined for any atom with base type real, the dimensions will be
3841 left as undefined.
3842 Any variable which is later declared to be one of these types will be given
3843 wild card dimensionality (represented in the interactive display by an
3844 asterisk (*)).
3845 The system will deduce the dimensionality from its use in the relationships
3846 in which it appears or in the declaring of default values for it, if possible.
3847 \end_layout
3848
3849 \end_deeper
3850 \begin_layout List
3851 \labelwidthstring 00000.00000.00000.000
3852
3853 \family sans
3854 solver_var
3855 \family default
3856
3857 \begin_inset LatexCommand \index{solver\_var}
3858
3859 \end_inset
3860
3861 is a special case of
3862 \family sans
3863 ATOM
3864 \family default
3865 and we will say much more about it in Section
3866 \begin_inset LatexCommand \vref{sub:x.6.1Variables-for-solvers}
3867
3868 \end_inset
3869
3870 .
3871 \end_layout
3872
3873 \begin_deeper
3874 \begin_layout LyX-Code
3875 ATOM solver_var REFINES real DEFAULT 0.5 {?
3876 \begin_inset LatexCommand \index{?}
3877
3878 \end_inset
3879
3880 };
3881 \end_layout
3882
3883 \begin_layout LyX-Code
3884 lower_bound IS_A real;
3885 \end_layout
3886
3887 \begin_layout LyX-Code
3888 upper_bound IS_A real;
3889 \end_layout
3890
3891 \begin_layout LyX-Code
3892 nominal IS_A real;
3893 \end_layout
3894
3895 \begin_layout LyX-Code
3896 fixed IS_A boolean;
3897 \end_layout
3898
3899 \begin_layout LyX-Code
3900 fixed := FALSE;
3901 \end_layout
3902
3903 \begin_layout LyX-Code
3904 lower_bound := -1e20 {?};
3905 \end_layout
3906
3907 \begin_layout LyX-Code
3908 upper_bound := 1e20 {?};
3909 \end_layout
3910
3911 \begin_layout LyX-Code
3912 nominal := 0.5 {?};
3913 \end_layout
3914
3915 \begin_layout LyX-Code
3916 END solver_var;
3917 \end_layout
3918
3919 \begin_layout Standard
3920 The default field is also optional.
3921 If the atom has a declared dimensionality, then this value must be expressed
3922 with units which are compatible with this dimensionality.
3923 In the solver_var example, we see a DEFAULT value of 0.5 with the unspecified
3924 unit
3925 \begin_inset LatexCommand \index{unit, unspecified}
3926
3927 \end_inset
3928
3929
3930 \begin_inset LatexCommand \index{unspecified unit}
3931
3932 \end_inset
3933
3934 {?
3935 \begin_inset LatexCommand \index{}
3936
3937 \end_inset
3938
3939 } which leaves the dimensionality wild
3940 \begin_inset LatexCommand \index{wild dimensionality}
3941
3942 \end_inset
3943
3944 .
3945 \end_layout
3946
3947 \end_deeper
3948 \begin_layout List
3949 \labelwidthstring 00000.00000.00000.000
3950 real
3951 \begin_inset LatexCommand \index{real}
3952
3953 \end_inset
3954
3955 Real valued variable quantity.
3956 At present, all variables that you want to be attended to by solver tools
3957 must be refinements of the type solver_var.
3958 This is so that modifiable parametric values can be included in equations
3959 without treating them as variables.
3960 Strictly speaking, this is a characteristic of the solver interface and
3961 not the ASCEND language.
3962 Each tool in the total ASCEND system may have its own semantics that go
3963 beyond the ASCEND object definition language.
3964 \end_layout
3965
3966 \begin_layout List
3967 \labelwidthstring 00000.00000.00000.000
3968 integer
3969 \begin_inset LatexCommand \index{integer}
3970
3971 \end_inset
3972
3973 Integer valued variable quantity.
3974 We find these mighty convenient for use in certain procedural computations
3975 and as attributes of solver_var atoms.
3976 \end_layout
3977
3978 \begin_layout List
3979 \labelwidthstring 00000.00000.00000.000
3980 boolean
3981 \begin_inset LatexCommand \index{boolean}
3982
3983 \end_inset
3984
3985 Truth valued variable quantity.
3986 These are principally used as flags on solver_vars and relations.
3987 They can also be used procedurally and as variables in logical programming
3988 models, subject to the logical solver tools semantics.
3989 (Compare solver_boolean and boolean_var in Section
3990 \begin_inset LatexCommand \vref{sec:x.6Miscellany}
3991
3992 \end_inset
3993
3994 .)
3995 \end_layout
3996
3997 \begin_layout List
3998 \labelwidthstring 00000.00000.00000.000
3999 symbol
4000 \begin_inset LatexCommand \index{symbol}
4001
4002 \end_inset
4003
4004 Symbol valued variable quantity.
4005 We do not yet have operators for building symbols out of other symbols.
4006 \end_layout
4007
4008 \begin_layout List
4009 \labelwidthstring 00000.00000.00000.000
4010
4011 \bar under
4012 Setting\InsetSpace ~
4013 variables
4014 \bar default
4015
4016 \begin_inset LatexCommand \index{variables, setting}
4017
4018 \end_inset
4019
4020
4021 \end_layout
4022
4023 \begin_layout List
4024 \labelwidthstring 00000.00000.00000.000
4025 :=
4026 \begin_inset LatexCommand \index{:=}
4027
4028 \end_inset
4029
4030 Procedural equals
4031 \begin_inset LatexCommand \index{equals, procedural}
4032
4033 \end_inset
4034
4035 differs from the ordinary equals (=) in that it means the left-hand-side
4036 (LHS) variables are to be assigned the value of the right-hand-side (RHS)
4037 expression when this statement is processed.
4038 Processing happens in the last phase of compiling (instantiation) or when
4039 executing a method interactively through the ASCEND user interface.
4040 The order the system encounters these statements matters, therefore, with
4041 a later result overwriting an earlier one if both statements have the same
4042 the same LHS variable.
4043
4044 \end_layout
4045
4046 \begin_deeper
4047 \begin_layout Standard
4048 Note that variable assignments (also known as defaulting statements) written
4049 in the declarative section are executed only after an instance has been
4050 fully created.
4051 This is a frequent source of confusion and errors, therefore we recommend
4052 that you DO NOT ASSIGN VARIABLES IN THE DECLARATIVE SECTION.
4053
4054 \end_layout
4055
4056 \end_deeper
4057 \begin_layout List
4058 \labelwidthstring 00000.00000.00000.000
4059 Note\InsetSpace ~
4060 that\InsetSpace ~
4061 :=\InsetSpace ~
4062 IS\InsetSpace ~
4063 NOT\InsetSpace ~
4064 =.
4065 \end_layout
4066
4067 \begin_deeper
4068 \begin_layout Standard
4069 We use an ordinary equals (=) when defining a real valued equation to state
4070 that the LHS expression is to equal the RHS expression at the solution
4071 for the model.
4072 We use == for logical equations.
4073 \end_layout
4074
4075 \end_deeper
4076 \begin_layout List
4077 \labelwidthstring 00000.00000.00000.000
4078 \begin_inset Note Note
4079 status open
4080
4081 \begin_layout List
4082 \labelwidthstring 00000.00000.00000.000
4083
4084 \bar under
4085 Tabular\InsetSpace ~
4086 assignments
4087 \bar default
4088
4089 \begin_inset LatexCommand \index{assignments, tabular}
4090
4091 \end_inset
4092
4093 (* 4+ *) Assigning values en masse to arrays of variables that are defined
4094 associatively on sets without order presents a minor challenge.
4095 The solution proposed in ASCEND IV (but not yet implemented as weve not
4096 had time or significant user demand) is to allow a tabular data statement
4097 to be used to assign the elements of arrays of variables or constants.
4098 The DATA statement may be used to assign variables in the declarative or
4099 methods section of a model (though we discourage its use declaratively
4100 for variable initialization) or to assign constant arrays of any type,
4101 including sets, in the declarative section.
4102 Here are some examples:
4103 \end_layout
4104
4105 \begin_layout LyX-Code
4106 DATA ~(* ~4+ ~*)
4107 \end_layout
4108
4109 \begin_deeper
4110 \begin_layout LyX-Code
4111 MODEL tabular_ex;
4112 \end_layout
4113
4114 \begin_layout LyX-Code
4115 lset,rset,cset IS_A set OF integer_constant;
4116 \end_layout
4117
4118 \begin_layout LyX-Code
4119 rset :== [1..3];
4120 \end_layout
4121
4122 \begin_layout LyX-Code
4123 cset :== rset - [2];
4124 \end_layout
4125
4126 \begin_layout LyX-Code
4127 lset :== [5,7];
4128 \end_layout
4129
4130 \begin_layout LyX-Code
4131 a[rset][cset] IS_A real;
4132 \end_layout
4133
4134 \begin_layout LyX-Code
4135 b[lset][cset][rset] IS_A real_constant;
4136 \end_layout
4137
4138 \begin_layout LyX-Code
4139 (* rectangle table *)
4140 \end_layout
4141
4142 \begin_layout LyX-Code
4143 DATA FOR a:
4144 \end_layout
4145
4146 \begin_layout LyX-Code
4147 COLUMNS 1,3; (*order last subscript cset*)
4148 \end_layout
4149
4150 \begin_layout LyX-Code
4151 UNITS {kg/s}, {s}; (* columnar units *)
4152 \end_layout
4153
4154 \begin_layout LyX-Code
4155 (* give leading subscripts *)
4156 \end_layout
4157
4158 \begin_layout LyX-Code
4159 [1] 2.8, 0.3;
4160 \end_layout
4161
4162 \begin_layout LyX-Code
4163 [2] 2.7, 1.3;
4164 \end_layout
4165
4166 \begin_layout LyX-Code
4167 [3] 3.3, 0.6;
4168 \end_layout
4169
4170 \begin_layout LyX-Code
4171 END DATA;
4172 \end_layout
4173
4174 \begin_layout LyX-Code
4175 (* 2 layer rectangle table *)
4176 \end_layout
4177
4178 \begin_layout LyX-Code
4179 CONSTANT DATA FOR b:
4180 \end_layout
4181
4182 \begin_layout LyX-Code
4183 COLUMNS 1..3; (* order last subscript
4184 \end_layout
4185
4186 \begin_layout LyX-Code
4187 rset *)
4188 \end_layout
4189
4190 \begin_layout LyX-Code
4191 (* UNITS omitted, so either the user gives
4192 \end_layout
4193
4194 \begin_layout LyX-Code
4195 value in the table or values given are
4196 \end_layout
4197
4198 \begin_layout LyX-Code
4199 DIMENSIONLESS.
4200 *)
4201 \end_layout
4202
4203 \begin_layout LyX-Code
4204 (* ordering over [lset][cset] required *)
4205 \end_layout
4206
4207 \begin_layout LyX-Code
4208 [5][1] 3 {m}, 2{m}, 1{m};
4209 \end_layout
4210
4211 \begin_layout LyX-Code
4212 [5][3] 0.1, 0.2, 0.3;
4213 \end_layout
4214
4215 \begin_layout LyX-Code
4216 [7][1] -3 {m/s}, -2{m/s}, -1{m/s};
4217 \end_layout
4218
4219 \begin_layout LyX-Code
4220 [7][3] 4.1 {1/s}, 4.2 {1/s}, 4.3 {1/s};
4221 \end_layout
4222
4223 \begin_layout LyX-Code
4224 END DATA;
4225 \end_layout
4226
4227 \begin_layout LyX-Code
4228 END tabular_ex;
4229 \end_layout
4230
4231 \begin_layout Standard
4232 For sparse arrays of variables or constants, the COLUMNS and (possibly)
4233 UNITS keywords are omitted and the array subscripts are simply enumerated
4234 along with the values to be assigned.
4235 \end_layout
4236
4237 \end_inset
4238
4239
4240 \end_layout
4241
4242 \begin_deeper
4243 \begin_layout Standard
4244
4245 \end_layout
4246
4247 \begin_layout Section
4248 Relations
4249 \begin_inset LatexCommand \index{relations}
4250
4251 \end_inset
4252
4253
4254 \end_layout
4255
4256 \end_deeper
4257 \begin_layout List
4258 \labelwidthstring 00000.00000.00000.000
4259
4260 \bar under
4261 Mathematical\InsetSpace ~
4262 expression
4263 \begin_inset LatexCommand \index{mathematical expression}
4264
4265 \end_inset
4266
4267
4268 \begin_inset LatexCommand \index{expression, math}
4269
4270 \end_inset
4271
4272 :
4273 \end_layout
4274
4275 \begin_deeper
4276 \begin_layout Standard
4277 The syntax for a mathematical expression is any legal combination of variable
4278 names and arithmetic operators in the normal notation.
4279 An expression may contain any number of matched rounded parentheses, (),
4280 to clarify meaning.
4281 The following is a legal arithmetic expression:
4282 \end_layout
4283
4284 \begin_layout LyX-Code
4285 y^2+(sin(x)-tan(z))*q
4286 \end_layout
4287
4288 \begin_layout Standard
4289 Each additive term in a mathematical expression (terms are separated by
4290 + or - operators) must have the same dimensionality.
4291 \end_layout
4292
4293 \begin_layout Standard
4294 An expression may contain an index variable as a part of the calculation
4295 if that index variable is over a set whose elements are of type integer.
4296 (See the
4297 \family sans
4298 FOR/CREATE
4299 \family default
4300 and
4301 \family sans
4302 FOR/DO
4303 \family default
4304 statements below.) An example is:
4305 \end_layout
4306
4307 \begin_layout LyX-Code
4308 term[i] = a[i]*x^(i-1);
4309 \end_layout
4310
4311 \end_deeper
4312 \begin_layout List
4313 \labelwidthstring 00000.00000.00000.000
4314
4315 \bar under
4316 Numerical\InsetSpace ~
4317 relations
4318 \bar default
4319
4320 \begin_inset LatexCommand \index{relations, numerical}
4321
4322 \end_inset
4323
4324
4325 \begin_inset LatexCommand \index{numerical relations}
4326
4327 \end_inset
4328
4329
4330 \end_layout
4331
4332 \begin_deeper
4333 \begin_layout Standard
4334 The syntax for a numeric relation is either
4335 \end_layout
4336
4337 \begin_layout LyX-Code
4338
4339 \emph on
4340 optional_label
4341 \emph default
4342 :
4343 \emph on
4344 LHS relational_operator RHS
4345 \emph default
4346 ;
4347 \end_layout
4348
4349 \begin_layout Standard
4350 or
4351 \end_layout
4352
4353 \begin_layout LyX-Code
4354
4355 \emph on
4356 optional_label
4357 \emph default
4358 :
4359 \emph on
4360 objective_type LHS
4361 \emph default
4362 ;
4363 \end_layout
4364
4365 \begin_layout Standard
4366 Objective_type is either
4367 \family sans
4368 MAXIMIZE
4369 \family default
4370 or
4371 \family sans
4372 MINIMIZE
4373 \family default
4374 .
4375 RHS and LHS must be one or more variables, constants, and operators in
4376 a normal algebraic expression.
4377 The operators allowed are defined below and in Section
4378 \begin_inset LatexCommand \vref{sub:x.6.3Single-operand-real}
4379
4380 \end_inset
4381
4382 .
4383 Variable integers, booleans, and symbols are not allowed as operands in
4384 numerical relations, nor are boolean constants.
4385 Integer indices declared in
4386 \family sans
4387 FOR/CREATE
4388 \family default
4389 loops are allowed in relations, and they are treated as integer constants.
4390 \end_layout
4391
4392 \end_deeper
4393 \begin_layout List
4394 \labelwidthstring 00000.00000.00000.000
4395
4396 \bar under
4397 Relational\InsetSpace ~
4398 operators
4399 \begin_inset LatexCommand \index{operators, relational}
4400
4401 \end_inset
4402
4403
4404 \begin_inset LatexCommand \index{relational operators}
4405
4406 \end_inset
4407
4408 :
4409 \end_layout
4410
4411 \begin_layout List
4412 \labelwidthstring 00000.00000.00000.000
4413 =
4414 \begin_inset LatexCommand \index{=}
4415
4416 \end_inset
4417
4418 ,\InsetSpace ~
4419 >=
4420 \begin_inset LatexCommand \index{ >=}
4421
4422 \end_inset
4423
4424 ,\InsetSpace ~
4425 <=
4426 \begin_inset LatexCommand \index{<=}
4427
4428 \end_inset
4429
4430 ,\InsetSpace ~
4431 <
4432 \begin_inset LatexCommand \index{<}
4433
4434 \end_inset
4435
4436 ,\InsetSpace ~
4437 >
4438 \begin_inset LatexCommand \index{>}
4439
4440 \end_inset
4441
4442 ,\InsetSpace ~
4443 <>
4444 \begin_inset LatexCommand \index{<>}
4445
4446 \end_inset
4447
4448 These are the numerical relational operators for declarative use.
4449 \end_layout
4450
4451 \begin_deeper
4452 \begin_layout LyX-Code
4453 Ftot*y['methane'] = m['methane'];
4454 \end_layout
4455
4456 \begin_layout LyX-Code
4457 y['ethanol'] >= 0;
4458 \end_layout
4459
4460 \begin_layout Standard
4461 Equations must be dimensionally correct.
4462 \end_layout
4463
4464 \end_deeper
4465 \begin_layout List
4466 \labelwidthstring 00000.00000.00000.000
4467
4468 \family sans
4469 MAXIMIZE
4470 \family default
4471
4472 \begin_inset LatexCommand \index{MAXIMIZE}
4473
4474 \end_inset
4475
4476 ,\InsetSpace ~
4477
4478 \family sans
4479 MINIMIZE
4480 \family default
4481
4482 \begin_inset LatexCommand \index{MINIMIZE}
4483
4484 \end_inset
4485
4486
4487 \end_layout
4488
4489 \begin_deeper
4490 \begin_layout Standard
4491 Objective function indicators.
4492
4493 \end_layout
4494
4495 \end_deeper
4496 \begin_layout List
4497 \labelwidthstring 00000.00000.00000.000
4498
4499 \bar under
4500 Binary\InsetSpace ~
4501 Operators
4502 \begin_inset LatexCommand \index{operators, binary}
4503
4504 \end_inset
4505
4506
4507 \begin_inset LatexCommand \index{binary operators}
4508
4509 \end_inset
4510
4511 :
4512 \bar default
4513 +, -, *, /, ^.
4514 We follow the usual algebraic order of operations for binary operators.
4515 \end_layout
4516
4517 \begin_layout List
4518 \labelwidthstring 00000.00000.00000.000
4519 +
4520 \begin_inset LatexCommand \index{+, binary math}
4521
4522 \end_inset
4523
4524 Plus.
4525 Numerical addition or set union.
4526 \end_layout
4527
4528 \begin_layout List
4529 \labelwidthstring 00000.00000.00000.000
4530 -
4531 \begin_inset LatexCommand \index{-, binary math}
4532
4533 \end_inset
4534
4535 Minus.
4536 Numerical subtraction or set difference.
4537 \end_layout
4538
4539 \begin_layout List
4540 \labelwidthstring 00000.00000.00000.000
4541 *
4542 \begin_inset LatexCommand \index{*, binary math}
4543
4544 \end_inset
4545
4546 Times.
4547 Numerical multiplication or set intersection.
4548 \end_layout
4549
4550 \begin_layout List
4551 \labelwidthstring 00000.00000.00000.000
4552 /
4553 \begin_inset LatexCommand \index{/}
4554
4555 \end_inset
4556
4557 Divide.
4558 Numeric division.
4559 In most cases it implies real division and not integer division.
4560 \end_layout
4561
4562 \begin_layout List
4563 \labelwidthstring 00000.00000.00000.000
4564 ^ Power
4565 \begin_inset LatexCommand \index{power}
4566
4567 \end_inset
4568
4569 .
4570 Numeric exponentiation.
4571 If the value of y in x^y is not integer, then x must be greater than 0.0
4572 and dimensionless.
4573 \end_layout
4574
4575 \begin_layout List
4576 \labelwidthstring 00000.00000.00000.000
4577
4578 \bar under
4579 Unary\InsetSpace ~
4580 Operators
4581 \begin_inset LatexCommand \index{operators, unary}
4582
4583 \end_inset
4584
4585
4586 \begin_inset LatexCommand \index{unary operators}
4587
4588 \end_inset
4589
4590 :
4591 \bar default
4592 -
4593 \begin_inset LatexCommand \index{-, unary}
4594
4595 \end_inset
4596
4597 , ordered_function()
4598 \end_layout
4599
4600 \begin_layout List
4601 \labelwidthstring 00000.00000.00000.000
4602 - Unary minus.
4603 Numeric negation.
4604 There is no unary +
4605 \begin_inset LatexCommand \index{+, math unary}
4606
4607 \end_inset
4608
4609 operator.
4610 \end_layout
4611
4612 \begin_layout List
4613 \labelwidthstring 00000.00000.00000.000
4614
4615 \family typewriter
4616 ordered_function
4617 \begin_inset LatexCommand \index{ordered\_function}
4618
4619 \end_inset
4620
4621 ()
4622 \family default
4623 unary real valued functions.
4624 The unary real functions we support are given in section Section
4625 \begin_inset LatexCommand \vref{sub:x.6.3Single-operand-real}
4626
4627 \end_inset
4628
4629 .
4630 \end_layout
4631
4632 \begin_layout List
4633 \labelwidthstring 00000.00000.00000.000
4634 Real\InsetSpace ~
4635 functions\InsetSpace ~
4636 of\InsetSpace ~
4637 sets\InsetSpace ~
4638 of\InsetSpace ~
4639 real\InsetSpace ~
4640 terms:
4641 \end_layout
4642
4643 \begin_layout List
4644 \labelwidthstring 00000.00000.00000.000
4645
4646 \family sans
4647 SUM
4648 \family default
4649
4650 \begin_inset LatexCommand \index{SUM}
4651
4652 \end_inset
4653
4654
4655 \family typewriter
4656 [term\InsetSpace ~
4657 set]
4658 \family default
4659 Add all expressions in the functions list.
4660 \end_layout
4661
4662 \begin_deeper
4663 \begin_layout Standard
4664 For the
4665 \family sans
4666 SUM
4667 \family default
4668 , the base type real items can be arbitrary arithmetic expressions.
4669 The resulting items must all be dimensionally compatible.
4670 \end_layout
4671
4672 \begin_layout Standard
4673 An examples of the use is:
4674 \end_layout
4675
4676 \begin_layout LyX-Code
4677 SUM[y[components]] = 1;
4678 \end_layout
4679
4680 \begin_layout Standard
4681 or, equivalently, one could write:
4682 \end_layout
4683
4684 \begin_layout LyX-Code
4685 SUM[y[i] | i IN components] = 1;
4686 \end_layout
4687
4688 \end_deeper
4689 \begin_layout List
4690 \labelwidthstring 00000.00000.00000.000
4691
4692 \bar under
4693 Empty\InsetSpace ~
4694
4695 \family sans
4696 SUM
4697 \family default
4698 \InsetSpace ~
4699 yields\InsetSpace ~
4700 wildcard\InsetSpace ~
4701
4702 \family typewriter
4703 0
4704 \family default
4705 .
4706 \end_layout
4707
4708 \begin_deeper
4709 \begin_layout Standard
4710 When a
4711 \family sans
4712 SUM
4713 \family default
4714 is compiled over a list which is empty it generates a wildcard-dimensioned
4715
4716 \family typewriter
4717 0
4718 \family default
4719 .
4720 This will sometimes cause our dimension checking routines to fail.
4721 The best way to prevent this is to make sure the SUM never actually encounters
4722 an empty list.
4723 For example:
4724 \end_layout
4725
4726 \begin_layout LyX-Code
4727 SUM[Q[possibly_empty_set], 0{watt}];
4728 \end_layout
4729
4730 \begin_layout Standard
4731 In the above, the variables
4732 \family typewriter
4733 Q[i]
4734 \family default
4735 (if they exist) have the dimensionality associated with an energy rate.
4736 When the set is empty, the
4737 \family typewriter
4738 0
4739 \family default
4740 is the only term in the
4741 \family sans
4742 SUM
4743 \family default
4744 and establishes the dimensionality of the result.
4745 When the set is
4746 \emph on
4747 not
4748 \emph default
4749 empty the compiler will simplify away the trailing
4750 \family typewriter
4751 0
4752 \family default
4753 in the sum.
4754 \end_layout
4755
4756 \end_deeper
4757 \begin_layout List
4758 \labelwidthstring 00000.00000.00000.000
4759 PROD
4760 \begin_inset LatexCommand \index{PROD}
4761
4762 \end_inset
4763
4764 [term\InsetSpace ~
4765 set] Multiply all the expressions in the products list.
4766 The product of an empty list is a dimensionless value, 1.0.
4767 \end_layout
4768
4769 \begin_layout List
4770 \labelwidthstring 00000.00000.00000.000
4771
4772 \bar under
4773 Possible\InsetSpace ~
4774 future\InsetSpace ~
4775 functions:
4776 \end_layout
4777
4778 \begin_deeper
4779 \begin_layout Standard
4780 (Not implemented - only under confused consideration at this time.) The following
4781 functions only work in methods as they are not smooth function and would
4782 destroy a Newton-based solution algorithm if used in defining a model equation:
4783 \begin_inset Note Note
4784 status open
4785
4786 \begin_layout Standard
4787 Clarification required
4788 \end_layout
4789
4790 \end_inset
4791
4792
4793 \end_layout
4794
4795 \end_deeper
4796 \begin_layout List
4797 \labelwidthstring 00000.00000.00000.000
4798 MAX
4799 \begin_inset LatexCommand \index{MAX}
4800
4801 \end_inset
4802
4803 [term\InsetSpace ~
4804 set] (* 4+ *) maximum value on list of arguments
4805 \end_layout
4806
4807 \begin_layout List
4808 \labelwidthstring 00000.00000.00000.000
4809 MIN
4810 \begin_inset LatexCommand \index{MIN}
4811
4812 \end_inset
4813
4814 [term\InsetSpace ~
4815 set] (* 4+ *) minimum value on list of arguments
4816 \end_layout
4817
4818 \begin_deeper
4819 \begin_layout Standard
4820 \begin_inset Note Note
4821 status open
4822
4823 \begin_layout Section
4824 Derivatives
4825 \begin_inset LatexCommand \index{derivatives}
4826
4827 \end_inset
4828
4829 in relations
4830 \end_layout
4831
4832 \begin_layout Standard
4833 Simply put, we would like to have general partial and full derivatives usable
4834 in writing equations, as there are many mathematically interesting things
4835 that can be said about both.
4836 We have not implemented such things yet for lack of time and because with
4837 several implementations (see gPROMS and OMOLA, among others) already out
4838 there we cant see too many research points to be gained by more derivative
4839 work.
4840 \end_layout
4841
4842 \end_inset
4843
4844
4845 \end_layout
4846
4847 \begin_layout Section
4848 External relations
4849 \begin_inset LatexCommand \index{relations, external}
4850
4851 \end_inset
4852
4853
4854 \begin_inset LatexCommand \index{external relations}
4855
4856 \end_inset
4857
4858
4859 \end_layout
4860
4861 \begin_layout Standard
4862 We cannot document these at the present time.
4863 Some details are available in Kirk Abbott's thesis
4864 \begin_inset LatexCommand \cite{Abbott1996a}
4865
4866 \end_inset
4867
4868 , or check the wiki at
4869 \family sans
4870 http://ascendwiki.cheme.cmu.edu/
4871 \end_layout
4872
4873 \begin_layout Section
4874 Conditional modelling
4875 \begin_inset LatexCommand \index{relations, conditional}
4876
4877 \end_inset
4878
4879
4880 \begin_inset LatexCommand \index{conditional relations}
4881
4882 \end_inset
4883
4884
4885 \end_layout
4886
4887 \begin_layout Subsection
4888 Conditional relations
4889 \end_layout
4890
4891 \begin_layout Standard
4892 The syntax is
4893 \end_layout
4894
4895 \begin_layout LyX-Code
4896 CONDITIONAL
4897 \end_layout
4898
4899 \begin_layout LyX-Code
4900
4901 \emph on
4902 list_of_relation_statements
4903 \end_layout
4904
4905 \begin_layout LyX-Code
4906 END CONDITIONAL;
4907 \end_layout
4908
4909 \begin_layout Standard
4910 A
4911 \family sans
4912 CONDITIONAL
4913 \family default
4914 statement can appear anywhere in the declarative portion of the model and
4915 it contains only relations to be used as boundaries.
4916 That is, these real arithmetic equations are used in expressing logical
4917 condition equations via the
4918 \family sans
4919 SATISFIED
4920 \family default
4921 operator.
4922 \end_layout
4923
4924 \begin_layout Subsection
4925 Logical relations
4926 \end_layout
4927
4928 \end_deeper
4929 \begin_layout List
4930 \labelwidthstring 00000.00000.00000.000
4931
4932 \bar under
4933 Logical\InsetSpace ~
4934 expression
4935 \bar default
4936
4937 \begin_inset LatexCommand \index{expression, logical}
4938
4939 \end_inset
4940
4941
4942 \begin_inset LatexCommand \index{logical expression}
4943
4944 \end_inset
4945
4946 An expression whose value is
4947 \family sans
4948 TRUE
4949 \family default
4950 or
4951 \family sans
4952 FALSE
4953 \family default
4954 is a logical expression.
4955 Such expressions may contain boolean variables.
4956 If A,B, and laminar are boolean, then the following is a logical expression:
4957 \end_layout
4958
4959 \begin_deeper
4960 \begin_layout LyX-Code
4961 A + (B * laminar)
4962 \end_layout
4963
4964 \begin_layout Standard
4965 as is (and probably more clearly)
4966 \end_layout
4967
4968 \begin_layout LyX-Code
4969 A OR (B AND laminar)
4970 \end_layout
4971
4972 \begin_layout Standard
4973 The plus operator acts like an OR among the terms while the times operator
4974 acts like an
4975 \family sans
4976 AND
4977 \family default
4978 .
4979 Think of
4980 \family sans
4981 TRUE
4982 \family default
4983 being equal to 1 and
4984 \family sans
4985 FALSE
4986 \family default
4987 being equal to 0 with the 1+1=0+1=1+0=1, 0+0=0, 1*1=1 and 0*1=1*0=0*0=0.
4988 If A =
4989 \family sans
4990 FALSE
4991 \family default
4992 , B=
4993 \family sans
4994 TRUE
4995 \family default
4996 and laminar is
4997 \family sans
4998 TRUE
4999 \family default
5000 , this expression has the value
5001 \end_layout
5002
5003 \begin_layout LyX-Code
5004 FALSE OR (TRUE AND TRUE) -->TRUE
5005 \end_layout
5006
5007 \begin_layout Standard
5008 or in terms of ones and zeros
5009 \end_layout
5010
5011 \begin_layout LyX-Code
5012 0 + (1 * 1) --> 1.
5013 \end_layout
5014
5015 \begin_layout Standard
5016 Logical relations are then made by putting together logical expressions
5017 with the boolean relational operators
5018 \family typewriter
5019 ==
5020 \family default
5021 and
5022 \family typewriter
5023 !=
5024 \family default
5025 .
5026 Since we have no logical solving engine we have not pushed the implementation
5027 of logical relations very hard yet.
5028 \end_layout
5029
5030 \begin_layout Section
5031
5032 \family sans
5033 NOTES
5034 \family default
5035
5036 \begin_inset LatexCommand \index{NOTES}
5037
5038 \end_inset
5039
5040
5041 \end_layout
5042
5043 \begin_layout Standard
5044 Within a
5045 \family sans
5046 MODEL
5047 \family default
5048 (or
5049 \family sans
5050 METHOD
5051 \family default
5052 ) definition annotations (hereafter called notes) may be made on a part
5053 declared in the
5054 \family sans
5055 MODEL
5056 \family default
5057 , or on the
5058 \family sans
5059 MODEL
5060 \family default
5061 (or
5062 \family sans
5063 METHOD
5064 \family default
5065 ) itself.
5066 Short notes may be made when defining or refining an object by enclosing
5067 the note in double quotes (
5068 \family typewriter
5069 "
5070 \family default
5071 ).
5072 Longer notes may be made in a block statement.
5073 \end_layout
5074
5075 \begin_layout Standard
5076 Each note is entered in a database with the name of the file, name of
5077 \family sans
5078 MODEL
5079 \family default
5080 , name of
5081 \family sans
5082 METHOD
5083 \family default
5084 if applicable, and the language (a kind of keyword) in which the note is
5085 written.
5086 Users, user interfaces, and other programs may query this database for
5087 information on models and simulations.
5088 The block notes may include code fragments in other languages that you
5089 wish to embed in your
5090 \family sans
5091 MODEL
5092 \family default
5093 or any other kind of text.
5094 \end_layout
5095
5096 \begin_layout Standard
5097 Short notes should be included as you write any model to clarify the roles
5098 of parts and variables.
5099 All short notes have the language 'inline.' Here are some examples of short
5100 notes:
5101 \end_layout
5102
5103 \begin_layout LyX-Code
5104 L[1..10] "L[i] is the length of the ith rod"
5105 \end_layout
5106
5107 \begin_layout LyX-Code
5108 IS_A distance;
5109 \end_layout
5110
5111 \begin_layout LyX-Code
5112 thetaM "angle between horizon and moon",
5113 \end_layout
5114
5115 \begin_layout LyX-Code
5116 thetaJ "angle between horizon and jupiter"
5117 \end_layout
5118
5119 \begin_layout LyX-Code
5120 IS_A angle;
5121 \end_layout
5122
5123 \begin_layout LyX-Code
5124 car.tires "using car in Minnesota, you betcha"
5125 \end_layout
5126
5127 \begin_layout LyX-Code
5128 IS_REFINED_TO snow_tire;
5129 \end_layout
5130
5131 \begin_layout Standard
5132 In the second
5133 \family sans
5134 IS_A
5135 \family default
5136 statement concerning two angles, we see that a short note in double quotes
5137 goes with the name immediately to its left.
5138 We also see that the note comes before the comma if the name is part of
5139 a list of names.
5140 In the third statement, we see that not only simple names but also qualified
5141 names may be annotated.
5142
5143 \end_layout
5144
5145 \begin_layout Standard
5146 Longer notes are made in block statements of the form below.
5147 These blocks can appear in a
5148 \family sans
5149 METHOD
5150 \family default
5151 or
5152 \family sans
5153 MODEL
5154 \family default
5155 .
5156 These blocks can also be written separately before or after a model as
5157 we shall see.
5158 \end_layout
5159
5160 \begin_layout LyX-Code
5161 NOTES
5162 \end_layout
5163
5164 \begin_layout LyX-Code
5165 'language or keyword' list.of, names {
5166 \end_layout
5167
5168 \begin_layout LyX-Code
5169 free-form block of text to store in the
5170 \end_layout
5171
5172 \begin_layout LyX-Code
5173 database exactly as written.
5174 \end_layout
5175
5176 \begin_layout LyX-Code
5177 }
5178 \end_layout
5179
5180 \begin_layout LyX-Code
5181 some.other.name {
5182 \end_layout
5183
5184 \begin_layout LyX-Code
5185 this note has the same language or keyword as
5186 \end_layout
5187
5188 \begin_layout LyX-Code
5189 the first since we didn't define a new keyword
5190 \end_layout
5191
5192 \begin_layout LyX-Code
5193 in single quotes before the name list.
5194 \end_layout
5195
5196 \begin_layout LyX-Code
5197 }
5198 \end_layout
5199
5200 \begin_layout LyX-Code
5201 'another language' some.other.name {
5202 \end_layout
5203
5204 \begin_layout LyX-Code
5205 en espanol
5206 \end_layout
5207
5208 \begin_layout LyX-Code
5209 }
5210 \end_layout
5211
5212 \begin_layout LyX-Code
5213 'fortran' SELF {
5214 \end_layout
5215
5216 \begin_layout LyX-Code
5217 This model should be solved with subroutine
5218 \end_layout
5219
5220 \begin_layout LyX-Code
5221 LSODE.
5222 \end_layout
5223
5224 \begin_layout LyX-Code
5225 This note demonstrates that "SELF" can be used
5226 \end_layout
5227
5228 \begin_layout LyX-Code
5229 to annotate the entire model instead of a
5230 \end_layout
5231
5232 \begin_layout LyX-Code
5233 named part.
5234 \end_layout
5235
5236 \begin_layout LyX-Code
5237 }
5238 \end_layout
5239
5240 \begin_layout LyX-Code
5241 END NOTES;
5242 \end_layout
5243
5244 \begin_layout Standard
5245 Notes made outside the scope of a model definition look like one of the
5246 following:
5247 \end_layout
5248
5249 \begin_layout LyX-Code
5250 ADD NOTES IN name_of_model;
5251 \end_layout
5252
5253 \begin_layout LyX-Code
5254 'language or keyword' list.of, names {
5255 \end_layout
5256
5257 \begin_layout LyX-Code
5258 more text
5259 \end_layout
5260
5261 \begin_layout LyX-Code
5262 } (* more than one note may be made in this
5263 \end_layout
5264
5265 \begin_layout LyX-Code
5266 block if desired.
5267 *)
5268 \end_layout
5269
5270 \begin_layout LyX-Code
5271 END NOTES;
5272 \end_layout
5273
5274 \begin_layout LyX-Code
5275 ADD NOTES IN name_of_model METHOD name_of_method;
5276 \end_layout
5277
5278 \begin_layout LyX-Code
5279 'language or keyword' SELF {
5280 \end_layout
5281
5282 \begin_layout LyX-Code
5283 This method proves Fermat's last theorem and
5284 \end_layout
5285
5286 \begin_layout LyX-Code
5287 makes toast.
5288 \end_layout
5289
5290 \begin_layout LyX-Code
5291 }
5292 \end_layout
5293
5294 \begin_layout LyX-Code
5295 'humor' SELF {
5296 \end_layout
5297
5298 \begin_layout LyX-Code
5299 ASCEND is not expected to make either proving
5300 \end_layout
5301
5302 \begin_layout LyX-Code
5303 FLT or toasting possible.
5304 \end_layout
5305
5306 \begin_layout LyX-Code
5307 }
5308 \end_layout
5309
5310 \begin_layout LyX-Code
5311 END NOTES;
5312 \end_layout
5313
5314 \begin_layout Standard
5315 We can add notes to the database before or after defining the annotated
5316 model.
5317 This is handy for several reasons including:
5318 \end_layout
5319
5320 \begin_layout Itemize
5321 Lengthy notes mixed with model and method code can make that code very hard
5322 to read.
5323
5324 \end_layout
5325
5326 \begin_layout Itemize
5327 Separate notes describing a family of models can be loaded and browsed before
5328 loading that library family.
5329 \end_layout
5330
5331 \begin_layout Itemize
5332 Users other than the author of a model can annotate that model without fear
5333 of introducing typographical errors into the model.
5334 \end_layout
5335
5336 \begin_layout Standard
5337 These advantages come with a disadvantage that all documentation has.
5338 If you change the model, you ought to change the documentation at the same
5339 time.
5340 To make finding these documentation locations in need of change easier,
5341 the name of the file containing each note is included in the loaded database.
5342 \end_layout
5343
5344 \begin_layout Standard
5345 Experience has shown that even documentation embedded directly in models
5346 or in other computer programs gets out-dated if the person changing the
5347 program is in a hurry and is not required to document properly as part
5348 of the task at hand.
5349 Neither ASCEND nor any other software system can eliminate the garbage
5350 code and documentation that results from undisciplined modeling.
5351 \end_layout
5352
5353 \begin_layout Chapter
5354 Declarative statements
5355 \begin_inset LatexCommand \index{statements, declarative}
5356
5357 \end_inset
5358
5359
5360 \begin_inset LatexCommand \index{declarative statements}
5361
5362 \end_inset
5363
5364
5365 \begin_inset LatexCommand \label{sec:x.3Declarative-statements}
5366
5367 \end_inset
5368
5369
5370 \end_layout
5371
5372 \begin_layout Standard
5373 We have already seen several examples that included declarative statements.
5374 Here we will be more systematic in defining things.
5375 The statements we describe are legal within the declarative portion of
5376 an
5377 \family sans
5378 ATOM
5379 \family default
5380 or
5381 \family sans
5382 MODEL
5383 \family default
5384 definition.
5385 The declarative portion stops at the keyword
5386 \family sans
5387 METHODS
5388 \family default
5389 if it is present in the definition or at the end of the definition.
5390 \end_layout
5391
5392 \end_deeper
5393 \begin_layout List
5394 \labelwidthstring 00000.00000.00000.000
5395
5396 \bar under
5397 Statements
5398 \bar default
5399
5400 \begin_inset LatexCommand \index{statements}
5401
5402 \end_inset
5403
5404 Statements in ASCEND terminate with a semicolon (
5405 \family typewriter
5406 ;
5407 \family default
5408 ).
5409 Statements may extend over any number of lines.
5410 They may have blank lines in the middle of them.
5411 There may be several statements on a single line.
5412
5413 \end_layout
5414
5415 \begin_layout List
5416 \labelwidthstring 00000.00000.00000.000
5417
5418 \bar under
5419 Compound\InsetSpace ~
5420 statements
5421 \bar default
5422
5423 \begin_inset LatexCommand \index{statements, compound}
5424
5425 \end_inset
5426
5427
5428 \begin_inset LatexCommand \index{compound statements}
5429
5430 \end_inset
5431
5432 Some statements in ASCEND can contain other statements as a part of them.
5433 The declarative compound statements are the
5434 \family sans
5435 ALIASES
5436 \family default
5437 /
5438 \family sans
5439 IS_A
5440 \family default
5441 ,
5442 \family sans
5443 CONDITIONAL
5444 \family default
5445 ,
5446 \family sans
5447 FOR/CREATE
5448 \family default
5449 ,
5450 \family sans
5451 SELECT/CASE
5452 \family default
5453 , and
5454 \family sans
5455 WHEN/CASE
5456 \family default
5457 statements.
5458 The procedural compound statements allowed only in methods are the
5459 \family sans
5460 FOR/DO
5461 \family default
5462 ,
5463 \family sans
5464 FOR/CHECK
5465 \family default
5466 ,
5467 \family sans
5468 SWITCH
5469 \family default
5470 and the
5471 \family sans
5472 IF
5473 \family default
5474 statements.
5475 Compound statements end with "
5476 \family sans
5477 END
5478 \family default
5479
5480 \family typewriter
5481 word
5482 \family default
5483 ;", where word matches the beginning of the syntax block, e.g.
5484
5485 \family sans
5486 END FOR
5487 \family default
5488 .and they can be nested, with some exceptions which are noted later.
5489
5490 \end_layout
5491
5492 \begin_layout List
5493 \labelwidthstring 00000.00000.00000.000
5494
5495 \family sans
5496 \bar under
5497 CASE
5498 \family default
5499 \InsetSpace ~
5500 statements
5501 \bar default
5502
5503 \begin_inset LatexCommand \index{statements, CASE}
5504
5505 \end_inset
5506
5507
5508 \begin_inset LatexCommand \index{CASE statements}
5509
5510 \end_inset
5511
5512
5513 \family sans
5514 WHEN/CASE
5515 \family default
5516 ,
5517 \family sans
5518 CONDITIONAL
5519 \family default
5520 , and
5521 \family sans
5522 SELECT/CASE
5523 \family default
5524 handle modeling alternatives within a single definition.
5525 The easy way to remember the difference is that the first picks which equations
5526 to solve
5527 \family sans
5528 WHEN
5529 \family default
5530 discrete variables have certain values, while the second
5531 \family sans
5532 SELECT
5533 \family default
5534 s which statements to compile based on discrete constants.
5535 SWITCH statements handle flow of control in methods, in a slightly more
5536 generalized form than the C language switch statement.
5537 \end_layout
5538
5539 \begin_layout List
5540 \labelwidthstring 00000.00000.00000.000
5541 Type\InsetSpace ~
5542 declarations
5543 \begin_inset LatexCommand \index{declarations, type}
5544
5545 \end_inset
5546
5547
5548 \begin_inset LatexCommand \index{yype declarations}
5549
5550 \end_inset
5551
5552 are not compound statements.
5553 \end_layout
5554
5555 \begin_deeper
5556 \begin_layout Standard
5557
5558 \family sans
5559 MODEL
5560 \family default
5561 and
5562 \family sans
5563 ATOM
5564 \family default
5565 type definitions and
5566 \family sans
5567 METHOD
5568 \family default
5569 definitions are not really compound statements because they require a name
5570 following their
5571 \family sans
5572 END
5573 \family default
5574 word that matches the name given at the beginning of the definition.
5575 These definitions cannot be nested.
5576 \end_layout
5577
5578 \end_deeper
5579 \begin_layout List
5580 \labelwidthstring 00000.00000.00000.000
5581 ASCEND\InsetSpace ~
5582 operator\InsetSpace ~
5583 synopses:
5584 \end_layout
5585
5586 \begin_deeper
5587 \begin_layout Standard
5588 Well start with an extremely brief synopsis of what each does and then give
5589 detailed descriptions.
5590 It is helpful to remember that an instance may have many names, even in
5591 the same scope, but each name may only be defined once.
5592 \end_layout
5593
5594 \end_deeper
5595 \begin_layout List
5596 \labelwidthstring 00000.00000.00000.000
5597
5598 \family sans
5599 IS_A
5600 \family default
5601
5602 \begin_inset LatexCommand \index{IS\_A}
5603
5604 \end_inset
5605
5606 Constructor.
5607 Calls for one or more named instances to be compiled using the type specified.
5608 If the type is one that requires parameters, the parameters must be supplied
5609 in
5610 \family typewriter
5611 ()
5612 \family default
5613 following the type name.
5614 \end_layout
5615
5616 \begin_layout List
5617 \labelwidthstring 00000.00000.00000.000
5618
5619 \family sans
5620 IS_REFINED_TO
5621 \family default
5622
5623 \begin_inset LatexCommand \index{IS\_REFINED\_TO}
5624
5625 \end_inset
5626
5627 Reconstructor.
5628 Causes the already compiled instance(s) named to have their type changed
5629 to a more refined type.
5630 This causes an incremental recompilation of the instance(s).
5631
5632 \family sans
5633 IS_REFINED_TO
5634 \family default
5635 is not a redefinition of the named instances because refinement can only
5636 add compatible information.
5637 The instances retain all the structure that originally defined them.
5638 If the type being refined to requires arguments, these must be supplied,
5639 even if the same arguments were required in the
5640 \family sans
5641 IS_A
5642 \family default
5643 of the originally less refined declaration of the instance.
5644
5645 \end_layout
5646
5647 \begin_layout List
5648 \labelwidthstring 00000.00000.00000.000
5649
5650 \family sans
5651 ALIASES
5652 \family default
5653
5654 \begin_inset LatexCommand \index{ALIASES}
5655
5656 \end_inset
5657
5658 Part alternate naming statement.
5659 Establishes another name for an instance at the same scope or in a child
5660 instance.
5661 \begin_inset Foot
5662 status collapsed
5663
5664 \begin_layout Standard
5665 The equivalent of an
5666 \family sans
5667 ALIASES
5668 \family default
5669 in ASCEND III was to create another part with the desired name and merge
5670 it immediately via
5671 \family sans
5672 ARE_THE_SAME
5673 \family default
5674 with the part being renamed, a rather expensive and unintuitive process.
5675 \end_layout
5676
5677 \end_inset
5678
5679
5680 \end_layout
5681
5682 \begin_layout List
5683 \labelwidthstring 00000.00000.00000.000
5684
5685 \family sans
5686 ALIASES/IS_A
5687 \family default
5688
5689 \begin_inset LatexCommand \index{ALIASES/IS\_A}
5690
5691 \end_inset
5692
5693
5694 \end_layout
5695
5696 \begin_deeper
5697 \begin_layout Standard
5698 Creates an array of alternate names for a list of existing instances with
5699 some common base type and creates the set over which the elements of the
5700 array are indexed.
5701 Useful for making collections of related objects in ways the original author
5702 of the model didnt anticipate.
5703 Also useful for assembling array arguments to parameterized type definitions.
5704 \end_layout
5705
5706 \end_deeper
5707 \begin_layout List
5708 \labelwidthstring 00000.00000.00000.000
5709
5710 \family sans
5711 WILL_BE
5712 \family default
5713
5714 \begin_inset LatexCommand \index{WILL\_BE}
5715
5716 \end_inset
5717
5718 Forward declaration statement.
5719 Promises that a part with the given type will be constructed by an as yet
5720 unknown IS_A statement above the current scope.
5721 At present
5722 \family sans
5723 WILL_BE
5724 \family default
5725 is legal only in defining parameters.
5726 Were it legal in the body of a model, compiling models would be very expensive.
5727 \end_layout
5728
5729 \begin_layout List
5730 \labelwidthstring 00000.00000.00000.000
5731
5732 \family sans
5733 ARE_THE_SAME
5734 \family default
5735
5736 \begin_inset LatexCommand \index{ARE\_THE\_SAME}
5737
5738 \end_inset
5739
5740 Merge.
5741 Calls for two or more instances already compiled to be merged recursively.
5742 This essentially means combining all the values in the instances into the
5743 most refined of the instances and then destroying all the extra, possibly
5744 less refined, instances.
5745 The remaining instance has its original name and also all the names of
5746 the instances destroyed during the merge.
5747 \end_layout
5748
5749 \begin_layout List
5750 \labelwidthstring 00000.00000.00000.000
5751
5752 \family sans
5753 WILL_BE_THE_SAME
5754 \family default
5755
5756 \begin_inset LatexCommand \index{WILL\_BE\_THE\_SAME}
5757
5758 \end_inset
5759
5760
5761 \end_layout
5762
5763 \begin_deeper
5764 \begin_layout Standard
5765 Structural condition statement restricting objects in a forward declaration.
5766 The objects passed to a parameterized type definition can be constrained
5767 to have arbitrary parts in common before the parameterized object is constructe
5768 d.
5769 \end_layout
5770
5771 \end_deeper
5772 \begin_layout List
5773 \labelwidthstring 00000.00000.00000.000
5774
5775 \family sans
5776 WILL_NOT_BE_THE_SAME
5777 \family default
5778
5779 \begin_inset LatexCommand \index{WILL\_NOT\_BE\_THE\_SAME}
5780
5781 \end_inset
5782
5783
5784 \end_layout
5785
5786 \begin_deeper
5787 \begin_layout Standard
5788 Structural condition statement restricting objects in a forward declaration.
5789 We apologize for the length of this key word, but we bet it is easy to
5790 remember.
5791 The objects passed to a parameterized type definition can be constrained
5792 to have arbitrary parts be distinct instances before the parameterized
5793 object is constructed.
5794 At present the constraint is only enforced when the objects are being passed.
5795 \end_layout
5796
5797 \end_deeper
5798 \begin_layout List
5799 \labelwidthstring 00000.00000.00000.000
5800 \begin_inset Note Note
5801 status open
5802
5803 \begin_layout List
5804 \labelwidthstring 00000.00000.00000.000
5805
5806 \family sans
5807 ARE_NOT_THE_SAME
5808 \family default
5809
5810 \begin_inset LatexCommand \index{ARE\_NOT\_THE\_SAME}
5811
5812 \end_inset
5813
5814
5815 \end_layout
5816
5817 \begin_layout Standard
5818 Cannot be merged.
5819 We believe it is useful to say that two objects cannot be merged and still
5820 represent a valid model.
5821 This is not yet implemented, however, mainly for lack of time.
5822 The implementation is simple.
5823 \end_layout
5824
5825 \end_inset
5826
5827
5828 \end_layout
5829
5830 \begin_layout List
5831 \labelwidthstring 00000.00000.00000.000
5832
5833 \family sans
5834 ARE_ALIKE
5835 \family default
5836
5837 \begin_inset LatexCommand \index{ARE\_ALIKE}
5838
5839 \end_inset
5840
5841 Refinement clique
5842 \begin_inset LatexCommand \index{clique}
5843
5844 \end_inset
5845
5846 constructor.
5847 Causes a group of instances to always be of the same formal type.
5848 Refining one of them causes a refinement of all the others.
5849 Does not propagate implicit type information, such as assignments to constants
5850 or part refinements made from a scope other than the scope of the formal
5851 definition.
5852 \end_layout
5853
5854 \begin_layout List
5855 \labelwidthstring 00000.00000.00000.000
5856
5857 \family sans
5858 FOR/CREATE
5859 \family default
5860
5861 \begin_inset LatexCommand \index{FOR/CREATE}
5862
5863 \end_inset
5864
5865 Indexed execution of other declarative statements.
5866 Required for creating arrays of relations and sparse arrays of other types.
5867 \end_layout
5868
5869 \begin_layout List
5870 \labelwidthstring 00000.00000.00000.000
5871
5872 \family sans
5873 FOR/CHECK
5874 \family default
5875
5876 \begin_inset LatexCommand \index{FOR/CHECK}
5877
5878 \end_inset
5879
5880 Indexed checking of the conditions (WHERE
5881 \begin_inset LatexCommand \index{WHERE}
5882
5883 \end_inset
5884
5885 statements) of a parameterized model.
5886 \end_layout
5887
5888 \begin_layout List
5889 \labelwidthstring 00000.00000.00000.000
5890
5891 \family sans
5892 SELECT/CASE
5893 \family default
5894
5895 \begin_inset LatexCommand \index{SELECT/CASE}
5896
5897 \end_inset
5898
5899
5900 \end_layout
5901
5902 \begin_deeper
5903 \begin_layout Standard
5904 Select a subset of statements to compile.
5905 Given the values of the specified constants,
5906 \family sans
5907 SELECT
5908 \family default
5909 compiles all cases that match those values.
5910 A name cannot be defined two different ways inside the
5911 \family sans
5912 SELECT
5913 \family default
5914 statement, but it may be defined outside the case statement and then refined
5915 in different ways in separate cases.
5916 \end_layout
5917
5918 \end_deeper
5919 \begin_layout List
5920 \labelwidthstring 00000.00000.00000.000
5921
5922 \family sans
5923 CONDITIONAL
5924 \family default
5925
5926 \begin_inset LatexCommand \index{CONDITIONAL}
5927
5928 \end_inset
5929
5930
5931 \end_layout
5932
5933 \begin_deeper
5934 \begin_layout Standard
5935 Describe bounding relations.
5936 The relations written inside a
5937 \family sans
5938 CONDITIONAL
5939 \family default
5940 statement must all be labelled.
5941 These relations can be used to define regions in which alternate sets of
5942 equations apply using the
5943 \family sans
5944 WHEN
5945 \family default
5946 statement.
5947 \end_layout
5948
5949 \end_deeper
5950 \begin_layout List
5951 \labelwidthstring 00000.00000.00000.000
5952
5953 \family sans
5954 WHEN/CASE
5955 \family default
5956
5957 \begin_inset LatexCommand \index{WHEN/CASE}
5958
5959 \end_inset
5960
5961 When logical variables have certain values, use certain relations or model
5962 parts in defining a mathematical problem.
5963 The relations are not defined inside the WHEN statement because all the
5964 relations must be compiled regardless of which values the logical variables
5965 have at any given moment.
5966
5967 \end_layout
5968
5969 \begin_layout List
5970 \labelwidthstring 00000.00000.00000.000
5971 Reminder: In the following detailed statement descriptions, we show keywords
5972 in capital letters.
5973 These words must appear in capital letters as shown in ASCEND statements.
5974 We show optional parts to a statement enclosed in double angle brackets
5975 (« ») and user supplied names in lower-case italic letters.
5976 (Remember that ASCEND treats the underscore (_) as a letter).
5977 The user may substitute any name desired for these names.
5978 We use names that describe the kind of name the user should use.
5979 \end_layout
5980
5981 \begin_layout List
5982 \labelwidthstring 00000.00000.00000.000
5983
5984 \bar under
5985 Operators\InsetSpace ~
5986 in\InsetSpace ~
5987 detail:
5988 \end_layout
5989
5990 \begin_layout List
5991 \labelwidthstring 00000.00000.00000.000
5992 IS_A
5993 \begin_inset LatexCommand \index{IS\_A}
5994
5995 \end_inset
5996
5997 This statement has the syntax
5998 \end_layout
5999
6000 \begin_deeper
6001 \begin_layout LyX-Code
6002
6003 \emph on
6004 list_of_instance_names
6005 \emph default
6006 IS_A
6007 \emph on
6008 model_name
6009 \end_layout
6010
6011 \begin_layout LyX-Code
6012 «(arguments_if_needed)»;
6013 \end_layout
6014
6015 \begin_layout Standard
6016 The IS_A statement allows us to declare instances of a given type to exist
6017 within a model definition.
6018 If type has not been defined (loaded in the ASCEND environment) then this
6019 statement is an error and the MODEL it appears in is irreparably damaged
6020 (at least until you delete the type definitions and reload a corrected
6021 file).
6022 Similarly, if the arguments needed are not supplied or if provably incorrect
6023 arguments are supplied, the statement is in error.
6024 The construction of the instances does not occur until all the arguments
6025 satisfy the definition of type.
6026 \end_layout
6027
6028 \begin_layout Standard
6029 If a name is used twice in WILL_BE/IS_A/ALIASES statements of the same model,
6030 ASCEND will complain bitterly when the definition is parsed.
6031 Duplicate naming is a serious error.
6032 Labels on relations share the same name space as other objects.
6033 \end_layout
6034
6035 \end_deeper
6036 \begin_layout List
6037 \labelwidthstring 00000.00000.00000.000
6038 IS_REFINED_TO
6039 \begin_inset LatexCommand \index{IS\_REFINED\_TO}
6040
6041 \end_inset
6042
6043 This statement has the syntax
6044 \end_layout
6045
6046 \begin_deeper
6047 \begin_layout LyX-Code
6048 list_of_instances IS_REFINED_TO
6049 \emph on
6050 type_name
6051 \end_layout
6052
6053 \begin_layout LyX-Code
6054 «(arguments_if_needed)»;
6055 \end_layout
6056
6057 \begin_layout Standard
6058 We use this statement to change the type of each of the instances listed
6059 to the type type_name.
6060 The modeler has to have defined each member on the list of instances.
6061 The type_name has to be a type which refines the types of all the instances
6062 on the list.
6063 \end_layout
6064
6065 \begin_layout Standard
6066 An example of its use is as follows.
6067 First we define the parts called fl1, fl2 and fl3 which are of type flash.
6068 \end_layout
6069
6070 \begin_layout LyX-Code
6071 fl1, fl2, fl3 IS_A flash;
6072 \end_layout
6073
6074 \begin_layout Standard
6075 Assume that there exists in the previously defined model definitions the
6076 type adiabatic_flash that is a refinement of flash.
6077 Then we can make fl1 and fl3 into more refined types by stating:
6078 \end_layout
6079
6080 \begin_layout LyX-Code
6081 fl1, fl3 IS_REFINED_TO adiabatic_flash;
6082 \end_layout
6083
6084 \begin_layout Standard
6085 This reconstruction does not occur until the arguments to the type satisfy
6086 the definition type_name.
6087 \end_layout
6088
6089 \end_deeper
6090 \begin_layout List
6091 \labelwidthstring 00000.00000.00000.000
6092 ALIASES
6093 \begin_inset LatexCommand \index{ALIASES}
6094
6095 \end_inset
6096
6097 \InsetSpace ~
6098 (*\InsetSpace ~
6099 4\InsetSpace ~
6100 *) This statement has the syntax
6101 \end_layout
6102
6103 \begin_deeper
6104 \begin_layout LyX-Code
6105
6106 \emph on
6107 list_of_instances
6108 \emph default
6109 ALIASES
6110 \emph on
6111 instance_name
6112 \emph default
6113 ;
6114 \end_layout
6115
6116 \begin_layout Standard
6117 We use this statement to point at an already existing instance of any type
6118 other than relation, logical_relation, or when.
6119 For example, say we want a flash tank model to have a variable T, the temperatu
6120 re of the vapor-liquid equilibrium mixture in the tank.
6121 \end_layout
6122
6123 \begin_layout LyX-Code
6124 MODEL tank;
6125 \end_layout
6126
6127 \begin_layout LyX-Code
6128 feed, liquid, vapor IS_A stream;
6129 \end_layout
6130
6131 \begin_layout LyX-Code
6132 state IS_A VLE_mixture;
6133 \end_layout
6134
6135 \begin_layout LyX-Code
6136 T ALIASES state.T;
6137 \end_layout
6138
6139 \begin_layout LyX-Code
6140 liquor_temperature ALIASES T;
6141 \end_layout
6142
6143 \begin_layout LyX-Code
6144 END tank;
6145 \end_layout
6146
6147 \begin_layout Standard
6148 We might also want a more descriptive name than T, so ALIASES can also be
6149 used to establish a second name at the same scope, e.g.
6150 liquor_temperature.
6151 \end_layout
6152
6153 \begin_layout Standard
6154 An ALIASES statement will not be executed until the RHS instance has been
6155 created with an IS_A.
6156 The compiler schedules ALIASES instructions appropriately and issues warnings
6157 if recursion is detected.
6158 An array of aliases, e.g.
6159
6160 \end_layout
6161
6162 \begin_layout LyX-Code
6163 b[1..n], c ALIASES a;
6164 \end_layout
6165
6166 \begin_layout Standard
6167 is permitted (though we cant think why anyone would want such an array),
6168 and the sets over which the array is defined must be completed before the
6169 statement is executed.
6170 So, in the example of b and c, the array b will not be created until a
6171 exists and n is assigned a value.
6172 b and c will be created at the same time since they are defined in the
6173 same statement.
6174 This suggests the following rule: if you must use an array of aliases,
6175 do not declare it in the same statement with a scalar alias.
6176 \end_layout
6177
6178 \begin_layout Standard
6179 The ALIASES RHS can be an element or portion of a larger array with the
6180 following exception.
6181 The existing RHS instance cannot be a relation or array of relations (including
6182 logical relations and whens) because of the rule in the language that a
6183 relation instance is associated with exactly one model.
6184 \end_layout
6185
6186 \end_deeper
6187 \begin_layout List
6188 \labelwidthstring 00000.00000.00000.000
6189 ALIASES/IS_A
6190 \begin_inset LatexCommand \index{ALIASES/IS\_A}
6191
6192 \end_inset
6193
6194 \InsetSpace ~
6195 (*\InsetSpace ~
6196 4\InsetSpace ~
6197 *)
6198 \end_layout
6199
6200 \begin_deeper
6201 \begin_layout Standard
6202 The ALIASES/IS_A statement syntax is subject to change, though some equivalent
6203 will always exist.
6204 We take a set of symbol_constant or integer_constant and pair it with a
6205 list of instances to create an array.
6206 For the moment, the syntax and semantics is as follows.
6207 \end_layout
6208
6209 \begin_layout LyX-Code
6210
6211 \emph on
6212 alias_array_instance[aset]
6213 \emph default
6214
6215 \end_layout
6216
6217 \begin_layout LyX-Code
6218 ALIASES (
6219 \emph on
6220 list_of_instances)
6221 \emph default
6222
6223 \end_layout
6224
6225 \begin_layout LyX-Code
6226 WHERE
6227 \emph on
6228 aset
6229 \emph default
6230 IS_A set OF
6231 \emph on
6232 settype
6233 \emph default
6234 ;
6235 \end_layout
6236
6237 \begin_layout Standard
6238 or
6239 \end_layout
6240
6241 \begin_layout LyX-Code
6242
6243 \emph on
6244 alias_array_instance[aset]
6245 \emph default
6246
6247 \end_layout
6248
6249 \begin_layout LyX-Code
6250 ALIASES (
6251 \emph on
6252 list_of_instances
6253 \emph default
6254 )
6255 \end_layout
6256
6257 \begin_layout LyX-Code
6258 WHERE
6259 \emph on
6260 aset
6261 \emph default
6262 IS_A set OF
6263 \emph on
6264 settype
6265 \emph default
6266
6267 \end_layout
6268
6269 \begin_layout LyX-Code
6270 WITH_VALUE (
6271 \emph on
6272 value_list_matching_settype
6273 \emph default
6274 );
6275 \end_layout
6276
6277 \begin_layout Standard
6278 aset is the name of the set that will be created by the IS_A to index the
6279 array of aliases.
6280 If value_list_matching_set_type is not given, the compiler will make one
6281 up out of the integers (1..number of names in list_of_instances) or symbols
6282 derived from the individual names given.
6283 If the value list is given, it must have the same number of elements as
6284 the list of instances does.
6285 The value list elements must be unique because they form a set.
6286 The list of instances can contain duplicates.
6287 If any of these conditions are not met properly, the statement is in error.
6288 \end_layout
6289
6290 \begin_layout Standard
6291 ALIASES/IS_A can be used inside a FOR statement.
6292 When this occurs, the definition of aset must be indexed and it must be
6293 the last subscript of alias_array_instance.
6294 The statement must look like:
6295 \end_layout
6296
6297 \begin_layout LyX-Code
6298
6299 \emph on
6300 array_instance[FOR_index][aset[FORindex]]
6301 \end_layout
6302
6303 \begin_layout LyX-Code
6304 ALIASES (
6305 \emph on
6306 list_of_instances
6307 \emph default
6308 )
6309 \end_layout
6310
6311 \begin_layout LyX-Code
6312 WHERE
6313 \emph on
6314 aset[FORindex]
6315 \emph default
6316 IS_A set OF
6317 \emph on
6318 settype
6319 \emph default
6320
6321 \end_layout
6322
6323 \begin_layout LyX-Code
6324 WITH_VALUE (
6325 \emph on
6326 value_list_matching_settype
6327 \emph default
6328 );
6329 \end_layout
6330
6331 \begin_layout Standard
6332 Here, as with the unindexed version, the WITH_VALUE portion is optional.
6333 \end_layout
6334
6335 \begin_layout Standard
6336 If this explanation is unclear, just try it out.
6337 The compiler error messages for ALIASES/IS_A are particularly good because
6338 we know it is a bit tricky to explain.
6339
6340 \end_layout
6341
6342 \end_deeper
6343 \begin_layout List
6344 \labelwidthstring 00000.00000.00000.000
6345 WILL_BE
6346 \begin_inset LatexCommand \index{WILL\_BE}
6347
6348 \end_inset
6349
6350 \InsetSpace ~
6351 (*\InsetSpace ~
6352 4\InsetSpace ~
6353 *) instance WILL_BE type_name;
6354 \end_layout
6355
6356 \begin_deeper
6357 \begin_layout Standard
6358 The most common use of this forward declaration is as a statement within
6359 the parameter list of a model definition.
6360 In parameter lists, list_of_instances must contain exactly one instance.
6361 When a model definition includes a parameter defined by WILL_BE, that model
6362 cannot be compiled until a compiled instance at least as refined as the
6363 type specified by type_name is passed to it.
6364 \end_layout
6365
6366 \begin_layout Standard
6367 (* 4+ *) The second potential use of WILL_BE is to establish that an array
6368 of a common base type exists and its elements will be filled in individually
6369 by IS_A or ARE_THE_SAME or ALIASES statements.
6370 WILL_BE allows us to avoid costly reconstruction or merge operations by
6371 establishing a placeholder instance which contains just enough type information
6372 to let us check the validity of other statements that require type compatibilit
6373 y while delaying construction until it is called for by the filling in statement
6374 s.
6375 Instances declared with WILL_BE are never compiled if they are not ultimately
6376 resolved to another instance created with IS_A.
6377 Unresolved WILL_BE instances will appear in the user interface as objects
6378 of type PENDING_INSTANCE_model_name.
6379 Because of the many implementation and explanation difficulties this usage
6380 of WILL_BE creates, it is not allowed.
6381 The ALIASES/IS_A construct does the same job in a much simpler way.
6382 \end_layout
6383
6384 \end_deeper
6385 \begin_layout List
6386 \labelwidthstring 00000.00000.00000.000
6387 ARE_THE_SAME
6388 \begin_inset LatexCommand \index{ARE\_THE\_SAME}
6389
6390 \end_inset
6391
6392 The format for this instruction is
6393 \end_layout
6394
6395 \begin_deeper
6396 \begin_layout LyX-Code
6397
6398 \emph on
6399 list_of_instances
6400 \emph default
6401 ARE_THE_SAME;
6402 \end_layout
6403
6404 \begin_layout Standard
6405 \begin_inset Float figure
6406 wide false
6407 sideways false
6408 status open
6409
6410 \begin_layout Standard
6411 \begin_inset Graphics
6412 filename syntaxFig1.eps
6413
6414 \end_inset
6415
6416
6417 \end_layout
6418
6419 \begin_layout Caption
6420 Diagram of the Model Type Hierarchy for A, B, C, D, and E Example
6421 \begin_inset LatexCommand \label{fig:HierarchyDiagram}
6422
6423 \end_inset
6424
6425
6426 \end_layout
6427
6428 \end_inset
6429
6430
6431 \end_layout
6432
6433 \begin_layout Standard
6434 All items on the list must have compatible types.
6435 For the example in Figure
6436 \begin_inset LatexCommand \ref{fig:HierarchyDiagram}
6437
6438 \end_inset
6439
6440 , consider a model where we define the following parts:
6441 \end_layout
6442
6443 \begin_layout LyX-Code
6444 a1 IS_A A;
6445 \end_layout
6446
6447 \begin_layout LyX-Code
6448 b1 IS_A B;
6449 \end_layout
6450
6451 \begin_layout LyX-Code
6452 c1 IS_A C;
6453 \end_layout
6454
6455 \begin_layout LyX-Code
6456 d1 IS_A D;
6457 \end_layout
6458
6459 \begin_layout LyX-Code
6460 e1 IS_A E;
6461 \end_layout
6462
6463 \begin_layout Standard
6464 Then the following ARE_THE_SAME statement is legal
6465 \end_layout
6466
6467 \begin_layout LyX-Code
6468 a1, b1, c1 ARE_THE_SAME;
6469 \end_layout
6470
6471 \begin_layout Standard
6472 while the following are not
6473 \end_layout
6474
6475 \begin_layout LyX-Code
6476 b1, d1 ARE_THE_SAME;
6477 \end_layout
6478
6479 \begin_layout LyX-Code
6480 a1, c1, d1 ARE_THE_SAME;
6481 \end_layout
6482
6483 \begin_layout LyX-Code
6484 b1, e1 ARE_THE_SAME;
6485 \end_layout
6486
6487 \begin_layout Standard
6488 When compiling a model, ASCEND will put all of the instances mentioned as
6489 being the same into an ARE_THE_SAME clique.
6490 ASCEND lists members of this clique when one asks via the interface for
6491 the aliases of any object in a compiled model.
6492 \end_layout
6493
6494 \begin_layout Standard
6495 Merging any other item with a member of the clique makes it the same as
6496 all the other items in the clique, i.e., it adds the newly mentioned items
6497 to the existing clique.
6498 \end_layout
6499
6500 \begin_layout Standard
6501 ASCEND merges all members of a clique by first checking that all members
6502 of the clique are type compatible.
6503 It then changes the type designation of all clique members to that of the
6504 most refined member.
6505 \end_layout
6506
6507 \begin_layout Standard
6508 It next looks inside each of the instances, all of which are now of the
6509 same type, and puts all of the parts with the same name into their respective
6510 ARE_THE_SAME cliques.
6511 The process repeats by processing these cliques until all parts of all
6512 parts of all parts, etc., are their respective most refined type or discovered
6513 to be type incompatible.
6514 \end_layout
6515
6516 \begin_layout Standard
6517 There are now lots of cliques associated with the instances being merged.
6518 The type associated with each such clique is now either a model, an array,
6519 or an atom (i.e., a variable, constant, or set).
6520 If a model, only one member of the clique generates its equations.
6521 If a variable, it assigns all members to the same storage location.
6522 \end_layout
6523
6524 \begin_layout Standard
6525 Note that the values of constants and sets are essentially type information,
6526 so merging two already assigned constants is only possible if merging them
6527 does not force one of them to be assigned a new value.
6528 Merging arrays with mismatching ranges of elements is an error.
6529 \end_layout
6530
6531 \end_deeper
6532 \begin_layout List
6533 \labelwidthstring 00000.00000.00000.000
6534 WILL_BE_THE_SAME\InsetSpace ~
6535 (*\InsetSpace ~
6536 4\InsetSpace ~
6537 *)
6538 \end_layout
6539
6540 \begin_deeper
6541 \begin_layout Standard
6542 There is no further explanation of this operator.
6543
6544 \end_layout
6545
6546 \end_deeper
6547 \begin_layout List
6548 \labelwidthstring 00000.00000.00000.000
6549 WILL_NOT_BE_THE_SAME\InsetSpace ~
6550 (*\InsetSpace ~
6551 4\InsetSpace ~
6552 *)
6553 \end_layout
6554
6555 \begin_deeper
6556 \begin_layout Standard
6557 There is no further explanation of this operator.
6558 \end_layout
6559
6560 \end_deeper
6561 \begin_layout List
6562 \labelwidthstring 00000.00000.00000.000
6563 ARE_NOT_THE_SAME\InsetSpace ~
6564 (*\InsetSpace ~
6565 4+\InsetSpace ~
6566 *)
6567 \end_layout
6568
6569 \begin_deeper
6570 \begin_layout Standard
6571 ARE_NOT_THE_SAME will be documented further when it is implemented.
6572 \end_layout
6573
6574 \end_deeper
6575 \begin_layout List
6576 \labelwidthstring 00000.00000.00000.000
6577 ARE_ALIKE
6578 \begin_inset LatexCommand \index{ARE\_ALIKE}
6579
6580 \end_inset
6581
6582 The format for this statement is
6583 \end_layout
6584
6585 \begin_deeper
6586 \begin_layout LyX-Code
6587
6588 \emph on
6589 list_of_instance_names
6590 \emph default
6591 ARE_ALIKE;
6592 \end_layout
6593
6594 \begin_layout Standard
6595 The compiler places all instances in the list into an ARE_ALIKE clique.
6596 It checks that the members are formally type compatible and then it converts
6597 each into the most refined type of any instance in the clique.
6598 At that point the compiler stops.
6599 It does not continue by placing the parts into cliques nor does it merge
6600 anything.
6601 \end_layout
6602
6603 \begin_layout Standard
6604 There are important consequences of modeling with such a partial merge.
6605 The consequences we are about to describe can be much more reliably achieved
6606 by use of parameterized types, when the types are well understood.
6607 When we are exploring new ways of modeling, ARE_ALIKE still has its uses.
6608 When a model and its initial uses are understood well enough to be put
6609 into a reusable library, then parameterization and the explicit statement
6610 of structural constraints by operators such as WILL_NOT_BE_THE_SAME should
6611 be the preferred method of ensuring correct use.
6612 \end_layout
6613
6614 \begin_layout Standard
6615 One consequence of ARE_ALIKE is to prevent extreme model misuse when configuring
6616 models.
6617 For example, suppose a modeler creates a new pressure changing model.
6618 The modeler is not yet concerned about the type of the streams into and
6619 out of the device but does care that these streams are of the same final
6620 type.
6621 For example, the modeler wants both to be liquid streams if either is or
6622 both to be vapor streams if either is.
6623 By declaring both to be streams only but declaring the two streams to be
6624 alike, the modeler accomplishes this intent.
6625 Suppose the modeler merges the inlet stream with a liquid outlet stream
6626 from a reactor.
6627 The merge operation makes the inlet stream into a liquid stream.
6628 The outlet stream, being in an ARE_ALIKE clique with the inlet stream,
6629 also becomes a liquid stream.
6630 Any subsequent merge of the outlet stream with a vapor stream will lead
6631 to an error due to type incompatibility when ASCEND attempts to compile
6632 that merge.
6633 Without the ARE_ALIKE statement, the compiler can detect no such incompatibilit
6634 y unless parameterized models are used.
6635 \end_layout
6636
6637 \begin_layout Standard
6638 Another purpose is the propagation of types through a model.
6639 Altering the type of the inlet stream through merging it with a liquid
6640 stream automatically made the outlet stream into a liquid stream.
6641 \end_layout
6642
6643 \begin_layout Standard
6644 If all the liquid streams within a distillation column are alike, then the
6645 modeler can make them all into streams with a particular set of components
6646 in them and with the same method used for physical property evaluation
6647 by merging only one of them with a liquid stream of this type.
6648 This is the primary example which has been used to justify the existence
6649 of ARE_ALIKE.
6650 We have observed that its use makes a column library very difficult to
6651 compile efficiently.
6652 But since we now have parameterized types to help us keep the column library
6653 semantically consistent, ARE_ALIKE can be left to its proper role: the
6654 rapid prototyping of partially understood models.
6655 We have yet to see anyone use ARE_ALIKE in a prototyping context, however.
6656 \end_layout
6657
6658 \begin_layout Standard
6659 Finally, because ARE_ALIKE does not recursively put the parts of ARE_ALIKEd
6660 instances into ARE_ALIKE cliques, it is possible to ARE_ALIKE model instances
6661 which have compatible formal types but incompatible implicit types.
6662 This can lead to unexpected problems later and makes the ARE_ALIKE instruction
6663 a source of non-reusability.
6664 \end_layout
6665
6666 \end_deeper
6667 \begin_layout List
6668 \labelwidthstring 00000.00000.00000.000
6669 FOR/CREATE
6670 \begin_inset LatexCommand \index{FOR/CREATE}
6671
6672 \end_inset
6673
6674 The FOR/CREATE statement is a compound statement that looks like a loop.
6675 It isnt, however, necessarily compiled as a loop.
6676 What FOR really does is specify an index set value.
6677 Its format is:
6678 \end_layout
6679
6680 \begin_deeper
6681 \begin_layout LyX-Code
6682 FOR
6683 \emph on
6684 index_variable
6685 \emph default
6686 IN
6687 \emph on
6688 set
6689 \emph default
6690 CREATE
6691 \end_layout
6692
6693 \begin_layout LyX-Code
6694
6695 \emph on
6696 list_of_statements;
6697 \end_layout
6698
6699 \begin_layout LyX-Code
6700 END FOR;
6701 \end_layout
6702
6703 \begin_layout Standard
6704 This statement can be in the declarative part of the model definition only.
6705 Every statement in the list should have at least one occurrence of the
6706 index variable, or the statement should be moved outside the FOR to avoid
6707 redundant execution.
6708 A correct example is
6709 \end_layout
6710
6711 \begin_layout LyX-Code
6712 FOR i IN components CREATE
6713 \end_layout
6714
6715 \begin_layout LyX-Code
6716 a.y[i], b[i] ARE_THE_SAME;
6717 \end_layout
6718
6719 \begin_layout LyX-Code
6720 y[i] = K[i]*x[i];
6721 \end_layout
6722
6723 \begin_layout LyX-Code
6724 END FOR;
6725 \end_layout
6726
6727 \begin_layout Standard
6728
6729 \family sans
6730 FOR
6731 \family default
6732 loops can be nested to produce sparse arrays as illustrated in Arrays can
6733 be jagged(
6734 \begin_inset LatexCommand \vpageref{lyx:Arrays-can-be}
6735
6736 \end_inset
6737
6738 .
6739 IS_A and ALIASES statements are allowed in FOR loops, provided the statements
6740 are properly indexed, a new feature in ASCEND IV.
6741 \end_layout
6742
6743 \end_deeper
6744 \begin_layout List
6745 \labelwidthstring 00000.00000.00000.000
6746
6747 \family sans
6748 SELECT/CASE
6749 \family default
6750
6751 \begin_inset LatexCommand \index{SELECT/CASE}
6752
6753 \end_inset
6754
6755
6756 \end_layout
6757
6758 \begin_deeper
6759 \begin_layout Standard
6760 Declarative.
6761 Order does not matter.
6762 All matching cases are executed.
6763 The
6764 \family sans
6765 OTHERWISE
6766 \family default
6767
6768 \begin_inset LatexCommand \index{OTHERWISE}
6769
6770 \end_inset
6771
6772 is executed if present and no other
6773 \family sans
6774 CASE
6775 \family default
6776 s match.
6777
6778 \family sans
6779 SELECT
6780 \family default
6781 is not allowed inside
6782 \family sans
6783 FOR
6784 \family default
6785 .
6786 Writing
6787 \family sans
6788 FOR
6789 \family default
6790 statements inside
6791 \family sans
6792 SELECT
6793 \family default
6794 is allowed.
6795 \end_layout
6796
6797 \end_deeper
6798 \begin_layout List
6799 \labelwidthstring 00000.00000.00000.000
6800
6801 \family sans
6802 CONDITIONAL
6803 \family default
6804
6805 \begin_inset LatexCommand \index{CONDITIONAL}
6806
6807 \end_inset
6808
6809
6810 \end_layout
6811
6812 \begin_deeper
6813 \begin_layout Standard
6814 Both real and logical relations are allowed in
6815 \family sans
6816 CONDITIONAL
6817 \family default
6818 statements.
6819 \begin_inset Foot
6820 status open
6821
6822 \begin_layout Standard
6823
6824 \family sans
6825 CONDITIONAL
6826 \family default
6827 is really just a shorthand for setting the
6828 \family typewriter
6829 $boundary
6830 \family default
6831 flag on a whole batch of relations, since
6832 \family typewriter
6833 $boundary
6834 \family default
6835 is a write-once attribute invisible through the user interface and methods
6836 at this time.
6837 \end_layout
6838
6839 \end_inset
6840
6841
6842 \end_layout
6843
6844 \end_deeper
6845 \begin_layout List
6846 \labelwidthstring 00000.00000.00000.000
6847
6848 \family sans
6849 WHEN/CASE
6850 \family default
6851
6852 \begin_inset LatexCommand \index{WHEN/CASE}
6853
6854 \end_inset
6855
6856 Inside each
6857 \family sans
6858 CASE
6859 \family default
6860 , relations or model parts to be used are specified by writing, for example,
6861
6862 \family typewriter
6863 USE mass_balance_1;
6864 \family default
6865 .
6866 The method of dealing with the combined logical/nonlinear model is left
6867 to the solver.
6868 All matching
6869 \family sans
6870 CASE
6871 \family default
6872 s are included in the problem to be solved.
6873
6874 \end_layout
6875
6876 \begin_deeper
6877 \begin_layout Chapter
6878 Procedural statements
6879 \begin_inset LatexCommand \index{statements, procedural}
6880
6881 \end_inset
6882
6883
6884 \begin_inset LatexCommand \index{procedural statements}
6885
6886 \end_inset
6887
6888
6889 \begin_inset LatexCommand \label{sec:x.4Procedural-statements}
6890
6891 \end_inset
6892
6893
6894 \end_layout
6895
6896 \end_deeper
6897 \begin_layout List
6898 \labelwidthstring 00000.00000.00000.000
6899
6900 \family sans
6901 METHODS
6902 \family default
6903
6904 \begin_inset LatexCommand \index{METHODS}
6905
6906 \end_inset
6907
6908 This statement separates the method definitions in ASCEND from the declarative
6909 statements.
6910 All statements following this statement are to define methods in ASCEND
6911 while all before it are for the declarative part of ASCEND.
6912 The syntax for this statement is simply
6913 \end_layout
6914
6915 \begin_deeper
6916 \begin_layout LyX-Code
6917 METHODS
6918 \end_layout
6919
6920 \begin_layout Standard
6921 with no punctuation.
6922 The next code must be a
6923 \family sans
6924 METHOD
6925 \family default
6926 or the
6927 \family sans
6928 END
6929 \family default
6930 of the type being defined.
6931 If there are no method definitions, this statement may be omitted.
6932 \end_layout
6933
6934 \begin_layout Standard
6935
6936 \family sans
6937 METHOD
6938 \family default
6939 definitions for a type can also be added or replaced after the type has
6940 been defined.
6941 This is to make creating and debugging of methods as interactive as possible.
6942 In ASCEND an instance must be destroyed and recreated each time a new or
6943 revised method is added to the type definition.
6944 This is a very expensive process when working with models of significant
6945 size.
6946 \end_layout
6947
6948 \begin_layout Standard
6949 The detailed semantics of method inheritance, addition, and replacement
6950 of methods are given at the end of this section.
6951 \end_layout
6952
6953 \end_deeper
6954 \begin_layout List
6955 \labelwidthstring 00000.00000.00000.000
6956
6957 \family sans
6958 ADD\InsetSpace ~
6959 METHODS\InsetSpace ~
6960 IN
6961 \family default
6962
6963 \begin_inset LatexCommand \index{ADD METHODS IN}
6964
6965 \end_inset
6966
6967
6968 \family typewriter
6969 \InsetSpace ~
6970 type_name;
6971 \end_layout
6972
6973 \begin_deeper
6974 \begin_layout Standard
6975 This statement allows new methods to be added to an already loaded type
6976 definition.
6977 The next code must be a METHOD or the END METHODS; statement.
6978 If a method of the same name already exists in type_name, the statement
6979 is in error.
6980 If other types refine type_name then the addition follows the method inheritanc
6981 e rules.
6982 Any type which inherited methods from type_name now inherits the methods
6983 added to type_name.
6984 If a refinement of type_name already defines a method ADDed to type_name,
6985 then the existing method in the more refined type is not disturbed.
6986 \end_layout
6987
6988 \end_deeper
6989 \begin_layout List
6990 \labelwidthstring 00000.00000.00000.000
6991
6992 \family sans
6993 REPLACE\InsetSpace ~
6994 METHODS\InsetSpace ~
6995 IN
6996 \family default
6997
6998 \begin_inset LatexCommand \index{REPLACE METHODS IN}
6999
7000 \end_inset
7001
7002
7003 \family typewriter
7004 \InsetSpace ~
7005 type_name;
7006 \end_layout
7007
7008 \begin_deeper
7009 \begin_layout Standard
7010 This statement allows existing methods to be replaced in an already loaded
7011 type definition.
7012 The next code must be a
7013 \family sans
7014 METHOD
7015 \family default
7016 or the
7017 \family sans
7018 END METHODS
7019 \family default
7020 statement.
7021 If a method of the same name does not exist in
7022 \family typewriter
7023 type_name
7024 \family default
7025 , the statement is in error.
7026 If other types refine
7027 \family typewriter
7028 type_name
7029 \family default
7030 then the replacement follows the method inheritance rules.
7031 Any type which inherited the old method now inherits the replacment method
7032 instead.
7033 \end_layout
7034
7035 \end_deeper
7036 \begin_layout List
7037 \labelwidthstring 00000.00000.00000.000
7038
7039 \family sans
7040 ADD\InsetSpace ~
7041 METHODS\InsetSpace ~
7042 IN\InsetSpace ~
7043 DEFINITION\InsetSpace ~
7044 MODEL
7045 \family typewriter
7046 ;
7047 \end_layout
7048
7049 \begin_deeper
7050 \begin_layout Standard
7051 This statement allows methods to be added globally.
7052 It should be used very sparingly.
7053 Library
7054 \family typewriter
7055 basemodel.a4l
7056 \family default
7057 contains the example of this statement.
7058 Methods in the global model definition are inherited by all models.
7059 There is no actual global model definition, but it has a method list for
7060 practical purposes.
7061
7062 \end_layout
7063
7064 \end_deeper
7065 \begin_layout List
7066 \labelwidthstring 00000.00000.00000.000
7067
7068 \bar under
7069 Initialization\InsetSpace ~
7070 routines
7071 \begin_inset LatexCommand \index{routines, initialization}
7072
7073 \end_inset
7074
7075
7076 \begin_inset LatexCommand \index{initialization routines}
7077
7078 \end_inset
7079
7080 :
7081 \end_layout
7082
7083 \begin_layout List
7084 \labelwidthstring 00000.00000.00000.000
7085 METHOD
7086 \begin_inset LatexCommand \index{METHOD}
7087
7088 \end_inset
7089
7090 A method in ASCEND must appear following the METHODS statement within a
7091 model.
7092 The system executes procedural statements of the method in the order they
7093 are written.
7094
7095 \end_layout
7096
7097 \begin_deeper
7098 \begin_layout Standard
7099 At present, there are no local variables or other structures in methods
7100 except loop indices.
7101 A method may be written recursively, but there is an arbitrary stack depth
7102 limit
7103 \begin_inset Foot
7104 status open
7105
7106 \begin_layout Standard
7107 currently set to 20 in
7108 \family typewriter
7109 compiler/initialize.h
7110 \end_layout
7111
7112 \end_inset
7113
7114 to prevent the system from crashing on infinite recursions.
7115
7116 \end_layout
7117
7118 \begin_layout Standard
7119 Specifically disallowed in ASCEND methods are
7120 \family sans
7121 IS_A
7122 \family default
7123 ,
7124 \family sans
7125 ALIASES
7126 \family default
7127 ,
7128 \family sans
7129 WILL_BE
7130 \family default
7131 ,
7132 \family sans
7133 IS
7134 \family default
7135 ,
7136 \family sans
7137 IS_REFINED_TO
7138 \family default
7139 ,
7140 \family sans
7141 ARE_THE_SAME
7142 \family default
7143 and
7144 \family sans
7145 ARE_ALIKE
7146 \family default
7147 statements as these declare the structure of the model and belong only
7148 in the declarative section.
7149 \end_layout
7150
7151 \begin_layout Standard
7152 \begin_inset Note Note
7153 status open
7154
7155 \begin_layout Standard
7156 (* 4+ *) In the near future, declarations of local instances (which are
7157 automatically destroyed when the method exits) will be allowed.
7158 Since methods are imperative, these local structure definitions are processed
7159 in the order they are written.
7160 Local structures are not allowed to shadow structures in the model context
7161 with which the method is called.
7162 When local structures are allowed, it will also be possible to define methods
7163 which take parameters and return values, thereby making the imperative
7164 ASCEND methods a rapid prototyping tool every bit as powerful and easy
7165 to use as the declarative ASCEND language.
7166 \end_layout
7167
7168 \end_inset
7169
7170
7171 \end_layout
7172
7173 \begin_layout Standard
7174 The syntax for a method declaration is
7175 \end_layout
7176
7177 \begin_layout LyX-Code
7178 METHOD
7179 \emph on
7180 method_name
7181 \emph default
7182 ;
7183 \end_layout
7184
7185 \begin_layout LyX-Code
7186 «procedural statement;» (*one or more*)
7187 \end_layout
7188
7189 \begin_layout LyX-Code
7190 END
7191 \emph on
7192 method_name
7193 \emph default
7194 ;
7195 \end_layout
7196
7197 \end_deeper
7198 \begin_layout List
7199 \labelwidthstring 00000.00000.00000.000
7200
7201 \bar under
7202 Procedural\InsetSpace ~
7203 assignment
7204 \bar default
7205
7206 \begin_inset LatexCommand \index{assignment, procedural}
7207
7208 \end_inset
7209
7210
7211 \begin_inset LatexCommand \index{procedural assignment}
7212
7213 \end_inset
7214
7215
7216 \end_layout
7217
7218 \begin_deeper
7219 \begin_layout Standard
7220 The syntax is
7221 \end_layout
7222
7223 \begin_layout LyX-Code
7224
7225 \emph on
7226 instance_name
7227 \emph default
7228 :=
7229 \emph on
7230 mathematical_expression
7231 \emph default
7232 ;
7233 \end_layout
7234
7235 \begin_layout Standard
7236 or
7237 \end_layout
7238
7239 \begin_layout LyX-Code
7240
7241 \emph on
7242 array_name[set_name]
7243 \emph default
7244 :=
7245 \emph on
7246 expression
7247 \emph default
7248 ;
7249 \end_layout
7250
7251 \begin_layout Standard
7252 or
7253 \end_layout
7254
7255 \begin_layout LyX-Code
7256
7257 \emph on
7258 list_of_instance_names
7259 \emph default
7260 := expression.
7261 \end_layout
7262
7263 \begin_layout Standard
7264 Its meaning is that the value for the variable(s) on the LHS is set to the
7265 value of the expression on the RHS.
7266
7267 \end_layout
7268
7269 \begin_layout Standard
7270
7271 \family sans
7272 DATA
7273 \family default
7274 statements can (should, rather) also appear in methods.
7275
7276 \end_layout
7277
7278 \end_deeper
7279 \begin_layout List
7280 \labelwidthstring 00000.00000.00000.000
7281 FOR/DO
7282 \begin_inset LatexCommand \index{FOR/DO}
7283
7284 \end_inset
7285
7286 statement
7287 \end_layout
7288
7289 \begin_deeper
7290 \begin_layout Standard
7291 This statement is similar to the
7292 \family sans
7293 FOR/CREATE
7294 \family default
7295 statement except it can only appear in a method definition.
7296 An example would be
7297 \end_layout
7298
7299 \begin_layout LyX-Code
7300 FOR i IN [1..n_stages] DO
7301 \end_layout
7302
7303 \begin_layout LyX-Code
7304 T[i] := T[1] + (i-1)*DT;
7305 \end_layout
7306
7307 \begin_layout LyX-Code
7308 ...
7309 \end_layout
7310
7311 \begin_layout LyX-Code
7312 END FOR;
7313 \end_layout
7314
7315 \begin_layout Standard
7316 Here we actually execute using the values of
7317 \family typewriter
7318 i
7319 \family default
7320 in the sequence given.
7321 So,
7322 \end_layout
7323
7324 \begin_layout LyX-Code
7325 FOR i IN [n_stages..1] DO ...
7326
7327 \end_layout
7328
7329 \begin_layout LyX-Code
7330 END FOR;
7331 \end_layout
7332
7333 \begin_layout Standard
7334 is an empty loop, while
7335 \end_layout
7336
7337 \begin_layout LyX-Code
7338 FOR i IN [n_stages..1] DECREASING DO ...
7339
7340 \end_layout
7341
7342 \begin_layout LyX-Code
7343 END FOR;
7344 \end_layout
7345
7346 \begin_layout Standard
7347 is a backward loop.
7348 \end_layout
7349
7350 \end_deeper
7351 \begin_layout List
7352 \labelwidthstring 00000.00000.00000.000
7353
7354 \family sans
7355 IF
7356 \family default
7357
7358 \begin_inset LatexCommand \index{IF}
7359
7360 \end_inset
7361
7362
7363 \end_layout
7364
7365 \begin_deeper
7366 \begin_layout Standard
7367 The
7368 \family sans
7369 IF
7370 \family default
7371 statement can only appear in a method definition.
7372 Its syntax is
7373 \end_layout
7374
7375 \begin_layout LyX-Code
7376 IF
7377 \emph on
7378 logical_expression
7379 \emph default
7380 THEN
7381 \end_layout
7382
7383 \begin_layout LyX-Code
7384
7385 \emph on
7386 list_of_statements
7387 \end_layout
7388
7389 \begin_layout LyX-Code
7390 ELSE
7391 \end_layout
7392
7393 \begin_layout LyX-Code
7394
7395 \emph on
7396 list_of_statements
7397 \end_layout
7398
7399 \begin_layout LyX-Code
7400 END IF;
7401 \end_layout
7402
7403 \begin_layout Standard
7404 or
7405 \end_layout
7406
7407 \begin_layout LyX-Code
7408 IF
7409 \emph on
7410 logical_expression
7411 \emph default
7412 THEN
7413 \end_layout
7414
7415 \begin_layout LyX-Code
7416
7417 \emph on
7418 list_of_statements
7419 \end_layout
7420
7421 \begin_layout LyX-Code
7422 END IF;
7423 \end_layout
7424
7425 \begin_layout Standard
7426 If the logical expression has a value of
7427 \family sans
7428 TRUE
7429 \family default
7430 , ASCEND will execute the statements in the
7431 \family sans
7432 THEN
7433 \family default
7434 part.
7435 If the value is
7436 \family sans
7437 FALSE
7438 \family default
7439 , ASCEND executes the statements in the optional
7440 \family sans
7441 ELSE
7442 \family default
7443 part.
7444 Please use
7445 \family typewriter
7446 ()
7447 \family default
7448 to make the precedence of
7449 \family sans
7450 AND
7451 \family default
7452 ,
7453 \family sans
7454 OR
7455 \family default
7456 ,
7457 \family sans
7458 NOT
7459 \family default
7460 ,
7461 \family typewriter
7462 ==
7463 \family default
7464 , and
7465 \family typewriter
7466 !=
7467 \family default
7468 clear to both the user and the system.
7469 \end_layout
7470
7471 \end_deeper
7472 \begin_layout List
7473 \labelwidthstring 00000.00000.00000.000
7474
7475 \family sans
7476 SWITCH
7477 \family default
7478
7479 \begin_inset LatexCommand \index{SWITCH}
7480
7481 \end_inset
7482
7483 Essentially roughly equivalent to the C
7484 \family typewriter
7485 switch
7486 \family default
7487 statement, except that ASCEND allows wildcard matches, allows any number
7488 of controlling variables to be given in a list, and assumes
7489 \family sans
7490 BREAK
7491 \family default
7492 at the end of each
7493 \family sans
7494 CASE
7495 \family default
7496 .
7497
7498 \end_layout
7499
7500 \begin_deeper
7501 \begin_layout List
7502 \labelwidthstring 00000.00000.00000.000
7503 \begin_inset Note Note
7504 status open
7505
7506 \begin_layout Standard
7507 EXAMPLE of SWITCH required here
7508 \end_layout
7509
7510 \end_inset
7511
7512
7513 \end_layout
7514
7515 \end_deeper
7516 \begin_layout List
7517 \labelwidthstring 00000.00000.00000.000
7518
7519 \family sans
7520 CALL
7521 \family default
7522
7523 \begin_inset LatexCommand \index{CALL}
7524
7525 \end_inset
7526
7527 External calls are not presently well defined, pending debugging of the
7528
7529 \family sans
7530 EXTERNAL
7531 \family default
7532
7533 \begin_inset LatexCommand \index{EXTERNAL}
7534
7535 \end_inset
7536
7537 connection prototype originally created by Kirk Abbott.
7538 \end_layout
7539
7540 \begin_layout List
7541 \labelwidthstring 00000.00000.00000.000
7542
7543 \family sans
7544 RUN
7545 \family default
7546
7547 \begin_inset LatexCommand \index{RUN}
7548
7549 \end_inset
7550
7551 This statement can appear only in a method.
7552 Its format is:
7553 \end_layout
7554
7555 \begin_deeper
7556 \begin_layout LyX-Code
7557 RUN
7558 \emph on
7559 name_of_method
7560 \emph default
7561 ;
7562 \end_layout
7563
7564 \begin_layout Standard
7565 or
7566 \end_layout
7567
7568 \begin_layout LyX-Code
7569 RUN
7570 \emph on
7571 part_name.name_of_method
7572 \emph default
7573 ;
7574 \end_layout
7575
7576 \begin_layout Standard
7577 or
7578 \end_layout
7579
7580 \begin_layout LyX-Code
7581 RUN
7582 \emph on
7583 model_type::name_of_method
7584 \emph default
7585 ;
7586 \end_layout
7587
7588 \begin_layout Standard
7589 The named method can be defined in the current model (the first syntax),
7590 or in any of its parts (the second syntax).
7591 Methods defined in a part will be run in the scope of that part, not at
7592 the scope of the
7593 \family sans
7594 RUN
7595 \family default
7596 statement.
7597 \end_layout
7598
7599 \end_deeper
7600 \begin_layout List
7601 \labelwidthstring 00000.00000.00000.000
7602 Type\InsetSpace ~
7603 access\InsetSpace ~
7604 to\InsetSpace ~
7605 methods:
7606 \end_layout
7607
7608 \begin_deeper
7609 \begin_layout Standard
7610 When
7611 \family typewriter
7612 model_type::
7613 \family default
7614
7615 \begin_inset LatexCommand \index{::}
7616
7617 \end_inset
7618
7619 appears, the type named must be a type that the current model is refined
7620 from.
7621 In this way, methods may be defined incrementally.
7622 For example:
7623 \end_layout
7624
7625 \begin_layout LyX-Code
7626 MODEL foo;
7627 \end_layout
7628
7629 \begin_layout LyX-Code
7630 x IS_A generic_real;
7631 \end_layout
7632
7633 \begin_layout LyX-Code
7634 METHODS
7635 \end_layout
7636
7637 \begin_layout LyX-Code
7638 METHOD specify;
7639 \end_layout
7640
7641 \begin_layout LyX-Code
7642 x.fixed:= TRUE;
7643 \end_layout
7644
7645 \begin_layout LyX-Code
7646 END specify;
7647 \end_layout
7648
7649 \begin_layout LyX-Code
7650 END foo;
7651 \end_layout
7652
7653 \begin_layout LyX-Code
7654 MODEL bar REFINES foo;
7655 \end_layout
7656
7657 \begin_layout LyX-Code
7658 y IS_A generic_real;
7659 \end_layout
7660
7661 \begin_layout LyX-Code
7662 METHODS
7663 \end_layout
7664
7665 \begin_layout LyX-Code
7666 METHOD specify;
7667 \end_layout
7668
7669 \begin_layout LyX-Code
7670 RUN foo::specify;
7671 \end_layout
7672
7673 \begin_layout LyX-Code
7674 y.fixed := TRUE;
7675 \end_layout
7676
7677 \begin_layout LyX-Code
7678 END specify;
7679 \end_layout
7680
7681 \begin_layout LyX-Code
7682 END bar;
7683 \end_layout
7684
7685 \begin_layout Chapter
7686 Parameterized models
7687 \begin_inset LatexCommand \index{models, parameterized}
7688
7689 \end_inset
7690
7691
7692 \begin_inset LatexCommand \index{parameterized models}
7693
7694 \end_inset
7695
7696
7697 \begin_inset LatexCommand \label{sec:x.5Parameterized-models}
7698
7699 \end_inset
7700
7701
7702 \end_layout
7703
7704 \begin_layout Standard
7705 Parameterized model definitions have the following general form
7706 \begin_inset Foot
7707 status collapsed
7708
7709 \begin_layout Standard
7710 «» signify optional parts
7711 \end_layout
7712
7713 \end_inset
7714
7715 :
7716 \end_layout
7717
7718 \begin_layout LyX-Code
7719 MODEL
7720 \emph on
7721 new_type
7722 \emph default
7723 (
7724 \emph on
7725 parameter_list
7726 \emph default
7727 ;)
7728 \end_layout
7729
7730 \begin_layout LyX-Code
7731 «WHERE (
7732 \emph on
7733 where_list
7734 \emph default
7735 ;)»
7736 \end_layout
7737
7738 \begin_layout LyX-Code
7739 «REFINES
7740 \emph on
7741 existing_type
7742 \emph default
7743 «(
7744 \emph on
7745 assignment_list
7746 \emph default
7747 ;)»»;
7748 \end_layout
7749
7750 \begin_layout Section
7751 The parameter list
7752 \begin_inset LatexCommand \label{sub:x.5.1The-parameter-list}
7753
7754 \end_inset
7755
7756
7757 \end_layout
7758
7759 \begin_layout Standard
7760 A parameter list is a list of statements about the objects that will be
7761 passed into the model being defined when an instance of that model is created
7762 by
7763 \family sans
7764 IS_A
7765 \family default
7766 or
7767 \family sans
7768 IS_REFINED_TO
7769 \family default
7770 .
7771 The parameter list is designed to allow a complete statement of the necessary
7772 and sufficient conditions to construct the parameterized model.
7773 The mechanism implemented is general, however, so it is possible to put
7774 less than the necessary information in the parameter list if one seeks
7775 to confuse the models reusers.
7776 To make parameters easy to understand for users with experience in other
7777 computer languages (and to make the implementation much simpler), we define
7778 the parameter list as ordered.
7779 All the statements in a parameter list, including the last one, must end
7780 with a `
7781 \family typewriter
7782 ;
7783 \family default
7784 '.
7785 A parameter list looks like:
7786 \end_layout
7787
7788 \begin_layout LyX-Code
7789 MODEL test (
7790 \end_layout
7791
7792 \begin_layout LyX-Code
7793 x WILL_BE real;
7794 \end_layout
7795
7796 \begin_layout LyX-Code
7797 n IS_A integer_constant;
7798 \end_layout
7799
7800 \begin_layout LyX-Code
7801 p[1..n] IS_A integer_constant;
7802 \end_layout
7803
7804 \begin_layout LyX-Code
7805 q[0..2*n-1] WILL_BE widget;
7806 \end_layout
7807
7808 \begin_layout LyX-Code
7809 );
7810 \end_layout
7811
7812 \begin_layout Standard
7813 Each
7814 \family sans
7815 WILL_BE
7816 \family default
7817 statement corresponds to a single object that the user must create and
7818 pass into the definition of test.
7819 We will establish the local name
7820 \family typewriter
7821 x
7822 \family default
7823 for the first object passed to the definition of test.
7824
7825 \family typewriter
7826 n
7827 \family default
7828 is handled similarly, and it must preceed the definition of
7829 \family typewriter
7830 p[1..n]
7831 \family default
7832 , because it defines the set for the array
7833 \family typewriter
7834 p
7835 \family default
7836 .
7837 Constant types can also be defined with
7838 \family sans
7839 WILL_BE
7840 \family default
7841 , though we have used
7842 \family sans
7843 IS_A
7844 \family default
7845 for the example test.
7846 \end_layout
7847
7848 \begin_layout Standard
7849 Each
7850 \family sans
7851 IS_A
7852 \family default
7853 statement corresponds to a single constant-valued instance or an array
7854 of constant-valued instances that we will create as part of the model we
7855 are defining.
7856 Thus, the user of test must supply an array of constants as the third argument.
7857 We will check that the instance supplied is subscripted on the set [1..n]
7858 and copy the corresponding values to the array p we create local to the
7859 instance of test.
7860
7861 \end_layout
7862
7863 \begin_layout Standard
7864
7865 \family sans
7866 WILL_BE
7867 \family default
7868 statements can be used to pass complex objects (models) or arrays of objects.
7869 Both
7870 \family sans
7871 WILL_BE
7872 \family default
7873 and
7874 \family sans
7875 IS_A
7876 \family default
7877 statements can be passed arguments that are more refined than the type
7878 listed.
7879 If an object that is less refined than the type listed, the instance of
7880 parameterized model test will not be compiled.
7881 When a parameterized model type is specified with a
7882 \family sans
7883 WILL_BE
7884 \family default
7885 statement, NO arguments should be given.
7886 We are only interested in the formal type of the argument, not how it was
7887 constructed.
7888 \end_layout
7889
7890 \begin_layout Section
7891 The
7892 \family sans
7893 WHERE
7894 \family default
7895 list
7896 \begin_inset LatexCommand \index{list, WHERE}
7897
7898 \end_inset
7899
7900
7901 \begin_inset LatexCommand \index{WHERE list}
7902
7903 \end_inset
7904
7905
7906 \end_layout
7907
7908 \begin_layout Standard
7909 We can write structural and equation constraints on the arguments in the
7910
7911 \family sans
7912 WHERE
7913 \family default
7914 list.
7915 Each statement is a
7916 \family sans
7917 WILL_BE_THE_SAME
7918 \family default
7919 , a
7920 \family sans
7921 WILL_NOT_BE_THE_SAME
7922 \family default
7923 , an equation written in terms of sets or discrete constants, or a
7924 \family sans
7925 FOR/CHECK
7926 \family default
7927 statement surrounding a group of such statements.
7928 Until all the conditions in the
7929 \family sans
7930 WHERE
7931 \family default
7932 list are satisfied, an object cannot be constructed using the parameterized
7933 definition.
7934 If the arguments given to a parameterized type in an
7935 \family sans
7936 IS_A
7937 \family default
7938 or
7939 \family sans
7940 IS_REFINED_TO
7941 \family default
7942 statement cannot possibly satisfy the conditions, the
7943 \family sans
7944 IS_A
7945 \family default
7946 or
7947 \family sans
7948 IS_REFINED_TO
7949 \family default
7950 statement is abandoned by the compiler.
7951 \end_layout
7952
7953 \begin_layout Standard
7954 We have not created a
7955 \family sans
7956 WILL_BE_ALIKE
7957 \family default
7958 statement because formal type compatibility in ASCEND is not really a meaningfu
7959 l guarantee of object compatibility.
7960 Object compatibility is much more reliably guaranteed by checking conditions
7961 on the structure determining constants of a model instance.
7962 \end_layout
7963
7964 \begin_layout Section
7965 The assignment list
7966 \begin_inset LatexCommand \index{list, assignment}
7967
7968 \end_inset
7969
7970
7971 \begin_inset LatexCommand \index{assignment list}
7972
7973 \end_inset
7974
7975
7976 \end_layout
7977
7978 \begin_layout Standard
7979 When we declare constant parameters with
7980 \family sans
7981 IS_A
7982 \family default
7983 , we can in a later refinement of the parameterized model assign their values
7984 in the assignment list, thus removing them from the parameter list.
7985 If an array of constants is declared with
7986 \family sans
7987 IS_A
7988 \family default
7989 , then we must assign values to ALL the array elements at the same time
7990 if we are going to remove them from the parameter list.
7991 If an array element is left out, the type which assigns some of the elements
7992 and any subsequent refinements of that type will not be compilable.
7993 \end_layout
7994
7995 \begin_layout Section
7996 Refining
7997 \begin_inset LatexCommand \index{refining, parameterized types}
7998
7999 \end_inset
8000
8001 parameterized types
8002 \end_layout
8003
8004 \begin_layout Standard
8005 Because we wish to make the parameterized model lists represent all the
8006 parameters and conditions necessary to use a model of any type, we must
8007 repeat the parameters declared in the ancestral type when we make a refinement.
8008 If we did not repeat the parameters, the user would be forced to hunt up
8009 the (possibly long) chain of types that yield an interesting definition
8010 in order to know the list of parameters and conditions that must be satisfied
8011 in order to use a model.
8012 We repeat all the parameters of the type being refined before we add new
8013 ones.
8014 The only exception to this is that parameters defined with I
8015 \family sans
8016 S_A
8017 \family default
8018 and then assigned in the assignment list are not repeated because the user
8019 no longer needs to supply these values.
8020 A refinement of the model test given in Section
8021 \begin_inset LatexCommand \vref{sub:x.5.1The-parameter-list}
8022
8023 \end_inset
8024
8025 follows.
8026 \end_layout
8027
8028 \begin_layout LyX-Code
8029 MODEL expanded_test (
8030 \end_layout
8031
8032 \begin_layout LyX-Code
8033 x WILL_BE real;
8034 \end_layout
8035
8036 \begin_layout LyX-Code
8037 p[1..n] IS_A integer_constant;
8038 \end_layout
8039
8040 \begin_layout LyX-Code
8041 q[0..2*n-1] WILL_BE better_widget;
8042 \end_layout
8043
8044 \begin_layout LyX-Code
8045 r[0..q[0].k] WILL_BE gizmo;
8046 \end_layout
8047
8048 \begin_layout LyX-Code
8049 ms WILL_BE set OF symbol_constant;
8050 \end_layout
8051
8052 \begin_layout LyX-Code
8053 ) WHERE (
8054 \end_layout
8055
8056 \begin_layout LyX-Code
8057 q[0].k >= 2;
8058 \end_layout
8059
8060 \begin_layout LyX-Code
8061 r[0..q[0].k].giz_part WILL_BE_THE_SAME;
8062 \end_layout
8063
8064 \begin_layout LyX-Code
8065 ) REFINES test(
8066 \end_layout
8067
8068 \begin_layout LyX-Code
8069 n :== 4;
8070 \end_layout
8071
8072 \begin_layout LyX-Code
8073 );
8074 \end_layout
8075
8076 \begin_layout Standard
8077 In expanded_test, we see that the type of the array q is more refined than
8078 it was in test.
8079 We see that constants and sets from inside passed objects, such as q[0].k,
8080 can be used to set the sizes of subseqent array arguments.
8081 We see a structural constraint that all the gizmos in the array r must
8082 have been constructed with the same giz_part.
8083 This condition probably indicates that the gizmo definition takes giz_part
8084 as a WILL_BE defined parameter.
8085 \end_layout
8086
8087 \begin_layout Chapter
8088 Miscellany
8089 \begin_inset LatexCommand \label{sec:x.6Miscellany}
8090
8091 \end_inset
8092
8093
8094 \end_layout
8095
8096 \begin_layout Section
8097 Variables for solvers
8098 \begin_inset LatexCommand \label{sub:x.6.1Variables-for-solvers}
8099
8100 \end_inset
8101
8102
8103 \end_layout
8104
8105 \end_deeper
8106 \begin_layout List
8107 \labelwidthstring 00000.00000.00000.000
8108
8109 \family sans
8110 solver_var
8111 \family default
8112
8113 \begin_inset LatexCommand \index{solver\_var}
8114
8115 \end_inset
8116
8117
8118 \family sans
8119 solver_var
8120 \family default
8121 is the base-type for all computable variables in the current ASCEND system.
8122 Any instances of an atom definition that refines
8123 \family sans
8124 solver_var
8125 \family default
8126 are considered potential variables when constructing a problem for one
8127 of the solvers.
8128
8129 \end_layout
8130
8131 \begin_deeper
8132 \begin_layout Standard
8133
8134 \family sans
8135 solver_var
8136 \family default
8137 has wildcard dimensionality.
8138 (Wildcard in this context means that until ASCEND can decide what its dimension
8139 ality is, it has none assigned.
8140 ASCEND can decide on dimensionality while compiling or executing.) In
8141 \family typewriter
8142 system.a4l
8143 \family default
8144 we define the following parts with associated initial values for each:
8145 \end_layout
8146
8147 \end_deeper
8148 \begin_layout List
8149 \labelwidthstring 00000.00000.00000.000
8150
8151 \bar under
8152 Attributes:
8153 \bar default
8154
8155 \bar under
8156 type, default
8157 \end_layout
8158
8159 \begin_layout List
8160 \labelwidthstring 00000.00000.00000.000
8161
8162 \family sans
8163 lower_bound
8164 \family default
8165
8166 \begin_inset LatexCommand \index{lower\_bound}
8167
8168 \end_inset
8169
8170 real, 0.0
8171 \end_layout
8172
8173 \begin_layout List
8174 \labelwidthstring 00000.00000.00000.000
8175
8176 \family sans
8177 upper_bound
8178 \family default
8179
8180 \begin_inset LatexCommand \index{upper\_bound}
8181
8182 \end_inset
8183
8184 real, 0.0
8185 \end_layout
8186
8187 \begin_layout List
8188 \labelwidthstring 00000.00000.00000.000
8189
8190 \family sans
8191 nominal
8192 \family default
8193
8194 \begin_inset LatexCommand \index{nominal}
8195
8196 \end_inset
8197
8198 real, 0.0
8199 \end_layout
8200
8201 \begin_layout List
8202 \labelwidthstring 00000.00000.00000.000
8203
8204 \family sans
8205 fixed
8206 \family default
8207
8208 \begin_inset LatexCommand \index{fixed}
8209
8210 \end_inset
8211
8212 boolean, FALSE
8213 \end_layout
8214
8215 \begin_deeper
8216 \begin_layout Standard
8217
8218 \family sans
8219 lower_bound
8220 \family default
8221 and
8222 \family sans
8223 upper_bound
8224 \family default
8225 are bounds for a variable which are monitored and maintained during solving.
8226 The
8227 \family sans
8228 nominal
8229 \family default
8230 value is the value used to scale a variable when solving.
8231 The flag
8232 \family sans
8233 fixed
8234 \family default
8235 indicates if the variable is to be held fixed during solving.
8236 All atoms which are refinements of
8237 \family sans
8238 solver_var
8239 \family default
8240 will have these parts.
8241 The refining definitions may reassign the default values of the attributes.
8242 \end_layout
8243
8244 \begin_layout Standard
8245 The latest full definition of
8246 \family sans
8247 solver_var
8248 \family default
8249 is always in the file
8250 \family typewriter
8251 system.a4l
8252 \family default
8253 .
8254 \end_layout
8255
8256 \end_deeper
8257 \begin_layout List
8258 \labelwidthstring 00000.00000.00000.000
8259
8260 \family sans
8261 generic_real
8262 \family default
8263
8264 \begin_inset LatexCommand \index{generic\_real}
8265
8266 \end_inset
8267
8268 One should not declare a variable to be of type
8269 \family sans
8270 solver_var
8271 \family default
8272 .
8273 The nominal value and bound values will get you into trouble when solving.
8274 If you are programming and do not wish to declare variable types, then
8275 declare them to be of type
8276 \family sans
8277 generic_real
8278 \family default
8279 .
8280 This type has nominal value of 0.5 and lower and upper bounds of
8281 \family typewriter
8282 -1.0e50
8283 \family default
8284 and
8285 \family typewriter
8286 1.0e50
8287 \family default
8288 respectively.
8289 It is dimensionless.
8290 The type
8291 \family sans
8292 generic_real
8293 \family default
8294 is the first refinement of
8295 \family sans
8296 solver_var
8297 \family default
8298 and is also defined in
8299 \family typewriter
8300 system.a4l
8301 \family default
8302 .
8303 \end_layout
8304
8305 \begin_layout List
8306 \labelwidthstring 00000.00000.00000.000
8307
8308 \bar under
8309 Kluges\InsetSpace ~
8310 for\InsetSpace ~
8311 MILPs
8312 \bar default
8313
8314 \begin_inset LatexCommand \index{MILPs}
8315
8316 \end_inset
8317
8318 Also defined in
8319 \family typewriter
8320 system.a4l
8321 \family default
8322 are the types for integer, binary, and semi-continuous variables
8323 \begin_inset LatexCommand \index{variables, semi-continuous}
8324
8325 \end_inset
8326
8327 .
8328 \end_layout
8329
8330 \begin_layout List
8331 \labelwidthstring 00000.00000.00000.000
8332
8333 \family sans
8334 solver_semi
8335 \family default
8336
8337 \begin_inset LatexCommand \index{solver\_semi}
8338
8339 \end_inset
8340
8341 ,\InsetSpace ~
8342
8343 \family sans
8344 solver_integer
8345 \family default
8346
8347 \begin_inset LatexCommand \index{solver\_integer}
8348
8349 \end_inset
8350
8351 ,\InsetSpace ~
8352
8353 \family sans
8354 solver_binary
8355 \family default
8356
8357 \begin_inset LatexCommand \index{solver\_binary}
8358
8359 \end_inset
8360
8361
8362 \end_layout
8363
8364 \begin_deeper
8365 \begin_layout Standard
8366 We define basic refinements of
8367 \family sans
8368 solver_var
8369 \family default
8370 to support solvers which are more than simply algebraic.
8371 Various mixed integer-linear program solvers can be fed
8372 \family sans
8373 solver_semi
8374 \family default
8375 based atoms defining semi-continuous variables,
8376 \family sans
8377 solver_integer
8378 \family default
8379 based atoms defining integer variables, and
8380 \family sans
8381 solver_binary
8382 \family default
8383 based atoms defining binary variables.
8384
8385 \end_layout
8386
8387 \end_deeper
8388 \begin_layout List
8389 \labelwidthstring 00000.00000.00000.000
8390 Integers\InsetSpace ~
8391 are\InsetSpace ~
8392 relaxable
8393 \begin_inset LatexCommand \index{relaxable integers}
8394
8395 \end_inset
8396
8397
8398 \begin_inset LatexCommand \index{integers, relaxable}
8399
8400 \end_inset
8401
8402 All these types have associated boolean flags which indicate that either
8403 the variable is to be treated according to its restricted meaning or it
8404 is to be relaxed and treated as a normal continuous algebraic variable.
8405
8406 \end_layout
8407
8408 \begin_layout List
8409 \labelwidthstring 00000.00000.00000.000
8410
8411 \bar under
8412 Kluges\InsetSpace ~
8413 for\InsetSpace ~
8414 ODEs
8415 \begin_inset LatexCommand \index{ODEs}
8416
8417 \end_inset
8418
8419
8420 \bar default
8421 We have an alternate version of
8422 \family typewriter
8423 system.a4l
8424 \family default
8425 called
8426 \family typewriter
8427 ivpsystem.a4l
8428 \family default
8429 which adds extra flags to the definition of
8430 \family sans
8431 solver_var
8432 \family default
8433 in order to support initial value problem (IVP
8434 \begin_inset LatexCommand \index{IVP}
8435
8436 \end_inset
8437
8438 ) solvers (integrators
8439 \begin_inset LatexCommand \index{integrators}
8440
8441 \end_inset
8442
8443 ).
8444 Integration in the ASCEND environment is explained in another chapter.
8445 \end_layout
8446
8447 \begin_layout List
8448 \labelwidthstring 00000.00000.00000.000
8449 ivpsystem.a4l
8450 \begin_inset LatexCommand \index{ivpsystem.a4l}
8451
8452 \end_inset
8453
8454 Having
8455 \family typewriter
8456 ivpsystem.a4l
8457 \family default
8458 is a temporary, but highly effective, way to keep people who want to use
8459 ASCEND only for algebraic purposes from having to pay for the IVP overhead.
8460 Algebraic users load
8461 \family typewriter
8462 system.a4l
8463 \family default
8464 .
8465 Users who want both algebraic and IVP capability load
8466 \family typewriter
8467 ivpsystem.a4l
8468 \family default
8469 instead of
8470 \family typewriter
8471 system.a4l
8472 \family default
8473 .
8474 This method is temporary because part of the extended definition of ASCEND
8475 is that differential calculus constructs will be explicitly supported by
8476 the compiler.
8477 The calculus is not yet implemented, however.
8478 \begin_inset Note Note
8479 status open
8480
8481 \begin_layout Standard
8482 the first step towards this is the proposed LINK syntax currently in the
8483 pipeline.
8484 \end_layout
8485
8486 \end_inset
8487
8488
8489 \end_layout
8490
8491 \begin_deeper
8492 \begin_layout Section
8493 Supported attributes
8494 \begin_inset LatexCommand \label{sub:x.6.2Supported-attributes}
8495
8496 \end_inset
8497
8498
8499 \end_layout
8500
8501 \begin_layout Standard
8502 The
8503 \family sans
8504 solver_var
8505 \family default
8506 , and in fact most objects in ASCEND, should have built-in support for (and
8507 thereby efficient storage of) quite a few more attributes than are defined
8508 above.
8509 These built-in attributes are not instances of any sort, merely values.
8510 The syntax for naming one of these supported attributes is:
8511 \family sans
8512 object_name.$supported_attribute_name
8513 \family default
8514 .
8515
8516 \end_layout
8517
8518 \begin_layout Standard
8519 Supported attributes may have symbol, real, integer, or boolean values.
8520 Note that the
8521 \family sans
8522 $
8523 \family default
8524 syntax is essentially the same as the derivative syntax for relations
8525 \begin_inset Note Note
8526 status open
8527
8528 \begin_layout Standard
8529 what's he talking about here? 'derivative syntax'???
8530 \end_layout
8531
8532 \end_inset
8533
8534 ; derivatives are a supported attribute of relations.
8535 The supported attributes must be defined at the time the ASCEND compiler
8536 is built.
8537 The storage requirement for a supported boolean attribute is 1 bit rather
8538 than the 24 bytes required to store a run-time defined boolean flag.
8539 Similarly, the requirement for a supported real attribute is 4 or 8 bytes
8540 instead of 24 bytes.
8541 \end_layout
8542
8543 \end_deeper
8544 \begin_layout Section
8545 Single operand real functions
8546 \begin_inset LatexCommand \index{functions, real}
8547
8548 \end_inset
8549
8550
8551 \begin_inset LatexCommand \label{sub:x.6.3Single-operand-real}
8552
8553 \end_inset
8554
8555
8556 \end_layout
8557
8558 \begin_layout List
8559 \labelwidthstring 00000.00000.00000.000
8560
8561 \family sans
8562 exp
8563 \family default
8564
8565 \begin_inset LatexCommand \index{exp}
8566
8567 \end_inset
8568
8569 () exponential (i.e.,
8570 \family sans
8571 exp
8572 \family default
8573 (
8574 \begin_inset Formula $x$
8575 \end_inset
8576
8577 )
8578 \begin_inset Formula $=e^{x}$
8579 \end_inset
8580
8581 )
8582 \end_layout
8583
8584 \begin_layout List
8585 \labelwidthstring 00000.00000.00000.000
8586
8587 \family sans
8588 ln
8589 \family default
8590
8591 \begin_inset LatexCommand \index{ln}
8592
8593 \end_inset
8594
8595 () log to the base
8596 \begin_inset Formula $e$
8597 \end_inset
8598
8599
8600 \end_layout
8601
8602 \begin_layout List
8603 \labelwidthstring 00000.00000.00000.000
8604
8605 \family sans
8606 sin
8607 \family default
8608
8609 \begin_inset LatexCommand \index{sin}
8610
8611 \end_inset
8612
8613 () sine.
8614 argument must be an angle (ASCEND will deal with the unit conversions automatic
8615 ally)
8616 \end_layout
8617
8618 \begin_layout List
8619 \labelwidthstring 00000.00000.00000.000
8620
8621 \family sans
8622 cos
8623 \family default
8624
8625 \begin_inset LatexCommand \index{cos}
8626
8627 \end_inset
8628
8629 () cosine.
8630 argument must be an angle.
8631 \end_layout
8632
8633 \begin_layout List
8634 \labelwidthstring 00000.00000.00000.000
8635
8636 \family sans
8637 tan
8638 \family default
8639
8640 \begin_inset LatexCommand \index{tan}
8641
8642 \end_inset
8643
8644 () tangent.
8645 argument must be an angle.
8646 \end_layout
8647
8648 \begin_layout List
8649 \labelwidthstring 00000.00000.00000.000
8650
8651 \family sans
8652 arcsin
8653 \family default
8654
8655 \begin_inset LatexCommand \index{arcsin}
8656
8657 \end_inset
8658
8659 () inverse sine.
8660 return value is an angle between -
8661 \begin_inset Formula $\pi/2$
8662 \end_inset
8663
8664 and
8665 \begin_inset Formula $\pi/2$
8666 \end_inset
8667
8668 radians.
8669 \end_layout
8670
8671 \begin_layout List
8672 \labelwidthstring 00000.00000.00000.000
8673
8674 \family sans
8675 arccos
8676 \family default
8677
8678 \begin_inset LatexCommand \index{arccos}
8679
8680 \end_inset
8681
8682 () inverse cosine.
8683 return value is an angle between
8684 \begin_inset Formula $0$
8685 \end_inset
8686
8687 and
8688 \begin_inset Formula $\pi$
8689 \end_inset
8690
8691 radians.
8692 \end_layout
8693
8694 \begin_layout List
8695 \labelwidthstring 00000.00000.00000.000
8696
8697 \family sans
8698 arctan
8699 \family default
8700
8701 \begin_inset LatexCommand \index{arctan}
8702
8703 \end_inset
8704
8705 () inverse tangent.
8706 return value is an angle between -
8707 \begin_inset Formula $\pi/2$
8708 \end_inset
8709
8710 and
8711 \begin_inset Formula $\pi/2$
8712 \end_inset
8713
8714 radians.
8715 \end_layout
8716
8717 \begin_layout List
8718 \labelwidthstring 00000.00000.00000.000
8719
8720 \family sans
8721 erf
8722 \family default
8723
8724 \begin_inset LatexCommand \index{erf}
8725
8726 \end_inset
8727
8728 () error function (not available under Windows)
8729 \end_layout
8730
8731 \begin_layout List
8732 \labelwidthstring 00000.00000.00000.000
8733
8734 \family sans
8735 sinh
8736 \family default
8737
8738 \begin_inset LatexCommand \index{sinh}
8739
8740 \end_inset
8741
8742 () hyperbolic sine
8743 \end_layout
8744
8745 \begin_layout List
8746 \labelwidthstring 00000.00000.00000.000
8747
8748 \family sans
8749 cosh
8750 \family default
8751
8752 \begin_inset LatexCommand \index{cosh}
8753
8754 \end_inset
8755
8756 () hyperbolic cosine
8757 \end_layout
8758
8759 \begin_layout List
8760 \labelwidthstring 00000.00000.00000.000
8761
8762 \family sans
8763 tanh
8764 \family default
8765
8766 \begin_inset LatexCommand \index{tanh}
8767
8768 \end_inset
8769
8770 () hyperbolic tangent
8771 \end_layout
8772
8773 \begin_layout List
8774 \labelwidthstring 00000.00000.00000.000
8775
8776 \family sans
8777 arcsinh
8778 \family default
8779
8780 \begin_inset LatexCommand \index{arcsinh}
8781
8782 \end_inset
8783
8784 () inverse hyperbolic sine
8785 \end_layout
8786
8787 \begin_layout List
8788 \labelwidthstring 00000.00000.00000.000
8789
8790 \family sans
8791 arccosh
8792 \family default
8793
8794 \begin_inset LatexCommand \index{arccosh}
8795
8796 \end_inset
8797
8798 () inverse hyperbolic cosine
8799 \end_layout
8800
8801 \begin_layout List
8802 \labelwidthstring 00000.00000.00000.000
8803
8804 \family sans
8805 arctanh
8806 \family default
8807
8808 \begin_inset LatexCommand \index{arctanh}
8809
8810 \end_inset
8811
8812 () inverse hyperbolic tangent
8813 \end_layout
8814
8815 \begin_layout List
8816 \labelwidthstring 00000.00000.00000.000
8817
8818 \family sans
8819 lnm
8820 \family default
8821
8822 \begin_inset LatexCommand \index{lnm}
8823
8824 \end_inset
8825
8826 () modified natural logarithm
8827 \begin_inset LatexCommand \index{ln, modified}
8828
8829 \end_inset
8830
8831 function.
8832 This
8833 \family sans
8834 lnm
8835 \family default
8836 function is parameterized by a constant
8837 \family sans
8838 a
8839 \family default
8840 , which is typically set to about
8841 \family typewriter
8842
8843 \begin_inset Formula $1\times10^{-8}$
8844 \end_inset
8845
8846
8847 \family default
8848 .
8849
8850 \family sans
8851 lnm
8852 \family default
8853 (x) is defined as follows:
8854 \end_layout
8855
8856 \begin_deeper
8857 \begin_layout Standard
8858 \begin_inset Formula \[
8859 \mathrm{lnm}(x)=\left\{ \begin{array}{cc}
8860 \ln(x) & \mathrm{for}\, x>a\\
8861 \frac{x-a}{a}+\ln(a) & \mathrm{for}\, x\le a\end{array}\right.\]
8862
8863 \end_inset
8864
8865
8866 \end_layout
8867
8868 \begin_layout Standard
8869 Below the value a (default setting is
8870 \family typewriter
8871
8872 \begin_inset Formula $1\times10^{-8}$
8873 \end_inset
8874
8875
8876 \family default
8877 ),
8878 \family sans
8879 lnm
8880 \family default
8881 takes on the value given by the straight line passing through
8882 \begin_inset Formula $\ln(a)$
8883 \end_inset
8884
8885 and having the same slope as
8886 \begin_inset Formula $\ln(a)$
8887 \end_inset
8888
8889 has at
8890 \begin_inset Formula $a$
8891 \end_inset
8892
8893 .
8894 This function and its first derivative are continuous.
8895 The second derivative contains a jump at
8896 \begin_inset Formula $a$
8897 \end_inset
8898
8899 .
8900 \end_layout
8901
8902 \begin_layout Standard
8903 The
8904 \family sans
8905 lnm
8906 \family default
8907 function can tolerate a negative argument while the
8908 \family sans
8909 ln
8910 \family default
8911 function cannot.
8912 At present the value of
8913 \begin_inset Formula $a$
8914 \end_inset
8915
8916 is controllable via the user interface of the ASCEND solvers.
8917
8918 \begin_inset Note Note
8919 status open
8920
8921 \begin_layout Standard
8922 need to check that.
8923 \end_layout
8924
8925 \end_inset
8926
8927
8928 \end_layout
8929
8930 \end_deeper
8931 \begin_layout List
8932 \labelwidthstring 00000.00000.00000.000
8933 Operand\InsetSpace ~
8934 dimensionality\InsetSpace ~
8935 must\InsetSpace ~
8936 be\InsetSpace ~
8937 correct.
8938 \end_layout
8939
8940 \begin_deeper
8941 \begin_layout Standard
8942 The operands for an ASCEND function must be dimensionally consistent with
8943 the function in question.
8944 Most transcendental functions require dimensionless arguments.
8945 The trigonometric functions require arguments with dimensionality of plane
8946 angles,
8947 \begin_inset Formula $P$
8948 \end_inset
8949
8950 .
8951 ASCEND functions return dimensionally correct results.
8952 \end_layout
8953
8954 \begin_layout Standard
8955 The operands for ASCEND functions are enclosed within rounded parentheses,
8956
8957 \family typewriter
8958 ()
8959 \family default
8960 .
8961 An example of use is:
8962 \end_layout
8963
8964 \begin_layout LyX-Code
8965 y = A*exp(-B/T);
8966 \end_layout
8967
8968 \end_deeper
8969 \begin_layout List
8970 \labelwidthstring 00000.00000.00000.000
8971
8972 \bar under
8973 Discontinuous\InsetSpace ~
8974 functions
8975 \begin_inset LatexCommand \index{functions, discontinuous}
8976
8977 \end_inset
8978
8979 :
8980 \end_layout
8981
8982 \begin_deeper
8983 \begin_layout Standard
8984 Discontinuous functions may destroy a Newton
8985 \begin_inset LatexCommand \index{Newton}
8986
8987 \end_inset
8988
8989 -based solution algorithm if used in defining a model equation.
8990 We strongly suggest considering alternative formulations of your equations.
8991 \end_layout
8992
8993 \end_deeper
8994 \begin_layout List
8995 \labelwidthstring 00000.00000.00000.000
8996
8997 \family sans
8998 abs
8999 \family default
9000
9001 \begin_inset LatexCommand \index{abs}
9002
9003 \end_inset
9004
9005 () absolute value of argument.
9006 Any dimensionality is allowed in an a
9007 \family sans
9008 bs
9009 \family default
9010 () function.
9011 \end_layout
9012
9013 \begin_deeper
9014 \begin_layout Section
9015 Logical functions
9016 \begin_inset LatexCommand \index{functions, logical}
9017
9018 \end_inset
9019
9020
9021 \end_layout
9022
9023 \end_deeper
9024 \begin_layout List
9025 \labelwidthstring 00000.00000.00000.000
9026 SATISFIED
9027 \begin_inset LatexCommand \index{SATISFIED}
9028
9029 \end_inset
9030
9031 () SATISFIED(relation_name,tolerance) returns TRUE if the relation named
9032 has a residual value less than the real value, tolerance, given.
9033 If the relation named is a logical relation, the tolerance should not be
9034 specified, since logical relations evaluate directly to TRUE or FALSE.
9035 \end_layout
9036
9037 \begin_deeper
9038 \begin_layout Section
9039
9040 \family sans
9041 UNITS
9042 \family default
9043
9044 \begin_inset LatexCommand \index{UNITS}
9045
9046 \end_inset
9047
9048 definitions
9049 \end_layout
9050
9051 \begin_layout Standard
9052 As noted in Section
9053 \begin_inset LatexCommand \vref{sub:x.1.2Basic-Elements}
9054
9055 \end_inset
9056
9057 , ASCEND will recognize conversion factors
9058 \begin_inset LatexCommand \index{conversion factors}
9059
9060 \end_inset
9061
9062 when it sees them as
9063 \family typewriter
9064 {units}
9065 \family default
9066 .
9067 These units are built up from the basic units, and new units can be defined
9068 by the user.
9069 Note that the assignment
9070 \family typewriter
9071 x:= 0.5 {100};
9072 \family default
9073 yields
9074 \family typewriter
9075 x == 50
9076 \family default
9077 , and that there are no `offset conversions
9078 \begin_inset LatexCommand \index{conversion, offset}
9079
9080 \end_inset
9081
9082
9083 \begin_inset LatexCommand \index{offset conversions}
9084
9085 \end_inset
9086
9087 ,' e.g.
9088 F=9/5C+32.
9089 Please keep unit names to 20 characters or less, as this makes life pretty
9090 for other users.
9091 \end_layout
9092
9093 \begin_layout Standard
9094 One or more unit conversion factors can be defined with the
9095 \family sans
9096 UNITS
9097 \family default
9098 keyword.
9099 A unit of measure, once defined, stays in the system until the system is
9100 shut down.
9101 A measuring unit cannot be defined differently without first shutting down
9102 the system, but duplicate or equivalent definitions are quietly ignored.
9103
9104 \end_layout
9105
9106 \begin_layout Standard
9107 A
9108 \family sans
9109 UNITS
9110 \family default
9111 declaration can occur in a file by itself, inside a model or inside an
9112 atom.
9113
9114 \family sans
9115 UNITS
9116 \family default
9117 definitions are parsed immediately, they will be processed even if a surroundin
9118 g
9119 \family sans
9120 MODEL
9121 \family default
9122 or
9123 \family sans
9124 ATOM
9125 \family default
9126 definition is rejected.
9127 Because units and dimensionality are designed into the deepest levels of
9128 the system, a unit definition must be parsed before any atoms or relations
9129 use that definition.
9130 It is good design practice to keep customized unit definitions in separate
9131 files and
9132 \family sans
9133 REQUIRE
9134 \family default
9135 those files at the beginning of any file that uses them.
9136 Unit definitions are made in the form, for example:
9137 \end_layout
9138
9139 \begin_layout LyX-Code
9140 UNITS (* several unit definitions could be
9141 \end_layout
9142
9143 \begin_layout LyX-Code
9144 here.
9145 *)
9146 \end_layout
9147
9148 \begin_layout LyX-Code
9149 ohm =
9150 \end_layout
9151
9152 \begin_layout LyX-Code
9153 {kilogram*meter^2/second^3/ampere^2};
9154 \end_layout
9155
9156 \begin_layout LyX-Code
9157 END UNITS;
9158 \end_layout
9159
9160 \begin_layout Standard
9161 The standard units library,
9162 \family typewriter
9163 measures.a4l
9164 \family default
9165 , is documented in the ASCEND manual, Section
9166 \begin_inset LatexCommand \ref{cha:physprops}
9167
9168 \end_inset
9169
9170
9171 \begin_inset LatexCommand \cite{ASCEND2006}
9172
9173 \end_inset
9174
9175 .
9176 \end_layout
9177
9178 \end_body
9179 \end_document

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22