\chapter{Equation Input} \label{chap:equation}

The expressions to be evaluated are entered by the user as equations.
The syntax is very similar to \caps{FORTRAN} equation syntax. The first
item is the variable to be assigned, followed by an ``\cmd{=}'', then
the expression to be evaluated. The expression consists of constants,
variables, arithmetic operators, and functions.

The equations must adhere to the following syntax rules.
\setlength{\itemsep}{\medskipamount} \begin{itemize}
\item
Blanks are treated as delimiters, but are otherwise ignored.
\item
Either lowercase or uppercase letters are acceptable, but lowercase
letters are converted to uppercase.
\item
A ``\verb|'|'' character in any equation starts a comment. The
``\verb|'|'' and any characters following it on the line are ignored.
\item
An equation may be continued over several lines with a ``\verb|>|''
character. The ``\verb|>|'' and any characters following it on the
current line are ignored and the next line is appended to the current
line.
\end{itemize}

\section{The Assigned Variable} \label{assvar}

The assigned variable name must start with a letter and can be up to
eight alphanumeric characters (A--Z, 0--9) long. A name that is longer
than eight characters is truncated with a warning. Blanks cannot be
embedded in a variable name.

All assigned variables (except temporary variables specified by a
\cmd{DELETE} command) will be written to the output database. The input
database variables are not written to the output database unless they
are assigned in an equation (such as \cmd{X~=~X}) or transferred with a
\cmd{SAVE} command.

The type of the assigned variable depends on the expression. There are
three types of ``quantities'' in an expression that are related to the
variable types:
\setlength{\itemsep}{\medskipamount} \begin{itemize}
\item
Global quantities include global variables and nodal or element
variables for specific nodes or elements.
\item
Nodal quantities include nodal variables and nodal coordinates, unless
the value is limited to a specific node.
\item
Element quantities include element variables, unless the value is
limited to a specific element.
\end{itemize}
Global quantities are referred to as ``single-value''
quantities. Nodal and element quantities are referred to as ``arrays''.

Each part of an expression yields a result of a particular type. The
types of constants and variables are defined above. The type of an
arithmetic operation is dependent on the types of its operands. If both
operands are global quantities, the operation yields a global
quantity. If either operand is an array, the operation type is
the array type. Thus a nodal quantity and an element quantity cannot
appear in the same operation. For array operations, the operator is
applied to each array element. The type of a function is dependent on
the types of its parameters. The rules for operand types also apply to
all function parameters. One special type of function yields a global
quantity regardless of the parameter type.

The assigned variable can be reassigned, but it must be assigned to the
same variable type (global, nodal or element).

The equations are evaluated in order. The assigned variables are grouped
by variable type, but are otherwise output in the order they are first
assigned by the equations.

If there are no timesteps on the input database, a timestep will be
added to the output database. The equation defining new variable(s)
can access constants and coordinates.

\section{Restricting the Nodes and/or Elements}

Nodes and/or elements may be deleted from the input database with the
\cmd{ZOOM}, \cmd{VISIBLE}, \cmd{FILTER}, or \cmd{REMOVE} commands. An
input variable is defined for all input nodes and/or elements. An
output variable is only defined for the nodes and/or elements to be
output.

Element variables may be undefined for certain element blocks. This may
be further restricted with the \cmd{BLOCKS} command. If two or more
element variables are combined with an operator or are function
parameters, the resulting variable is only defined for an element block
if all the variables involved are defined for that block.

When an operation or function is performed on an array variable, it is
only performed for the defined nodes/elements. This is done to prevent
problems with numerical errors such as divide by zero for undefined
values.

\section{Constants}

Constants can be entered in any legal \caps{FORTRAN} numeric format
(e.g., 5, 5.4 or 5.4E3). All integers are converted to real numbers. If
the constant is signed, parenthesis should surround the sign and
constant.

\section{Variables}

