| [0b990d] | 1 | 
 | 
|---|
 | 2 | /** \page keyval The KeyVal Library
 | 
|---|
 | 3 | 
 | 
|---|
 | 4 | The KeyVal class provides a means for users to associate keywords with
 | 
|---|
 | 5 | values.  ParsedKeyVal is a specialization of KeyVal that permits
 | 
|---|
 | 6 | keyword/value associations in text such as an input file or a command line
 | 
|---|
 | 7 | string.
 | 
|---|
 | 8 | 
 | 
|---|
 | 9 | The package is flexible enough to allow complex structures and arrays as
 | 
|---|
 | 10 | well as objects to be read from an input file.
 | 
|---|
 | 11 | 
 | 
|---|
 | 12 | <ul>
 | 
|---|
 | 13 |   <li> \ref keyvalass
 | 
|---|
 | 14 |   <li> \ref keyvalgroup
 | 
|---|
 | 15 |   <li> \ref keyvalarray
 | 
|---|
 | 16 |   <li> \ref keyvaltab
 | 
|---|
 | 17 |   <li> \ref keyvalexp
 | 
|---|
 | 18 |   <li> \ref keyvalobj
 | 
|---|
 | 19 | </ul>
 | 
|---|
 | 20 | 
 | 
|---|
 | 21 | \section keyvalass Assignment
 | 
|---|
 | 22 | 
 | 
|---|
 | 23 | As an example of the use of ParsedKeyVal, consider the following
 | 
|---|
 | 24 | input:
 | 
|---|
 | 25 | <pre>
 | 
|---|
 | 26 | x_coordinate = 1.0
 | 
|---|
 | 27 | y_coordinate = 2.0
 | 
|---|
 | 28 | x_coordinate = 3.0
 | 
|---|
 | 29 | </pre>
 | 
|---|
 | 30 | Two assignements will be made.  The keyword <tt>x_coordinate</tt> will be
 | 
|---|
 | 31 | associated with the value <tt>1.0</tt> and the keyword <tt>y_coordinate</tt>
 | 
|---|
 | 32 | will be assigned to <tt>2.0</tt>.  The third line in the above input
 | 
|---|
 | 33 | will have no effect since <tt>x_coordinate</tt> was assigned previously.
 | 
|---|
 | 34 | 
 | 
|---|
 | 35 | \section keyvalgroup Keyword Grouping
 | 
|---|
 | 36 | 
 | 
|---|
 | 37 | Lets imagine that we have a program which needs to read in the
 | 
|---|
 | 38 | characteristics of animals.  There are lots of animals so it might be
 | 
|---|
 | 39 | nice to catagorize them by their family.  Here is a sample format for
 | 
|---|
 | 40 | such an input file:
 | 
|---|
 | 41 | <pre>
 | 
|---|
 | 42 | reptile: (
 | 
|---|
 | 43 |   alligator: (
 | 
|---|
 | 44 |     legs = 4
 | 
|---|
 | 45 |     extinct = no
 | 
|---|
 | 46 |     )
 | 
|---|
 | 47 |   python: (
 | 
|---|
 | 48 |     legs = 0
 | 
|---|
 | 49 |     extinct = no
 | 
|---|
 | 50 |     )
 | 
|---|
 | 51 |   )
 | 
|---|
 | 52 | bird: (
 | 
|---|
 | 53 |   owl: (
 | 
|---|
 | 54 |     flys = yes
 | 
|---|
 | 55 |     extinct = no
 | 
|---|
 | 56 |     )
 | 
|---|
 | 57 |   )
 | 
|---|
 | 58 | </pre>
 | 
|---|
 | 59 | 
 | 
|---|
 | 60 | This sample illustrates the use of keyword <tt>=</tt> value
 | 
|---|
 | 61 | assignments and the keyword grouping operators <tt>(</tt> and <tt>)</tt>.
 | 
|---|
 | 62 | The keywords in this example are
 | 
|---|
 | 63 | <pre>
 | 
|---|
 | 64 | reptile:alligator:legs
 | 
|---|
 | 65 | reptile:alligator:extinct
 | 
|---|
 | 66 | reptile:alligator:legs
 | 
|---|
 | 67 | reptile:python:size
 | 
|---|
 | 68 | reptile:python:extinct
 | 
|---|
 | 69 | bird:owl:flys
 | 
|---|
 | 70 | bird:owl:extinct
 | 
|---|
 | 71 | </pre>
 | 
|---|
 | 72 | 
 | 
|---|
 | 73 | The <tt>:</tt>'s occuring in these keywords break the keywords into
 | 
|---|
 | 74 | smaller logical units called keyword segments.  The sole purpose of this
 | 
|---|
 | 75 | is to allow persons writing input files to group the input into easy to
 | 
|---|
 | 76 | read sections.  In the above example there are two main sections, the
 | 
|---|
 | 77 | reptile section and the bird section.  The reptile section takes the
 | 
|---|
 | 78 | form <tt>reptile</tt> <tt>:</tt> <tt>(</tt> keyword <tt>=</tt> value
 | 
|---|
 | 79 | assignments <tt>)</tt>.  Each of the keywords found between the
 | 
|---|
 | 80 | parentheses has the <tt>reptile:</tt> prefix attached to it.  Within each
 | 
|---|
 | 81 | of these sections further keyword groupings can be used, as many and as
 | 
|---|
 | 82 | deeply nested as the user wants.
 | 
|---|
 | 83 | 
 | 
|---|
 | 84 | Keyword grouping is also useful when you need many different programs to
 | 
|---|
 | 85 | read from the same input file.  Each program can be assigned its own
 | 
|---|
 | 86 | unique section.
 | 
|---|
 | 87 | 
 | 
|---|
 | 88 | \section keyvalarray Array Construction
 | 
|---|
 | 89 | 
 | 
|---|
 | 90 | Input for an array is specified in the input by forming a keyword
 | 
|---|
 | 91 | group.  The name of the group is the name of the array and the
 | 
|---|
 | 92 | grouped keywords are the integers \f$i\f$, such that \f$0 \leq i < n\f$, where \f$n\f$
 | 
|---|
 | 93 | is the number of elements in the array.  For example, an array, called
 | 
|---|
 | 94 | <tt>array</tt>, of length 3 could be given as follows:
 | 
|---|
 | 95 | <pre>
 | 
|---|
 | 96 | array: (
 | 
|---|
 | 97 |   0 = 5.4
 | 
|---|
 | 98 |   1 = 8.9
 | 
|---|
 | 99 |   2 = 3.7
 | 
|---|
 | 100 |   )
 | 
|---|
 | 101 | </pre>
 | 
|---|
 | 102 | The numbers <tt>0</tt>, <tt>1</tt>, and <tt>2</tt> in this example are keyword
 | 
|---|
 | 103 | segments which serve as indices of <tt>array</tt>.  However, this syntax
 | 
|---|
 | 104 | is somewhat awkward and array construction operators have been provided
 | 
|---|
 | 105 | to simplify the input for this case.  The following input is equivalent
 | 
|---|
 | 106 | to the above input:
 | 
|---|
 | 107 | <pre>
 | 
|---|
 | 108 | array = [ 5.4 8.9 3.7 ]
 | 
|---|
 | 109 | </pre>
 | 
|---|
 | 110 | 
 | 
|---|
 | 111 | More complex arrays than this can be imagined.  Suppose an array of
 | 
|---|
 | 112 | complex numbers is needed.  For example the input
 | 
|---|
 | 113 | <pre>
 | 
|---|
 | 114 | carray: (
 | 
|---|
 | 115 |   0: ( r = 1.0  i = 0.0 )
 | 
|---|
 | 116 |   1: ( r = 0.0  i = 1.0 )
 | 
|---|
 | 117 |   )
 | 
|---|
 | 118 | </pre>
 | 
|---|
 | 119 | could be written as
 | 
|---|
 | 120 | <pre>
 | 
|---|
 | 121 | carray: [
 | 
|---|
 | 122 |   (r = 1.0 i = 0.0)
 | 
|---|
 | 123 |   (r = 0.0 i = 1.0)
 | 
|---|
 | 124 |   ]
 | 
|---|
 | 125 | </pre>
 | 
|---|
 | 126 | which looks a bit nicer than the example without array construction
 | 
|---|
 | 127 | operators.
 | 
|---|
 | 128 | 
 | 
|---|
 | 129 | Furthermore, the array construction operators can be nested in about
 | 
|---|
 | 130 | every imaginable way.  This allows multidimensional arrays of
 | 
|---|
 | 131 | complicated data to be represented.  Here is an example of
 | 
|---|
 | 132 | input for a lower triangular array:
 | 
|---|
 | 133 | <pre>
 | 
|---|
 | 134 | ltriarray = [ [ 5.4  ]
 | 
|---|
 | 135 |               [ 0.0 2.8 ]
 | 
|---|
 | 136 |               [ 0.1 0.0 3.7 ] ]
 | 
|---|
 | 137 | </pre>
 | 
|---|
 | 138 | 
 | 
|---|
 | 139 | \section keyvaltab Table Construction
 | 
|---|
 | 140 | 
 | 
|---|
 | 141 | Although the array construction operators will suit
 | 
|---|
 | 142 | most requirements for enumerated lists of data, in some cases the input can
 | 
|---|
 | 143 | still look ugly.  This can, in some cases, be fixed with the table
 | 
|---|
 | 144 | construction operators, <tt>{</tt> and <tt>}</tt>.
 | 
|---|
 | 145 | 
 | 
|---|
 | 146 | Suppose a few long vectors of the same length are needed and the data in
 | 
|---|
 | 147 | the <tt>i</tt>th element of each array is related or somehow belong
 | 
|---|
 | 148 | together.  If the arrays are so long that the width of a page is
 | 
|---|
 | 149 | exceeded, then data that should be seen next to each other are no longer
 | 
|---|
 | 150 | adjacent.  The way this problem can be fixed is to arrange the data
 | 
|---|
 | 151 | vertically side by side rather than horizontally.  The table
 | 
|---|
 | 152 | construction operators allows the user to achieve this in a very simple
 | 
|---|
 | 153 | manner.
 | 
|---|
 | 154 | <pre>
 | 
|---|
 | 155 | balls: (
 | 
|---|
 | 156 |   color    = [  red      blue     red   ]
 | 
|---|
 | 157 |   diameter = [   12       14       11   ]
 | 
|---|
 | 158 |   material = [  rubber  vinyl   plastic ]
 | 
|---|
 | 159 |   bounces  = [  yes      no       no    ]
 | 
|---|
 | 160 |   coordinate = [[ 0.0  0.0  0.0]
 | 
|---|
 | 161 |                 [ 1.0  2.0 -1.0]
 | 
|---|
 | 162 |                 [ 1.0 -1.0  1.0]]
 | 
|---|
 | 163 |   )
 | 
|---|
 | 164 | </pre>
 | 
|---|
 | 165 | can be written
 | 
|---|
 | 166 | <pre>
 | 
|---|
 | 167 | balls: (
 | 
|---|
 | 168 |   { color diameter material bounces     coordinate} =
 | 
|---|
 | 169 |   {  red     12    rubber    yes     [ 0.0  0.0  0.0]
 | 
|---|
 | 170 |      blue    14    vinyl     no      [ 1.0  2.0 -1.0]
 | 
|---|
 | 171 |      red     11    plastic   no      [ 1.0 -1.0  1.0] }
 | 
|---|
 | 172 |   )
 | 
|---|
 | 173 | </pre>
 | 
|---|
 | 174 | The length and width of the table can be anything the user desires.
 | 
|---|
 | 175 | 
 | 
|---|
 | 176 | <pre>Value Substitution</pre>
 | 
|---|
 | 177 | 
 | 
|---|
 | 178 | Occasionally, a user may need to repeat some value several times in an
 | 
|---|
 | 179 | input file.  If the value must be changed, it would be nice to only
 | 
|---|
 | 180 | change the value in one place.  The value substitution feature of
 | 
|---|
 | 181 | ParsedKeyVal allows the user to do this.  Any place a value can
 | 
|---|
 | 182 | occur the user can place a <tt>$</tt>.  Following this a keyword must be
 | 
|---|
 | 183 | given.  This keyword must have been assigned before the attempt is made
 | 
|---|
 | 184 | to use its value in a value substitution.
 | 
|---|
 | 185 | 
 | 
|---|
 | 186 | Here is an example illustrating most of the variable substition
 | 
|---|
 | 187 | features:
 | 
|---|
 | 188 | <pre>
 | 
|---|
 | 189 | default:linewidth = 130
 | 
|---|
 | 190 | testsub: (
 | 
|---|
 | 191 |   ke: (
 | 
|---|
 | 192 |     ke_1 = 1
 | 
|---|
 | 193 |     ke_2 = 2
 | 
|---|
 | 194 |     ke_3: (
 | 
|---|
 | 195 |       ke_31 = 31
 | 
|---|
 | 196 |       ke_32 = 32
 | 
|---|
 | 197 |       )
 | 
|---|
 | 198 |     )
 | 
|---|
 | 199 |   kx = $ke
 | 
|---|
 | 200 |   r1 = 3.0
 | 
|---|
 | 201 |   r2 = $r1
 | 
|---|
 | 202 |   linewidth = $:default:linewidth
 | 
|---|
 | 203 |   )
 | 
|---|
 | 204 | </pre>
 | 
|---|
 | 205 | is the same as specifying
 | 
|---|
 | 206 | <pre>
 | 
|---|
 | 207 | testsub: (
 | 
|---|
 | 208 |   ke: (
 | 
|---|
 | 209 |     ke_1 = 1
 | 
|---|
 | 210 |     ke_3: (
 | 
|---|
 | 211 |       ke_31 = 31
 | 
|---|
 | 212 |       ke_32 = 32
 | 
|---|
 | 213 |       )
 | 
|---|
 | 214 |     ke_2 = 2
 | 
|---|
 | 215 |     )
 | 
|---|
 | 216 |   linewidth = 130
 | 
|---|
 | 217 |   r2 = 3.0
 | 
|---|
 | 218 |   r1 = 3.0
 | 
|---|
 | 219 |   kx: (
 | 
|---|
 | 220 |     ke_1 = 1
 | 
|---|
 | 221 |     ke_2 = 2
 | 
|---|
 | 222 |     ke_3: (
 | 
|---|
 | 223 |       ke_31 = 31
 | 
|---|
 | 224 |       ke_32 = 32
 | 
|---|
 | 225 |       )
 | 
|---|
 | 226 |     )
 | 
|---|
 | 227 |   )
 | 
|---|
 | 228 | </pre>
 | 
|---|
 | 229 | It can be seen from this that value substitution can result in entire
 | 
|---|
 | 230 | keyword segment hierarchies being copied, as well as simple
 | 
|---|
 | 231 | substitutions.
 | 
|---|
 | 232 | 
 | 
|---|
 | 233 | \section keyvalexp Expression Evaluation
 | 
|---|
 | 234 | 
 | 
|---|
 | 235 | Suppose your program requires several parameters <tt>x1</tt>, <tt>x2</tt>,
 | 
|---|
 | 236 | and <tt>x3</tt>.  Furthermore, suppose that their ratios remain fixed for
 | 
|---|
 | 237 | all the runs of the program that you desire.  It would be best to
 | 
|---|
 | 238 | specify some scale factor in the input that would be the only thing that
 | 
|---|
 | 239 | has to be changed from run to run.  If you don't want to or cannot
 | 
|---|
 | 240 | modify the program, then this can be done directly with
 | 
|---|
 | 241 | ParsedKeyVal as follows
 | 
|---|
 | 242 | <pre>
 | 
|---|
 | 243 | scale = 1.234
 | 
|---|
 | 244 | x1 = ( $:scale *  1.2 )
 | 
|---|
 | 245 | x2 = ( $:scale *  9.2 )
 | 
|---|
 | 246 | x3 = ( $:scale * -2.0 )
 | 
|---|
 | 247 | </pre>
 | 
|---|
 | 248 | So we see that to the right of the ``<tt>=</tt>'' the characters
 | 
|---|
 | 249 | ``<tt>(</tt>'' and ``<tt>)</tt>'' are the expression construction operators.
 | 
|---|
 | 250 | This is in contrast to their function when they are to the left of the
 | 
|---|
 | 251 | ``<tt>=</tt>'', where they are the keyword grouping operators.
 | 
|---|
 | 252 | 
 | 
|---|
 | 253 | The expression must be binary and the data is all converted
 | 
|---|
 | 254 | to double.  If you use the expression construction operators to produce
 | 
|---|
 | 255 | data that the program expects to be integer, you will certainly get the
 | 
|---|
 | 256 | wrong answers (unless the desired value happens to be zero).
 | 
|---|
 | 257 | 
 | 
|---|
 | 258 | \section keyvalobj Objects
 | 
|---|
 | 259 | 
 | 
|---|
 | 260 | An instance of an object can be specified by surrounding it's
 | 
|---|
 | 261 | classname with the ``<tt><</tt>'' and ``<tt>></tt>'' operators immediately
 | 
|---|
 | 262 | after the keyword naming the data.
 | 
|---|
 | 263 | 
 | 
|---|
 | 264 | A pointer to a single object can be associated with multiple keywords by
 | 
|---|
 | 265 | using value substitution.
 | 
|---|
 | 266 | This is accomplished by holding references to all objects once they are
 | 
|---|
 | 267 | read in.
 | 
|---|
 | 268 | 
 | 
|---|
 | 269 | Consider a linked list class, A, which reads from the keyword
 | 
|---|
 | 270 | <tt>next</tt> a reference to an object of class A.  Input for such an
 | 
|---|
 | 271 | object, read from keyword <tt>a1</tt>, follows:
 | 
|---|
 | 272 | <pre>
 | 
|---|
 | 273 | a1\<A\>: (
 | 
|---|
 | 274 |     next\<A\>: (
 | 
|---|
 | 275 |         next\<B\>: (
 | 
|---|
 | 276 |             bdata = 4
 | 
|---|
 | 277 |             next\<A\>:()
 | 
|---|
 | 278 |             )
 | 
|---|
 | 279 |         )
 | 
|---|
 | 280 |     )
 | 
|---|
 | 281 | a2 = $:a1
 | 
|---|
 | 282 | </pre>
 | 
|---|
 | 283 | 
 | 
|---|
 | 284 | The <tt>a1</tt> list would contain two <tt>A</tt> objects followed by a
 | 
|---|
 | 285 | <tt>B</tt> object followed by another <tt>A</tt> object.  The <tt>a2</tt> list
 | 
|---|
 | 286 | refers to exactly the same object as <tt>a1</tt> (not a copy of
 | 
|---|
 | 287 | <tt>a1</tt>).
 | 
|---|
 | 288 | 
 | 
|---|
 | 289 | */
 | 
|---|