\chapter{Exodiff}\label{ch:exodiff}
\section{Introduction}

\exodiff{} compares the results data from two \exo{} databases.  The
databases should represent the same model, that is, the \exo{} meta
data should be identical as should be the genesis portion of the bulk
data. The only differences should be in the values of the transient
bulk data.  \exodiff{}'s main purpose is to detect and report these
differences. \exodiff{} will compare global, nodal, element, nodeset,
and sideset transient variables at each selected timestep; it will
also compare element attribute variables on each element block
containing attributes.

If a third file is specified on the command line, it will be created
with the same meta data and non-transient bulk data as the first file,
and each variable in the third file will be the differences of the
corresponding variables in the first two files.

A command file can be specified and used to control exactly what
variables are to be compared/differenced and to what tolerance.

By default, element block names and variable names are compared ignoring case.

\subsection{Difference Terminology}
\exodiff{} supports several options for determining whether two values
differ.  These are called {\em difference types} and include the
following:

\begin{tabular}{ll}
relative difference  & $|val1 - val2|/\max(|val1|, |val2|)$. \\
absolute difference  & $|val1 - val2|$ \\
combined difference  & $|val1 - val2| / \max(tol, tol * \max(|val1|, |val2|))$ \\
eigen\_relative difference  & $||val1| - |val2||/\max{(|val1|,|val2|)}$. \\
eigen\_absolute difference  & $||val1| - |val2||$\\
eigen\_combined difference  & $||val1| - |val2|| / \max(tol, tol * \max(|val1|, |val2|))$\\
\end{tabular}

Where $tol$ is a user-specified tolerance. The difference types
prefixed by {\em eigen\_} are intended to be used when the variable
being differenced describes the shape of an eigenvector and the
eigenvector shape is considered equal if the values on one database
are equal in magnitude, but possibly of a different sign\footnote{Note
that the difference type as implemented does not fully check whether
the eigenvectors represented by the data are truly the same shape with
a potential difference of sign since it works on an item-by-item basis and
does not check whether all items in the first database are multiplied
by the same 1.0 or -1.0 to match the items in the second database.
However, the implementation can be improved in the future without
breaking any existing scripts or command files.}.

Values are considered equal if $|val1| <= floor \&\& |val2| <= floor$;
where $floor$ is a user-specified value. Otherwise the difference is
computed using one of the above formulas and compared to a tolerance.
If the difference is greater than the tolerance, then the databases
are different.  At the end of execution, a summary of the differences
found is output.

By default:
\begin{itemize}
\item All results variables and attributes are compared using a {\em relative difference} of $10^{-6}$
(about 6 significant digits) and a {\em floor} of~0.0.
\item Nodal locations are compared using {\em absolute difference} with
a tolerance of $10^{-6}$ and a {\em floor} of~0.0.
\item Time step values are compared using {\em relative difference} tolerance of $10^{-6}$ and a floor of $10^{-15}$.
\end{itemize}

\section{Invoking \exodiff}
\exodiff{} can be invoked using the following command lines:
To do normal comparison of two files using default tolerances
producing text output summarizing the differences, enter:
\begin{syntax}
     exodiff [{options}] [-f <cmd\_file>] file1.e file2.e
\end{syntax}
Where \file{cmd\_file} is an optional file containing options and
tolerance values; its syntax is described below.

If you want \exodiff{} to output an \exo{} file created containing the differences of the two
files, the command line is similar, but also contains the name of the
file where the differences should be written\footnote{Note that all
variables on the third file are the difference of the values on the
first two files including the displacement variables.  If you
visualize the file containing the differences, the visualization program may show a strange
deformed shape since the displacement variables are no longer true displacements.}:
\begin{syntax}
     exodiff [{options}] [-f <cmd\_file>] file1.e file2.e diff_file.e
\end{syntax}