The variables that may be found in the expression to be evaluated are:
\setlength{\itemsep}{\smallskipamount} \begin{itemize}
\item any input database global, nodal or element variable,
\item the values for any coordinate,
\item a reference to a specific nodal or element quantity,
\item the time associated with each time step, and
\item any previously assigned variable.
\end{itemize}

If an embedded blank is included in an input database variable or
coordinate name, the blank must be deleted in references to the
variable. For example, variable ``\cmd{SIG X}'' must be entered as
``\cmd{SIGX}''.

The coordinates may be referenced in the expression by name. They are
treated as an input database nodal variable whose value remains constant
in all ``whole'' time steps.

If the value for a specific node or element is desired, a ``\cmd{\$}''
and the node or element number is appended to the variable name. For
example, \cmd{SIGR\$40} refers to the value for the \nth{40}{th} element
of variable \cmd{SIGR}. A specifier may be appended to the name of any
nodal or element quantity in an expression, including coordinates and
previously assigned variables. References to specific nodes and/or
elements can only be made if the variable is defined at that node and/or
element.

The value of a variable in the previous time step is referenced by
appending a ``\cmd{:}'' to the variable name. The value in the first
time step is referenced by appending a ``\cmd{:1}'' to the variable
name. If time steps are selected, the previous and first time steps
refer to the selected time steps, not the input time steps.

The name ``\cmd{TIME}'' is reserved for the time associated with each
time step. The output database times are copied from the input database
unless a value is assigned to the variable \cmd{TIME}. \cmd{TIME} may also
appear in the expression, referring to the input or assigned database
time.

The equations are evaluated in order. References to a variable name in
the expression refer to the last assigned value, or to the input
variable if the name has not been assigned. For example, if input global
variable \cmd{CONST} has a value of 4 and the following equations are
executed,
\cenlinesbegin
\cmd{X = CONST} \\
\cmd{CONST = 2$*$CONST} \\
\cmd{Y = CONST}
\cenlinesend
the result is \cmd{X} equals 4, \cmd{CONST} equals 8, and \cmd{Y} equals
8.

\section{Operators}

The legal operations are addition ($+$), subtraction ($-$),
multiplication ($*$), division ($/$), and exponentiation ($**$). The
operands may be either single-value or array quantities as explained in
Section~\ref{assvar}.

\caps{FORTRAN} operator precedence rules apply (e.g., multiplication is
performed before addition). Parenthesis may be used to change the order
of evaluation.

Two operators cannot be placed in succession. To precede a value with a
sign, enclose the sign and value in parenthesis. For example,
\cenlinesbegin
\cmd{A = $-$5 $*$ $-$SIN(0.5)}
\cenlinesend
should be written as
\cenlinesbegin
\cmd{A = ($-$5) $*$ ($-$SIN(0.5))}
\cenlinesend
where the parenthesis around the \cmd{$-$5} are optional.

\section{Functions}

Many of the standard \caps{FORTRAN} functions and several special
functions are implemented in \caps{\PROGRAM}. 
These functions are summarized in Appendix~\ref{appx:function}.
The parameters for any
function may be expressions and all parameters must be supplied. The
parameters may be either single-value or array quantities as explained
in Section~\ref{assvar}.

