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

Annotation of /trunk/doc/syntax.lyx

Parent Directory Parent Directory | Revision Log Revision Log


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