The third invocation option reads a single file and outputs a summary
of the variable data contained in the file.  The summary data are the
minimum and maximum values for each variable and the time step and
entity id where the minimums and maximums occurred.  This file can be
used for preparing a command input file for use in the previous two
invocations.  The \param{no\_coord\_sep} option if present will
inhibit the calculation and output of the minimum distance between any
two nodes in the file which can take a long time for large models and
is often unneeded data.
\begin{syntax}
     exodiff -summary [no\_coord\_sep] file.e (create variable summary)
\end{syntax}

The remaining invocation lines will output a short usage summary, a
much longer usage summary, and the last just output the version
information.

\begin{syntax}
     exodiff [-h] [-help]             (short usage summary)
     exodiff [-H]                     (longer usage summary)
     exodiff [-v] [-version]          (version info)
\end{syntax}

The basic behavior can be modified using several optional parameters
specified on the command line.  These are documented below:

\subsection{Optional Parameters}

\renewcommand\arraystretch{1.5}
\begin{longtable}{lp{4.0in}}
-t \tt<real value> & Overrides the default tolerance of $10^{-6}$ for
	all variables.\\
-F \tt<real value> & Overrides the default floor tolerance of 0.0 for
	all variables.\\
-absolute & Use absolute differences as default tolerance type \\
-relative & Use relative differences as default tolerance type \\
-combined & Use combined differences as default tolerance type \\
-eigen\_absolute & Use eigen\_absolute differences as default tolerance type (absolute value of values) \\
-eigen\_relative & Use eigen\_relative differences as default tolerance type (absolute value of values) \\
-eigen\_combined & Use eigen\_combined differences as default tolerance type (absolute value of values) \\

-T \tt<offset> & Match timestep 'x+offset' in first file with timestep
	'x' in second file. \\

-TA   & Automatically determine the timestep offset such that both databases end at the same step. \\
-TM   & Automatically determine the timestep offset to find the closest match in file1 to the first step on file2.\\
-q    & Quiet.  Only errors will be sent to stdout. Comparison mode
	will echo: {\tt exodiff: Files are the same.} or {\tt exodiff: Files are different.}\\

-show\_all\_diffs & Show all differences for all variables, not
	just the maximum.  Default behavior is that there will be a maximum of
	one difference output per variable per timestep.  If this option is
	specified, then any pair of values that exceed the tolerance will be
	output.  Use of this option Can result in lots of output on large files
        with lots of differences.\\

-m & Invoke a matching algorithm to create a mapping between the
	nodes and elements of the two files based on geometric proximity.
	The topology must still be the same (within tolerance), but can be ordered differently.
	A match must be found for all nodes and elements or \exodiff{}
	will output an error message and stop.\\

-p & Invoke a matching algorithm similar to the -m option.  However
	this option ignores unmatched nodes and elements.  This allows
	comparison of files that only partially overlap. \\

-match\_ids & Invoke a matching algorithm which matches nodes and elements using the node and element
        global id maps in the two files. This is the default
        mode of operation.\\

-match\_file\_order & Invoke a matching algorithm using the node and element
        position order in the two files. \\

-show\_unmatched & If the -p option is given, this prints out the
        elements that did not match. \\

-dumpmap & If the -m or -p switch is given, this prints out the resulting
        map between the nodes and elements in the two files. \\

-nsmap & Create a map between the nodeset nodes in the two files
        if they include the same nodes, but are in different
        order. This is enabled by default.\\

-ssmap & Create a map between the sideset faces in the two files
        if they include the same sides, but are in different order.
        This is enabled by default.\\

-no\_nsmap & Compare nodeset nodes based on file order only. \\
-no\_ssmap & Compare sideset faces based on file order only. \\

-s & Short block type compare.  Forces element block type strings to
        be compared only up to the shortest string length.  For example,
        ``HEX'' and ``HEX8'' will be considered the same. This is enabled by default. \\

