Next: , Previous: , Up: Unit Expressions   [Contents][Index]


5.7 Variables Assigned at Run Time

Unit definitions are fixed once units has finished reading the units data file(s), but at run time you can assign unit expressions to variables whose names begin with an underscore, using the syntax

_name = <unit expression>

This can help manage a long calculation by saving intermediate quantities as variables that you can use later. For example, to determine the shot-noise-limited signal-to-noise ratio (SNR) of an imaging system using a helium–neon laser, you could do

You have: _lambda = 632.8 nm            # laser wavelength
You have: _nu = c / _lambda             # optical frequency
You have: _photon_energy = h * _nu
You have: _power = 550 uW
You have: _photon_count = _power * 500 ns / _photon_energy
You have: _snr = sqrt(_photon_count)
You have: _snr
You want:
        Definition: sqrt(_photon_count) = 29597.922

Except for beginning with an underscore, runtime variables follow the same naming rules as units. Because names beginning with ‘_’ are reserved for these variables and unit names cannot begin with ‘_’, runtime variables can never hide unit definitions. Runtime variables are undefined until you make an assignment to them, so if you give a name beginning with an underscore and no assignment has been made, you get an error message.

When you assign a unit expression to a runtime variable, units checks the expression to determine whether it is valid, but the resulting definition is stored as a text string, and is not reduced to primitive units. The text will be processed anew each time you use the variable in a conversion or calculation. This means that if your definition depends on other runtime variables (or the special variable ‘_’), the result of calculating with your variable will change if any of those variables change. A dependence need not be direct.

Continuing the example of the laser above, suppose you have done the calculation as shown. You now wonder what happens if you switch to an argon laser:

You have: _lambda = 454.6 nm
You have: _snr
You want:
        Definition: sqrt(_photon_count) = 25086.651

If you then change the power:

You have: _power = 1 mW
You have: _snr
You want:
        Definition: sqrt(_photon_count) = 33826.834

Instead of having to reenter or edit a lengthy expression when you perform another calculation, you need only enter values that change; in this respect, runtime variables are similar to a spreadsheet.

The more times a variable appears in an expression that depends on it, the greater the benefit of having a calculation using that expression reflect changes to that variable. For example, the length of a sidereal day at a given latitude and declination of the Sun is given by

\[ L = 2 \cos^{-1} \left ( { \sin h - \sin \phi \sin \delta } \over { \cos \phi \cos \delta } \right ) \]

where \(L\) is the day length, \(h\) is the Sun’s altitude, \(\phi\) is the location’s latitude, and \(\delta\) is the Sun’s declination. The length of a solar day is obtained from a sidereal day by multiplying by

siderealday / day

By convention, the Sun’s altitude at rise or set is \(-50^\prime\) to allow for atmospheric refraction and the semidiameter of its disk. At the summer solstice, the Sun’s declination is approximately \(23.44^\circ\); to find the length of the longest day of the year for a latitude of \(55^\circ\), you could do

You have: _alt = -50 arcmin
You have: _lat = 55 deg
You have: _decl = 23.44 deg
You have: _num = sin(_alt) - sin(_lat) sin(_decl)
You have: _denom = cos(_lat) cos(_decl)
You have: _sday = 2 (acos(_num / _denom) / circle) 24 hr
You have: _day = _sday siderealday / day
You have: _day
You want: hms
        17 hr + 19 min + 34.895151 sec

At the winter solstice, the Sun’s declination is approximately \(-23.44^\circ\), so you could calculate the length of the shortest day of the year using:

You have: _decl = -23.44 deg
You have: _day
You want: hms
        7 hr + 8 min + 40.981084 sec

Latitude and declination each appear twice in the expression for _day; the result in the examples above is updated by changing only the value of the declination.

It’s important to remember that evaluation of runtime variables is delayed, so you cannot make an assignment that is self-referential. For example, the following does not work:

You have: _decl = 23.44 deg
You have: _decl = -_decl
You have: _decl
Circular unit definition

A runtime variable must be assigned before it can be used in an assignment; in the first of the three examples above, giving the general equation before the values for _alt, _lat, and _decl had been assigned would result in an error message.


Next: Backwards Compatibility: ‘*’ and ‘-, Previous: Complicated Unit Expressions, Up: Unit Expressions   [Contents][Index]

JavaScript license information