A function in an equation is distinguished from a variable name by the
``\cmd{(}'' which follows the function name. This allows the user to
assign variable names which are the same as the function names and to
reference input database variables with the same names as the functions.

\subsection*{\caps{FORTRAN} Functions}

The standard \caps{FORTRAN} functions implemented are: \cmd{AINT},
\cmd{ANINT}, \cmd{ABS}, \cmd{MOD}, \cmd{SIGN}, \cmd{DIM}, \cmd{MAX},
\cmd{MIN}, \cmd{SQRT}, \cmd{EXP}, \cmd{LOG}, \cmd{LOG10}, \cmd{SIN},
\cmd{COS}, \cmd{TAN}, \cmd{ASIN}, \cmd{ACOS}, \cmd{ATAN}, \cmd{ATAN2},
\cmd{SINH}, \cmd{COSH}, and \cmd{TANH}. The use and result of these
functions is the same as in \caps{FORTRAN}, and the same restrictions
apply.

\subsection*{Tensor Principal Values and Magnitude Functions}

Functions \cmd{PMAX} and \cmd{PMIN} calculate the maximum and minimum
principal values of a symmetric tensor. For example, to obtain the
maximum principal values for a tensor $T$,
\cenlinesbegin
\cmd{SMAX = PMAX ($T_{11}$, $T_{22}$, $T_{33}$, $T_{12}$, $T_{23}$,
$T_{31}$)}.
\cenlinesend
For a two-dimensional tensor or a tensor using cylindrical coordinates
for an axisymmetric solution, \cmd{PMAX2} and \cmd{PMIN2} may be used:
\cenlinesbegin
\cmd{SMAX = PMAX2 ($T_{11}$, $T_{22}$, $T_{12}$)}.
\cenlinesend

The function \cmd{TMAG} calculates the magnitude of the deviatoric part
of a symmetric tensor. To calculate the magnitude of tensor $T$,
\cenlinesbegin
\cmd{SMAG = TMAG ($T_{11}$, $T_{22}$, $T_{33}$, $T_{12}$, $T_{23}$,
$T_{31}$)}
\cenlinesend
where the following calculation is made:
\cenlinesbegin
\cmd{SMAG = }$\sqrt{(T_{11} - T_{22})^{2} + (T_{22} - T_{33})^{2} +
(T_{33} - T_{11})^{2} + 6 * (T_{12}^{2} + T_{23}^{2} + T_{31}^{2})}$.
\cenlinesend

To obtain the von Mises stress, the value supplied by function
\cmd{TMAG} is multiplied by the constant $1/\sqrt{2}$. To calculate
effective strain, multiply by the constant $\sqrt{2.0}/3.0$.

\subsection*{IF Functions}

The functions \cmd{IFLZ}, \cmd{IFEZ}, and \cmd{IFGZ} provide a simple
\mbox{if-then-else} capability. Each function expects three parameters:
a condition, a true result, and a false result. Function \cmd{IFLZ}
returns the true result if the condition evaluates to less than zero;
otherwise the function returns the false result. Function \cmd{IFEZ}
checks for equal to zero and \cmd{IFGZ} checks for greater than zero.
For example, the equation
\cenlinesbegin
\cmd{\param{x} = IFLZ (\param{cond}, \param{rtrue}, \param{rfalse})}
\cenlinesend
with global parameters \param{cond}, \param{rtrue}, and \param{rfalse}
could be implemented in \caps{FORTRAN} by
\cenlinesbegin
\cmd{IF (\param{cond} .LT. 0.0) THEN} \\
\hspace*{\myindent} \cmd{\param{x} = \param{rtrue}} \\
\cmd{ELSE} \\
\hspace*{\myindent} \cmd{\param{x} = \param{rfalse}} \\
\cmd{END IF}
\cenlinesend
All the parameters are evaluated before the function, so both the true
result and the false result are evaluated even though only one is
needed.

\subsection*{Array $\Rightarrow$ Global Variable Functions}

The functions \cmd{SUM}, \cmd{SMAX}, and \cmd{SMIN} perform a
calculation on a nodal or element array parameter which produces a
global result. \cmd{SUM} sums all the array values. \cmd{SMAX} and
\cmd{SMIN} return the maximum and minimum of all the array values.

Values for specific nodes and/or elements are only included in the
function calculation if the variable is defined at that node and/or
element.

\subsection*{Envelope Functions}

An ``envelope'' function performs a calculation that is cumulative for
all previous time steps. The function \cmd{ENVMAX} results in an array
(assuming the parameter is an array) that is the maximum of each array
value for all previous selected time steps and the current time step. On
the last time step, \cmd{ENVMAX} contains the maximum of each array
value for all selected time steps. \cmd{ENVMIN} is the corresponding
minimum function.