-no\_short & Do not do the short block type compare.  Forces element block
        type strings to fully match. For example, ``HEX'' and ``HEX8''
        will be considered different. \\

 -ignore\_case & Ignore case.  Variable names are compared case
	in-sensitive.  For example, ``Stress'' and ``STRESS'' will be
	considered as the same variable. This is enabled by default. \\

-case\_sensitive & Variable names are compared case sensitive. For
	example, ``Stress'' and ``STRESS'' will be considered as two different
	variables. \\

-ignore\_maps& Output node and element difference summaries using file local implicit
        ids instead of global ids. Note that the matching of
	nodes and elements will use the mapping option
	specified above; this option only affects the output of the node or
	element id where the difference occurred. \\

-ignore\_nans& Don't check data for NaNs.  By default, \exodiff{} will
	output a warning message if any variable's value is NaN (Not a number). \\

-ignore\_dups& If two elements/nodes are in the same location in match or partial
	match case, return first match instead of
	aborting. This is used in the -m and -p matching options.  Normally,
	\exodiff{} will output an error message if a node in one file can be
	matched to two or more nodes in the second file.\\

-ignore\_attributes& Don't compare element attribute values. \\

-nosymm & Turn off symmetric variable name checking.  By default, a warning
	will be produced if a variable that is not to be excluded\footnote{See
	the command file description in Section~\ref{ed:command_file} for
	details on excluding variables} is contained in the second file given
	on the command line but not the first.  This ``symmetric'' check can be
	turned off with this option and the extra variables in the second file
	will be ignored.\\

-allow\_name\_mismatch  & Allow a variable name that is in the first database to
	be absent from the second database.  The default behavior is to
	output an error if all variables in the first file cannot be matched
	to variables in the second file.\\

-x {\tt <list>} & Exclude time steps.  Does not calculate any
	variable differences for the time steps
	given in the list of integers.  The format is comma
	separated and ranged integers (with no spaces), such as ``1,5-9,28''.
	The first time step is the number one. \\

-steps {\tt <b:e:i>}& Specify subset of steps to consider. Syntax is begin:end:increment,
	Enter -1:: for just the last step. If only begin is set, then
	end=begin and only that step will be considered \\

-norms& Calculate the $L_2$ norm of variable differences and output if
	the norm is greater than 0.0. The output will also contain the
	$L_2$ norm of each variable.  This can be used to give an idea of
	the relative magnitudes of the differences compared to the magnitudes
	of the variables.  This is for informational purposes only at
	this time; it does not affect the determination of whether the
	databases compare the same or different.\\

-stat & Return an exit status of 2 if the files are different.  Normally,
        the exit status is zero unless an error occurs. \\

-maxnames {\tt <int>}& There is a compiled limit of 1000 exodus
	variable names. This option allows the maximum number to be
	set to a larger value if either of the input databases contains more
	than 1000 variables. \\

-use\_old\_floor& When \exodiff{} was first released, it used an
	incorrect definition of the floor tolerance in which the differences
	were ignored if the difference itself was less than the floor
	value. This was fixed several years ago to the new definition which is
	to ignore the differences if $|a| < floor \&\& |b| < floor$. This
	option was provided so that users could use the old definition
	if desired.  It should not be used. \\

-summary & Produce a summary in \exodiff{} input format.  This will
	create an output file with max/min statistics on the data in the
	format of an \exodiff{} input file.  The algorithm to determine
	the minimum separation between any two nodes can be disabled with
	the ``no\_coord\_sep'' switch. \\

-copyright & Output the copyright and license information. \\

-f {\tt <cmd file>} & Use the given file to specify the variables to
	be considered and the tolerances to be used for
	each variable type or each individual variable. See
	Section~\ref{ed:command_file} for details of the syntax in this file.\\

-H file & Show the syntax help for the command input file.  This is
	also documented in Section~\ref{ed:command_file}.\\
\end{longtable}

\subsection{\exodiff{} Command File Syntax}\label{ed:command_file}

If an \exodiff{} invocation uses the \param{-f <cmd\_file>} option,
then \exodiff{} will read commands from the specified file in addition
to parsing the options given on the command line.  The command line
will be parsed first and then the commands in the input file.  The
primary use of the input file is to give more control over the
difference types and tolerances to be used for individual variables.

The basic syntax of the file is:
\begin{itemize}

\item each command is given on a separate line.

\item Anything following the \param{\#} character on a line
will be treated as a comment and ignored.

\item Within a ``variables'' block, lines must be indented and must begin with a ``tab'' character.
\end{itemize}

The valid command lines are shown in all uppercase in the following
list. The list also describes the behavior that the command line will
specify.
\begin{itemize}
\item The variable names are case insensitive (unless the
	\param{-case\_sensitive} option is specified or there is a
	\param{CASE SENSITIVE} line in the command file).

\item All keyword comparisons are case insensitive. Abbreviations can be used.

\item All variable comparisons use the default of relative $10^{-6}$ for
	variables and absolute $10^{-6}$ for coordinates.  This is
	overridden with the \param{DEFAULT TOLERANCE} line.  The
	\param{DEFAULT TOLERANCE} values are overridden by the values
	given on the \param{VARIABLES} line and apply only to those
	variables.  Each variable can override all values by following
	its name with a value.

\item A variable name must start with a tab character.  If there is at least
	one variable name of a specified type (element, nodal, global,
	...) is listed, then only the listed variable(s) of that type will be differenced.
	The variable name can be followed by an optional difference
	type and tolerance, and an optional \param{floor} and floor
	tolerance. The NOT symbol \param{!} means do not include this
	variable.  Mixing non-! and ! is not allowed without the
	\param{(all)} specifier.  For example
\begin{verbatim}
                NODAL VARIABLES (all) absolute 1.E-8
                <tab> DISPLX
                <tab> !VELX
                <tab> VELY relative 1.E-6 floor 1.e-10
\end{verbatim}
           In this case, all variables are considered that are not prepended
           with a ``!'' symbol.

\item If a variable type (e.g. \param{NODAL VARIABLES}) is not specified, no
	variables of that type will be considered.  Allowed variable
	types are: \param{GLOBAL VARIABLES}, \param{NODAL VARIABLES},
	\param{ELEMENT VARIABLES}, \param{NODESET VARIABLES}, and
	\param{SIDESET VARIABLES}.

\item The command line option to set the maximum number of \exo{}
	names can be set with \param{MAX NAMES <int>}.  Note:  this option must
	appear before the variable blocks are read!

\item The time step exclusion option can be used in the input file with
           the syntax \param{EXCLUDE TIMES <list>}, where \param{<list>} has the same
           format as in the command line options.

\item  The matching algorithm, \param{-m}, can be turned on from the input file
           with the \param{APPLY MATCHING} keyword on a separate line.

\item  The nodeset matching algorithm, \param{-nsmap}, can be turned on from the
           input file with the \param{NODESET MATCH} keyword on a separate line.
\item  The sideset matching algorithm, \param{-ssmap}, can be turned on from the
           input file with the \param{SIDESET MATCH} keyword on a separate line.
\item  The short block type compare option, \param{-s}, can be turned on with the
	\param{SHORT BLOCKS} keyword.
\item  The no short compare option, \param{-no\_short}, can be turned on with the
           \param{NO SHORT BLOCKS} keyword.
\item  The case\_sensitive option, \param{-case\_sensitive}, can be turned on with the
           \param{CASE SENSITIVE} keyword.
\item  The ignore case option, \param{-i}, can be turned on with the
           \param{IGNORE CASE} keyword. (default behavior)
\item  The ignore maps option, \param{-ignore\_maps}, can be turned on with the
           \param{IGNORE MAPS} keyword.
\item  The ignore nans option, \param{-ignore\_nans}, can be turned on with the
           \param{IGNORE NANS} keyword.
\item  The ignore dups option, \param{-ignore\_dups}, can be turned on with the
           \param{IGNORE DUPLICATES} keyword.
\item  The time step offset option, \param{-T}, can be turned on with the
           \param{STEP OFFSET} keyword.
\item  The automatic time step offset option, \param{-TA}, can be turned
           on with the \param{STEP OFFSET AUTOMATIC} keyword.
\item  The automatic time step offset option, \param{-TM}, can be turned
           on with the \param{STEP OFFSET MATCH} keyword.
\item  The calculation of the L2 norm of differences \param{-norms}, can be turned
           on with the \param{CALCULATE NORMS} keyword.
\item  The exit status return option, \param{-stat}, can be turned on with the
           \param{RETURN STATUS} keyword.
\end{itemize}
\section{Examples}
The output below shows an example run of \exodiff{}.  The command
invocation used was:
\begin{syntax}
exodiff -f P_exodiff.cmd P_gold_results.e bar-P.e
\end{syntax}

The \file{P\_exodiff.cmd} command file contains the following:
\begin{verbatim}
COORDINATES absolute 1.e-6

TIME STEPS relative 1.e-6 floor 0.0

GLOBAL VARIABLES relative 1.e-6 floor 1.e-16
	internal_energy
	kinetic_energy
	momentum_x

NODAL VARIABLES relative 1.e-4 floor 1.e-16
	displacement_x
	acceleration_x
	force_internal_x
	mass
	velocity_x

ELEMENT VARIABLES relative 1.e-6 floor 1.e-16
	eqps
	stress_xx          absolute 1000
	stress_yy          absolute 1000
	stress_zz          absolute 1000
	temperature        absolute 1
	yield_stress       absolute 1000
\end{verbatim}

The first section of the output shows the code version and contact
information and when the output was generated; followed by some
summary statistics of the two files including the file paths and the
counts of nodes, elements, etc.  If options are read from a command
file, the path to that file is listed.

\begin{verbatim}
   *****************************************************************
     EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF

                        Version 2.43 (2011-04-07)
              Authors:  Richard Drake, rrdrake@sandia.gov
                        Greg Sjaardema, gdsjaar@sandia.gov
                        2011/04/28   21:11:00 MDT

     EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF
   *****************************************************************

Reading first file ...
Reading second file ...
  FILE 1: /home/exodiff/axial_pulse_par_ns/P_gold_results.e
   Title: Default Database Title
          Dim = 3, Blocks = 1, Nodes = 816, Elements = 450, Nodesets = 6, Sidesets = 0
          Vars: Global = 7, Nodal = 13, Element = 16, Nodeset = 0, Sideset = 0, Times = 23

  FILE 2: /home/exodiff/axial_pulse_par_ns/bar-P.e
   Title: Default Database Title
          Dim = 3, Blocks = 1, Nodes = 816, Elements = 450, Nodesets = 6, Sidesets = 0
          Vars: Global = 7, Nodal = 13, Element = 16, Nodeset = 0, Sideset = 0, Times = 23

  COMMAND FILE: /home/exodiff/axial_pulse_par_ns/P_exodiff.cmd
\end{verbatim}

\sectionline
The next output section summarizes what variables will be compared and
the difference types, tolerances, and floor values that will be used.
Note that the command file is specifying that only a subset of the
variables on the files will be differenced since the output above
shows 7 global variables, 13 nodal variables, and 16 element variables,
but the list below only shows 3 global, 5 nodal, and 6 element variables.

\begin{verbatim}
Coordinates will be compared .. tol:    1e-06 (absolute), floor:        0
Time step values will be compared .. tol:    1e-06 (relative), floor:        0
Global variables to be compared:
	internal_energy                  tol:    1e-06 (relative), floor:    1e-16
	kinetic_energy                           1e-06 (relative),           1e-16
	momentum_x                               1e-06 (relative),           1e-16
Nodal variables to be compared:
	displacement_x                   tol:    1e-06 (relative), floor:    1e-16
	acceleration_x                           1e-06 (relative),           1e-16
	force_internal_x                         1e-06 (relative),           1e-16
	mass                                     1e-06 (relative),           1e-16
	velocity_x                               1e-06 (relative),           1e-16
Element variables to be compared:
	eqps                             tol:    1e-06 (relative), floor:    1e-16
	stress_xx                                1e-06 (relative),           1e-16
	stress_yy                                1e-06 (relative),           1e-16
	stress_zz                                1e-06 (relative),           1e-16
	temperature                              1e-06 (relative),           1e-16
	yield_stress                             1e-06 (relative),           1e-16
No Element Attribute variables on either file.
No Nodeset variables on either file.
No Sideset variables on either file.

  ==============================================================
  NOTE: All node and element ids are reported as global ids.
\end{verbatim}

\sectionline
The next output section shows the results of the differencing.  For
the first several timesteps, no differences were found.

\begin{verbatim}
  --------- Time step 1, 0.0000000e+00 ~ 0.0000000e+00, rel diff:  0.00000e+00 ---------
Global variables:
Nodal variables:
Element variables:
  --------- Time step 2, 2.2708229e-08 ~ 2.2708229e-08, rel diff:  0.00000e+00 ---------
Global variables:
Nodal variables:
Element variables:
  --------- Time step 3, 8.1607527e-08 ~ 8.1607527e-08, rel diff:  0.00000e+00 ---------
Global variables:
Nodal variables:
Element variables:
  --------- Time step 4, 2.3437714e-07 ~ 2.3437714e-07, rel diff:  0.00000e+00 ---------
Global variables:
Nodal variables:
Element variables:

... deleted some output ...

  --------- Time step 11, 7.7253933e-06 ~ 7.7253933e-06, rel diff:  0.00000e+00 ---------
Global variables:
Nodal variables:
Element variables:
  --------- Time step 12, 8.9485520e-06 ~ 8.9485520e-06, rel diff:  0.00000e+00 ---------
Global variables:
Nodal variables:
Element variables:
\end{verbatim}

\sectionline
At this time step, differences are detected and output.  The output
format is:

\begin{verbatim}
  variable name  diff type   val file 1       val file 2     difference  (which entity)
   stress_xx     rel diff: -1.1444528e+04 ~ -1.1444553e+04 = 2.15241e-06 (block 1, elmt 66)
\end{verbatim}

Note that only the maximum difference found for each variable at each
time step is output.  There may be many more differences detected.

\begin{verbatim}
  --------- Time step 13, 1.0171704e-05 ~ 1.0171704e-05, rel diff:  1.66547e-16 ---------
Global variables:
Nodal variables:
   acceleration_x    rel diff:  1.1719403e+04 ~  1.1719426e+04 = 1.98010e-06 (node 68)
   force_internal_x  rel diff: -5.8141261e+02 ~ -5.8141376e+02 = 1.98010e-06 (node 68)
Element variables:
   stress_xx     rel diff: -1.1444528e+04 ~ -1.1444553e+04 = 2.15241e-06 (block 1, elmt 66)
   stress_yy     rel diff: -4.9048081e+03 ~ -4.9048309e+03 = 4.63816e-06 (block 1, elmt 266)
   stress_zz     rel diff: -4.9048129e+03 ~ -4.9048357e+03 = 4.64075e-06 (block 1, elmt 266)
  --------- Time step 14, 1.1394849e-05 ~ 1.1394849e-05, rel diff:  1.48669e-16 ---------
Global variables:
Nodal variables:
   displacement_x    rel diff:  1.0981488e-11 ~  1.0980936e-11 = 5.02741e-05 (node 740)
   acceleration_x    rel diff:  2.0947516e+02 ~  2.0950905e+02 = 1.61776e-04 (node 639)
   force_internal_x  rel diff: -5.1961477e+00 ~ -5.1969885e+00 = 1.61776e-04 (node 639)
   velocity_x        rel diff:  5.9451636e-05 ~  5.9447122e-05 = 7.59215e-05 (node 740)
Element variables:
   stress_xx     rel diff: -1.9233572e+02 ~ -1.9236707e+02 = 1.62922e-04 (block 1, elmt 326)
   stress_yy     rel diff: -8.2409892e+01 ~ -8.2442564e+01 = 3.96299e-04 (block 1, elmt 326)
   stress_zz     rel diff: -8.2408238e+01 ~ -8.2440733e+01 = 3.94165e-04 (block 1, elmt 326)
  --------- Time step 15, 1.2617989e-05 ~ 1.2617989e-05, rel diff:  1.34258e-16 ---------
Global variables:
Nodal variables:
   displacement_x    rel diff:  1.4026865e-13 ~  1.4075811e-13 = 3.47725e-03 (node 648)
   acceleration_x    rel diff:  2.7998765e+00 ~  2.8278524e+00 = 9.89300e-03 (node 700)
   force_internal_x  rel diff: -1.3890498e-01 ~ -1.4029290e-01 = 9.89300e-03 (node 700)
   velocity_x        rel diff:  7.8395852e-07 ~  7.8796013e-07 = 5.07844e-03 (node 648)
Element variables:
   stress_xx     rel diff: -2.4472564e+00 ~ -2.4778807e+00 = 1.23591e-02 (block 1, elmt 386)
   stress_yy     rel diff: -1.0366468e+00 ~ -1.0631157e+00 = 2.48974e-02 (block 1, elmt 386)
   stress_zz     rel diff: -1.0455424e+00 ~ -1.0720140e+00 = 2.46934e-02 (block 1, elmt 386)

... deleted some output ...

  --------- Time step 22, 2.1179859e-05 ~ 2.1179859e-05, rel diff:  7.99848e-16 ---------
Global variables:
Nodal variables:
Element variables:
  --------- Time step 23, 2.2036041e-05 ~ 2.2036041e-05, rel diff:  7.68771e-16 ---------
Global variables:
Nodal variables:
Element variables:
\end{verbatim}

\sectionline
The final section is the status output indicating that differences
were detected.  This string will not change in future versions and can
be searched for to determine whether the files are the same or
different.  The \exodiff{} exit status can also be used for this if
the \param{-status} option is set.

\begin{verbatim}
exodiff: Files are different
\end{verbatim}
\sectionline
The next example shows the summary output produced by the command
line:
\begin{syntax}
exodiff -summary bar-P.e
\end{syntax}
\begin{verbatim}
#  *****************************************************************
#    EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF
#
#                       Version 2.43 (2011-04-07)
#             Authors:  Richard Drake, rrdrake@sandia.gov
#                       Greg Sjaardema, gdsjaar@sandia.gov
#                       2011/06/03   11:23:07 MDT
#
#    EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF  EXODIFF
#  *****************************************************************

#  FILE 1: /scratch/user/bar-P.e
#   Title: An Exodiff Summary Example
#          Dim = 3, Blocks = 1, Nodes = 204, Elements = 50, Nodesets = 5, Sidesets = 0
#          Vars: Global = 7, Nodal = 10, Element = 16, Nodeset = 0, Sideset = 0, Times = 206


# ==============================================================
#  NOTE: All node and element ids are reported as global ids.

# NOTES:  - The min/max values are reporting the min/max in absolute value.
#         - Time values (t) are 1-offset time step numbers.
#         - Element block numbers are the block ids.
#         - Node(n) and element(e) numbers are 1-offset.

COORDINATES absolute 1.e-6    # min separation = 0.1

TIME STEPS relative 1.e-6 floor 0.0     # min:               0 @ t1 max:   2.2088109e-05 @ t206

GLOBAL VARIABLES relative 1.e-6 floor 0.0
	external_energy  # min:               0 @ t1	max:               0 @ t1
	internal_energy  # min:               0 @ t1	max:        22205882 @ t206
	kinetic_energy   # min:               0 @ t1	max:        20210551 @ t206
	momentum_x       # min:               0 @ t1	max:       42651.567 @ t206
	momentum_y       # min:               0 @ t1	max:               0 @ t1
	momentum_z       # min:               0 @ t1	max:               0 @ t1
	timestep         # min:               0 @ t1	max:   1.3153439e-07 @ t51

NODAL VARIABLES relative 1.e-6 floor 0.0
	acceleration_x    # min:               0 @ t1,n1	max:   3.7989521e+08 @ t190,n1
	acceleration_y    # min:               0 @ t1,n1	max:               0 @ t1,n1
	acceleration_z    # min:               0 @ t1,n1	max:               0 @ t1,n1
	force_internal_x  # min:               0 @ t1,n1	max:        82739542 @ t190,n5
	force_internal_y  # min:               0 @ t1,n1	max:   1.3526743e+08 @ t206,n201
	force_internal_z  # min:               0 @ t1,n1	max:   1.3526743e+08 @ t206,n201
	mass              # min:        0.111625 @ t1,n1	max:         0.22325 @ t1,n21
	velocity_x        # min:               0 @ t1,n1	max:       994.29394 @ t206,n201
	velocity_y        # min:               0 @ t1,n1	max:               0 @ t1,n1
	velocity_z        # min:               0 @ t1,n1	max:               0 @ t1,n1

ELEMENT VARIABLES relative 1.e-6 floor 0.0
	eqps                    # min:               0 @ t1,b2,e1	max:   0.00083689614 @ t206,b2,e50
	rate_of_deformation_xx  # min:               0 @ t1,b2,e1	max:       539.94599 @ t116,b2,e50
	rate_of_deformation_yy  # min:               0 @ t1,b2,e1	max:   4.0126165e-32 @ t200,b2,e46
	rate_of_deformation_zz  # min:               0 @ t1,b2,e1	max:   1.1275579e-32 @ t185,b2,e49
	rate_of_deformation_xy  # min:               0 @ t1,b2,e1	max:   1.1868359e-13 @ t186,b2,e42
	rate_of_deformation_yz  # min:               0 @ t1,b2,e1	max:   1.1093839e-32 @ t185,b2,e49
	rate_of_deformation_zx  # min:               0 @ t1,b2,e1	max:   4.7474497e-14 @ t203,b2,e39
	sound_speed             # min:          394000 @ t1,b2,e1	max:       395751.09 @ t206,b2,e50
	stress_xx               # min:               0 @ t1,b2,e1	max:    3.980196e+09 @ t206,b2,e50
	stress_yy               # min:               0 @ t1,b2,e1	max:   2.7099141e+09 @ t206,b2,e50
	stress_zz               # min:               0 @ t1,b2,e1	max:   2.7099141e+09 @ t206,b2,e50
	stress_xy               # min:               0 @ t1,b2,e1	max:   2.7908475e-07 @ t205,b2,e46
	stress_yz               # min:               0 @ t1,b2,e1	max:   3.7940314e-26 @ t190,b2,e49
	stress_zx               # min:               0 @ t1,b2,e1	max:   1.5648498e-07 @ t188,b2,e49
	temperature             # min:             298 @ t78,b2,e8	max:       299.37791 @ t206,b2,e50
	yield_stress            # min:   7.5751705e+08 @ t142,b2,e34	max:   1.3389387e+09 @ t148,b2,e50

# No NODESET VARIABLES

# No SIDESET VARIABLES
\end{verbatim}
\sectionline
The output starts with a database summary similar to the previous
example.  It then gives a summary of the minimum and maximum values of
each variable and the timestep and node or element where that minimum
or maximum occurs.

The format of the summary is such that it can be used as a basis for
creating an \exodiff{} command input file.
