diff --git a/.gitlab/issue_templates/bug.md b/.gitlab/issue_templates/bug.md
new file mode 100644
index 0000000000000000000000000000000000000000..1423a4aa00846121070997778dca4f30766bb216
--- /dev/null
+++ b/.gitlab/issue_templates/bug.md
@@ -0,0 +1,71 @@
+<!--
+  *** Please read this first! ***
+
+  Before opening a new issue, make sure to search for keywords in the issues
+  filtered by the "bug" label and check to see if it has already been reported
+-->
+
+<!--
+  All text between these markers are comments and will not be present in the
+  report
+-->
+
+### Summary
+
+<!-- Summarize the bug encountered concisely -->
+
+
+### Steps to reproduce
+
+<!-- How one can reproduce the issue - this is very important -->
+
+
+### Example case
+
+<!--
+  If possible, please create a SMALL example and attach it to your report
+
+  If you are using an older version of OpenFOAM this will also determine
+  whether the bug has been fixed in a more recent version
+-->
+
+
+### What is the current *bug* behaviour?
+
+<!-- What actually happens -->
+
+
+### What is the expected *correct* behavior?
+
+<!-- What you should see instead -->
+
+
+### Relevant logs and/or images
+
+<!--
+  Paste any relevant logs - please use code blocks (```) to format console
+  output, logs, and code as it's very hard to read otherwise.
+-->
+
+
+### Environment information
+
+<!--
+  Providing details of your set-up can help us identify any issues, e.g.
+  OpenFOAM version : v1806|v1812|v1906 etc
+  Operating system : ubuntu|openSUSE|centos etc
+  Hardware info    : any info that may help?
+  Compiler         : gcc|intel|clang etc
+ -->
+OpenFOAM version :
+Operating system :
+Compiler         :
+
+### Possible fixes
+
+<!--
+  If you can, link to the line of code that might be responsible for the
+  problem
+-->
+
+/label ~bug
diff --git a/.gitlab/issue_templates/feature-request.md b/.gitlab/issue_templates/feature-request.md
new file mode 100644
index 0000000000000000000000000000000000000000..c318838e73523c265af40f9c433c3bf0cdf77b57
--- /dev/null
+++ b/.gitlab/issue_templates/feature-request.md
@@ -0,0 +1,31 @@
+### Functionality to add/problem to solve
+
+(Brief scope)
+
+
+### Target audience
+
+(Who will benefit from the changes?)
+(What type of cases?)
+
+
+### Proposal
+
+(How are we going to solve the problem?)
+
+
+### What does success look like, and how can we measure that?
+
+(What are the success factors and acceptance criteria? e.g. test cases, error margins)
+
+
+### Links / references
+
+(Links to literature, supporting information)
+
+
+### Funding
+
+(Does the functionality already exist/is sponsorship available?)
+
+/label ~feature
diff --git a/.gitlab/merge_request_templates/new-features.md b/.gitlab/merge_request_templates/new-features.md
new file mode 100644
index 0000000000000000000000000000000000000000..0d2144bb35da15b67b4c3783cc562ca3deab66c7
--- /dev/null
+++ b/.gitlab/merge_request_templates/new-features.md
@@ -0,0 +1,20 @@
+### Summary
+
+(Summarize the changes concisely)
+
+
+### Resolved bugs (If applicable)
+
+(Links to issues)
+
+
+### Details of new models (If applicable)
+
+(New options, user inputs etc)
+(Images are nice :))
+
+
+### Risks
+
+(Possible regressions?)
+(Changes to user inputs?)
diff --git a/META-INFO/api-info b/META-INFO/api-info
index 5891e7c19c68027265e70e483ec5fd948f09d40e..0bbf85a510d4abcf93ca19c4761ca4cb0eeb2d4b 100644
--- a/META-INFO/api-info
+++ b/META-INFO/api-info
@@ -1,2 +1,2 @@
 api=1812
-patch=0
+patch=190403
diff --git a/applications/solvers/combustion/XiFoam/XiEngineFoam/logSummary.H b/applications/solvers/combustion/XiFoam/XiEngineFoam/logSummary.H
index 1946f38da892cc357f5a5b1fd7abe78e2dfa553c..d18024e65d96f3133a5e306361193a8d059e6d3e 100644
--- a/applications/solvers/combustion/XiFoam/XiEngineFoam/logSummary.H
+++ b/applications/solvers/combustion/XiFoam/XiEngineFoam/logSummary.H
@@ -1,15 +1,22 @@
-Info<< "Mean pressure:" << p.weightedAverage(mesh.V()).value() << endl;
-Info<< "Mean temperature:" << thermo.T().weightedAverage(mesh.V()).value()
-    << endl;
-Info<< "Mean u':"
-    << (sqrt((2.0/3.0)*turbulence->k()))().weightedAverage(mesh.V()).value()
-    << endl;
+{
+    const scalar meanP = p.weightedAverage(mesh.V()).value();
+    const scalar meanT = thermo.T().weightedAverage(mesh.V()).value();
+    const scalar meanUp =
+        (sqrt((2.0/3.0)*turbulence->k()))().weightedAverage(mesh.V()).value();
+    const scalar meanB = b.weightedAverage(mesh.V()).value();
 
-logSummaryFile()
-    << runTime.theta() << tab
-    << p.weightedAverage(mesh.V()).value() << tab
-    << thermo.T().weightedAverage(mesh.V()).value() << tab
-    << (sqrt((2.0/3.0)*turbulence->k()))().weightedAverage(mesh.V()).value()
-    << tab
-    << 1 - b.weightedAverage(mesh.V()).value()
-    << endl;
+    Info<< "Mean pressure:" << meanP << nl
+        << "Mean temperature:" << meanT << nl
+        << "Mean u':" << meanUp << endl;
+
+    if (Pstream::master())
+    {
+        logSummaryFile()
+            << runTime.theta() << tab
+            << meanP << tab
+            << meanT << tab
+            << meanUp << tab
+            << 1 - meanB
+            << endl;
+    }
+}
diff --git a/applications/test/dictionary/testDictAPI b/applications/test/dictionary/testDictAPI
new file mode 100644
index 0000000000000000000000000000000000000000..e6091cb9d0b4aff850b3d63b0261f35ab9af5384
--- /dev/null
+++ b/applications/test/dictionary/testDictAPI
@@ -0,0 +1,19 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| =========                 |                                                 |
+| \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox           |
+|  \\    /   O peration     | Version:  v1812                                 |
+|   \\  /    A nd           | Web:      www.OpenFOAM.com                      |
+|    \\/     M anipulation  |                                                 |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+    version     2.0;
+    format      ascii;
+    class       dictionary;
+    object      testDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+_FOAM_API  $FOAM_API;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
diff --git a/applications/test/ensightFoamReader/Make/files b/applications/test/ensightFoamReader/Make/files
deleted file mode 100644
index c8089bfc493d9bc3ce7c2ea21c6f8f4bf2749393..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/Make/files
+++ /dev/null
@@ -1,3 +0,0 @@
-udr_checker.c
-
-EXE = $(FOAM_USER_APPBIN)/ensightFoamReader-udr_checker
diff --git a/applications/test/ensightFoamReader/Make/options b/applications/test/ensightFoamReader/Make/options
deleted file mode 100644
index 750aeb0d14b80b8765826093a49b74506c45aa6c..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/Make/options
+++ /dev/null
@@ -1,5 +0,0 @@
-EXE_INC = \
-    -DUSERD_API_203
-
-EXE_LIBS = \
-    -luserd-foam
diff --git a/applications/test/ensightFoamReader/README b/applications/test/ensightFoamReader/README
deleted file mode 100644
index f12e6fd40fc4f10452c5caad8b4529e6576057df..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/README
+++ /dev/null
@@ -1,116 +0,0 @@
-udr_checker
------------
-
-udr_checker.c is a routine that can be used to debug EnSight User-defined
-readers.   It exists because of the difficulty of debugging dynamic shared
-libraries when you don't have the source for the calling program (EnSight).
-
-If udr_checker.c is compiled and linked with your reader source code (including
-access to any libraries needed, and the global_extern.h file), it will exercise
-most options of you reader, giving feedback as it goes.  The resulting
-executable can be debugged using your favorite debugger.  And if you have
-memory/bounds checking software (such as purify), you can (and should) run it
-with this executable to make sure that you are not overwriting things.  Readers
-that bash memory will cause problems when run with EnSight!
-
-You will note that the Makefile provided with the readers in the EnSight
-distribution have a "checker" object.  If you do a "make checker" instead of
-just a "make", the "checker"executable will be produced.   You may need to
-modify these makefiles slightly if the locations of your reader files are
-different than the normal.
-
-
---------------------------------------
-Once the "checker" executable exists, you can run the checker program by simply
-invoking it:
-
-> checker
-
-And you will be prompted for the type of information that you provide in the
-EnSight Data Reader dialog, namely:
-
-The path
-filename_1
-[filename_2]           Only if your reader uses two fields
-swapbytes flag
-<toggle flags>         Only if your reader implements extra GUI
-<pulldown flags>        one flag value per line
-<field contents>        one field string per line
-
-There are certain command line options that you can use to control some aspects
-of the checker program.  One of the more useful is the ability to provide the
-input just described in a file.  This is done in this fashion:
-
-> checker -p <playfile>
-
-And <playfile> would be a simple ascii file with 3 [0r 4] lines:
-line 1:         the path
-line 2:         filename_1
-line 3:        [filename_2]   (if two_fields is TRUE)
-line 3 or 4:    0 or 1, for swapbytes  (0 is FALSE, 1 is TRUE)
-remaining lines 0 or 1 for toggle disable enabled
-                       one line for each toggle
-                0 - num_pulldown_values for pulldown choice
-                       one line for each pulldown
-                strings 
-                       one line for each field
-
-example playfile for an EnSight Gold reader casefile (entitled cube.play)
-could look something like the following:  (Note: two_fields is FALSE)
--------------------
-
-/usr/local/bin/data/ens
-cube.case
-0
-
-
-And you would invoke checker as:
-
-> checker -p check.play
-
-Another example playfile 
-with swapbytes 0, 
-two enabled toggles, 
-three pulldowns with the value 0 chosen 
-and a single field "sample field value"
-
-could look something like the following::
-----------------------
-
-/mydirectory/subdir/
-myfile
-0
-1
-1
-0
-0
-0
-sample field value
-
-
-Other command line arguments are:
----------------------------------
--server_number       For checking server number routines.  If you use this
-                     option, you will be prompted for the total number of
-                     servers and the current server number.  These will then be
-                     used in the calls to the server number routines.
-
--gts #               For specifying the geometry timestep to test.  The default
-                     is step 0.
-                     The # is the (zero based) time step to read for geometry.
-
--vts #               For specifying the variable timestep to test.  The default
-                     is step 0.
-                     The # is the (zero based) time step to read for variables.
-
-
-
-Testing optional routines using #defines
------------------------------------------
-For optional routines, such as the extra_gui, or var_extract_gui routines, you
-must uncomment the proper #define in udr_checker.c
-
-Currently the ones available are:
-
-#define _EGS          for extra gui routines
-#define _VES          for var extract gui routines
diff --git a/applications/test/ensightFoamReader/ensightFoamReaderTest b/applications/test/ensightFoamReader/ensightFoamReaderTest
deleted file mode 100755
index 55ed682d7fa099dfe0e9211f74686a97bc3403d3..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/ensightFoamReaderTest
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/bin/sh
-#------------------------------------------------------------------------------
-# =========                 |
-# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-#  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-#    \\/     M anipulation  |
-#-------------------------------------------------------------------------------
-# License
-#     This file is part of OpenFOAM.
-#
-#     OpenFOAM is free software: you can redistribute it and/or modify it
-#     under the terms of the GNU General Public License as published by
-#     the Free Software Foundation, either version 3 of the License, or
-#     (at your option) any later version.
-#
-#     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-#     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-#     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-#     for more details.
-#
-#     You should have received a copy of the GNU General Public License
-#     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-#
-# Script
-#     ensightFoamReaderTest
-#
-# Description
-#     start ensightFoamReader-udr_checker
-#
-#------------------------------------------------------------------------------
-usage() {
-    while [ "$#" -ge 1 ]; do echo "$1"; shift; done
-    cat<<USAGE
-
-usage: ${0##*/} [OPTION]
-options:
-  -case   dir    specify alternative case directory
-
-* start ensightFoamReader-udr_checker
-
-USAGE
-    exit 1
-}
-
-# parse options
-while [ "$#" -gt 0 ]
-do
-    case "$1" in
-    -h | -help)
-        usage
-        ;;
-    -case)
-        [ "$#" -ge 2 ] || usage "'$1' option requires an argument"
-        cd "$2" 2>/dev/null || usage "directory does not exist:  '$2'"
-        shift 2
-        ;;
-    *)
-        usage "unknown option/argument: '$*'"
-        ;;
-    esac
-done
-
-
-# check existence of essential files
-for check in system/controlDict system/fvSchemes system/fvSolution
-do
-    [ -s "$check" ] || usage "file does not exist:  '$check'"
-done
-
-
-# export values that might be needed
-export FOAM_CASE=$PWD
-export FOAM_CASENAME=${PWD##*/}
-
-pathName=${PWD%/*}
-
-playFile=/tmp/ensightFoamReader.$$
-trap "rm -f $playFile 2>/dev/null; exit 0" EXIT TERM INT
-
-cat << PLAY_FILE > $playFile
-$pathName
-$FOAM_CASENAME
-0
-PLAY_FILE
-
-echo "ensightFoamReader-udr_checker -p $playFile"
-
-ensightFoamReader-udr_checker -p $playFile
-
-#------------------------------------------------------------------------------
diff --git a/applications/test/ensightFoamReader/global_extern.h b/applications/test/ensightFoamReader/global_extern.h
deleted file mode 120000
index 09b4ffb70c9948c3249252b265823f2ddc256fdd..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/global_extern.h
+++ /dev/null
@@ -1 +0,0 @@
-../../utilities/postProcessing/graphics/ensightFoamReader/global_extern.h
\ No newline at end of file
diff --git a/applications/test/ensightFoamReader/global_extern_proto.h b/applications/test/ensightFoamReader/global_extern_proto.h
deleted file mode 120000
index 7c23ba48d9b5db4cdc5c968f94cd974981026d00..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/global_extern_proto.h
+++ /dev/null
@@ -1 +0,0 @@
-../../utilities/postProcessing/graphics/ensightFoamReader/global_extern_proto.h
\ No newline at end of file
diff --git a/applications/test/ensightFoamReader/udr_checker-80.c b/applications/test/ensightFoamReader/udr_checker-80.c
deleted file mode 100644
index 22fb6feb5386cd86ae8c9d77f5320d55e1a2e159..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/udr_checker-80.c
+++ /dev/null
@@ -1,5396 +0,0 @@
-/*----------------------------------
- *     User Defined Reader - checker
- *----------------------------------*/
-
-/********************************************************************
- *
- *      ****************************************
- *       Copyright 2004 Computational Engineering International, Inc.
- *       All Rights Reserved.
- *
- *              Restricted Rights Legend
- *
- *       Use, duplication, or disclosure of this
- *       software and its documentation by the
- *       Government is subject to restrictions as
- *       set forth in subdivision [(b)(3)(ii)] of
- *       the Rights in Technical Data and Computer
- *       Software clause at 52.227-7013.
- *******************************************************************/
-
-/*----------------------------------------------------------------------
- * MAJOR ROUTINES ACCESS:     (VERSION 2.00)    Gold_Userd   API
- *
- *        Get the name of the reader
- *        ==========================
- *        USERD_get_name_of_reader
- *        USERD_get_extra_gui_numbers    (optional)
- *        USERD_get_extra_gui_defaults   (optional)
- *
- *        Get the reader version
- *        ======================
- *        USERD_get_reader_version
- *
- *        Set the filenames, gather timeset and time info
- *        ===============================================
- *        USERD_set_extra_gui_data       (optional)
- *        USERD_set_server_number
- *        USERD_set_filenames
- *        USERD_get_number_of_timesets
- *        USERD_get_geom_timeset_number
- *
- *        for each timeset:
- *          USERD_get_timeset_description
- *          USERD_get_num_of_time_steps
- *          USERD_get_sol_times
- *
- *        USERD_set_time_set_and_step
- *
- *
- *        Gather variable and time info
- *        =============================
- *        USERD_get_number_of_variables
- *        USERD_get_gold_variable_info
- *
- *
- *        Get initial part building info
- *        ==============================
- *        USERD_set_time_set_and_step
- *        USERD_get_changing_geometry_status
- *        USERD_get_node_label_status
- *        USERD_get_element_label_status
- *        USERD_get_number_of_files_in_dataset
- *        USERD_get_dataset_query_file_info
- *        USERD_get_descrip_lines                 (geometry)
- *        USERD_get_number_of_model_parts
- *        USERD_get_gold_part_build_info
- *        USERD_get_ghosts_in_model_flag
- *        USERD_get_maxsize_info
- *        USERD_get_ghosts_in_block_flag          (if any ghost cells in model)
- *        USERD_get_model_extents    **OR**
- *             USERD_get_part_coords  **AND/OR**
- *             USERD_get_block_coords_by_component
- *
- *
- *
- *         Part Builder
- *         ============
- *
- *         both unstructured and structured
- *         --------------------------------
- *         USERD_set_time_set_and_step
- *
- *         if unstructured
- *         ---------------
- *         USERD_get_part_element_ids_by_type
- *         USERD_get_part_elements_by_type
- *
- *         if any nsided elements:
- *           USERD_get_nsided_conn
- *
- *         if any nfaced elements:
- *           USERD_get_nfaced_nodes_per_face
- *           USERD_get_nfaced_conn
- *
- *         USERD_get_part_coords
- *         USERD_get_part_node_ids
- *
- *         else if structured
- *         ------------------
- *         USERD_get_block_iblanking
- *         USERD_get_block_coords_by_component
- *         USERD_get_block_ghost_flags
- *         USERD_get_part_node_ids              (If node ids given)
- *         USERD_get_part_element_ids_by_type   (If element ids given)
- *
- *         both again
- *         ----------
- *         USERD_get_border_availability        (If border representation
- *         USERD_get_border_elements_by_type     is selected)
- *
- *         USERD_stop_part_building
- *
- *
- *         Changing geometry
- *         =================
- *
- *         changing coords only
- *         --------------------
- *         USERD_set_time_set_and_step
- *         USERD_get_descrip_lines
- *         USERD_get_part_coords
- *         USERD_get_block_coords_by_component
- *
- *         changing connectivity
- *         ---------------------
- *         USERD_set_time_set_and_step
- *         USERD_get_descrip_lines
- *         USERD_get_number_of_model_parts
- *         USERD_get_gold_part_build_info
- *         USERD_get_ghosts_in_model_flag
- *         USERD_get_ghosts_in_block_flag       (If any ghost cells in model)
- *         USERD_get_model_extents     **OR**
- *             USERD_get_part_coords  **AND/OR**
- *             USERD_get_block_coords_by_component
- *         USERD_get_part_element_ids_by_type
- *         USERD_get_part_elements_by_type
- *         USERD_get_part_coords
- *         USERD_get_part_node_ids
- *         USERD_get_block_iblanking
- *         USERD_get_block_coords_by_component
- *         USERD_get_block_ghost_flags          (If ghost cells in part)
- *         USERD_get_part_node_ids              (If node ids given)
- *         USERD_get_part_element_ids_by_type   (If element ids given)
- *
- *         USERD_get_border_availability        (If border representation
- *         USERD_get_border_elements_by_type     is selected)
- *
- *
- *         Loading Variables
- *         ==================
- *
- *         constants
- *         ---------
- *         USERD_set_time_set_and_step
- *         USERD_get_constant_val
- *
- *         scalars/vectors/tensors
- *         -----------------------
- *         USERD_get_description_lines
- *         USERD_set_time_set_and_step
- *         USERD_get_var_by_component
- *
- *
- *         Node or Element queries over time
- *         =================================
- *         USERD_get_var_value_at_specific
- *
- *
- *  At 2.03, added:
- *  ---------------
- *
- *         Materials
- *         =========
- *         USERD_get_number_of_material_sets
- *         USERD_get_matf_set_info
- *
- *         If any material sets in the model (calls once per material set)
- *           USERD_get_number_of_materials
- *           USERD_get_matf_var_info
- *
- *         For each element type of each part containing material ids
- *           USERD_size_matf_data
- *           USERD_load_matf_data
- *
- *
- *  At 2.04, added:
- *  ---------------
- *          USERD_get_uns_failed_params  - Sets params used in element failure
- *
- *
- *----------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------
- * MAJOR ROUTINES ACCESS:       (Version 1.00)  original API
- *
- *        Get the name of the reader
- *        ==========================
- *        USERD_get_name_of_reader
- *        USERD_get_extra_gui_numbers     (optional #define _EGS)
- *        USERD_get_extra_gui_defaults    (optional #define _EGS)
- *
- *        Set the filenames
- *        =================
- *        USERD_set_extra_gui_data        (optional #define _EGS)
- *        USERD_set_filenames
- *        USERD_get_number_of_time_steps
- *        USERD_get_solution_times
- *        USERD_set_time_step
- *
- *
- *        Gather variable and time info
- *        =============================
- *        USERD_get_number_of_variables
- *        USERD_get_variable_info
- *
- *
- *        Get initial part building info
- *        ==============================
- *        USERD_set_time_step
- *        USERD_get_changing_geometry_status
- *        USERD_get_node_label_status
- *        USERD_get_element_label_status
- *        USERD_get_number_of_files_in_dataset
- *        USERD_get_dataset_query_file_info
- *        USERD_get_description_lines                     (geometry)
- *        USERD_get_number_of_model_parts
- *        USERD_get_part_build_info
- *        USERD_get_number_global_nodes
- *        USERD_get_global_coords
- *        USERD_get_block_coords_by_component
- *
- *        Failure Info
- *        ============
- *        USERD_get_uns_failed_params
- *
- *
- *        Part Builder
- *        ============
- *        USERD_set_time_step
- *        USERD_get_global_coords
- *        USERD_get_global_node_ids
- *        USERD_get_element_connectivities_for_part
- *        USERD_get_element_ids_for_part
- *        USERD_get_block_iblanking
- *        USERD_get_block_coords_by_component
- *
- *        USERD_stop_part_building
- *
- *
- *        Changing geometry
- *        =================
- *
- *        changing coords only
- *        --------------------
- *        USERD_set_time_step
- *        USERD_get_global_coords
- *        USERD_get_block_coords_by_component
- *
- *        changing connectivity
- *        ---------------------
- *        USERD_set_time_step
- *        USERD_get_number_of_model_parts
- *        USERD_get_part_build_info
- *        USERD_get_number_global_nodes
- *        USERD_get_global_coords
- *        USERD_get_global_node_ids
- *        USERD_get_element_connectivities_for_part
- *        USERD_get_element_ids_for_part
- *        USERD_get_block_iblanking
- *        USERD_get_block_coords_by_component
- *
- *        Loading Variables
- *        =================
- *
- *        constants:
- *        ----------
- *        USERD_set_time_step
- *        USERD_get_constant_value
- *
- *        scalars:
- *        --------
- *        USERD_get_description_lines
- *        USERD_set_time_step
- *        USERD_get_scalar_values
- *        USERD_get_block_scalar_values
- *
- *        vectors:
- *        --------
- *        USERD_get_description_lines
- *        USERD_set_time_step
- *        USERD_get_vector_values
- *        USERD_get_block_vector_values_by_component
- *
- *
- *        Node or Element queries over time
- *        =================================
- *        USERD_get_variable_value_at_specific
- *
- *----------------------------------------------------------------------*/
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <ctype.h>
-#include <sys/types.h>
-#ifndef CONVEX
-#include <malloc.h>
-#endif
-#include <math.h>
-
-#include "global_extern.h"
-
-/* -----------------------------------------------
- *  If you wish to test out the Extra GUI stuff
- *     you need to uncomment this section
- *
- *   #define _EGS
- *
- * ----------------------------------------------- */
-
-#if (!defined USERD_API_100)
-#define GT_USERD_API_100
-#endif
-
-#if (!defined USERD_API_100 && !defined USERD_API_200)
-#define GT_USERD_API_200
-#endif
-
-#if (!defined USERD_API_100 && !defined USERD_API_200 && !defined USERD_API_201 && !defined USERD_API_202)
-#define GT_USERD_API_202
-#endif
-
-#if (!defined USERD_API_100 && !defined USERD_API_200 && !defined USERD_API_201 && !defined USERD_API_202 && !defined USERD_API_203)
-#define GT_USERD_API_203
-#endif
-
-
-#define EOS '\0'
-
-typedef struct {
-  int  id;                /* part_id                                      */
-  char desc[Z_BUFL];      /* description given in the file                */
-  int  type;              /* Z_UNSTRUCTURED, Z_STRUCTURED, Z_IBLANKED     */
-  int  ne[Z_MAXTYPE];     /* Number of elements per type (Z_UNSTRUCTURED) */
-                          /* or ne[0] = I dimension (Z_STRUCTURED)        */
-                          /*    ne[1] = J dimension                       */
-                          /*    ne[2] = K dimension                       */
-  int  nn;                /* Num of unstructured nodes (All_Local only)   */
-  int  ghosts;            /* TRUE if ghost cells, FALSE otherwise         */
-}BUILDINFO;
-
-typedef struct {
-  char  description[Z_BUFL];  /* description */
-  char  filename[Z_BUFL];     /* real filename */
-  char  ifilename[Z_BUFL];    /* imaginary filename */
-  int   type;
-  int   classify;
-  int   complex;
-  float freq;
-  int   contran;
-  int   timeset;
-}VARINFO;
-
-
-typedef struct {
-  char name[12];          /* Z_POINT, Z_G_POINT, Z_BAR02, ... */
-  int  con_len;           /* Number of nodes per element      */
-}EINFO;
-
-
-/* Global variables
- *-----------------*/
-int Geom_status;
-int Node_labels;
-int Element_labels;
-int Ghosts_in_model;
-int Num_parts;
-int Num_vars;
-int Num_materials_sets;
-BUILDINFO *Pbuild;
-VARINFO *Varinfo;
-char Version_number[Z_MAX_USERD_NAME];
-int Num_time_sets;
-int Num_time_steps;
-
-/* ------------------
- * Extra GUI stuff
- * ------------------ */
-int Num_toggles = 0;
-int Num_pulldowns = 0;
-int Num_fields = 0;
-char **Toggle_title;
-int *Toggle_default_status;
-char **Pulldown_title;
-int *Pulldown_number_in_list;
-int *Pulldown_default_selection;
-char ***Pulldown_item_strings;
-char **Field_title;
-char **Field_user_string;
-int *Toggle_choice; /* user choice */
-int *Pulldown_choice; /* user choice */
-
-/* ---------------------------
- * Failed elements (API 2.04)
- * --------------------------- */
-int Any_uns_failed_model_elems = FALSE;
-
-
-#if (defined USERD_API_100 || defined USERD_API_200)
-EINFO Elem_info[Z_MAXTYPE] = {"Z_POINT",1,
-                              "Z_BAR02",2,
-                              "Z_BAR03",3,
-                              "Z_TRI03",3,
-                              "Z_TRI06",6,
-                              "Z_QUA04",4,
-                              "Z_QUA08",8,
-                              "Z_TET04",4,
-                              "Z_TET10",10,
-                              "Z_PYR05",5,
-                              "Z_PYR13",13,
-                              "Z_PEN06",6,
-                              "Z_PEN15",15,
-                              "Z_HEX08",8,
-                              "Z_HEX20",20};
-#elif defined USERD_API_201
-EINFO Elem_info[Z_MAXTYPE] = {"Z_POINT",  1,
-                              "Z_G_POINT",1,
-                              "Z_BAR02",  2,
-                              "Z_G_BAR02",2,
-                              "Z_BAR03",  3,
-                              "Z_G_BAR03",3,
-                              "Z_TRI03",  3,
-                              "Z_G_TRI03",3,
-                              "Z_TRI06",  6,
-                              "Z_G_TRI06",6,
-                              "Z_QUA04",  4,
-                              "Z_G_QUA04",4,
-                              "Z_QUA08",  8,
-                              "Z_G_QUA08",8,
-                              "Z_TET04",  4,
-                              "Z_G_TET04",4,
-                              "Z_TET10",  10,
-                              "Z_G_TET10",10,
-                              "Z_PYR05",  5,
-                              "Z_G_PYR05",5,
-                              "Z_PYR13",  13,
-                              "Z_G_PYR13",13,
-                              "Z_PEN06",  6,
-                              "Z_G_PEN06",6,
-                              "Z_PEN15",  15,
-                              "Z_G_PEN15",15,
-                              "Z_HEX08",  8,
-                              "Z_G_HEX08",8,
-                              "Z_HEX20",  20,
-                              "Z_G_HEX20",20};
-#else
-EINFO Elem_info[Z_MAXTYPE] = {"Z_POINT",  1,
-                              "Z_G_POINT",1,
-                              "Z_BAR02",  2,
-                              "Z_G_BAR02",2,
-                              "Z_BAR03",  3,
-                              "Z_G_BAR03",3,
-                              "Z_TRI03",  3,
-                              "Z_G_TRI03",3,
-                              "Z_TRI06",  6,
-                              "Z_G_TRI06",6,
-                              "Z_QUA04",  4,
-                              "Z_G_QUA04",4,
-                              "Z_QUA08",  8,
-                              "Z_G_QUA08",8,
-                              "Z_TET04",  4,
-                              "Z_G_TET04",4,
-                              "Z_TET10",  10,
-                              "Z_G_TET10",10,
-                              "Z_PYR05",  5,
-                              "Z_G_PYR05",5,
-                              "Z_PYR13",  13,
-                              "Z_G_PYR13",13,
-                              "Z_PEN06",  6,
-                              "Z_G_PEN06",6,
-                              "Z_PEN15",  15,
-                              "Z_G_PEN15",15,
-                              "Z_HEX08",  8,
-                              "Z_G_HEX08",8,
-                              "Z_HEX20",  20,
-                              "Z_G_HEX20",20,
-                              "Z_NSIDED",  1,   /* Not yet implemented */
-                              "Z_G_NSIDED",1,   /* Not yet implemented */
-                              "Z_NFACED",  1,   /* Not yet implemented */
-                              "Z_G_NFACED",1};  /* Not yet implemented */
-#endif
-
-
-/* Prototypes
- *-----------*/
-static int load_fail_defaults(void);
-static int prelim_info(int *two_fields, int *any_extra_gui);
-static int get_input(int set_server_number,
-                     int use_playfile,
-                     char playfile[Z_MAXFILENP],
-                     int two_fields,
-                     int any_extra_gui,
-                     int *swapbytes);
-static int time_info( void );
-static int part_build_info(int geom_time_step);
-static int variable_info( void );
-
-#if (defined GT_USERD_API_100)
-static int gold_part_builder(int geom_time_step);
-static int gold_var_loader(int var_time_step);
-#else
-static int part_builder(int geom_time_step);
-static int var_loader(int var_time_step);
-#endif
-
-#if (defined GT_USERD_API_100)
-static int materials_info( void );
-static int gold_materials_loader(int geom_time_step);
-#endif
-
-static int entity_querys(int var_time_step);
-static int exercise_bkup( void );
-static void usage( void );
-
-
-/*=============
- * Main Routine
- *=============*/
-#ifdef WIN32
-int main(int argc, char *argv[])
-#else
-int main(int argc, char *argv[])
-#endif
-{
-  /* Command line option variables
-   *------------------------------*/
-  int set_server_number = FALSE;
-  int use_playfile = FALSE;
-  char playfile[Z_MAXFILENP];
-  FILE *fplay;
-  int geom_time_step = 0;
-  int var_time_step = 0;
-
-  /* Other local variables
-   *----------------------*/
-  int i, j;
-  int err;
-  int two_fields;
-  int any_extra_gui = FALSE;
-  int swapbytes;
-  int indx;
-
-  /*----------------------------
-   * Command argument processing
-   *----------------------------*/
-  fprintf(stderr,"\n");
-  fprintf(stderr,"\n");
-  fprintf(stderr,"********************************************\n");
-  fprintf(stderr,"*  EnSight User Defined Reader Debug Tool  *\n");
-  fprintf(stderr,"********************************************\n");
-  fprintf(stderr,"\n");
-
-  indx = 1;
-  while(indx < argc) {
-
-    if(!strcmp("-h",argv[indx])) {
-      usage();
-    }
-    else if(!strcmp("-help",argv[indx])) {
-      usage();
-    }
-
-    /* if you want to test the server number routines
-     *
-     * Use:
-     * > checker -server_number
-     *
-     * You will then be prompted for the current and total
-     * number of servers
-     *-----------------------------------------------*/
-    else if(!strcmp("-server_number",argv[indx])) {
-      set_server_number = TRUE;
-    }
-
-
-    /* if you want to use a "playfile" instead of being prompted
-     * for the data loader information
-     *
-     * Use:
-     * > checker -p <playfile>
-     *
-     * This playfile should have 3 [or 4] lines:
-     * line 1:   the path
-     * line 2:   filename_1
-     * line 3:   [filename_2]   (if two_fields is TRUE)
-     * line 4:   0 or 1, for swapytes (0 is FALSE, 1 is TRUE)
-     *
-     * example (two_fields is FALSE, so only 3 lines):
-     *
-     *  /usr/scratch/stealth/bjn/dat/sp_gold/binary
-     *  simple.case
-     *  1
-     *
-     *------------------------------------------------------*/
-    else if(!strcmp("-p",argv[indx])) {
-      indx++;
-      if((indx < argc) && (argv[indx][0] != '-')) {
-        use_playfile = TRUE;
-        memset(playfile,EOS,Z_MAXFILENP);
-        strcpy(playfile,argv[indx]);
-      }
-      else {
-        usage();
-      }
-    }
-
-    /* if you want to specify the geometry timestep to test (default is step 0)
-     *
-     * Use:
-     * > checker -gts #
-     *
-     * Where # is the step number (zero based)
-     *-------------------------------------------------------------------------*/
-    else if(!strcmp("-gts",argv[indx])) {
-      indx++;
-      if((indx < argc) && (argv[indx][0] != '-')) {
-        geom_time_step = atoi(argv[indx]);
-      }
-      else {
-        usage();
-      }
-    }
-
-    /* if you want to specify the variable timestep to test (default is step 0)
-     * (will use this step for the appropriate timeset of each variable)
-     *
-     * Use:
-     * > checker -vts #
-     *
-     * Where # is the step number (zero based)
-     *-------------------------------------------------------------------------*/
-    else if(!strcmp("-vts",argv[indx])) {
-      indx++;
-      if((indx < argc) && (argv[indx][0] != '-')) {
-        var_time_step = atoi(argv[indx]);
-      }
-      else {
-        usage();
-      }
-    }
-    else {
-      usage();
-    }
-
-    indx++;
-  }
-
-
-  /*-------------------------------------------------------------
-   *
-   * Now start exercising EnSight
-   *
-   *--------------------------------------------------------------*/
-
-  /*-----------------
-   * Preliminary info
-   *-----------------*/
-  err = prelim_info(&two_fields,&any_extra_gui);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in prelim_info\n");
-    exit(1);
-  }
-
-
-  /*------------------
-   * User input needed
-   *------------------*/
-  err = get_input(set_server_number,
-                  use_playfile,
-                  playfile,
-                  two_fields,
-                  any_extra_gui,
-                  &swapbytes);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in get_input\n");
-    exit(1);
-  }
-
-
-  /*----------
-   * Time info
-   *----------*/
-  err = time_info();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in time_info\n");
-    exit(1);
-  }
-
-
-  /*----------------
-   * Part build info
-   *----------------*/
-  err = part_build_info(geom_time_step);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in part_build_info\n");
-    exit(1);
-  }
-
-
-  /*------------------
-   * Get Variable Info
-   *------------------*/
-  err = variable_info();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in variable_info\n");
-    exit(1);
-  }
-
-
-#if (defined GT_USERD_API_202)
-  /*-------------------
-   * Get Materials Info
-   *-------------------*/
-  err = materials_info();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in materials_info\n");
-    exit(1);
-  }
-#endif
-
-#if (defined GT_USERD_API_203)
-  if (Z_ERR == load_fail_defaults()) {
-    fprintf(stderr,"Stopping due to error in failed element flag routine\n");
-    exit(1);
-  }
-#endif
-
-  /*------------------------
-   * Act like building parts
-   *------------------------*/
-  if(Num_parts > 0) {
-
-#if (defined GT_USERD_API_100)
-    err = gold_part_builder(geom_time_step);
-#else
-    err = part_builder(geom_time_step);
-#endif
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in part_builder\n");
-      exit(1);
-    }
-    else {
-      USERD_stop_part_building();
-    }
-  }
-
-
-  /*---------------------------
-   * Act like loading variables
-   *---------------------------*/
-  if(Num_vars > 0) {
-
-#if (defined GT_USERD_API_100)
-    err = gold_var_loader(var_time_step);
-#else
-    err = var_loader(var_time_step);
-#endif
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in var_loader\n");
-      exit(1);
-    }
-  }
-
-#if (defined GT_USERD_API_202)
-  /*---------------------------
-   * Act like loading materials
-   *---------------------------*/
-  if(Num_materials_sets > 0) {
-    err = gold_materials_loader(geom_time_step);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in materials_loader\n");
-      exit(1);
-    }
-  }
-#endif
-
-
-
-  /*----------------------------------------------------
-   * See if can do node and/or element queries over time
-   *----------------------------------------------------*/
-  if(Num_parts > 0 &&
-     Num_vars > 0) {
-    err = entity_querys(var_time_step);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in entity_querys\n");
-      exit(1);
-    }
-  }
-
-  /*----------------------------------------
-   * Call the bkup file once in save mode,
-   * then again in restore mode - so someone
-   * could debug if desired
-   *----------------------------------------*/
-  err = exercise_bkup();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping due to error in saving and/or restoring archive\n");
-    exit(1);
-  }
-
-  /*-------------
-   * Exit Routine
-   *-------------*/
-  fprintf(stderr,"\n----------------- exiting ---------------\n");
-
-#if (defined GT_USERD_API_100)
-  USERD_exit_routine();
-#endif
-
-  fprintf(stderr,"\n\n");
-}
-
-/*--------------
- * Usage routine
- *--------------*/
-static void
-usage( void )
-{
-  fprintf(stderr,"------------------------------------------------------------\n");
-  fprintf(stderr,"USAGE: checker [-p pfile] [-server_number] [-gts #] [-vts #]\n");
-  fprintf(stderr,"------------------------------------------------------------\n");
-  fprintf(stderr,"  -h, -help       Prints out this USAGE text.\n");
-  fprintf(stderr,"  -gts #          Specify the geometry times step to use.)\n");
-  fprintf(stderr,"  -p pfile        Plays the checker playfile (pfile).\n");
-  fprintf(stderr,"  -server_number  Cause servers numbers to be prompted for.\n");
-  fprintf(stderr,"  -vts #          Specify the variable times step to use.)\n");
-  fprintf(stderr,"\n");
-  exit(1);
-}
-
-
-
-
-/*------------
- * prelim_info
- *------------*/
-static int
-prelim_info(int *two_fields, int *any_extra_gui)
-{
-  int err;
-  char reader_name[Z_MAX_USERD_NAME];
-  char release_number[Z_MAX_USERD_NAME];
-  char description[Z_MAXFILENP];
-  int i,j;
-
-  *any_extra_gui = FALSE;
-
-  /* Get the reader name
-   *--------------------*/
-  err = USERD_get_name_of_reader(reader_name,two_fields);
-  if(err == Z_OK) {
-    fprintf(stderr," Name of reader: %s\n",reader_name);
-    if(*two_fields==1) {
-      fprintf(stderr," two_fields:     TRUE\n");
-    }
-    else if(*two_fields==0){
-      fprintf(stderr," two_fields:     FALSE\n");
-    }
-    else if(*two_fields < 0) {
-      fprintf(stderr," two_fields:     -1 (optional string) \n");
-    }
-  }
-  else {
-    fprintf(stderr,"Error: Could not get name of reader\n");
-    return(Z_ERR);
-  }
-
-  /* Get the Extra GUI stuff (optional)
-   * ---------------------------------------------------------- */
-#ifdef _EGS
-
-  /* Get the Extra GUI numbers of toggles, pulldowns, & fields
-   * ---------------------------------------------------------- */
-
- USERD_get_extra_gui_numbers(      &Num_toggles,
-                                  &Num_pulldowns,
-                                  &Num_fields );
-
- if ( Num_toggles > 0 || Num_pulldowns > 0 || Num_fields > 0 ) {
-
-
-   *any_extra_gui = TRUE;
-
-   if (Num_toggles>0) {
-     Toggle_title = (char **) calloc(Num_toggles,sizeof(char*));
-     if (Toggle_title == (char **)NULL) return(Z_ERR);
-     for (i=0; i<Num_toggles; i++) {
-       Toggle_title[i] = (char *) calloc(Z_LEN_GUI_TITLE_STR,sizeof(char));
-       if ( Toggle_title[i] == (char *)NULL ) return(Z_ERR);
-     }
-     Toggle_default_status = (int *) calloc(Num_toggles,sizeof(int));
-     Toggle_choice = (int *) calloc(Num_toggles,sizeof(int));
-   }
-
-   if (Num_pulldowns > 0) {
-     Pulldown_title = (char **) calloc( Num_pulldowns , sizeof(char*) );
-     if (Pulldown_title == (char **)NULL) return(Z_ERR);
-
-     Pulldown_item_strings = (char ***) calloc( Num_pulldowns , sizeof(char**) );
-     if (Pulldown_item_strings == (char ***)NULL) return(Z_ERR);
-
-     for (i=0; i<Num_pulldowns; i++) {
-       Pulldown_title[i] = (char *) calloc( Z_LEN_GUI_TITLE_STR , sizeof(char) );
-       if ( Pulldown_title[i] == (char *)NULL ) return(Z_ERR);
-
-       Pulldown_item_strings[i] = (char **) calloc( Z_MAX_NUM_GUI_PULL_ITEMS , sizeof(char *) );
-       if (Pulldown_item_strings[i] == (char **)NULL) return(Z_ERR);
-
-       for(j = 0; j < Z_MAX_NUM_GUI_PULL_ITEMS; j++) {
-         Pulldown_item_strings[i][j] = (char *) calloc( Z_LEN_GUI_PULL_STR , sizeof(char) );
-         if ( Pulldown_item_strings[i][j] == (char *)NULL ) return(Z_ERR);
-       }
-     }
-     Pulldown_number_in_list = (int *) calloc(Num_pulldowns,sizeof(int));
-     Pulldown_default_selection = (int *) calloc(Num_pulldowns,sizeof(int));
-     Pulldown_choice = (int *) calloc(Num_pulldowns,sizeof(int));
-   }
-
-   if (Num_fields > 0) {
-     Field_title = (char **) calloc(Num_fields,sizeof(char*));
-     Field_user_string = (char **) calloc(Num_fields,sizeof(char*));
-     if (Field_title == (char **) NULL) return(Z_ERR);
-     for (i=0; i<Num_fields; i++) {
-       Field_title[i] = (char *) calloc(Z_LEN_GUI_TITLE_STR,sizeof(char));
-       if ( Field_title[i] == (char *)NULL) return(Z_ERR);
-       Field_user_string[i] = (char *) calloc(Z_LEN_GUI_FIELD_STR,sizeof(char));
-       if ( Field_user_string[i] == (char *)NULL) return(Z_ERR);
-     }
-   }
-
-
-   err = USERD_get_extra_gui_defaults(
-                                    Toggle_title,                 /* [num_toggles][Z_LEN_GUI_TITLE_STR] */
-                                    Toggle_default_status,        /* [num_toggles] */
-                                    Pulldown_title,               /* [num_pulldowns][Z_LEN_GUI_TITLE_STR] */
-                                    Pulldown_number_in_list,      /* [num_pulldowns] */
-                                    Pulldown_default_selection,   /* [num_pulldowns] */
-                                    Pulldown_item_strings,        /* [num_pulldowns][Z_MAX_NUM_GUI_PULL_ITEMS][Z_LEN_GUI_PULL_STR] */
-                                    Field_title,                  /* [num_fields][Z_LEN_GUI_TITLE_STR] */
-                                    Field_user_string              /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-                                    );
-   if (Z_ERR == err) return(Z_ERR);
-
-   fprintf(stderr,"\n**********************************************\n");
-   fprintf(stderr,"****          Extra GUI Information        ***\n");
-   fprintf(stderr,"**********************************************\n\n");
-
-   fprintf(stderr,"\nTOGGLE INFO: %d active toggles\n",Num_toggles);
-   for (i=0; i<Num_toggles; i++) {
-     fprintf(stderr,"Toggle Title %d : %s\n",i,Toggle_title[i]);
-     fprintf(stderr,"Default status = %d \n",Toggle_default_status[i]);
-   }
-
-   fprintf(stderr,"\nPULLDOWN INFO: %d active pulldowns\n",Num_pulldowns);
-   for (i=0; i<Num_pulldowns; i++) {
-     fprintf(stderr,"Pulldown Title %d : %s\n", i , Pulldown_title[i] );
-     for (j=0; j<Z_MAX_NUM_GUI_PULL_ITEMS; j++) {
-       fprintf(stderr,"Pulldown_item %d : %s\n",j,Pulldown_item_strings[i][j]);
-       if (strlen(Pulldown_item_strings[i][j]) == 0) {
-         Pulldown_number_in_list[i] = j;
-         break;
-       }
-     }
-     fprintf(stderr,"Number of items in list: %d\n",Pulldown_number_in_list[i]);
-     fprintf(stderr,"Default selection: %d\n\n",Pulldown_default_selection[i]);
-   }
-   fprintf(stderr,"\n");
-
-   fprintf(stderr,"\nFIELDINFO: %d active fields\n",Num_fields);
-   for (i=0; i<Num_fields; i++) {
-     fprintf(stderr,"Field Title %d : %s\n",i,Field_title[i]);
-     fprintf(stderr,"Field string %d: %s\n",i,Field_user_string[i]);
-   }
-   fprintf(stderr,"\n\n\n");
- }
-
-#endif
-
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the reader api used
-   *------------------------*/
-  err = USERD_get_reader_version(Version_number);
-  if(err == Z_OK) {
-    fprintf(stderr," API version:    %s\n",Version_number);
-  }
-  else {
-    fprintf(stderr,"Error: Could not get reader api version\n");
-    return(Z_ERR);
-  }
-
-  /* Get the reader release
-   *-----------------------*/
-  err = USERD_get_reader_release(release_number);
-  if(err == Z_OK) {
-    fprintf(stderr," Release:        %s\n",release_number);
-  }
-  else {
-    fprintf(stderr,"Error: Could not get reader release\n");
-    return(Z_ERR);
-  }
-#else
-  fprintf(stderr," API version:    1.00\n");
-#endif
-
-
-#if 0
-  /* Get the reader description
-   *---------------------------*/
-  err = USERD_get_reader_descrip(description);
-  if(err == Z_OK) {
-    fprintf(stderr," Description:\n\n");
-    fprintf(stderr,"%s\n\n",description);
-  }
-  else {
-    fprintf(stderr,"Error: Could not get reader description\n");
-    return(Z_ERR);
-  }
-#else
-  fprintf(stderr,"  Note: Not currently calling USERD_get_reader_descrip\n");
-  fprintf(stderr,"        because it is optional.\n");
-#endif
-
-  return(Z_OK);
-}
-
-
-/*----------
- * get_input
- *----------*/
-static int
-get_input(int set_server_number,
-          int use_playfile,
-          char playfile[Z_MAXFILENP],
-          int two_fields,
-          int any_extra_gui,
-          int *swapbytes)
-{
-  FILE *fplay;
-
-  int i, j;
-  int err;
-  int tot_servers;
-  int cur_server;
-  char the_path[Z_MAXFILENP];
-  char file1[Z_MAXFILENP];
-  char file2[Z_MAXFILENP];
-  char filename_1[Z_MAXFILENP];
-  char filename_2[Z_MAXFILENP];
-
-
-  fprintf(stderr,"\n-------------- get_input ----------------\n");
-
-  /*-----------------------------------------------------
-   * Prompt for the two input values, as the client would
-   * And set this info for the reader
-   *-----------------------------------------------------*/
-
-#if (defined GT_USERD_API_100)
-
-  /* Set the server number - if command line option to do so
-   *--------------------------------------------------------*/
-  if(set_server_number) {
-    fprintf(stderr,"     Enter total number of servers: ");
-    scanf("%d",&tot_servers);
-
-    fprintf(stderr,"     Enter current server number: ");
-    scanf("%d",&cur_server);
-
-    fprintf(stderr," Setting %d of %d for server number\n",cur_server,tot_servers);
-    USERD_set_server_number(cur_server,tot_servers);
-  }
-#endif
-
-  /* Set the filenames
-   *------------------*/
-  memset(the_path,EOS,Z_MAXFILENP);
-  memset(file1,EOS,Z_MAXFILENP);
-  memset(file2,EOS,Z_MAXFILENP);
-  memset(filename_1,EOS,Z_MAXFILENP);
-  memset(filename_2,EOS,Z_MAXFILENP);
-
-
-  if(!use_playfile) {
-    fprintf(stderr,"     Enter the path: ");
-    scanf("%s",the_path);
-
-
-    fprintf(stderr,"     Enter filename_1: ");
-    scanf("%s",file1);
-
-    if(two_fields == TRUE) {
-      fprintf(stderr,"     Enter filename_2: ");
-      scanf("%s",file2);
-    }
-
-    fprintf(stderr,"     Enter Swapbytes (0 if FALSE, 1 if TRUE): ");
-    scanf("%d",swapbytes);
-
-    if (TRUE == any_extra_gui ) {
-      fprintf(stderr,"\n**********************************************\n");
-      fprintf(stderr,"****          Extra GUI INPUT                ***\n");
-      fprintf(stderr,"**********************************************\n\n");
-
-      fprintf(stderr, "\n      TOGGLE INPUT \n");
-      for (i=0; i<Num_toggles; i++) {
-        fprintf(stderr, "      Enter Toggle Value for '%s' (1=toggle on, 0=toggle off)\n",Toggle_title[i]);
-        scanf("%d",&Toggle_choice[i]);
-      }
-      fprintf(stderr, "\n      PULLDOWN INPUT \n");
-      for (i=0; i<Num_pulldowns; i++) {
-        fprintf(stderr, "\n      PULLDOWN # %d \n",i);
-        for (j = 0; j<Pulldown_number_in_list[i]; j++) {
-          fprintf(stderr, "              %d %s\n",j,Pulldown_item_strings[i][j]);
-        }
-        fprintf(stderr, "              Enter Pulldown Value for '%s' (0 to %d)\n",Pulldown_title[i],Pulldown_number_in_list[i]-1);
-        scanf("%d",&Pulldown_choice[i]);
-      }
-      fprintf(stderr, "\n      FIELD INPUT \n");
-      for (i=0; i<Num_fields; i++) {
-        fprintf(stderr, "Enter string for field %d '%s'\n",i,Field_title[i]);
-        scanf("%s",Field_user_string[i]);
-      }
-
-    }                /* end if there is any extra gui stuff */
-  }                  /* end if not using playfile */
-  else {
-    fplay = fopen(playfile,"rb");
-    if(fplay == (FILE *)NULL) {
-      fprintf(stderr,"Error: Opening the playfile %s\n",playfile);
-      return(Z_ERR);
-    }
-    else {
-      fscanf(fplay,"%s",the_path);
-      fscanf(fplay,"%s",file1);
-      if(two_fields == TRUE) {
-        fscanf(fplay,"%s",file2);
-      }
-      fscanf(fplay,"%d",swapbytes);
-
-      /* ---------------------
-       * Extra GUI stuff
-       * --------------------- */
-      if (TRUE == any_extra_gui) {
-
-        for (i=0; i<Num_toggles; i++) {
-          fscanf(fplay,"%d",&Toggle_choice[i]);
-        }
-
-        for (i=0; i<Num_pulldowns; i++) {
-          fscanf(fplay,"%d",&Pulldown_choice[i]);
-        }
-
-        for (i=0; i<Num_fields; i++) {
-          fscanf(fplay,"%s",Field_user_string[i]);
-        }
-      }
-      fclose(fplay);
-    }
-  }
-
-#ifdef _EGS
-  /* -------------------------------------------
-   * set the user choices here and run the code
-   * ------------------------------------------- */
-
-  /* set your choices here
-     Toggle_choice[0..Num_toggles]
-     Pulldown_choice[0..Num_pulldowns]
-     Field_user_string[Num_fields][0..Numfields]
-     amd then send your choices into this routine */
-
-  USERD_set_extra_gui_data(
-                  Toggle_choice,            /* [num_toggle] */
-                  Pulldown_choice,          /* [num_pulldown] */
-                  Field_user_string  );    /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-
-  for (i=0; i<Num_toggles; i++) {
-    fprintf(stderr,"Toggle Title %d : %s\n",i,Toggle_title[i]);
-    fprintf(stderr,"User selection = %d \n",Toggle_choice[i]);
-  }
-  fprintf(stderr,"\n\n");
-
-  for (i=0; i<Num_pulldowns; i++) {
-    fprintf(stderr,"Pulldown Title %d : %s\n", i , Pulldown_title[i] );
-    fprintf(stderr,"Pulldown selection is # %d : %s\n",Pulldown_choice[i],Pulldown_item_strings[i][Pulldown_choice[i]]);
-  }
-
-  for (i=0; i<Num_fields; i++) {
-    fprintf(stderr,"Field Title %d : %s\n",i,Field_title[i]);
-    fprintf(stderr,"Field string %d: %s\n",i,Field_user_string[i]);
-
-  }
-
-
-#endif
-
-  if(strncmp(file1,"/",1)) {
-    strcpy(filename_1,the_path);
-    strcat(filename_1,"/");
-    strcat(filename_1,file1);
-  }
-  if(two_fields == TRUE) {
-    if(strncmp(file2,"/",1)) {
-      strcpy(filename_2,the_path);
-      strcat(filename_2,"/");
-      strcat(filename_2,file2);
-    }
-  }
-  if(*swapbytes == 0) {
-    *swapbytes = FALSE;
-  }
-  else {
-    *swapbytes = TRUE;
-  }
-
-  /* Feedback
-   *---------*/
-  fprintf(stderr," path: %s\n",the_path);
-  fprintf(stderr," filename_1: %s\n",filename_1);
-  fprintf(stderr," filename_2: %s\n",filename_2);
-  if(*swapbytes) {
-    fprintf(stderr," Swapbytes:    TRUE\n");
-  }
-  else {
-    fprintf(stderr," Swapbytes:    FALSE\n");
-  }
-
-  err = USERD_set_filenames(filename_1,filename_2,the_path,*swapbytes);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: Trouble setting the filenames\n");
-    return(Z_ERR);
-  }
-
-  return(Z_OK);
-}
-
-
-/*----------
- * time_info
- *----------*/
-static int
-time_info( void )
-{
-  int i;
-  int err;
-  int geom_time_set;
-  int ts;
-  float *sol_times;
-  char ts_desc[Z_BUFL];
-
-  fprintf(stderr,"\n-------------- time_info ----------------\n");
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the number of timesets
-   *---------------------------*/
-  Num_time_sets = USERD_get_number_of_timesets();
-  fprintf(stderr," number of timesets: %d\n",Num_time_sets);
-  if(Num_time_sets == 0) {
-    fprintf(stderr," So, static geometry and variables\n");
-    return(Z_OK);
-  }
-
-  /* Get the timeset used for the geometry
-   *--------------------------------------*/
-  geom_time_set = USERD_get_geom_timeset_number();
-
-  fprintf(stderr," geom timeset number: %d\n",geom_time_set);
-  if(geom_time_set < 1 && Num_time_sets > 0) {
-    fprintf(stderr,"Error: timeset numbers must be 1 or greater\n");
-    fprintf(stderr,"       (unless Num_time_sets is zero also)\n");
-  }
-
-
-  /* For each timeset
-   *-----------------*/
-  for(ts=1; ts<=Num_time_sets; ++ts) {
-
-    fprintf(stderr," Timeset %d:\n",ts);
-
-    /* Get the timeset descriptions
-     *-----------------------------*/
-    err = USERD_get_timeset_description(ts,ts_desc);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Error: getting timeset description\n");
-      return(Z_ERR);
-    }
-    else {
-      fprintf(stderr,"   description: %s\n",ts_desc);
-    }
-
-    /* Get the number of time steps
-     *-----------------------------*/
-    Num_time_steps = USERD_get_num_of_time_steps(ts);
-    fprintf(stderr,"   number of time steps: %d\n",Num_time_steps);
-    if(Num_time_steps < 1) {
-      fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-      fprintf(stderr," (Must be >0 to be okay)\n");
-      return(Z_ERR);
-    }
-
-
-    /* Get the solution times
-     *-----------------------*/
-    if(Num_time_steps > 0) {
-      sol_times = (float *) calloc(Num_time_steps,sizeof(float));
-      if(sol_times == (float *)NULL) {
-        fprintf(stderr,"Error: allocating for solution times\n");
-        return(Z_ERR);
-      }
-      else {
-        err = USERD_get_sol_times(ts,sol_times);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting solution times\n");
-          return(Z_ERR);
-        }
-        else {
-          for(i=0; i<Num_time_steps; ++i) {
-            fprintf(stderr,"   At step %d, time = %f\n",i,sol_times[i]);
-          }
-        }
-      }
-      free(sol_times);
-    }
-  }
-
-#else
-
-
-  /* Get the number of time steps
-   *-----------------------------*/
-  Num_time_steps = USERD_get_number_of_time_steps();
-  fprintf(stderr," Nnumber of time steps: %d\n",Num_time_steps);
-  if(Num_time_steps < 1) {
-    fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-    fprintf(stderr," (Must be >0 to be okay)\n");
-    return(Z_ERR);
-  }
-
-
-  /* Get the solution times
-   *-----------------------*/
-  if(Num_time_steps > 0) {
-    sol_times = (float *) calloc(Num_time_steps,sizeof(float));
-    if(sol_times == (float *)NULL) {
-      fprintf(stderr,"Error: allocating for solution times\n");
-      return(Z_ERR);
-    }
-    else {
-      err = USERD_get_solution_times(sol_times);
-      if(err == Z_ERR) {
-        fprintf(stderr,"Error: getting solution times\n");
-        return(Z_ERR);
-      }
-      else {
-        for(i=0; i<Num_time_steps; ++i) {
-          fprintf(stderr,"   At step %d, time = %f\n",i,sol_times[i]);
-        }
-      }
-    }
-    free(sol_times);
-  }
-
-#endif
-
-  return(Z_OK);
-}
-
-
-
-/*----------------
- * part_build_info
- *----------------*/
-static int
-part_build_info(int geom_time_step)
-{
-  int i, j;
-  int fn;
-  int err;
-  int num_dataset_files;
-  int geom_time_set;
-  Z_QFILES *qfiles;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-
-  int *part_ids;
-  int *part_types;
-  int *number_of_nodes;
-  int **num_elems;
-  int **ijk_dimensions;
-  int **iblanking_options;
-  char **part_descriptions;
-
-  int ghosts_in_block;
-
-  int *max_num_nodes;
-  int **max_num_elems;
-  int **max_ijk_dimensions;
-  float extents[6];
-
-
-  fprintf(stderr,"\n------------ part_build_info ------------\n");
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the timeset used for the geometry
-   *--------------------------------------*/
-  geom_time_set = USERD_get_geom_timeset_number();
-
-  /* Set the timeset and step - to first step
-   *-----------------------------------------*/
-
-  USERD_set_time_set_and_step(geom_time_set,geom_time_step);
-
-#else
-
-  /* Set the time step - to first step
-   *----------------------------------*/
-  USERD_set_time_step(geom_time_step);
-
-#endif
-
-  /* Get the changing geometry status
-   *---------------------------------*/
-  Geom_status = USERD_get_changing_geometry_status();
-  if(Geom_status == Z_STATIC) {
-    fprintf(stderr," Geom changing status: Z_STATIC\n");
-  }
-  else if(Geom_status == Z_CHANGE_COORDS) {
-    fprintf(stderr," Geom changing status: Z_CHANGE_COORDS\n");
-  }
-  else if(Geom_status == Z_CHANGE_CONN) {
-    fprintf(stderr," Geom changing status: Z_CHANGE_CONN\n");
-  }
-  else {
-    fprintf(stderr," Invalid Geom changing status!!\n");
-  }
-
-
-  /* Get the node label status
-   *--------------------------*/
-  Node_labels = USERD_get_node_label_status();
-  if(Node_labels) {
-    fprintf(stderr," Node labels will be provided\n");
-  }
-  else {
-    fprintf(stderr," Node labels will NOT be provided\n");
-  }
-
-  /* Get the element label status
-   *-----------------------------*/
-  Element_labels = USERD_get_element_label_status();
-  if(Element_labels) {
-    fprintf(stderr," Element labels will be provided\n");
-  }
-  else {
-    fprintf(stderr," Element labels will NOT be provided\n");
-  }
-
-  fprintf(stderr,"\n");
-
-  /* Get the number of files in the dataset
-   *---------------------------------------*/
-  num_dataset_files = USERD_get_number_of_files_in_dataset();
-  fprintf(stderr," Number of files in dataset: %d\n",num_dataset_files);
-
-
-  /* Get the dataset query file info
-   *--------------------------------*/
-  if(num_dataset_files > 0) {
-
-    qfiles = (Z_QFILES *) calloc(num_dataset_files,sizeof(Z_QFILES));
-    if(qfiles == (Z_QFILES *)NULL) {
-      fprintf(stderr,"Error: allocating for dataset query files\n");
-      return(Z_ERR);
-    }
-    else {
-
-      for(i=0; i<num_dataset_files; ++i) {
-        qfiles[i].f_desc = (char **) calloc(10,sizeof(char *));
-        if(qfiles[i].f_desc == (char **)NULL) {
-          fprintf(stderr,"Error: allocating for dataset query descrip lines\n");
-          return(Z_ERR);
-        }
-        else {
-          for(j=0; j<10; ++j) {
-            qfiles[i].f_desc[j] = (char *) calloc(Z_MAXFILENP,sizeof(char));
-            if(qfiles[i].f_desc[j] == (char *)NULL) {
-              fprintf(stderr,"Error: allocating for dataset query descrip lines\n");
-              return(Z_ERR);
-            }
-          }
-        }
-      }
-
-      err = USERD_get_dataset_query_file_info(qfiles);
-      if(err == Z_OK) {
-        for(fn=0; fn<num_dataset_files; ++fn) {
-          fprintf(stderr," For dataset file %d:\n",fn);
-
-          fprintf(stderr,"   name:           %s\n",qfiles[fn].name);
-          fprintf(stderr,"   size:           %d\n",qfiles[fn].sizeb);
-          fprintf(stderr,"   time:           %s\n",qfiles[fn].timemod);
-          fprintf(stderr,"   num desc lines: %d\n",qfiles[fn].num_d_lines);
-          for(i=0; i<qfiles[fn].num_d_lines; ++i) {
-            fprintf(stderr,"    desc line %d: %s\n",i,qfiles[fn].f_desc[i]);
-          }
-        }
-      }
-      else {
-        fprintf(stderr,"Error: getting dataset query info\n");
-        return(Z_ERR);
-      }
-    }
-
-    /* Free allocated memory
-     *----------------------*/
-    for(i=0; i<num_dataset_files; ++i) {
-      for(j=0; j<10; ++j) {
-        free(qfiles[i].f_desc[j]);
-      }
-      free(qfiles[i].f_desc);
-    }
-    free(qfiles);
-  }
-
-  fprintf(stderr,"\n-----------------------------------------\n");
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the geometry description lines
-   *-----------------------------------*/
-  err = USERD_get_descrip_lines(Z_GEOM,0,FALSE,line1,line2);
-  if(err == Z_OK) {
-    fprintf(stderr," Geom Desc line1: %s\n",line1);
-    fprintf(stderr," Geom Desc line2: %s\n",line2);
-  }
-  else {
-    fprintf(stderr,"Error: getting geom description lines\n");
-    return(Z_ERR);
-  }
-
-#else
-
-  /* Get the geometry description lines
-   *-----------------------------------*/
-  err = USERD_get_description_lines(Z_GEOM,0,line1,line2);
-  if(err == Z_OK) {
-    fprintf(stderr," Geom Desc line1: %s\n",line1);
-    fprintf(stderr," Geom Desc line2: %s\n",line2);
-  }
-  else {
-    fprintf(stderr,"Error: getting geom description lines\n");
-    return(Z_ERR);
-  }
-
-#endif
-
-  /* Get the number of model parts
-   *------------------------------*/
-  Num_parts = USERD_get_number_of_model_parts();
-  if(Num_parts > 0) {
-    fprintf(stderr," Number of parts: %d\n",Num_parts);
-  }
-  else {
-    fprintf(stderr," Problems getting number of parts\n");
-    return(Z_ERR);
-  }
-
-
-
-  /* Get the gold part build info
-   *-----------------------------*/
-  Pbuild = (BUILDINFO *) calloc(Num_parts,sizeof(BUILDINFO));
-  if(Pbuild == (BUILDINFO *)NULL) {
-    fprintf(stderr," Problems allocating for Pbuild structure\n");
-    return(Z_ERR);
-  }
-
-
-  part_ids = (int *) calloc(Num_parts,sizeof(int));
-  if(part_ids == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part ids\n");
-    return(Z_ERR);
-  }
-
-  part_types = (int *) calloc(Num_parts,sizeof(int));
-  if(part_types == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part types\n");
-    return(Z_ERR);
-  }
-
-  part_descriptions = (char **) calloc(Num_parts,sizeof(char *));
-  if(part_descriptions == (char **)NULL) {
-    fprintf(stderr," Problems allocating for part descriptions\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      part_descriptions[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(part_descriptions[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for part descriptions\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  number_of_nodes = (int *) calloc(Num_parts,sizeof(int));
-  if(number_of_nodes == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part number of nodes\n");
-    return(Z_ERR);
-  }
-
-  num_elems = (int **) calloc(Num_parts,sizeof(int *));
-  if(num_elems == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part number of elements\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      num_elems[i] = (int *) calloc(Z_MAXTYPE,sizeof(int));
-      if(num_elems[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part number of elements\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  ijk_dimensions = (int **) calloc(Num_parts,sizeof(int *));
-  if(ijk_dimensions == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part ijk dimensions\n");
-    return(Z_ERR);
-  }
-  else {
-
-#if (defined GT_USERD_API_202)
-    for(i=0; i<Num_parts; ++i) {
-      ijk_dimensions[i] = (int *) calloc(9,sizeof(int));
-      if(ijk_dimensions[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part ijk dimensions\n");
-        return(Z_ERR);
-      }
-      else {
-        for(j=0; j<9; ++j) {
-          ijk_dimensions[i][j] = -1;
-        }
-      }
-    }
-#else
-    for(i=0; i<Num_parts; ++i) {
-      ijk_dimensions[i] = (int *) calloc(3,sizeof(int));
-      if(ijk_dimensions[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part ijk dimensions\n");
-        return(Z_ERR);
-      }
-    }
-#endif
-  }
-
-  iblanking_options = (int **) calloc(Num_parts,sizeof(int *));
-  if(iblanking_options == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part iblanking options\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      iblanking_options[i] = (int *) calloc(6,sizeof(int));
-      if(iblanking_options[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part iblanking options\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-
-#if (defined GT_USERD_API_100)
-
-  err = USERD_get_gold_part_build_info(part_ids,
-                                       part_types,
-                                       part_descriptions,
-                                       number_of_nodes,
-                                       num_elems,
-                                       ijk_dimensions,
-                                       iblanking_options);
-#else
-
-  err = USERD_get_part_build_info(part_ids,
-                                  part_types,
-                                  part_descriptions,
-                                  num_elems,
-                                  ijk_dimensions,
-                                  iblanking_options);
-
-#endif
-
-  if(err == Z_ERR) {
-    fprintf(stderr," Problems getting part build info\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      fprintf(stderr," For part %d:\n",i+1);
-
-      fprintf(stderr,"   part id:   %d\n",part_ids[i]);
-      Pbuild[i].id = part_ids[i];
-
-      if(part_types[i] == Z_UNSTRUCTURED) {
-        fprintf(stderr,"   part type: Z_UNSTRUCTURED\n");
-      }
-      else if(part_types[i] == Z_STRUCTURED) {
-        fprintf(stderr,"   part type: Z_STRUCTURED\n");
-      }
-      else if(part_types[i] == Z_IBLANKED) {
-        fprintf(stderr,"   part type: Z_IBLANKED\n");
-      }
-      else {
-        fprintf(stderr,"   Invalid part type\n");
-        return(Z_ERR);
-      }
-      Pbuild[i].type = part_types[i];
-
-      fprintf(stderr,"   part desc:   %s\n",part_descriptions[i]);
-      strncpy(Pbuild[i].desc,part_descriptions[i],Z_BUFL);
-
-#if (defined GT_USERD_API_100)
-      fprintf(stderr,"   number of nodes :   %d\n",number_of_nodes[i]);
-      Pbuild[i].nn = number_of_nodes[i];
-#else
-      Pbuild[i].nn = USERD_get_number_of_global_nodes();
-#endif
-
-      for(j=0; j<Z_MAXTYPE; ++j) {
-        if(num_elems[i][j] > 0) {
-          fprintf(stderr,"   # %s elements:   %d\n",
-                  Elem_info[j].name,num_elems[i][j]);
-          Pbuild[i].ne[j] = num_elems[i][j];
-        }
-      }
-
-      if(part_types[i] != Z_UNSTRUCTURED) {
-
-        /* For this checker, we will place the following in the
-         * Pbuild[].ne[] structure:
-         *
-         *   Note this is can be used for block size whether ranges or not
-         *   -------------------------------------------------------------
-         *   Pbuild[].ne[0] = i dim of current block (to the range selected)
-         *   Pbuild[].ne[1] = j dim of current block (to the range selected)
-         *   Pbuild[].ne[2] = k dim of current block (to the range selected)
-         *
-         *   Thus if ranges:
-         *   ---------------
-         *   Pbuild[].ne[3] = i min range          (-1 indicates no ranges)
-         *   Pbuild[].ne[4] = i max range
-         *   Pbuild[].ne[5] = i min range
-         *   Pbuild[].ne[6] = i max range
-         *   Pbuild[].ne[7] = i min range
-         *   Pbuild[].ne[8] = i max range
-         *
-         *   Pbuild[].ne[9]  = i dim of total block (if ranges)
-         *   Pbuild[].ne[10] = j dim of total block (if ranges)
-         *   Pbuild[].ne[11] = k dim of total block (if ranges)
-         *
-         *   What comes back from the api is:
-         *   --------------------------------
-         *   before 2.03 (no ranges)
-         *   -----------------------
-         *   ijk_dimensions[][0] = i dim of block
-         *   ijk_dimensions[][1] = j dim of block
-         *   ijk_dimensions[][2] = k dim of block
-         *
-         *   at 2.03 (if no ranges)
-         *   -------
-         *   ijk_dimensions[][0] = i dim of block
-         *   ijk_dimensions[][1] = j dim of block
-         *   ijk_dimensions[][2] = k dim of block
-         *   ijk_dimensions[][3] = -1
-         *
-         *   at 2.03 (if ranges)
-         *   -------
-         *   ijk_dimensions[][0] = i dim of total block
-         *   ijk_dimensions[][1] = j dim of total block
-         *   ijk_dimensions[][2] = k dim of total block
-         *   ijk_dimensions[][3] = i min range
-         *   ijk_dimensions[][4] = i max range
-         *   ijk_dimensions[][5] = j min range
-         *   ijk_dimensions[][6] = j max range
-         *   ijk_dimensions[][7] = k min range
-         *   ijk_dimensions[][8] = k max range
-         *--------------------------------------------------------------*/
-
-#if (defined GT_USERD_API_202)
-        if(ijk_dimensions[i][3] == -1) {
-          fprintf(stderr,"   ijk_dimensions: %d %d %d\n",
-                  ijk_dimensions[i][0],
-                  ijk_dimensions[i][1],
-                  ijk_dimensions[i][2]);
-          Pbuild[i].ne[0] = ijk_dimensions[i][0];
-          Pbuild[i].ne[1] = ijk_dimensions[i][1];
-          Pbuild[i].ne[2] = ijk_dimensions[i][2];
-          Pbuild[i].ne[3] = ijk_dimensions[i][3];
-        }
-        else {
-
-          /* If empty part
-           *--------------*/
-          if(ijk_dimensions[i][0] == 0 &&
-             ijk_dimensions[i][1] == 0 &&
-             ijk_dimensions[i][2] == 0) {
-            fprintf(stderr,"   ijk_dimensions: %d %d %d\n",
-                    ijk_dimensions[i][0],
-                    ijk_dimensions[i][1],
-                    ijk_dimensions[i][2]);
-            Pbuild[i].ne[0] = ijk_dimensions[i][0];
-            Pbuild[i].ne[1] = ijk_dimensions[i][1];
-            Pbuild[i].ne[2] = ijk_dimensions[i][2];
-            Pbuild[i].ne[3] = -1;
-          }
-
-          /* range part
-           *-----------*/
-          else {
-            Pbuild[i].ne[0] = ijk_dimensions[i][4] - ijk_dimensions[i][3] + 1;
-            Pbuild[i].ne[1] = ijk_dimensions[i][6] - ijk_dimensions[i][5] + 1;
-            Pbuild[i].ne[2] = ijk_dimensions[i][8] - ijk_dimensions[i][7] + 1;
-
-            Pbuild[i].ne[3] = ijk_dimensions[i][3];
-            Pbuild[i].ne[4] = ijk_dimensions[i][4];
-            Pbuild[i].ne[5] = ijk_dimensions[i][5];
-            Pbuild[i].ne[6] = ijk_dimensions[i][6];
-            Pbuild[i].ne[7] = ijk_dimensions[i][7];
-            Pbuild[i].ne[8] = ijk_dimensions[i][8];
-
-            Pbuild[i].ne[9] = ijk_dimensions[i][0];
-            Pbuild[i].ne[10] = ijk_dimensions[i][1];
-            Pbuild[i].ne[11] = ijk_dimensions[i][2];
-
-            fprintf(stderr,"   Part has ranges:\n");
-            fprintf(stderr,"   ijk dimensions of total block: %d %d %d\n",
-                    Pbuild[i].ne[9],
-                    Pbuild[i].ne[10],
-                    Pbuild[i].ne[11]);
-            fprintf(stderr,"     i range: %d  to  %d\n",
-                    Pbuild[i].ne[3],
-                    Pbuild[i].ne[4]);
-            fprintf(stderr,"     j range: %d  to  %d\n",
-                    Pbuild[i].ne[5],
-                    Pbuild[i].ne[6]);
-            fprintf(stderr,"     k range: %d  to  %d\n",
-                    Pbuild[i].ne[7],
-                    Pbuild[i].ne[8]);
-            fprintf(stderr,"   ijk dimensions of range portion: %d %d %d\n",
-                    Pbuild[i].ne[0],
-                    Pbuild[i].ne[1],
-                    Pbuild[i].ne[2]);
-          }
-        }
-#else
-        fprintf(stderr,"   ijk_dimensions: %d %d %d\n",
-                ijk_dimensions[i][0],
-                ijk_dimensions[i][1],
-                ijk_dimensions[i][2]);
-        Pbuild[i].ne[0] = ijk_dimensions[i][0];
-        Pbuild[i].ne[1] = ijk_dimensions[i][1];
-        Pbuild[i].ne[2] = ijk_dimensions[i][2];
-        Pbuild[i].ne[3] = -1;
-#endif
-        if(part_types[i] == Z_IBLANKED) {
-          fprintf(stderr,"   Ibanking options on:\n");
-          if(iblanking_options[i][Z_EXT]) {
-            fprintf(stderr,"     Z_EXT\n");
-          }
-          if(iblanking_options[i][Z_INT]) {
-            fprintf(stderr,"     Z_INT\n");
-          }
-          if(iblanking_options[i][Z_BND]) {
-            fprintf(stderr,"     Z_BND\n");
-          }
-          if(iblanking_options[i][Z_INTBND]) {
-            fprintf(stderr,"     Z_INTBND\n");
-          }
-          if(iblanking_options[i][Z_SYM]) {
-            fprintf(stderr,"     Z_SYM\n");
-          }
-        }
-      }
-    }
-  }
-
-
-#if (defined GT_USERD_API_200)
-
-  /* Get ghosts in model flag
-   *-------------------------*/
-  Ghosts_in_model = USERD_get_ghosts_in_model_flag();
-  if(Ghosts_in_model) {
-    fprintf(stderr," Ghosts in Model:  TRUE\n");
-  }
-  else {
-    fprintf(stderr," Ghosts in Model:  FALSE\n");
-  }
-
-  /* Get ghosts in block flag - if needed
-   *-------------------------------------*/
-  for(i=1; i<=Num_parts; ++i) {
-    if(part_types[i-1] != Z_UNSTRUCTURED && Ghosts_in_model) {
-      ghosts_in_block = USERD_get_ghosts_in_block_flag(i);
-      Pbuild[i-1].ghosts = ghosts_in_block;
-      if(ghosts_in_block) {
-        fprintf(stderr," Ghosts in block part %d:  TRUE\n",i);
-      }
-      else {
-        fprintf(stderr," Ghosts in block part %d:  FALSE\n",i);
-      }
-    }
-  }
-
-#endif
-
-
-#if (defined GT_USERD_API_100)
-
-  /* Get maxsize info
-   *-----------------*/
-  max_num_nodes = (int *) calloc(Num_parts,sizeof(int));
-  if(max_num_nodes == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part max num of nodes\n");
-    return(Z_ERR);
-  }
-
-  max_num_elems = (int **) calloc(Num_parts,sizeof(int *));
-  if(max_num_elems == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part max num of elements\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      max_num_elems[i] = (int *) calloc(Z_MAXTYPE,sizeof(int));
-      if(max_num_elems[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part max_num of elements\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  max_ijk_dimensions = (int **) calloc(Num_parts,sizeof(int *));
-  if(max_ijk_dimensions == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part max ijk dimensions\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      max_ijk_dimensions[i] = (int *) calloc(3,sizeof(int));
-      if(max_ijk_dimensions[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part max ijk dimensions\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  err = USERD_get_maxsize_info(max_num_nodes,
-                               max_num_elems,
-                               max_ijk_dimensions);
-  if(err == Z_ERR) {
-    fprintf(stderr," No maxsize info provided (or error getting them)\n");
-  }
-  else {
-
-    for(i=0; i<Num_parts; ++i) {
-      fprintf(stderr," For part %d:\n",i+1);
-
-      fprintf(stderr,"   max number of nodes :   %d\n",max_num_nodes[i]);
-
-      for(j=0; j<Z_MAXTYPE; ++j) {
-        if(max_num_elems[i][j] > 0) {
-          fprintf(stderr,"   max # %s elems:   %d\n",
-                  Elem_info[j].name,max_num_elems[i][j]);
-        }
-      }
-
-      if(part_types[i] != Z_UNSTRUCTURED) {
-        fprintf(stderr,"   max_ijk_dimensions: %d %d %d\n",
-                max_ijk_dimensions[i][0],
-                max_ijk_dimensions[i][1],
-                max_ijk_dimensions[i][2]);
-      }
-    }
-  }
-
-  /* Get model extents - if given
-   *-----------------------------*/
-  err = USERD_get_model_extents(extents);
-  if(err == Z_ERR) {
-    fprintf(stderr," No extents given\n");
-  }
-  else {
-    fprintf(stderr," Min x: %g\n",extents[0]);
-    fprintf(stderr," Max x: %g\n",extents[1]);
-    fprintf(stderr," Min y: %g\n",extents[2]);
-    fprintf(stderr," Max y: %g\n",extents[3]);
-    fprintf(stderr," Min z: %g\n",extents[4]);
-    fprintf(stderr," Max z: %g\n",extents[5]);
-  }
-
-#endif
-
-  /* Free the allocated memory
-   *--------------------------*/
-  free(part_ids);
-  free(part_types);
-  free(number_of_nodes);
-
-  for(i=0; i<Num_parts; ++i) {
-    free(ijk_dimensions[i]);
-    free(num_elems[i]);
-    free(part_descriptions[i]);
-  }
-  free(ijk_dimensions);
-  free(num_elems);
-  free(iblanking_options);
-  free(part_descriptions);
-
-#if (defined GT_USERD_API_100)
-  for(i=0; i<Num_parts; ++i) {
-    free(max_ijk_dimensions[i]);
-    free(max_num_elems[i]);
-  }
-  free(max_num_nodes);
-  free(max_num_elems);
-  free(max_ijk_dimensions);
-
-#endif
-
-  return(Z_OK);
-}
-
-
-/*--------------
- * variable_info
- *--------------*/
-static int
-variable_info( void )
-{
-  int i,j;
-  int err;
-
-  char **var_description;
-  char **var_filename;
-  int *var_type;
-  int *var_classify;
-  int *var_complex;
-  char **var_ifilename;
-  float *var_freq;
-  int *var_contran;
-  int *var_timeset;
-
-
-  fprintf(stderr,"\n------------ variable_info --------------\n");
-
-  /* Get the number of variables
-   *----------------------------*/
-  Num_vars = USERD_get_number_of_variables();
-  if(Num_vars < 0) {
-    fprintf(stderr,"Error: getting the number of variables\n");
-  }
-  else {
-    fprintf(stderr," Number of variables: %d\n",Num_vars);
-  }
-
-
-  /* Get the gold variable info
-   *---------------------------*/
-  Varinfo = (VARINFO *) calloc(Num_vars,sizeof(VARINFO));
-  if(Varinfo == (VARINFO *)NULL) {
-    fprintf(stderr," Problems allocating for Varinfo structure\n");
-    return(Z_ERR);
-  }
-
-
-  var_description = (char **) calloc(Num_vars,sizeof(char *));
-  if(var_description == (char **)NULL) {
-    fprintf(stderr," Problems allocating for var description\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-      var_description[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(var_description[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for var description\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  var_filename = (char **) calloc(Num_vars,sizeof(char *));
-  if(var_filename == (char **)NULL) {
-    fprintf(stderr," Problems allocating for var filename\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-      var_filename[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(var_filename[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for var filename\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  var_type = (int *) calloc(Num_vars,sizeof(int));
-  if(var_type == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var type\n");
-    return(Z_ERR);
-  }
-
-  var_classify = (int *) calloc(Num_vars,sizeof(int));
-  if(var_classify == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var classify\n");
-    return(Z_ERR);
-  }
-
-  var_complex = (int *) calloc(Num_vars,sizeof(int));
-  if(var_complex == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var complex\n");
-    return(Z_ERR);
-  }
-
-
-  var_ifilename = (char **) calloc(Num_vars,sizeof(char *));
-  if(var_ifilename == (char **)NULL) {
-    fprintf(stderr," Problems allocating for var ifilename\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-      var_ifilename[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(var_ifilename[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for var ifilename\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  var_freq = (float *) calloc(Num_vars,sizeof(float));
-  if(var_freq == (float *)NULL) {
-    fprintf(stderr," Problems allocating for var freq\n");
-    return(Z_ERR);
-  }
-
-  var_contran = (int *) calloc(Num_vars,sizeof(int));
-  if(var_contran == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var contran\n");
-    return(Z_ERR);
-  }
-
-  var_timeset = (int *) calloc(Num_vars,sizeof(int));
-  if(var_timeset == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var timeset\n");
-    return(Z_ERR);
-  }
-
-#if (defined GT_USERD_API_100)
-
-  err = USERD_get_gold_variable_info(var_description,
-                                     var_filename,
-                                     var_type,
-                                     var_classify,
-                                     var_complex,
-                                     var_ifilename,
-                                     var_freq,
-                                     var_contran,
-                                     var_timeset);
-#else
-
-  err = USERD_get_variable_info(var_description,
-                                var_filename,
-                                var_type,
-                                var_classify);
-
-#endif
-
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: getting variable info\n");
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-
-      /* Loading the global
-       * (for use in other routines)
-       *----------------------------*/
-      strncpy(Varinfo[i].description,var_description[i],Z_BUFL);
-      strncpy(Varinfo[i].filename,var_filename[i],Z_BUFL);
-      strncpy(Varinfo[i].ifilename,var_ifilename[i],Z_BUFL);
-      Varinfo[i].type     = var_type[i];
-      Varinfo[i].classify = var_classify[i];
-      Varinfo[i].complex  = var_complex[i];
-      Varinfo[i].freq     = var_freq[i];
-      Varinfo[i].contran  = var_contran[i];
-      Varinfo[i].timeset  = var_timeset[i];
-
-      /* Echo some feedback
-       *-------------------*/
-      fprintf(stderr," For Variable %d:\n",i+1);
-
-      fprintf(stderr,"   var desc:      %s\n",var_description[i]);
-      fprintf(stderr,"   var filename:  %s\n",var_filename[i]);
-
-#if (defined GT_USERD_API_100)
-      if(var_complex[i]) {
-        fprintf(stderr,"   var complex:   TRUE\n");
-        fprintf(stderr,"   var ifilename: %s\n",var_ifilename[i]);
-        fprintf(stderr,"   var freq:      %g\n",var_freq[i]);
-      }
-      else {
-        fprintf(stderr,"   var complex:   FALSE\n");
-      }
-#endif
-
-      if(var_type[i] == Z_CONSTANT) {
-        fprintf(stderr,"   var type:      Z_CONSTANT\n");
-
-#if (defined GT_USERD_API_100)
-        if(var_contran[i]) {
-          fprintf(stderr,"   var contran:  TRUE\n");
-        }
-        else {
-          fprintf(stderr,"   var contran:  FALSE\n");
-        }
-#endif
-
-      }
-      else if(var_type[i] == Z_SCALAR) {
-        fprintf(stderr,"   var type:      Z_SCALAR\n");
-      }
-      else if(var_type[i] == Z_VECTOR) {
-        fprintf(stderr,"   var type:      Z_VECTOR\n");
-      }
-      else if(var_type[i] == Z_TENSOR) {
-        fprintf(stderr,"   var type:      Z_TENSOR\n");
-      }
-      else if(var_type[i] == Z_TENSOR9) {
-        fprintf(stderr,"   var type:      Z_TENSOR9\n");
-      }
-      else {
-        fprintf(stderr,"   Invalid var type\n");
-        return(Z_ERR);
-      }
-
-      if(var_classify[i] == Z_PER_NODE) {
-        fprintf(stderr,"   var classify:  Z_PER_NODE\n");
-      }
-      else if(var_classify[i] == Z_PER_ELEM) {
-        fprintf(stderr,"   var classify:  Z_PER_ELEM\n");
-      }
-      else if(var_classify[i] != Z_CONSTANT) {
-        fprintf(stderr,"   Invalid var classify\n");
-        return(Z_ERR);
-      }
-
-#if (defined GT_USERD_API_100)
-      fprintf(stderr,"   var timeset:   %d\n",var_timeset[i]);
-#endif
-    }
-  }
-
-  /* Free the allocated memory
-   *--------------------------*/
-  for(i=0; i<Num_vars; ++i) {
-    free(var_description[i]);
-    free(var_filename[i]);
-    free(var_ifilename[i]);
-  }
-  free(var_description);
-  free(var_filename);
-  free(var_ifilename);
-  free(var_type);
-  free(var_classify);
-  free(var_complex);
-  free(var_freq);
-  free(var_contran);
-  free(var_timeset);
-
-  return(Z_OK);
-}
-
-
-#if (defined GT_USERD_API_100)
-/*------------------
- * gold_part_builder
- *------------------*/
-static int
-gold_part_builder(int geom_time_step)
-{
-  int i, j, k, jj, kk;
-  int err;
-  int geom_timeset;
-  int p, pn;
-  int et, ne;
-  int *elemids;
-  int **conns;
-  int nn;
-  int comp;
-  int bdim[3];
-  int ib[5];
-  int num_ghosts;
-  int num_dims;
-  int cell_type;
-  float mm[6];
-  float **coords;
-  int *nodeids;
-  int *iblanking;
-  int *ghost_flag;
-  short *parent_type;
-  int *parent_num;
-  int num_elems[Z_MAXTYPE];
-  CRD *crds;
-  int bd1,bd2,bd3;
-  int empty_part;
-  int *pdata;
-  int nsid_len;
-  int *nsid_con;
-  int nface_len;
-  int *nface_con;
-  int npf_len;
-  int *npf_con;
-  int maxcheck;
-  int num_failed = 0;
-  int *fail_flags = (int *) NULL;
-
-  fprintf(stderr,"\n------------- part_builder --------------\n");
-
-  if(Num_time_sets > 0) {
-    /* Get the timeset used for the geometry
-     *--------------------------------------*/
-    geom_timeset = USERD_get_geom_timeset_number();
-
-    /* Get the number of time steps for this timeset
-     *----------------------------------------------*/
-    Num_time_steps = USERD_get_num_of_time_steps(geom_timeset);
-    if(Num_time_steps < 1) {
-      fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-      fprintf(stderr," (Must be >0 to be okay)\n");
-      return(Z_ERR);
-    }
-    if(geom_time_step > (Num_time_steps - 1)) {
-      geom_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the timeset and step - to first step by default, but
-     * can set it at others using -gts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_set_and_step(geom_timeset,geom_time_step);
-
-    fprintf(stderr," Using timeset:   %d  (step range is %d through %d)\n",
-            geom_timeset,0,Num_time_steps-1);
-    fprintf(stderr," Using time step: %d\n",geom_time_step);
-  }
-
-  for(p=0; p<Num_parts; ++p) {
-    pn = p+1;
-
-    fprintf(stderr,"\n\n----------------------------------------");
-    fprintf(stderr," Part %d:\n",pn);
-
-    /*-----------------------
-     * For unstructured parts
-     *-----------------------*/
-    if(Pbuild[p].type == Z_UNSTRUCTURED) {
-
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-
-          pdata = (int *)calloc(ne*Elem_info[et].con_len,sizeof(int));
-          if(pdata == (int *) NULL) {
-            fprintf(stderr,"Error: allocating conns array\n");
-            return(Z_ERR);
-          }
-          else {
-            conns = (int **) calloc(ne,sizeof(int *));
-            if(conns == (int **) NULL) {
-              fprintf(stderr,"Error: allocating conns array\n");
-              return(Z_ERR);
-            }
-            for(i=0; i<ne; ++i) {
-              conns[i] = pdata;
-              pdata += Elem_info[et].con_len;
-            }
-          }
-
-
-          /* Get the elements
-           *-----------------*/
-          err = USERD_get_part_elements_by_type(pn,et,conns);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting element connectivities\n");
-            return(Z_ERR);
-          }
-
-          if(Element_labels) {
-            elemids = (int *) calloc(ne,sizeof(int));
-            if(elemids == (int *) NULL) {
-              fprintf(stderr,"Error: allocating elemids array\n");
-              return(Z_ERR);
-            }
-          }
-
-          /* Get the element ids - if any
-           *-----------------------------*/
-          if(Element_labels) {
-            err = USERD_get_part_element_ids_by_type(pn,et,elemids);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting element ids\n");
-              return(Z_ERR);
-            }
-          }
-
-          /* Echo "some" info
-           *-----------------*/
-
-#if (defined GT_USERD_API_202)
-
-          maxcheck = Z_NSIDED;
-
-          /* Nsided elements, if any
-           *------------------------*/
-          if(et == Z_NSIDED ||
-             et == Z_G_NSIDED) {
-
-            nsid_len = 0;
-            for(i=0; i<ne; ++i) {
-              nsid_len += conns[i][0];
-            }
-
-            nsid_con = (int *) calloc(nsid_len,sizeof(int));
-            if(nsid_con == (int *) NULL) {
-              fprintf(stderr,"Error: allocating nsided conn array\n");
-              return(Z_ERR);
-            }
-
-            err = USERD_get_nsided_conn(pn,nsid_con);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting nsided conn array\n");
-              return(Z_ERR);
-            }
-
-            /* First element of the type
-             *--------------------------*/
-            i = 0;
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            if(Element_labels) {
-              fprintf(stderr,"      id: %d\n",elemids[i]);
-            }
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<conns[i][0]; ++j) {
-              fprintf(stderr," %d",nsid_con[j]);
-            }
-            fprintf(stderr,"\n");
-
-            /* Last element of the type
-             *-------------------------*/
-            i = ne - 1;
-            if(i > 0) {
-              fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-              if(Element_labels) {
-                fprintf(stderr,"      id: %d\n",elemids[i]);
-              }
-              fprintf(stderr,"      connectivity:");
-
-              for(j=nsid_len-conns[i][0]; j<nsid_len; ++j) {
-                fprintf(stderr," %d",nsid_con[j]);
-              }
-              fprintf(stderr,"\n");
-            }
-          }
-
-          /* Nfaced elements if any
-           *-----------------------*/
-          if(et == Z_NFACED ||
-             et == Z_G_NFACED) {
-
-            nface_len = 0;
-            for(i=0; i<ne; ++i) {
-              nface_len += conns[i][0];
-            }
-
-            nface_con = (int *) calloc(nface_len,sizeof(int));
-            if(nface_con == (int *) NULL) {
-              fprintf(stderr,"Error: allocating nfaced face array\n");
-              return(Z_ERR);
-            }
-
-            err = USERD_get_nfaced_nodes_per_face(pn,nface_con);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting nfaced face array array\n");
-              return(Z_ERR);
-            }
-
-            npf_len = 0;
-            for(i=0; i<nface_len; ++i) {
-              npf_len += nface_con[i];
-            }
-
-            npf_con = (int *) calloc(npf_len,sizeof(int));
-            if(npf_con == (int *) NULL) {
-              fprintf(stderr,"Error: allocating nfaced npf array\n");
-              return(Z_ERR);
-            }
-
-            err = USERD_get_nfaced_conn(pn,npf_con);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting nfaced conn array\n");
-              return(Z_ERR);
-            }
-
-            /* First element of the type
-             *--------------------------*/
-            jj = 0;
-            kk = 0;
-            for(i=0; i<ne; ++i) {
-
-              if(i == 0 ||
-                 i == ne-1) {
-                fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,
-                        i+1,ne);
-                if(Element_labels) {
-                  fprintf(stderr,"      id: %d\n",elemids[i]);
-                }
-                for(j=0; j<conns[i][0]; ++j) {
-                  fprintf(stderr,"      face %d connectivity:",j+1);
-                  for(k=0; k<nface_con[jj]; ++k) {
-                    fprintf(stderr," %d",npf_con[kk]);
-                    ++kk;
-                  }
-                  fprintf(stderr,"\n");
-                  ++jj;
-                }
-              }
-              else {
-                for(j=0; j<conns[i][0]; ++j) {
-                  for(k=0; k<nface_con[jj]; ++k) {
-                    ++kk;
-                  }
-                  ++jj;
-                }
-              }
-            }
-          }
-#else
-
-          maxcheck = Z_MAXTYPE;
-
-#endif
-
-          /* Regular elements
-           *-----------------*/
-          if(et < maxcheck) {
-
-            /* First element of the type
-             *--------------------------*/
-            i = 0;
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            if(Element_labels) {
-              fprintf(stderr,"      id: %d\n",elemids[i]);
-            }
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<Elem_info[et].con_len; ++j) {
-              fprintf(stderr," %d",conns[i][j]);
-            }
-            fprintf(stderr,"\n");
-
-            /* check the connectivity for negative numbers
-             * -------------------------------------------*/
-#if defined GT_USERD_API_100
-            for (i=0;i<ne;i++){
-              for(j=0; j<Elem_info[et].con_len; ++j) {
-                /* ---------- uncomment to print out connectivity values ---------- */
-/*              fprintf(stderr," %d",conns[i][j]);  */
-                if (conns[i][j] <= 0 || conns[i][j] > Pbuild[p].nn ) {
-                  fprintf(stderr,"\n****************************\n");
-                  fprintf(stderr,"Connectivity value out of bounds: \n");
-                  fprintf(stderr,"Either less than zero or greater than \n");
-                  fprintf(stderr,"  number of nodes in part!!  \n");
-                  fprintf(stderr,"i = %d   j = %d  conns[i][j] = %d \n",i,j,conns[i][j]);
-                  fprintf(stderr,"****************************\n");
-                }
-              }
-                /* ---------- uncomment to print out connectivity values ---------- */
-/*            fprintf(stderr,"\n"); */
-            }
-#endif
-            /* Last element of the type
-             *-------------------------*/
-            i = ne - 1;
-            if(i > 0) {
-              fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-              if(Element_labels) {
-                fprintf(stderr,"      id: %d\n",elemids[i]);
-              }
-              fprintf(stderr,"      connectivity:");
-              for(j=0; j<Elem_info[et].con_len; ++j) {
-                fprintf(stderr," %d",conns[i][j]);
-              }
-              fprintf(stderr,"\n");
-            }
-          }
-
-          /* Free the allocated memory
-           *--------------------------*/
-          if(NULL != conns) {
-            if(NULL != *conns) {
-              free(*conns);
-              *conns = NULL;
-            }
-            free(conns);
-            conns = NULL;
-          }
-
-          if(Element_labels) {
-            free(elemids);
-          }
-        }
-      }
-
-      /* Get the coords
-       *---------------*/
-      nn = Pbuild[p].nn;
-
-      if(nn > 0) {
-
-        coords = (float **) calloc(3,sizeof(float *));
-        if(coords == (float **) NULL) {
-          fprintf(stderr,"Error: allocating coords array\n");
-          return(Z_ERR);
-        }
-        else {
-          for(i=0; i<3; ++i) {
-            coords[i] = (float *) calloc((nn+1),sizeof(float));
-            if(coords[i] == (float *) NULL) {
-              fprintf(stderr,"Error: allocating coords array\n");
-              return(Z_ERR);
-            }
-          }
-        }
-
-        if(Node_labels) {
-          nodeids = (int *) calloc((nn+1),sizeof(int));
-          if(nodeids == (int *) NULL) {
-            fprintf(stderr,"Error: allocating nodeids array\n");
-            return(Z_ERR);
-          }
-        }
-
-
-        err = USERD_get_part_coords(pn,coords);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting unstructured coords\n");
-          return(Z_ERR);
-        }
-
-        if(Node_labels) {
-          err = USERD_get_part_node_ids(pn,nodeids);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting nodeids\n");
-            return(Z_ERR);
-          }
-        }
-
-        /* Echo "some" info
-         *-----------------*/
-
-        /* First node
-         *-----------*/
-        i = 1;
-        fprintf(stderr,"   Node %d of %d:\n",i,nn);
-        if(Node_labels) {
-          fprintf(stderr,"      id: %d\n",nodeids[i]);
-        }
-        fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                coords[0][i], coords[1][i], coords[2][i]);
-        mm[0] = mm[1] = coords[0][i];
-        mm[2] = mm[3] = coords[1][i];
-        mm[4] = mm[5] = coords[2][i];
-
-
-        /* Last node
-         *----------*/
-        i = nn;
-        if(i > 1) {
-          fprintf(stderr,"   Node %d of %d:\n",i,nn);
-          if(Node_labels) {
-            fprintf(stderr,"      id: %d\n",nodeids[i]);
-          }
-          fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                  coords[0][i], coords[1][i], coords[2][i]);
-        }
-
-        /* Min and max coordinate values
-         *------------------------------*/
-        for(i=2; i<=nn; ++i) {
-          if(coords[0][i] < mm[0]) {
-            mm[0] = coords[0][i];
-          }
-          if(coords[0][i] > mm[1]) {
-            mm[1] = coords[0][i];
-          }
-          if(coords[1][i] < mm[2]) {
-            mm[2] = coords[1][i];
-          }
-          if(coords[1][i] > mm[3]) {
-            mm[3] = coords[1][i];
-          }
-          if(coords[2][i] < mm[4]) {
-            mm[4] = coords[2][i];
-          }
-          if(coords[2][i] > mm[5]) {
-            mm[5] = coords[2][i];
-          }
-        }
-
-        fprintf(stderr,"   Coordinate ranges:\n");
-        fprintf(stderr,"      min x: %g\n",mm[0]);
-        fprintf(stderr,"      max x: %g\n",mm[1]);
-        fprintf(stderr,"      min y: %g\n",mm[2]);
-        fprintf(stderr,"      max y: %g\n",mm[3]);
-        fprintf(stderr,"      min z: %g\n",mm[4]);
-        fprintf(stderr,"      max z: %g\n",mm[5]);
-
-
-        /* Free the allocated memory
-         *--------------------------*/
-        for(i=0; i<3; ++i) {
-          free(coords[i]);
-        }
-        free(coords);
-        if(Node_labels) {
-          free(nodeids);
-        }
-      }
-    }
-
-
-    /*---------------------
-     * For structured parts
-     *---------------------*/
-    else {
-
-      empty_part = FALSE;
-      if(Pbuild[p].ne[0] == 0 &&
-         Pbuild[p].ne[1] == 0 &&
-         Pbuild[p].ne[2] == 0) {
-        empty_part = TRUE;
-      }
-
-      if(!empty_part) {
-
-        /* Get the block coords
-         *---------------------*/
-        for(comp=0; comp<3; ++comp) {
-          if(Pbuild[p].ne[comp] < 1) {
-            bdim[comp] = 1;
-          }
-          else {
-            bdim[comp] = Pbuild[p].ne[comp];
-          }
-        }
-        nn = bdim[0] * bdim[1] * bdim[2];
-
-        bd1 = bdim[0]-1;
-        if(bd1 < 1) {
-          bd1 = 1;
-        }
-        bd2 = bdim[1]-1;
-        if(bd2 < 1) {
-          bd2 = 1;
-        }
-        bd3 = bdim[2]-1;
-        if(bd3 < 1) {
-          bd3 = 1;
-        }
-        ne = bd1 * bd2 * bd3;
-
-        /* Determine cell type
-         *--------------------*/
-        num_dims = 3;
-        for(i=0; i<3; ++i) {
-          if(bdim[i] == 1) {
-            --num_dims;
-          }
-        }
-        if(num_dims == 3) {
-          cell_type = Z_HEX08;
-        }
-        else if(num_dims == 2) {
-          cell_type = Z_QUA04;
-        }
-        else {
-          cell_type = Z_BAR02;
-        }
-
-        coords = (float **) calloc(num_dims,sizeof(float *));
-        if(coords == (float **) NULL) {
-          fprintf(stderr,"Error: allocating coords array\n");
-          return(Z_ERR);
-        }
-        else {
-          for(i=0; i<num_dims; ++i) {
-            coords[i] = (float *) calloc(nn,sizeof(float));
-            if(coords[i] == (float *) NULL) {
-              fprintf(stderr,"Error: allocating coords array\n");
-              return(Z_ERR);
-            }
-          }
-        }
-
-        /* Get the coords
-         *---------------*/
-        for(comp=0; comp<num_dims; ++comp) {
-          err = USERD_get_block_coords_by_component(pn,comp,coords[comp]);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting block coords\n");
-            return(Z_ERR);
-          }
-        }
-
-
-#if (defined GT_USERD_API_200)
-
-        if(Node_labels) {
-          nodeids = (int *) calloc(nn,sizeof(int));
-          if(nodeids == (int *) NULL) {
-            fprintf(stderr,"Error: allocating nodeids array\n");
-            return(Z_ERR);
-          }
-        }
-        /* Get the node ids - if any
-         *--------------------------*/
-        if(Node_labels) {
-          err = USERD_get_part_node_ids(pn,nodeids);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting nodeids\n");
-            return(Z_ERR);
-          }
-        }
-#endif
-
-        /* Echo "some" info
-         *-----------------*/
-
-        /* First node
-         *-----------*/
-        if(nn > 0) {
-          i = 0;
-          fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-#if (defined GT_USERD_API_200)
-
-          if(Node_labels) {
-            fprintf(stderr,"      id: %d\n",nodeids[i]);
-          }
-#endif
-          if(num_dims == 3) {
-            fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                    coords[0][i], coords[1][i], coords[2][i]);
-            mm[0] = mm[1] = coords[0][i];
-            mm[2] = mm[3] = coords[1][i];
-            mm[4] = mm[5] = coords[2][i];
-          }
-          else if(num_dims == 2) {
-            fprintf(stderr,"      x y coordinates: %g %g\n",
-                    coords[0][i], coords[1][i]);
-            mm[0] = mm[1] = coords[0][i];
-            mm[2] = mm[3] = coords[1][i];
-          }
-          else {
-            fprintf(stderr,"      x coordinates: %g\n",
-                    coords[0][i]);
-            mm[0] = mm[1] = coords[0][i];
-          }
-
-
-          /* Last node
-           *----------*/
-          i = nn-1;
-          if(i > 1) {
-            fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-#if (defined GT_USERD_API_200)
-            if(Node_labels) {
-              fprintf(stderr,"      id: %d\n",nodeids[i]);
-            }
-#endif
-            if(num_dims == 3) {
-              fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                      coords[0][i], coords[1][i], coords[2][i]);
-            }
-            else if(num_dims == 2) {
-              fprintf(stderr,"      x y coordinates: %g %g\n",
-                      coords[0][i], coords[1][i]);
-            }
-            else {
-              fprintf(stderr,"      x coordinates: %g\n",
-                      coords[0][i]);
-            }
-          }
-        }
-
-        /* Min and max coordinate values
-         *------------------------------*/
-        for(i=1; i<nn; ++i) {
-          if(coords[0][i] < mm[0]) {
-            mm[0] = coords[0][i];
-          }
-          if(coords[0][i] > mm[1]) {
-            mm[1] = coords[0][i];
-          }
-          if(num_dims > 1) {
-            if(coords[1][i] < mm[2]) {
-              mm[2] = coords[1][i];
-            }
-            if(coords[1][i] > mm[3]) {
-              mm[3] = coords[1][i];
-            }
-          }
-          if(num_dims > 2) {
-            if(coords[2][i] < mm[4]) {
-              mm[4] = coords[2][i];
-            }
-            if(coords[2][i] > mm[5]) {
-              mm[5] = coords[2][i];
-            }
-          }
-        }
-
-        fprintf(stderr,"   Coordinate ranges:\n");
-        fprintf(stderr,"      min x: %g\n",mm[0]);
-        fprintf(stderr,"      max x: %g\n",mm[1]);
-        if(num_dims > 1) {
-          fprintf(stderr,"      min y: %g\n",mm[2]);
-          fprintf(stderr,"      max y: %g\n",mm[3]);
-        }
-        if(num_dims > 2) {
-          fprintf(stderr,"      min z: %g\n",mm[4]);
-          fprintf(stderr,"      max z: %g\n",mm[5]);
-        }
-
-        /* Free the allocated memory - so far
-         *-----------------------------------*/
-        for(i=0; i<num_dims; ++i) {
-          free(coords[i]);
-        }
-        free(coords);
-
-#if (defined GT_USERD_API_200)
-        if(Node_labels) {
-          free(nodeids);
-        }
-#endif
-
-        /* Get the block iblanking - if any
-         *---------------------------------*/
-        if(Pbuild[p].type == Z_IBLANKED) {
-
-          iblanking = (int *) calloc(nn,sizeof(int));
-          if(iblanking == (int *) NULL) {
-            fprintf(stderr,"Error: allocating iblanking array\n");
-            return(Z_ERR);
-          }
-
-          err = USERD_get_block_iblanking(pn,iblanking);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting block iblanking\n");
-            return(Z_ERR);
-          }
-
-          /* Echo "some" info
-           *-----------------*/
-          ib[Z_EXT]    = 0;
-          ib[Z_INT]    = 0;
-          ib[Z_BND]    = 0;
-          ib[Z_INTBND] = 0;
-          ib[Z_SYM]    = 0;
-
-          for(i=0; i<nn; ++i) {
-            ++ib[iblanking[i]];
-          }
-
-          fprintf(stderr,"   Iblanking breakdown:\n");
-          fprintf(stderr,"      Number of Z_EXT:    %d\n",ib[Z_EXT]);
-          fprintf(stderr,"      Number of Z_INT:    %d\n",ib[Z_INT]);
-          fprintf(stderr,"      Number of Z_BND:    %d\n",ib[Z_BND]);
-          fprintf(stderr,"      Number of Z_INTBND: %d\n",ib[Z_INTBND]);
-          fprintf(stderr,"      Number of Z_SYM:    %d\n",ib[Z_SYM]);
-
-          free(iblanking);
-        }
-
-#if (defined GT_USERD_API_200)
-
-        /* Get the ghost flags - if any
-         *-----------------------------*/
-        if(Pbuild[p].ghosts) {
-
-          ghost_flag = (int *) calloc(ne,sizeof(int));
-          if(ghost_flag == (int *) NULL) {
-            fprintf(stderr,"Error: allocating ghost_flag array\n");
-            return(Z_ERR);
-          }
-
-          err = USERD_get_block_ghost_flags(pn,ghost_flag);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting block ghost flags\n");
-            return(Z_ERR);
-          }
-
-          /* Echo "some" info
-           *-----------------*/
-          num_ghosts = 0;
-
-          for(i=0; i<ne; ++i) {
-            if(ghost_flag[i] > 0) {
-              ++num_ghosts;
-            }
-          }
-
-          fprintf(stderr,"   Block Ghost flag breakdown:\n");
-          fprintf(stderr,"      %d ghost cells out of %d total cells\n",
-                  num_ghosts,ne);
-
-          free(ghost_flag);
-        }
-
-        /* Get the element ids - if any
-         *-----------------------------*/
-        if(Element_labels) {
-
-          elemids = (int *) calloc(ne,sizeof(int));
-          if(elemids == (int *) NULL) {
-            fprintf(stderr,"Error: allocating elemids array\n");
-            return(Z_ERR);
-          }
-
-
-          et = cell_type;
-          err = USERD_get_part_element_ids_by_type(pn,et,elemids);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting element ids\n");
-            return(Z_ERR);
-          }
-
-          /* First element of the type
-           *--------------------------*/
-          i = 0;
-          fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-          fprintf(stderr,"      id: %d\n",elemids[i]);
-
-          /* Last element of the type
-           *-------------------------*/
-          i = ne - 1;
-          if(i > 0) {
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            fprintf(stderr,"      id: %d\n",elemids[i]);
-          }
-
-          free(elemids);
-        }
-#endif
-      }
-      else {
-        fprintf(stderr,"   Empty structured part\n");
-      }
-    }
-
-    /* Get border availability
-     *------------------------*/
-    err = USERD_get_border_availability(pn,num_elems);
-    if(err == Z_OK) {
-
-      /* Get border elements - if any
-       *-----------------------------*/
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = num_elems[et];
-        if(ne > 0) {
-
-          conns = (int **) calloc(ne,sizeof(int *));
-          if(conns == (int **) NULL) {
-            fprintf(stderr,"Error: allocating border conns array\n");
-            return(Z_ERR);
-          }
-          else {
-            for(i=0; i<ne; ++i) {
-              conns[i] = (int *) calloc(Elem_info[et].con_len,sizeof(int));
-              if(conns[i] == (int *) NULL) {
-                fprintf(stderr,"Error: allocating border conns array\n");
-                return(Z_ERR);
-              }
-            }
-          }
-
-          parent_type = (short *) calloc(ne,sizeof(short));
-          if(parent_type == (short *) NULL) {
-            fprintf(stderr,"Error: allocating border parent_type array\n");
-            return(Z_ERR);
-          }
-
-          parent_num = (int *) calloc(ne,sizeof(int));
-          if(parent_num == (int *) NULL) {
-            fprintf(stderr,"Error: allocating border parent_num array\n");
-            return(Z_ERR);
-          }
-
-
-          err = USERD_get_border_elements_by_type(pn,
-                                                  et,
-                                                  conns,
-                                                  parent_type,
-                                                  parent_num);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting border elements\n");
-            return(Z_ERR);
-          }
-
-
-          /* Echo "some" info
-           *-----------------*/
-
-          /* First element of the type
-           *--------------------------*/
-          i = 0;
-          fprintf(stderr,"   %s border element %d of %d:\n",
-                  Elem_info[et].name,i+1,ne);
-          fprintf(stderr,"      Parent type: %s\n",
-                  Elem_info[parent_type[i]].name);
-          fprintf(stderr,"      Parent num:  %d\n",parent_num[i]);
-          fprintf(stderr,"      connectivity:");
-          for(j=0; j<Elem_info[et].con_len; ++j) {
-            fprintf(stderr," %d",conns[i][j]);
-          }
-          fprintf(stderr,"\n");
-
-          /* Last element of the type
-           *-------------------------*/
-          i = ne - 1;
-          if(i > 0) {
-            fprintf(stderr,"   %s border element %d of %d:\n",
-                    Elem_info[et].name,i+1,ne);
-            fprintf(stderr,"      Parent type: %s\n",
-                    Elem_info[parent_type[i]].name);
-            fprintf(stderr,"      Parent num:  %d\n",parent_num[i]);
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<Elem_info[et].con_len; ++j) {
-              fprintf(stderr," %d",conns[i][j]);
-            }
-            fprintf(stderr,"\n");
-          }
-
-
-          /* Free the allocated memory
-           *--------------------------*/
-          for(i=0; i<ne; ++i) {
-            free(conns[i]);
-          }
-          free(conns);
-          free(parent_type);
-          free(parent_num);
-        }
-      }
-    }
-  } /* end for p = 0 to Num_parts */
-
-  return(Z_OK);
-}
-
-
-/*----------------
- * gold_var_loader
- *----------------*/
-static int
-gold_var_loader(int var_time_step)
-{
-  int i, j;
-  int err;
-  int v, vn;
-  int var_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_comps;
-  int num_dims;
-  int nsize;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  float constant_val;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-  float *values;
-  float minv,maxv;
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n--------------- var_loader --------------\n");
-
-  for(v=0; v<Num_vars; ++v) {
-    vn = v + 1;
-
-    if(v > 0) {
-      fprintf(stderr,"\n");
-    }
-    if(Varinfo[v].classify == Z_PER_NODE) {
-      fprintf(stderr," Z_PER_NODE Variable %d:\n",vn);
-    }
-    else {
-      fprintf(stderr," Z_PER_ELEM Variable %d:\n",vn);
-    }
-
-
-    if(Num_time_sets > 0) {
-      /* Get the timeset used for the variable
-       *---------------------------------------*/
-      var_timeset = Varinfo[v].timeset;
-
-      /* Get the number of time steps for this timeset
-       *----------------------------------------------*/
-      Num_time_steps = USERD_get_num_of_time_steps(var_timeset);
-      if(Num_time_steps < 1) {
-        fprintf(stderr," Error: Number of time steps returned: %d\n",
-                Num_time_steps);
-        fprintf(stderr," (Must be >0 to be okay)\n");
-        return(Z_ERR);
-      }
-      if(var_time_step > (Num_time_steps - 1)) {
-        var_time_step = Num_time_steps - 1;
-      }
-
-      /* Set the timeset and step - to first step by default, but
-       * can set it at others using -vts command argument
-       *---------------------------------------------------------*/
-      USERD_set_time_set_and_step(var_timeset,var_time_step);
-
-      fprintf(stderr,"   Using timeset:   %d  (step range is %d through %d)\n",
-              var_timeset,0,Num_time_steps-1);
-      fprintf(stderr,"   Using time step: %d\n",var_time_step);
-    }
-
-
-    /* Constants
-     *----------*/
-    if(Varinfo[v].type == Z_CONSTANT) {
-
-      constant_val = USERD_get_constant_val(vn,FALSE);
-      fprintf(stderr,"   Constant (%s):\n",Varinfo[v].description);
-      fprintf(stderr,"     value: %g\n",constant_val);
-
-      if(Varinfo[v].complex) {
-        constant_val = USERD_get_constant_val(vn,TRUE);
-        fprintf(stderr,"   value (imag): %g\n",constant_val);
-      }
-    }
-
-    /* Scalars, Vectors, Tensors
-     *--------------------------*/
-    else {
-
-      /* Get the var description line
-       *-----------------------------*/
-      err = USERD_get_descrip_lines(Z_VARI,vn,FALSE,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-      if(Varinfo[v].complex) {
-        err = USERD_get_descrip_lines(Z_VARI,vn,TRUE,line1,line2);
-        if(err == Z_OK) {
-          fprintf(stderr,"   Desc line (imag): %s\n",line1);
-        }
-        else {
-          fprintf(stderr,"Error: getting var description line (imag)\n");
-          return(Z_ERR);
-        }
-      }
-
-
-      /* Get the values by component
-       *-----------------------------*/
-      if(Varinfo[v].type == Z_SCALAR) {
-        num_comps = 1;
-      }
-      else if(Varinfo[v].type == Z_VECTOR) {
-        num_comps = 3;
-      }
-      else if(Varinfo[v].type == Z_TENSOR) {
-        num_comps = 6;
-      }
-      else if(Varinfo[v].type == Z_TENSOR9) {
-        num_comps = 9;
-      }
-
-
-      /* Per_Node
-       *---------*/
-      if(Varinfo[v].classify == Z_PER_NODE) {
-
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            nsize = Pbuild[p].nn;
-          }
-          else {
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            nsize = bdim[0] * bdim[1] * bdim[2];
-          }
-
-
-          fprintf(stderr,"   For part %d, with %d nodes:\n",pn,nsize);
-
-          if(nsize > 0) {
-            values = (float *) calloc((nsize+1),sizeof(float));
-            if(values == (float *) NULL) {
-              fprintf(stderr,"Error: alocating variable values\n");
-              return(Z_ERR);
-            }
-
-            for(comp=0; comp<num_comps; ++comp) {
-
-              err = USERD_get_var_by_component(vn,
-                                               pn,
-                                               Varinfo[v].type,
-                                               0,
-                                               FALSE,
-                                               comp,
-                                               values);
-              if(err == Z_UNDEF) {
-                fprintf(stderr,"  Variable not defined on this part\n");
-              }
-
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              minv = maxv = values[1];
-              for(i=2; i<=nsize; ++i) {
-                if(values[i] < minv) {
-                  minv = values[i];
-                }
-                if(values[i] > maxv) {
-                  maxv = values[i];
-                }
-              }
-
-              fprintf(stderr,"     For component %d: \n",comp);
-              fprintf(stderr,"       node %10d value:   %g\n",1,values[1]);
-              fprintf(stderr,"       node %10d value:   %g\n",nsize,values[nsize]);
-              fprintf(stderr,"       min value:               %g\n",minv);
-              fprintf(stderr,"       max value:               %g\n",maxv);
-
-              if(Varinfo[v].complex) {
-                err = USERD_get_var_by_component(vn,
-                                                 pn,
-                                                 Varinfo[v].type,
-                                                 0,
-                                                 FALSE,
-                                                 comp,
-                                                 values);
-                if(err == Z_UNDEF) {
-                  fprintf(stderr,"  Variable not defined on this part\n");
-                }
-
-                /* For the component, show 1st node, last node, min, max values
-                 *-------------------------------------------------------------*/
-                minv = maxv = values[1];
-                for(i=2; i<=nsize; ++i) {
-                  if(values[i] < minv) {
-                    minv = values[i];
-                  }
-                  if(values[i] > maxv) {
-                    maxv = values[i];
-                  }
-                }
-
-                fprintf(stderr,"     For component %d (imag): \n",comp);
-                fprintf(stderr,"       node %10d value:   %g\n",1,values[1]);
-                fprintf(stderr,"       node %10d value:   %g\n",nsize,values[nsize]);
-                fprintf(stderr,"       min value:               %g\n",minv);
-                fprintf(stderr,"       max value:               %g\n",maxv);
-              }
-            }
-            free(values);
-          }
-        }
-      }
-
-      /* Per_Elem
-       *---------*/
-      else {
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type != Z_UNSTRUCTURED) {
-
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-
-            bd1 = bdim[0]-1;
-            if(bd1 < 1) {
-              bd1 = 1;
-            }
-            bd2 = bdim[1]-1;
-            if(bd2 < 1) {
-              bd2 = 1;
-            }
-            bd3 = bdim[2]-1;
-            if(bd3 < 1) {
-              bd3 = 1;
-            }
-            nsize = bd1 * bd2 * bd3;
-
-
-            /* Determine cell type
-             *--------------------*/
-            num_dims = 3;
-            for(i=0; i<3; ++i) {
-              if(bdim[i] == 1) {
-                --num_dims;
-              }
-            }
-            if(num_dims == 3) {
-              cell_type = Z_HEX08;
-            }
-            else if(num_dims == 2) {
-              cell_type = Z_QUA04;
-            }
-            else {
-              cell_type = Z_BAR02;
-            }
-          }
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            e1 = 0;
-            e2 = Z_MAXTYPE-1;
-          }
-          else {
-            e1 = e2 = cell_type;
-          }
-
-          for(et=e1; et<=e2; ++et) {
-
-            if(Pbuild[p].type == Z_UNSTRUCTURED) {
-              nsize = Pbuild[p].ne[et];
-            }
-
-            if(nsize > 0) {
-
-              fprintf(stderr,"   For part %d, with %d elems of type %s:\n",
-                      pn,nsize,Elem_info[et].name);
-
-
-              values = (float *) calloc((nsize+1),sizeof(float));
-              if(values == (float *) NULL) {
-                fprintf(stderr,"Error: alocating variable values\n");
-                return(Z_ERR);
-              }
-
-              for(comp=0; comp<num_comps; ++comp) {
-
-                err = USERD_get_var_by_component(vn,
-                                                 pn,
-                                                 Varinfo[v].type,
-                                                 et,
-                                                 FALSE,
-                                                 comp,
-                                                 values);
-                if(err == Z_UNDEF) {
-                  fprintf(stderr,"  Variable not defined on this part\n");
-                }
-
-                /* For the component, show 1st elem, last elem, min, max values
-                 *-------------------------------------------------------------*/
-                minv = maxv = values[1];
-                for(i=2; i<=nsize; ++i) {
-                  if(values[i] < minv) {
-                    minv = values[i];
-                  }
-                  if(values[i] > maxv) {
-                    maxv = values[i];
-                  }
-                }
-
-                fprintf(stderr,"     For component %d: \n",comp);
-                fprintf(stderr,"       elem %10d value:  %g\n",1,values[1]);
-                fprintf(stderr,"       elem %10d value:  %g\n",nsize,values[nsize]);
-                fprintf(stderr,"       min value:              %g\n",minv);
-                fprintf(stderr,"       max value:              %g\n",maxv);
-
-                if(Varinfo[v].complex) {
-                  err = USERD_get_var_by_component(vn,
-                                                   pn,
-                                                   Varinfo[v].type,
-                                                   et,
-                                                   FALSE,
-                                                   comp,
-                                                   values);
-                  if(err == Z_UNDEF) {
-                    fprintf(stderr,"  Variable not defined on this part\n");
-                  }
-
-                  /* For the component, show 1st elem, last elem, min, max values
-                   *-------------------------------------------------------------*/
-                  minv = maxv = values[1];
-                  for(i=2; i<=nsize; ++i) {
-                    if(values[i] < minv) {
-                      minv = values[i];
-                    }
-                    if(values[i] > maxv) {
-                      maxv = values[i];
-                    }
-                  }
-
-                  fprintf(stderr,"     For component %d (imag): \n",comp);
-                  fprintf(stderr,"       elem %10d value:  %g\n",1,values[1]);
-                  fprintf(stderr,"       elem %10d value:  %g\n",nsize,values[nsize]);
-                  fprintf(stderr,"       min value:              %g\n",minv);
-                  fprintf(stderr,"       max value:              %g\n",maxv);
-
-                }
-              }
-              free(values);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-#else
-
-/*-------------
- * part_builder
- *-------------*/
-static int
-part_builder(int geom_time_step)
-{
-  int i, j;
-  int err;
-  int p, pn;
-  int et, ne;
-  int *elemids[Z_MAXTYPE];
-  int **conns[Z_MAXTYPE];
-  int nn;
-  int comp;
-  int bdim[3];
-  int ib[5];
-  int num_dims;
-  int cell_type;
-  float mm[6];
-  float **coords;
-  int *nodeids;
-  int *iblanking;
-  CRD *crds;
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n------------- part_builder --------------\n");
-
-
-  if(Num_time_steps > 1) {
-    if(geom_time_step > (Num_time_steps - 1)) {
-      geom_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the time step - to first step by default, but
-     * can set it at others using -gts command argument
-     *---------------------------------------------------*/
-    USERD_set_time_step(geom_time_step);
-
-    fprintf(stderr," Using time step: %d  (where range is %d through %d\n",
-            geom_time_step,0,Num_time_steps-1);
-  }
-
-
-  /* Get the global coords
-   *----------------------*/
-  nn = USERD_get_number_of_global_nodes();
-
-  if(nn > 0) {
-
-    crds = (CRD *) calloc(nn,sizeof(CRD));
-    if(crds == (CRD *) NULL) {
-      fprintf(stderr,"Error: allocating crds array\n");
-      return(Z_ERR);
-    }
-
-    if(Node_labels) {
-      nodeids = (int *) calloc(nn,sizeof(int));
-      if(nodeids == (int *) NULL) {
-        fprintf(stderr,"Error: allocating nodeids array\n");
-        return(Z_ERR);
-      }
-    }
-
-
-    err = USERD_get_global_coords(crds);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Error: getting unstructured coords\n");
-      return(Z_ERR);
-    }
-
-    if(Node_labels) {
-      err = USERD_get_global_node_ids(nodeids);
-      if(err == Z_ERR) {
-        fprintf(stderr,"Error: getting nodeids\n");
-        return(Z_ERR);
-      }
-    }
-
-    /* Echo "some" info
-     *-----------------*/
-
-    /* First node
-     *-----------*/
-    i = 0;
-    fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-    if(Node_labels) {
-      fprintf(stderr,"      id: %d\n",nodeids[i]);
-    }
-    fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-            crds[i].xyz[0], crds[i].xyz[1], crds[i].xyz[2]);
-    mm[0] = mm[1] = crds[i].xyz[0];
-    mm[2] = mm[3] = crds[i].xyz[1];
-    mm[4] = mm[5] = crds[i].xyz[2];
-
-
-    /* Last node
-     *----------*/
-    i = nn-1;
-    if(i > 0) {
-      fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-      if(Node_labels) {
-        fprintf(stderr,"      id: %d\n",nodeids[i]);
-      }
-      fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-              crds[i].xyz[0], crds[i].xyz[1], crds[i].xyz[2]);
-    }
-
-    /* Min and max coordinate values
-     *------------------------------*/
-    for(i=1; i<nn; ++i) {
-      if(crds[i].xyz[0] < mm[0]) {
-        mm[0] = crds[i].xyz[0];
-      }
-      if(crds[i].xyz[0] > mm[1]) {
-        mm[1] = crds[i].xyz[0];
-      }
-      if(crds[i].xyz[1] < mm[2]) {
-        mm[2] = crds[i].xyz[1];
-      }
-      if(crds[i].xyz[1] > mm[3]) {
-        mm[3] = crds[i].xyz[1];
-      }
-      if(crds[i].xyz[2] < mm[4]) {
-        mm[4] = crds[i].xyz[2];
-      }
-      if(crds[i].xyz[2] > mm[5]) {
-        mm[5] = crds[i].xyz[2];
-      }
-    }
-
-    fprintf(stderr,"   Global coordinate ranges:\n");
-    fprintf(stderr,"      min x: %g\n",mm[0]);
-    fprintf(stderr,"      max x: %g\n",mm[1]);
-    fprintf(stderr,"      min y: %g\n",mm[2]);
-    fprintf(stderr,"      max y: %g\n",mm[3]);
-    fprintf(stderr,"      min z: %g\n",mm[4]);
-    fprintf(stderr,"      max z: %g\n",mm[5]);
-
-
-    /* Free the allocated memory
-     *--------------------------*/
-    free(crds);
-    if(Node_labels) {
-      free(nodeids);
-    }
-  }
-
-
-
-  for(p=0; p<Num_parts; ++p) {
-    pn = p+1;
-
-    fprintf(stderr,"\n");
-    fprintf(stderr," Part %d:\n",pn);
-
-    /*-----------------------
-     * For unstructured parts
-     *-----------------------*/
-    if(Pbuild[p].type == Z_UNSTRUCTURED) {
-
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-
-          conns[et] = (int **) calloc(ne,sizeof(int *));
-          if(conns[et] == (int **) NULL) {
-            fprintf(stderr,"Error: allocating conns array\n");
-            return(Z_ERR);
-          }
-          else {
-            for(i=0; i<ne; ++i) {
-              conns[et][i] = (int *) calloc(Elem_info[et].con_len,sizeof(int));
-              if(conns[et][i] == (int *) NULL) {
-                fprintf(stderr,"Error: allocating conns array\n");
-                return(Z_ERR);
-              }
-            }
-          }
-
-          if(Element_labels) {
-            elemids[et] = (int *) calloc(ne,sizeof(int));
-            if(elemids[et] == (int *) NULL) {
-              fprintf(stderr,"Error: allocating elemids array\n");
-              return(Z_ERR);
-            }
-          }
-        }
-      }
-
-      /* Get the elements
-       *-----------------*/
-      err = USERD_get_element_connectivities_for_part(pn,conns);
-      if(err == Z_ERR) {
-        fprintf(stderr,"Error: getting element connectivities\n");
-        return(Z_ERR);
-      }
-
-      /* Get the element ids - if any
-       *-----------------------------*/
-      if(Element_labels) {
-        err = USERD_get_element_ids_for_part(pn,elemids);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting element ids\n");
-          return(Z_ERR);
-        }
-      }
-
-      /* Echo "some" info
-       *-----------------*/
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-
-          /* First element of the type
-           *--------------------------*/
-          i = 0;
-          fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-          if(Element_labels) {
-            fprintf(stderr,"      id: %d\n",elemids[et][i]);
-          }
-          fprintf(stderr,"      connectivity:");
-          for(j=0; j<Elem_info[et].con_len; ++j) {
-            fprintf(stderr," %d",conns[et][i][j]);
-          }
-          fprintf(stderr,"\n");
-
-          /* Last element of the type
-           *-------------------------*/
-          i = ne - 1;
-          if(i > 0) {
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            if(Element_labels) {
-              fprintf(stderr,"      id: %d\n",elemids[et][i]);
-            }
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<Elem_info[et].con_len; ++j) {
-              fprintf(stderr," %d",conns[et][i][j]);
-            }
-            fprintf(stderr,"\n");
-          }
-        }
-      }
-
-      /* Free the allocated memory
-       *--------------------------*/
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-          for(i=0; i<ne; ++i) {
-            free(conns[et][i]);
-          }
-          free(conns[et]);
-
-          if(Element_labels) {
-            free(elemids[et]);
-          }
-        }
-      }
-    }
-
-
-    /*---------------------
-     * For structured parts
-     *---------------------*/
-    else {
-
-      /* Get the block coords
-       *---------------------*/
-      for(comp=0; comp<3; ++comp) {
-        if(Pbuild[p].ne[comp] < 1) {
-          bdim[comp] = 1;
-        }
-        else {
-          bdim[comp] = Pbuild[p].ne[comp];
-        }
-      }
-      nn = bdim[0] * bdim[1] * bdim[2];
-
-      bd1 = bdim[0]-1;
-      if(bd1 < 1) {
-        bd1 = 1;
-      }
-      bd2 = bdim[1]-1;
-      if(bd2 < 1) {
-        bd2 = 1;
-      }
-      bd3 = bdim[2]-1;
-      if(bd3 < 1) {
-        bd3 = 1;
-      }
-      ne = bd1 * bd2 * bd3;
-
-
-      /* Determine cell type
-       *--------------------*/
-      num_dims = 3;
-      for(i=0; i<3; ++i) {
-        if(bdim[i] == 1) {
-          --num_dims;
-        }
-      }
-      if(num_dims == 3) {
-        cell_type = Z_HEX08;
-      }
-      else if(num_dims == 2) {
-        cell_type = Z_QUA04;
-      }
-      else {
-        cell_type = Z_BAR02;
-      }
-
-      coords = (float **) calloc(num_dims,sizeof(float *));
-      if(coords == (float **) NULL) {
-        fprintf(stderr,"Error: allocating coords array\n");
-        return(Z_ERR);
-      }
-      else {
-        for(i=0; i<num_dims; ++i) {
-          coords[i] = (float *) calloc(nn,sizeof(float));
-          if(coords[i] == (float *) NULL) {
-            fprintf(stderr,"Error: allocating coords array\n");
-            return(Z_ERR);
-          }
-        }
-      }
-
-      /* Get the coords
-       *---------------*/
-      for(comp=0; comp<num_dims; ++comp) {
-        err = USERD_get_block_coords_by_component(pn,comp,coords[comp]);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting block coords\n");
-          return(Z_ERR);
-        }
-      }
-
-
-      /* Echo "some" info
-       *-----------------*/
-
-      /* First node
-       *-----------*/
-      if(nn > 0) {
-        i = 0;
-        fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-        if(num_dims == 3) {
-          fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                  coords[0][i], coords[1][i], coords[2][i]);
-          mm[0] = mm[1] = coords[0][i];
-          mm[2] = mm[3] = coords[1][i];
-          mm[4] = mm[5] = coords[2][i];
-        }
-        else if(num_dims == 2) {
-          fprintf(stderr,"      x y coordinates: %g %g\n",
-                  coords[0][i], coords[1][i]);
-          mm[0] = mm[1] = coords[0][i];
-          mm[2] = mm[3] = coords[1][i];
-        }
-        else {
-          fprintf(stderr,"      x coordinates: %g\n",
-                  coords[0][i]);
-          mm[0] = mm[1] = coords[0][i];
-        }
-
-
-        /* Last node
-         *----------*/
-        i = nn-1;
-        if(i > 1) {
-          fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-          if(num_dims == 3) {
-            fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                    coords[0][i], coords[1][i], coords[2][i]);
-          }
-          else if(num_dims == 2) {
-            fprintf(stderr,"      x y coordinates: %g %g\n",
-                    coords[0][i], coords[1][i]);
-          }
-          else {
-            fprintf(stderr,"      x coordinates: %g\n",
-                    coords[0][i]);
-          }
-        }
-      }
-
-      /* Min and max coordinate values
-       *------------------------------*/
-      for(i=2; i<=nn; ++i) {
-        if(coords[0][i] < mm[0]) {
-          mm[0] = coords[0][i];
-        }
-        if(coords[0][i] > mm[1]) {
-          mm[1] = coords[0][i];
-        }
-        if(num_dims > 1) {
-          if(coords[1][i] < mm[2]) {
-            mm[2] = coords[1][i];
-          }
-          if(coords[1][i] > mm[3]) {
-            mm[3] = coords[1][i];
-          }
-        }
-        if(num_dims > 2) {
-          if(coords[2][i] < mm[4]) {
-            mm[4] = coords[2][i];
-          }
-          if(coords[2][i] > mm[5]) {
-            mm[5] = coords[2][i];
-          }
-        }
-      }
-
-      fprintf(stderr,"   Coordinate ranges:\n");
-      fprintf(stderr,"      min x: %g\n",mm[0]);
-      fprintf(stderr,"      max x: %g\n",mm[1]);
-      if(num_dims > 1) {
-        fprintf(stderr,"      min y: %g\n",mm[2]);
-        fprintf(stderr,"      max y: %g\n",mm[3]);
-      }
-      if(num_dims > 2) {
-        fprintf(stderr,"      min z: %g\n",mm[4]);
-        fprintf(stderr,"      max z: %g\n",mm[5]);
-      }
-
-      /* Free the allocated memory - so far
-       *-----------------------------------*/
-      for(i=0; i<num_dims; ++i) {
-        free(coords[i]);
-      }
-      free(coords);
-
-
-      /* Get the block iblanking - if any
-       *---------------------------------*/
-      if(Pbuild[p].type == Z_IBLANKED) {
-
-        iblanking = (int *) calloc(nn,sizeof(int));
-        if(iblanking == (int *) NULL) {
-          fprintf(stderr,"Error: allocating iblanking array\n");
-          return(Z_ERR);
-        }
-
-        err = USERD_get_block_iblanking(pn,iblanking);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting block iblanking\n");
-          return(Z_ERR);
-        }
-
-        /* Echo "some" info
-         *-----------------*/
-        ib[Z_EXT]    = 0;
-        ib[Z_INT]    = 0;
-        ib[Z_BND]    = 0;
-        ib[Z_INTBND] = 0;
-        ib[Z_SYM]    = 0;
-
-        for(i=0; i<nn; ++i) {
-          ++ib[iblanking[i]];
-        }
-
-        fprintf(stderr,"   Iblanking breakdown:\n");
-        fprintf(stderr,"      Number of Z_EXT:    %d\n",ib[Z_EXT]);
-        fprintf(stderr,"      Number of Z_INT:    %d\n",ib[Z_INT]);
-        fprintf(stderr,"      Number of Z_BND:    %d\n",ib[Z_BND]);
-        fprintf(stderr,"      Number of Z_INTBND: %d\n",ib[Z_INTBND]);
-        fprintf(stderr,"      Number of Z_SYM:    %d\n",ib[Z_SYM]);
-
-        free(iblanking);
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-
-/*-----------
- * var_loader
- *-----------*/
-static int
-var_loader(int var_time_step)
-{
-  int i, j, k;
-  int err;
-  int v, vn;
-  int var_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_comps;
-  int num_dims;
-  int nsize;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  float constant_val;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-  float *values;
-  float *tvalues;
-  float minv[3],maxv[3];
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n--------------- var_loader --------------\n");
-
-  if(Num_time_steps > 1 && v == 0) {
-    if(var_time_step > (Num_time_steps - 1)) {
-      var_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the time step - to first step by default, but
-     * can set it at others using -vts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_step(var_time_step);
-
-    fprintf(stderr," Using time step: %d  (where range is %d through %d)\n\n",
-            var_time_step,0,Num_time_steps-1);
-  }
-
-  for(v=0; v<Num_vars; ++v) {
-    vn = v + 1;
-
-    if(v > 0) {
-      fprintf(stderr,"\n");
-    }
-    if(Varinfo[v].classify == Z_PER_NODE) {
-      fprintf(stderr," Z_PER_NODE Variable %d:\n",vn);
-    }
-    else {
-      fprintf(stderr," Z_PER_ELEM Variable %d:\n",vn);
-    }
-
-    /* Constants
-     *----------*/
-    if(Varinfo[v].type == Z_CONSTANT) {
-
-      constant_val = USERD_get_constant_value(vn);
-      fprintf(stderr,"   Constant (%s):\n",Varinfo[v].description);
-      fprintf(stderr,"     value: %g\n",constant_val);
-    }
-
-
-    /* Scalars, Vectors, Tensors
-     *--------------------------*/
-    else {
-
-      /* Get the var description line
-       *-----------------------------*/
-      err = USERD_get_description_lines(Z_VARI,vn,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-
-      /* Get the values by component
-       *-----------------------------*/
-      if(Varinfo[v].type == Z_SCALAR) {
-        num_comps = 1;
-      }
-      else if(Varinfo[v].type == Z_VECTOR) {
-        num_comps = 3;
-      }
-      else if(Varinfo[v].type == Z_TENSOR) {
-        num_comps = 6;
-      }
-      else if(Varinfo[v].type == Z_TENSOR9) {
-        num_comps = 9;
-      }
-
-
-      /* Per_Node
-       *---------*/
-      if(Varinfo[v].classify == Z_PER_NODE) {
-
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            nsize = Pbuild[p].nn;
-          }
-          else {
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            nsize = bdim[0] * bdim[1] * bdim[2];
-          }
-
-
-          fprintf(stderr,"   For part %d, with %d nodes:\n",pn,nsize);
-
-          if(nsize > 0) {
-            values = (float *) calloc((num_comps * nsize),sizeof(float));
-            if(values == (float *) NULL) {
-              fprintf(stderr,"Error: alocating variable values\n");
-              return(Z_ERR);
-            }
-
-            if(num_comps == 1) {
-
-              if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                err = USERD_get_scalar_values(vn,
-                                              pn,
-                                              0,
-                                              values);
-                if(err == Z_ERR) {
-                  fprintf(stderr,"Error: getting scalar values\n");
-                  return(Z_ERR);
-                }
-              }
-              else {
-                err = USERD_get_block_scalar_values(pn,
-                                                    vn,
-                                                    values);
-                if(err == Z_ERR) {
-                  fprintf(stderr,"Error: getting block scalar values\n");
-                  return(Z_ERR);
-                }
-              }
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              minv[0] = maxv[0] = values[0];
-              for(i=0; i<nsize; ++i) {
-                if(values[i] < minv[0]) {
-                  minv[0] = values[i];
-                }
-                if(values[i] > maxv[0]) {
-                  maxv[0] = values[i];
-                }
-              }
-
-              fprintf(stderr,"       node %10d value: %g\n",1,values[0]);
-              fprintf(stderr,"       node %10d value: %g\n",nsize,values[nsize-1]);
-              fprintf(stderr,"       min value:             %g\n",minv[0]);
-              fprintf(stderr,"       max value:             %g\n",maxv[0]);
-
-            }
-
-            else if(num_comps == 3) {
-
-              if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                err = USERD_get_vector_values(vn,
-                                              pn,
-                                              0,
-                                              values);
-                if(err == Z_ERR) {
-                  fprintf(stderr,"Error: getting vector values\n");
-                  return(Z_ERR);
-                }
-              }
-              else {
-
-                tvalues = (float *) calloc(nsize,sizeof(float));
-                if(tvalues == (float *) NULL) {
-                  fprintf(stderr,"Error: alocating tvalues array\n");
-                  return(Z_ERR);
-                }
-
-                for(i=0; i<3; ++i) {
-                  err = USERD_get_block_vector_values_by_component(pn,
-                                                                   vn,
-                                                                   i,
-                                                                   tvalues);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting vector values\n");
-                    return(Z_ERR);
-                  }
-                  for(j=0; j<nsize; ++j) {
-                    k = j*3 + i;
-                    values[k] = tvalues[j];
-                  }
-                }
-                free(tvalues);
-              }
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              minv[0] = maxv[0] = values[0];
-              minv[1] = maxv[1] = values[1];
-              minv[2] = maxv[2] = values[2];
-              for(i=0; i<nsize; ++i) {
-                j = i*3;
-                for(k=0; k<3; ++k) {
-                  if(values[j+k] < minv[k]) {
-                    minv[k] = values[j+k];
-                  }
-                  if(values[j+k] > maxv[k]) {
-                    maxv[k] = values[j+k];
-                  }
-                }
-              }
-
-              fprintf(stderr,"       node %10d values: %g %g %g\n",1,
-                      values[0],values[1],values[2]);
-              fprintf(stderr,"       node %10d values: %g %g %g\n",nsize,
-                      values[3*nsize-3],values[3*nsize-2],values[3*nsize-1]);
-              fprintf(stderr,"       min values:             %g %g %g\n",
-                      minv[0],minv[1],minv[2]);
-              fprintf(stderr,"       max values:             %g %g %g\n",
-                      maxv[0],maxv[1],maxv[2]);
-
-            }
-            free(values);
-          }
-        }
-      }
-
-      /* Per_Elem
-       *---------*/
-      else {
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type != Z_UNSTRUCTURED) {
-
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            bd1 = bdim[0]-1;
-            if(bd1 < 1) {
-              bd1 = 1;
-            }
-            bd2 = bdim[1]-1;
-            if(bd2 < 1) {
-              bd2 = 1;
-            }
-            bd3 = bdim[2]-1;
-            if(bd3 < 1) {
-              bd3 = 1;
-            }
-            nsize = bd1 * bd2 * bd3;
-
-
-            /* Determine cell type
-             *--------------------*/
-            num_dims = 3;
-            for(i=0; i<3; ++i) {
-              if(bdim[i] == 1) {
-                --num_dims;
-              }
-            }
-            if(num_dims == 3) {
-              cell_type = Z_HEX08;
-            }
-            else if(num_dims == 2) {
-              cell_type = Z_QUA04;
-            }
-            else {
-              cell_type = Z_BAR02;
-            }
-          }
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            e1 = 0;
-            e2 = Z_MAXTYPE-1;
-          }
-          else {
-            e1 = e2 = cell_type;
-          }
-
-          for(et=e1; et<=e2; ++et) {
-
-            if(Pbuild[p].type == Z_UNSTRUCTURED) {
-              nsize = Pbuild[p].ne[et];
-            }
-
-            if(nsize > 0) {
-
-              fprintf(stderr,"   For part %d, with %d elems of type %s:\n",
-                      pn,nsize,Elem_info[et].name);
-
-              values = (float *) calloc((num_comps * nsize),sizeof(float));
-              if(values == (float *) NULL) {
-                fprintf(stderr,"Error: alocating variable values\n");
-                return(Z_ERR);
-              }
-
-              if(num_comps == 1) {
-                if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                  err = USERD_get_scalar_values(vn,
-                                                pn,
-                                                et,
-                                                values);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting scalar values\n");
-                    return(Z_ERR);
-                  }
-                }
-                else {
-                  err = USERD_get_block_scalar_values(pn,
-                                                      vn,
-                                                      values);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting block scalar values\n");
-                    return(Z_ERR);
-                  }
-                }
-
-                /* For the component, show 1st node, last node, min, max values
-                 *-------------------------------------------------------------*/
-                minv[0] = maxv[0] = values[0];
-                for(i=1; i<nsize; ++i) {
-                  if(values[i] < minv[0]) {
-                    minv[0] = values[i];
-                  }
-                  if(values[i] > maxv[0]) {
-                    maxv[0] = values[i];
-                  }
-                }
-
-                fprintf(stderr,"       elem %10d value: %g\n",1,values[0]);
-                fprintf(stderr,"       elem %10d value: %g\n",nsize,values[nsize-1]);
-                fprintf(stderr,"       min value:             %g\n",minv[0]);
-                fprintf(stderr,"       max value:             %g\n",maxv[0]);
-
-              }
-
-              else if(num_comps == 3) {
-
-                if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                  err = USERD_get_vector_values(vn,
-                                                pn,
-                                                et,
-                                                values);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting vector values\n");
-                    return(Z_ERR);
-                  }
-                }
-                else {
-
-                  tvalues = (float *) calloc(nsize,sizeof(float));
-                  if(tvalues == (float *) NULL) {
-                    fprintf(stderr,"Error: alocating tvalues array\n");
-                    return(Z_ERR);
-                  }
-
-                  for(i=0; i<3; ++i) {
-                    err = USERD_get_block_vector_values_by_component(pn,
-                                                                     vn,
-                                                                     i,
-                                                                     tvalues);
-                    if(err == Z_ERR) {
-                      fprintf(stderr,"Error: getting vector values\n");
-                      return(Z_ERR);
-                    }
-                    for(j=0; j<nsize; ++j) {
-                      k = j*3 + i;
-                      values[k] = tvalues[j];
-                    }
-                  }
-                  free(tvalues);
-                }
-
-                /* For the component, show 1st node, last node, min, max values
-                 *-------------------------------------------------------------*/
-                minv[0] = maxv[0] = values[0];
-                minv[1] = maxv[1] = values[1];
-                minv[2] = maxv[2] = values[2];
-                for(i=1; i<=nsize; ++i) {
-                  j = i*3;
-                  for(k=0; k<3; ++k) {
-                    if(values[j+k] < minv[k]) {
-                      minv[k] = values[j+k];
-                    }
-                    if(values[j+k] > maxv[k]) {
-                      maxv[k] = values[j+k];
-                    }
-                  }
-                }
-
-                fprintf(stderr,"       elem %10d values: %g %g %g\n",1,
-                        values[0],values[1],values[2]);
-                fprintf(stderr,"       elem %10d values: %g %g %g\n",nsize,
-                        values[3*nsize-3],values[3*nsize-2],values[3*nsize-1]);
-                fprintf(stderr,"       min values:             %g %g %g\n",
-                        minv[0],minv[1],minv[2]);
-                fprintf(stderr,"       max values:             %g %g %g\n",
-                        maxv[0],maxv[1],maxv[2]);
-
-              }
-              free(values);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-#endif
-
-
-#if (defined GT_USERD_API_202)
-
-
-/*---------------
- * materials_info
- *---------------*/
-static int
-materials_info( void )
-{
-  int i,j;
-  int err;
-  int   *num_materials;
-  int   *msids;
-  char **msname;
-  int   *mids;
-  char **mdesc;
-
-
-  fprintf(stderr,"\n------------ materials_info --------------\n");
-
-  /* Get the number of variables
-   *----------------------------*/
-  Num_materials_sets = USERD_get_number_of_material_sets();
-  if(Num_materials_sets < 0) {
-    fprintf(stderr,"Error: getting the number of material sets\n");
-    return(Z_ERR);
-  }
-  else {
-    if(Num_materials_sets == 0) {
-      fprintf(stderr," No materials sets in the model\n");
-      return (Z_OK);
-    }
-    else if(Num_materials_sets > 1) {
-      fprintf(stderr," Number of materials sets: %d\n",Num_materials_sets);
-      fprintf(stderr," Currently, EnSight 7.6 only supports 1 material set\n");
-      return(Z_ERR);
-    }
-    else {
-      fprintf(stderr," Number of materials sets: %d\n",Num_materials_sets);
-    }
-  }
-
-  /* Get the material set index list and names
-   *------------------------------------------*/
-  msids = (int *) calloc(Num_materials_sets,sizeof(int));
-  if(msids == (int *)NULL) {
-    fprintf(stderr," Problems allocating for material set ids\n");
-    return(Z_ERR);
-  }
-
-  num_materials = (int *) calloc(Num_materials_sets,sizeof(int));
-  if(num_materials == (int *)NULL) {
-    fprintf(stderr," Problems allocating for material set num materials\n");
-    return(Z_ERR);
-  }
-
-  msname = (char **) calloc(Num_materials_sets,sizeof(char *));
-  if(msname == (char **)NULL) {
-    fprintf(stderr," Problems allocating for material set names\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_materials_sets; ++i) {
-      msname[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(msname[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for material set names\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  err = USERD_get_matf_set_info(msids,msname);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: getting material set info\n");
-  }
-  else {
-    for(i=0; i<Num_materials_sets; ++i) {
-
-      /* Echo some feedback
-       *-------------------*/
-      fprintf(stderr," For Material set %d:\n",i+1);
-
-      fprintf(stderr,"   id:   %d\n",msids[i]);
-      fprintf(stderr,"   name: %s\n",msname[i]);
-
-      num_materials[i] = USERD_get_number_of_materials(i);
-      if(num_materials[i] < 0) {
-        fprintf(stderr,"Error: getting the number of materials in set %d\n",i);
-        return (Z_ERR);
-      }
-      else if(num_materials[i] == 0) {
-        fprintf(stderr," No materials in Materials set %d\n",i);
-        return (Z_OK);
-      }
-      else {
-        mids = (int *) calloc(num_materials[i],sizeof(int));
-        if(mids == (int *)NULL) {
-          fprintf(stderr," Problems allocating for material ids\n");
-          return(Z_ERR);
-        }
-
-        mdesc = (char **) calloc(num_materials[i],sizeof(char *));
-        if(mdesc == (char **)NULL) {
-          fprintf(stderr," Problems allocating for material desc\n");
-          return(Z_ERR);
-        }
-        else {
-          for(j=0; j<num_materials[i]; ++j) {
-            mdesc[j] = (char *) calloc(Z_BUFL,sizeof(char));
-            if(mdesc[j] == (char *)NULL) {
-              fprintf(stderr," Problems allocating for material desc\n");
-              return(Z_ERR);
-            }
-          }
-        }
-
-        err = USERD_get_matf_var_info(i,mids,mdesc);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting material info\n");
-        }
-        else {
-
-          for(j=0; j<num_materials[i]; ++j) {
-            /* Echo some feedback
-             *-------------------*/
-            fprintf(stderr,"   For Material %d:\n",j+1);
-
-            fprintf(stderr,"     index:       %d\n",mids[j]);
-            fprintf(stderr,"     description: %s\n",mdesc[j]);
-          }
-        }
-      }
-    }
-  }
-
-  /* Free the allocated memory
-   *--------------------------*/
-  for(i=0; i<Num_materials_sets; ++i) {
-    free(msname[i]);
-
-    for(j=0; j<num_materials[i]; ++j) {
-      free(mdesc[j]);
-    }
-  }
-  free(msname);
-  free(msids);
-  free(num_materials);
-  free(mdesc);
-  free(mids);
-
-  return(Z_OK);
-}
-
-
-/*----------------------
- * gold_materials_loader
- *----------------------*/
-static int
-gold_materials_loader(int geom_time_step)
-{
-  int i, j, k, ms, nn;
-  int err, err1, err2;
-  int geom_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_dims;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  int bd1,bd2,bd3;
-  int *ivals;
-  float *fvals;
-  int do_num;
-  int mixed_present;
-  int matf_size, matfv_size;
-
-
-  fprintf(stderr,"\n-------------- materials_loader --------------\n");
-
-  if(Num_time_sets > 0) {
-    /* Get the timeset used for the geometry
-     *--------------------------------------*/
-    geom_timeset = USERD_get_geom_timeset_number();
-
-    /* Get the number of time steps for this timeset
-     *----------------------------------------------*/
-    Num_time_steps = USERD_get_num_of_time_steps(geom_timeset);
-    if(Num_time_steps < 1) {
-      fprintf(stderr," Error: Num time steps returned: %d\n",Num_time_steps);
-      fprintf(stderr," (Must be >0 to be okay)\n");
-      return(Z_ERR);
-    }
-    if(geom_time_step > (Num_time_steps - 1)) {
-      geom_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the timeset and step - to first step by default, but
-     * can set it at others using -gts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_set_and_step(geom_timeset,geom_time_step);
-
-    fprintf(stderr," Using timeset:   %d  (step range is %d through %d)\n",
-            geom_timeset,0,Num_time_steps-1);
-    fprintf(stderr," Using time step: %d\n",geom_time_step);
-  }
-
-  for(ms=0; ms<Num_materials_sets; ++ms) {
-    fprintf(stderr,"\n");
-    fprintf(stderr," Materials Set %d:\n",ms+1);
-
-    for(p=0; p<Num_parts; ++p) {
-      pn = p+1;
-
-      fprintf(stderr,"\n");
-      fprintf(stderr,"   Part %d:\n",pn);
-
-      /*-----------------------
-       * For unstructured parts
-       *-----------------------*/
-      if(Pbuild[p].type == Z_UNSTRUCTURED) {
-
-        e1 = 0;
-        e2 = Z_MAXTYPE;
-      }
-      else {
-        for(comp=0; comp<3; ++comp) {
-          if(Pbuild[p].ne[comp] < 1) {
-            bdim[comp] = 1;
-          }
-          else {
-            bdim[comp] = Pbuild[p].ne[comp];
-          }
-        }
-        nn = bdim[0] * bdim[1] * bdim[2];
-
-        bd1 = bdim[0]-1;
-        if(bd1 < 1) {
-          bd1 = 1;
-        }
-        bd2 = bdim[1]-1;
-        if(bd2 < 1) {
-          bd2 = 1;
-        }
-        bd3 = bdim[2]-1;
-        if(bd3 < 1) {
-          bd3 = 1;
-        }
-        ne = bd1 * bd2 * bd3;
-
-        /* Determine cell type
-         *--------------------*/
-        num_dims = 3;
-        for(i=0; i<3; ++i) {
-          if(bdim[i] == 1) {
-            --num_dims;
-          }
-        }
-        if(num_dims == 3) {
-          cell_type = Z_HEX08;
-        }
-        else if(num_dims == 2) {
-          cell_type = Z_QUA04;
-        }
-        else {
-          cell_type = Z_BAR02;
-        }
-
-        e1 = cell_type;
-        e2 = cell_type + 1;
-      }
-
-
-      for(et=e1; et<e2; ++et) {
-
-        if(Pbuild[p].type == Z_UNSTRUCTURED) {
-          ne = Pbuild[p].ne[et];
-        }
-
-        if(ne > 0) {
-
-          /* Get the material ids, if any
-           *-----------------------------*/
-          err = USERD_size_matf_data(ms,
-                                     pn,
-                                     et,
-                                     Z_MAT_INDEX,
-                                     &matf_size);
-          if(err == Z_OK && matf_size > 0) {
-
-
-            /* Go get the material ids
-             *------------------------*/
-            ivals = (int *) calloc(matf_size,sizeof(int));
-            if(ivals == (int *)NULL) {
-              fprintf(stderr," Problems allocating for material ids\n");
-              return(Z_ERR);
-            }
-            err = USERD_load_matf_data(ms,
-                                       pn,
-                                       et,
-                                       Z_MAT_INDEX,
-                                       ivals,
-                                       fvals);
-            if(err == Z_OK) {
-              if(matf_size < 20) {
-                fprintf(stderr,"     Printing all mat ids for %s elements\n",
-                        Elem_info[et].name);
-                do_num = matf_size;
-              }
-              else {
-                fprintf(stderr,"     Printing first 20 mat ids for %s elements\n",
-                        Elem_info[et].name);
-                do_num = 20;
-              }
-
-              /* See if any mixed materials
-               *---------------------------*/
-              mixed_present = FALSE;
-              for(k=0; k<matf_size; ++k) {
-                if(ivals[k] < 0) {
-                  mixed_present = TRUE;
-                  break;
-                }
-              }
-
-              /* Feedback
-               *---------*/
-              for(k=0; k<do_num; ++k) {
-                fprintf(stderr,"       mat id[%d] = %d\n",k,ivals[k]);
-              }
-              free(ivals);
-            }
-            else {
-              fprintf(stderr,"     Trouble getting mat ids for %s elements\n",
-                      Elem_info[et].name);
-              free(ivals);
-              return(Z_ERR);
-            }
-          }
-          else {
-            fprintf(stderr,"     %s elements have no material ids\n",
-                    Elem_info[et].name);
-          }
-
-
-          /* Get the mixed material ids, if any
-           *-----------------------------------*/
-          if(mixed_present) {
-            err1 = USERD_size_matf_data(ms,
-                                        pn,
-                                        et,
-                                        Z_MIX_INDEX,
-                                        &matf_size);
-            err2 = USERD_size_matf_data(ms,
-                                        pn,
-                                        et,
-                                        Z_MIX_VALUE,
-                                        &matfv_size);
-
-            if(err1 == Z_OK &&
-               err2 == Z_OK &&
-               matf_size > 0 &&
-               matfv_size > 0) {
-
-              /* Go get the material ids
-               *------------------------*/
-              ivals = (int *) calloc(matf_size,sizeof(int));
-              if(ivals == (int *)NULL) {
-                fprintf(stderr," Problems allocating for mixed material ids\n");
-                return(Z_ERR);
-              }
-              fvals = (float *) calloc(matfv_size,sizeof(float));
-              if(fvals == (float *)NULL) {
-                fprintf(stderr," Problems allocating for mixed material values\n");
-                return(Z_ERR);
-              }
-
-              err1 = USERD_load_matf_data(ms,
-                                          pn,
-                                          et,
-                                          Z_MIX_INDEX,
-                                          ivals,
-                                          fvals);
-
-              err2 = USERD_load_matf_data(ms,
-                                          pn,
-                                          et,
-                                          Z_MIX_VALUE,
-                                          ivals,
-                                          fvals);
-              if(err1 == Z_OK &&
-                 err2 == Z_OK) {
-                if(matf_size < 20) {
-                  fprintf(stderr,"     Printing all mixed mat ids for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = matf_size;
-                }
-                else {
-                  fprintf(stderr,"     Printing first 20 mixed mat ids for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = 20;
-                }
-                for(k=0; k<do_num; ++k) {
-                  fprintf(stderr,"       mixed mat id[%d] = %d\n",k,ivals[k]);
-                }
-                free(ivals);
-
-                if(matfv_size < 20) {
-                  fprintf(stderr,"     Printing all mixed mat values for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = matfv_size;
-                }
-                else {
-                  fprintf(stderr,"     Printing first 20 mixed mat values for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = 20;
-                }
-                for(k=0; k<do_num; ++k) {
-                  fprintf(stderr,"       mixed mat val[%d] = %f\n",k,fvals[k]);
-                }
-                free(fvals);
-              }
-              else {
-                fprintf(stderr,"     Trouble getting mixed mat ids or vals for %s elements\n",
-                        Elem_info[et].name);
-                free(ivals);
-                free(fvals);
-                return(Z_ERR);
-              }
-            }
-            else {
-              fprintf(stderr,"     Trouble getting mixed mat sizes for %s elements\n",
-                      Elem_info[et].name);
-              return(Z_ERR);
-            }
-          }
-          else {
-            fprintf(stderr,"       (%s elements have no mixed material ids)\n",
-                    Elem_info[et].name);
-          }
-        }
-      }
-    }
-  }
-  return(Z_OK);
-}
-
-#endif
-
-/*--------------
- * entity_querys
- *--------------*/
-static int
-entity_querys(int var_time_step)
-{
-  int i, j;
-  int err;
-  int v, vn;
-  int var_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_comps;
-  int num_dims;
-  int nsize;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-  float qvals[3];
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n-------------- entity_querys ------------\n");
-  fprintf(stderr,"       (scalar & vector variables only)    \n");
-  fprintf(stderr,"\n");
-
-#if (defined USERD_API_100)
-
-  if(Num_time_steps > 1) {
-    /* Get the number of time steps for this timeset
-     *----------------------------------------------*/
-    if(var_time_step > (Num_time_steps - 1)) {
-      var_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the time step - to first step by default, but
-     * can set it at others using -vts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_step(var_time_step);
-
-    fprintf(stderr," Using time step: %d  (where range is %d through %d)\n\n",
-            var_time_step,0,Num_time_steps-1);
-  }
-#endif
-
-  for(v=0; v<Num_vars; ++v) {
-    vn = v + 1;
-
-    /* Scalar or vectors only
-     *-----------------------*/
-    if(Varinfo[v].type == Z_SCALAR || Varinfo[v].type == Z_VECTOR) {
-
-
-      if(Varinfo[v].classify == Z_PER_NODE) {
-        fprintf(stderr," Z_PER_NODE Variable %d:\n",vn);
-      }
-      else {
-        fprintf(stderr," Z_PER_ELEM Variable %d:\n",vn);
-      }
-
-#if (defined GT_USERD_API_100)
-
-      if(Num_time_sets > 0) {
-        /* Get the timeset used for the variable
-         *---------------------------------------*/
-        var_timeset = Varinfo[v].timeset;
-
-        /* Get the number of time steps for this timeset
-         *----------------------------------------------*/
-        Num_time_steps = USERD_get_num_of_time_steps(var_timeset);
-        if(Num_time_steps < 1) {
-          fprintf(stderr," Error: Number of time steps returned: %d\n",
-                  Num_time_steps);
-          fprintf(stderr," (Must be >0 to be okay)\n");
-          return(Z_ERR);
-        }
-        if(var_time_step > (Num_time_steps - 1)) {
-          var_time_step = Num_time_steps - 1;
-        }
-
-        /* Set the timeset and step - to first step by default, but
-         * can set it at others using -vts command argument
-         *---------------------------------------------------------*/
-        USERD_set_time_set_and_step(var_timeset,var_time_step);
-
-        fprintf(stderr,"   Using timeset:   %d  (step range is %d through %d)\n",
-                var_timeset,0,Num_time_steps-1);
-        fprintf(stderr,"   Using time step: %d\n",var_time_step);
-      }
-#endif
-
-
-      /* Get the var description line
-       *-----------------------------*/
-#if (defined GT_USERD_API_100)
-      err = USERD_get_descrip_lines(Z_VARI,vn,FALSE,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-      if(Varinfo[v].complex) {
-        err = USERD_get_descrip_lines(Z_VARI,vn,TRUE,line1,line2);
-        if(err == Z_OK) {
-          fprintf(stderr,"   Desc line (imag): %s\n",line1);
-        }
-        else {
-          fprintf(stderr,"Error: getting var description line (imag)\n");
-          return(Z_ERR);
-        }
-      }
-#else
-
-      err = USERD_get_description_lines(Z_VARI,vn,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-#endif
-
-      /* Get the values by component
-       *-----------------------------*/
-      if(Varinfo[v].type == Z_SCALAR) {
-        num_comps = 1;
-      }
-      else if(Varinfo[v].type == Z_VECTOR) {
-        num_comps = 3;
-      }
-
-      /* Per_Node
-       *---------*/
-      if(Varinfo[v].classify == Z_PER_NODE) {
-
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            nsize = Pbuild[p].nn;
-          }
-          else {
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            nsize = bdim[0] * bdim[1] * bdim[2];
-          }
-
-
-
-          if(nsize > 0) {
-
-            fprintf(stderr,"   For part %d, using node %d:\n",pn,nsize);
-
-#if (defined GT_USERD_API_100)
-            err = USERD_get_var_value_at_specific(vn,
-                                                  nsize,
-                                                  pn,
-                                                  0,
-                                                  var_time_step,
-                                                  qvals,
-                                                  FALSE);
-#else
-            err = USERD_get_variable_value_at_specific(vn,
-                                                       nsize,
-                                                       pn,
-                                                       0,
-                                                       var_time_step,
-                                                       qvals);
-#endif
-            if(err == Z_NOT_IMPLEMENTED) {
-              fprintf(stderr,"  Node and element queries not implemented\n");
-              return(Z_OK);
-            }
-            else if(err == Z_ERR) {
-              fprintf(stderr,"     Could not get value\n");
-            }
-            else {
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              if(Varinfo[v].type == Z_SCALAR) {
-                fprintf(stderr,"     Scalar value is: %g\n",qvals[0]);
-              }
-              else {
-                fprintf(stderr,"     Vector values are: %g %g %g\n",
-                        qvals[0],qvals[1],qvals[2]);
-              }
-
-#if (defined GT_USERD_API_100)
-              if(Varinfo[v].complex) {
-
-                err = USERD_get_var_value_at_specific(vn,
-                                                      nsize,
-                                                      pn,
-                                                      0,
-                                                      var_time_step,
-                                                      qvals,
-                                                      TRUE);
-
-                if(err == Z_ERR) {
-                  fprintf(stderr,"     Could not get imag value\n");
-                }
-                else {
-
-                  /* For the component, show 1st node, last node, min, max values
-                   *-------------------------------------------------------------*/
-                  if(Varinfo[v].type == Z_SCALAR) {
-                    fprintf(stderr,"     Scalar value (imag) is: %g\n",qvals[0]);
-                  }
-                  else {
-                    fprintf(stderr,"     Vector values (imag) are: %g %g %g\n",
-                            qvals[0],qvals[1],qvals[2]);
-                  }
-                }
-              }
-#endif
-
-            }
-          }
-        }
-      }
-
-      /* Per_Elem
-       *---------*/
-      else {
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type != Z_UNSTRUCTURED) {
-
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            bd1 = bdim[0]-1;
-            if(bd1 < 1) {
-              bd1 = 1;
-            }
-            bd2 = bdim[1]-1;
-            if(bd2 < 1) {
-              bd2 = 1;
-            }
-            bd3 = bdim[2]-1;
-            if(bd3 < 1) {
-              bd3 = 1;
-            }
-            nsize = bd1 * bd2 * bd3;
-
-
-            /* Determine cell type
-             *--------------------*/
-            num_dims = 3;
-            for(i=0; i<3; ++i) {
-              if(bdim[i] == 1) {
-                --num_dims;
-              }
-            }
-            if(num_dims == 3) {
-              cell_type = Z_HEX08;
-            }
-            else if(num_dims == 2) {
-              cell_type = Z_QUA04;
-            }
-            else {
-              cell_type = Z_BAR02;
-            }
-          }
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            e1 = 0;
-            e2 = Z_MAXTYPE-1;
-          }
-          else {
-            e1 = e2 = cell_type;
-          }
-
-          for(et=e1; et<=e2; ++et) {
-
-            if(Pbuild[p].type == Z_UNSTRUCTURED) {
-              nsize = Pbuild[p].ne[et];
-            }
-
-            if(nsize > 0) {
-
-
-              fprintf(stderr,"   For part %d, using elem %d of type %s:\n",
-                      pn,nsize,Elem_info[et].name);
-
-
-#if (defined GT_USERD_API_100)
-              err = USERD_get_var_value_at_specific(vn,
-                                                    nsize,
-                                                    pn,
-                                                    et,
-                                                    var_time_step,
-                                                    qvals,
-                                                    FALSE);
-#else
-            err = USERD_get_variable_value_at_specific(vn,
-                                                       nsize,
-                                                       pn,
-                                                       et,
-                                                       var_time_step,
-                                                       qvals);
-#endif
-
-              if(err == Z_NOT_IMPLEMENTED) {
-                fprintf(stderr,"  Node and element queries not implemented\n");
-                return(Z_OK);
-              }
-              else if(err == Z_ERR) {
-                fprintf(stderr,"     Could not get value\n");
-              }
-              else {
-                if(Varinfo[v].type == Z_SCALAR) {
-                  fprintf(stderr,"     Scalar value is: %g\n",qvals[0]);
-                }
-                else {
-                  fprintf(stderr,"     Vector values are: %g %g %g\n",
-                          qvals[0],qvals[1],qvals[2]);
-                }
-
-#if (defined GT_USERD_API_100)
-                if(Varinfo[v].complex) {
-
-                  err = USERD_get_var_value_at_specific(vn,
-                                                        nsize,
-                                                        pn,
-                                                        et,
-                                                        var_time_step,
-                                                        qvals,
-                                                        TRUE);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"     Could not get imag value\n");
-                  }
-                  else {
-                    if(Varinfo[v].type == Z_SCALAR) {
-                      fprintf(stderr,"     Scalar value (imag) is: %g\n",qvals[0]);
-                    }
-                    else {
-                      fprintf(stderr,"     Vector values (imag) are: %g %g %g\n",
-                              qvals[0],qvals[1],qvals[2]);
-                    }
-                  }
-                }
-#endif
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-
-/*--------------
- * exercise_bkup
- *--------------*/
-static int
-exercise_bkup( void )
-{
-  int err;
-  FILE *arcfile;
-
-  fprintf(stderr,"\n------------ exercise_archive -----------\n");
-
-  arcfile = fopen("test.arc","wb");
-  if(arcfile == (FILE *)NULL) {
-    fprintf(stderr,"Error: opening test archive file\n");
-    return(Z_ERR);
-  }
-  err = USERD_bkup(arcfile,Z_SAVE_ARCHIVE);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: saving to test archive file\n");
-    return(Z_ERR);
-  }
-  fclose(arcfile);
-
-  arcfile = fopen("test.arc","rb");
-  err = USERD_bkup(arcfile,Z_REST_ARCHIVE);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: restoring from test archive file\n");
-    return(Z_ERR);
-  }
-
-  fprintf(stderr," Archive test completed\n");
-
-  fclose(arcfile);
-
-  return(Z_OK);
-}
-
-/* -------------------------------------------------------
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ------------------------------------------------------ */
-int load_fail_defaults(void)
-{
-  int check_for_failed = FALSE;
-  int cri1 = 0;                 /* Criteria1 ELE_FAILED_GREATER, etc */
-  int cri2 = 0;
-  int  logic_cri2 = 0;        /* Logic for criteria 2  ELE_FAILED_LOGIC_NONE, AND, etc */
-  float val1 = 0.0;           /* failure threshold 1 */
-  float  val2= 0.0;           /* failure threshold 2 */
-  char failed_var_name[Z_MXVARIABLEDESC]={EOS};
-
-  check_for_failed =  USERD_get_uns_failed_params( failed_var_name,
-                                                   &val1, &val2, &cri1, &cri2,
-                                                   &logic_cri2 );
-  if (check_for_failed == TRUE) {
-    fprintf(stderr,"Failed element criteria info \n");
-    fprintf(stderr,"Variable name = %s\n",failed_var_name);
-    fprintf(stderr,"Criteria 1 = %d\n",cri1);
-    fprintf(stderr,"Criteria 2 = %d\n",cri1);
-    fprintf(stderr,"Logic criteria = %d\n",logic_cri2);
-    fprintf(stderr,"Value 1 = %f\n",val1);
-    fprintf(stderr,"Value 2 = %f\n",val2);
-  } else {
-    fprintf(stderr,"No Failed elements\n");
-  }
-  return(Z_OK);
-}
-
-
-/* End of File */
diff --git a/applications/test/ensightFoamReader/udr_checker-90.c b/applications/test/ensightFoamReader/udr_checker-90.c
deleted file mode 100644
index c3197bf8e9a810a3f02d7c120b8512db96336671..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/udr_checker-90.c
+++ /dev/null
@@ -1,5884 +0,0 @@
-/*----------------------------------
- *     User Defined Reader - checker
- *----------------------------------*/
-
-/********************************************************************
- *
- *      ****************************************
- *       Copyright 2004 Computational Engineering International, Inc.
- *       All Rights Reserved.
- *
- *              Restricted Rights Legend
- *
- *       Use, duplication, or disclosure of this
- *       software and its documentation by the
- *       Government is subject to restrictions as
- *       set forth in subdivision [(b)(3)(ii)] of
- *       the Rights in Technical Data and Computer
- *       Software clause at 52.227-7013.
- *******************************************************************/
-
-/*----------------------------------------------------------------------
- * MAJOR ROUTINES ACCESS:     (VERSION 2.00)    Gold_Userd   API
- *
- *        Get the name of the reader
- *        ==========================
- *        USERD_get_name_of_reader
- *        USERD_get_extra_gui_numbers    (optional)
- *        USERD_get_extra_gui_defaults   (optional)
- *
- *        Get the reader version
- *        ======================
- *        USERD_get_reader_version
- *
- *        Set the filenames, gather timeset and time info
- *        ===============================================
- *        USERD_set_extra_gui_data       (optional)
- *        USERD_set_server_number
- *        USERD_set_filenames
- *        USERD_get_number_of_timesets
- *        USERD_get_geom_timeset_number
- *
- *        for each timeset:
- *          USERD_get_timeset_description
- *          USERD_get_num_of_time_steps
- *          USERD_get_sol_times
- *
- *        USERD_set_time_set_and_step
- *
- *
- *        Gather variable and time info
- *        =============================
- *        USERD_get_number_of_variables
- *        USERD_get_gold_variable_info
- *
- *
- *        Get initial part building info
- *        ==============================
- *        USERD_set_time_set_and_step
- *        USERD_get_changing_geometry_status
- *        USERD_get_node_label_status
- *        USERD_get_element_label_status
- *        USERD_get_number_of_files_in_dataset
- *        USERD_get_dataset_query_file_info
- *        USERD_get_descrip_lines                 (geometry)
- *        USERD_get_number_of_model_parts
- *        USERD_get_gold_part_build_info
- *        USERD_get_ghosts_in_model_flag
- *        USERD_get_maxsize_info
- *        USERD_get_ghosts_in_block_flag          (if any ghost cells in model)
- *        USERD_get_model_extents    **OR**
- *             USERD_get_part_coords  **AND/OR**
- *             USERD_get_block_coords_by_component
- *
- *
- *
- *         Part Builder
- *         ============
- *
- *         both unstructured and structured
- *         --------------------------------
- *         USERD_set_time_set_and_step
- *
- *         if unstructured
- *         ---------------
- *         USERD_get_part_element_ids_by_type
- *         USERD_get_part_elements_by_type
- *
- *         if any nsided elements:
- *           USERD_get_nsided_conn
- *
- *         if any nfaced elements:
- *           USERD_get_nfaced_nodes_per_face
- *           USERD_get_nfaced_conn
- *
- *         USERD_get_part_coords
- *         USERD_get_part_node_ids
- *
- *         else if structured
- *         ------------------
- *         USERD_get_block_iblanking
- *         USERD_get_block_coords_by_component
- *         USERD_get_block_ghost_flags
- *         USERD_get_part_node_ids              (If node ids given)
- *         USERD_get_part_element_ids_by_type   (If element ids given)
- *
- *         both again
- *         ----------
- *         USERD_get_border_availability        (If border representation
- *         USERD_get_border_elements_by_type     is selected)
- *
- *         USERD_stop_part_building
- *
- *
- *         Changing geometry
- *         =================
- *
- *         changing coords only
- *         --------------------
- *         USERD_set_time_set_and_step
- *         USERD_get_descrip_lines
- *         USERD_get_part_coords
- *         USERD_get_block_coords_by_component
- *
- *         changing connectivity
- *         ---------------------
- *         USERD_set_time_set_and_step
- *         USERD_get_descrip_lines
- *         USERD_get_number_of_model_parts
- *         USERD_get_gold_part_build_info
- *         USERD_get_ghosts_in_model_flag
- *         USERD_get_ghosts_in_block_flag       (If any ghost cells in model)
- *         USERD_get_model_extents     **OR**
- *             USERD_get_part_coords  **AND/OR**
- *             USERD_get_block_coords_by_component
- *         USERD_get_part_element_ids_by_type
- *         USERD_get_part_elements_by_type
- *         USERD_get_part_coords
- *         USERD_get_part_node_ids
- *         USERD_get_block_iblanking
- *         USERD_get_block_coords_by_component
- *         USERD_get_block_ghost_flags          (If ghost cells in part)
- *         USERD_get_part_node_ids              (If node ids given)
- *         USERD_get_part_element_ids_by_type   (If element ids given)
- *
- *         USERD_get_border_availability        (If border representation
- *         USERD_get_border_elements_by_type     is selected)
- *
- *
- *         Loading Variables
- *         ==================
- *
- *         constants
- *         ---------
- *         USERD_set_time_set_and_step
- *         USERD_get_constant_val
- *
- *         scalars/vectors/tensors
- *         -----------------------
- *         USERD_get_description_lines
- *         USERD_set_time_set_and_step
- *         USERD_get_var_by_component
- *
- *
- *         Node or Element queries over time
- *         =================================
- *         USERD_get_var_value_at_specific
- *
- *
- *  At 2.03, added:
- *  ---------------
- *
- *         Materials
- *         =========
- *         USERD_get_number_of_material_sets
- *         USERD_get_matf_set_info
- *
- *         If any material sets in the model (calls once per material set)
- *           USERD_get_number_of_materials
- *           USERD_get_matf_var_info
- *
- *         For each element type of each part containing material ids
- *           USERD_size_matf_data
- *           USERD_load_matf_data
- *
- *
- *  At 2.04, added:
- *  ---------------
- *          USERD_get_uns_failed_params  - Sets params used in element failure
- *
- *
- *----------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------
- * MAJOR ROUTINES ACCESS:       (Version 1.00)  original API
- *
- *        Get the name of the reader
- *        ==========================
- *        USERD_get_name_of_reader
- *        USERD_get_extra_gui_numbers     (optional    -extra_gui on command line)
- *        USERD_get_extra_gui_defaults    (optional    -extra_gui on command line)
- *
- *        Set the filenames
- *        =================
- *        USERD_set_extra_gui_data        (optional    -extra_gui on command line)
- *        USERD_set_filenames
- *        USERD_get_number_of_time_steps
- *        USERD_get_solution_times
- *        USERD_set_time_step
- *
- *
- *        Gather variable and time info
- *        =============================
- *        USERD_get_number_of_variables
- *        USERD_get_variable_info
- *
- *
- *        Get initial part building info
- *        ==============================
- *        USERD_set_time_step
- *        USERD_get_changing_geometry_status
- *        USERD_get_node_label_status
- *        USERD_get_element_label_status
- *        USERD_get_number_of_files_in_dataset
- *        USERD_get_dataset_query_file_info
- *        USERD_get_description_lines                     (geometry)
- *        USERD_get_number_of_model_parts
- *        USERD_get_part_build_info
- *        USERD_get_number_global_nodes
- *        USERD_get_global_coords
- *        USERD_get_block_coords_by_component
- *
- *        Failure Info
- *        ============
- *        USERD_get_uns_failed_params
- *
- *
- *        Part Builder
- *        ============
- *        USERD_set_time_step
- *        USERD_get_global_coords
- *        USERD_get_global_node_ids
- *        USERD_get_element_connectivities_for_part
- *        USERD_get_element_ids_for_part
- *        USERD_get_block_iblanking
- *        USERD_get_block_coords_by_component
- *
- *        USERD_stop_part_building
- *
- *
- *        Changing geometry
- *        =================
- *
- *        changing coords only
- *        --------------------
- *        USERD_set_time_step
- *        USERD_get_global_coords
- *        USERD_get_block_coords_by_component
- *
- *        changing connectivity
- *        ---------------------
- *        USERD_set_time_step
- *        USERD_get_number_of_model_parts
- *        USERD_get_part_build_info
- *        USERD_get_number_global_nodes
- *        USERD_get_global_coords
- *        USERD_get_global_node_ids
- *        USERD_get_element_connectivities_for_part
- *        USERD_get_element_ids_for_part
- *        USERD_get_block_iblanking
- *        USERD_get_block_coords_by_component
- *
- *        Loading Variables
- *        =================
- *
- *        constants:
- *        ----------
- *        USERD_set_time_step
- *        USERD_get_constant_value
- *
- *        scalars:
- *        --------
- *        USERD_get_description_lines
- *        USERD_set_time_step
- *        USERD_get_scalar_values
- *        USERD_get_block_scalar_values
- *
- *        vectors:
- *        --------
- *        USERD_get_description_lines
- *        USERD_set_time_step
- *        USERD_get_vector_values
- *        USERD_get_block_vector_values_by_component
- *
- *
- *        Node or Element queries over time
- *        =================================
- *        USERD_get_variable_value_at_specific
- *
- *----------------------------------------------------------------------*/
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <ctype.h>
-#include <sys/types.h>
-#ifndef CONVEX
-#include <malloc.h>
-#endif
-#include <math.h>
-
-#include "global_extern.h"
-
-/* -----------------------------------------------
- *  If you wish to test out various optional routines
- *  you must uncomment the proper #define below
- *
- *  #define _EGS  is for extra_gui routines
- *  #define _VES  is for var_extract_gui routines
- *---------------------------------------------------*/
-/* #define _EGS */
-/* #define _VES */
-
-
-#if (defined USERD_API_209)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-#define GT_USERD_API_203
-#define GT_USERD_API_204
-#define GT_USERD_API_205
-#define GT_USERD_API_206
-#define GT_USERD_API_207
-#define GT_USERD_API_208
-
-#elif (defined USERD_API_208)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-#define GT_USERD_API_203
-#define GT_USERD_API_204
-#define GT_USERD_API_205
-#define GT_USERD_API_206
-#define GT_USERD_API_207
-
-#elif (defined USERD_API_207)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-#define GT_USERD_API_203
-#define GT_USERD_API_204
-#define GT_USERD_API_205
-#define GT_USERD_API_206
-
-#elif (defined USERD_API_206)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-#define GT_USERD_API_203
-#define GT_USERD_API_204
-#define GT_USERD_API_205
-
-#elif (defined USERD_API_205)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-#define GT_USERD_API_203
-#define GT_USERD_API_204
-
-#elif (defined USERD_API_204)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-#define GT_USERD_API_203
-
-#elif (defined USERD_API_203)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-#define GT_USERD_API_202
-
-#elif (defined USERD_API_202)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-#define GT_USERD_API_201
-
-#elif (defined USERD_API_201)
-#define GT_USERD_API_100
-#define GT_USERD_API_200
-
-#elif (defined USERD_API_200)
-#define GT_USERD_API_100
-#endif
-
-
-#define EOS '\0'
-
-typedef struct {
-  int  id;                /* part_id                                      */
-  char desc[Z_BUFL];      /* description given in the file                */
-  int  type;              /* Z_UNSTRUCTURED, Z_STRUCTURED, Z_IBLANKED     */
-  int  ne[Z_MAXTYPE];     /* Number of elements per type (Z_UNSTRUCTURED) */
-                          /* or ne[0] = I dimension (Z_STRUCTURED)        */
-                          /*    ne[1] = J dimension                       */
-                          /*    ne[2] = K dimension                       */
-  int  nn;                /* Num of unstructured nodes (All_Local only)   */
-  int  ghosts;            /* TRUE if ghost cells, FALSE otherwise         */
-}BUILDINFO;
-
-typedef struct {
-  char  description[Z_BUFL];  /* description */
-  char  filename[Z_BUFL];     /* real filename */
-  char  ifilename[Z_BUFL];    /* imaginary filename */
-  int   type;
-  int   classify;
-  int   complex;
-  float freq;
-  int   contran;
-  int   timeset;
-}VARINFO;
-
-
-typedef struct {
-  char name[12];          /* Z_POINT, Z_G_POINT, Z_BAR02, ... */
-  int  con_len;           /* Number of nodes per element      */
-}EINFO;
-
-
-/* Global variables
- *-----------------*/
-int Geom_status;
-int Node_labels;
-int Element_labels;
-int Ghosts_in_model;
-int Num_parts;
-int Num_vars;
-int Num_materials_sets;
-BUILDINFO *Pbuild;
-VARINFO *Varinfo;
-char Version_number[Z_MAX_USERD_NAME];
-int Num_time_sets;
-int Num_time_steps;
-
-/* ------------------
- * Extra GUI stuff
- * ------------------ */
-int Num_toggles = 0;
-int Num_pulldowns = 0;
-int Num_fields = 0;
-char **Toggle_title;
-int *Toggle_default_status;
-char **Pulldown_title;
-int *Pulldown_number_in_list;
-int *Pulldown_default_selection;
-char ***Pulldown_item_strings;
-char **Field_title;
-char **Field_user_string;
-int *Toggle_choice; /* user choice */
-int *Pulldown_choice; /* user choice */
-
-/* ------------------
- * Var Extract stuff
- * ------------------ */
-int Num_ve_toggles = 0;
-int Num_ve_pulldowns = 0;
-int Num_ve_fields = 0;
-char **Toggle_ve_title;
-int *Toggle_ve_default_status;
-char **Pulldown_ve_title;
-int *Pulldown_ve_number_in_list;
-int *Pulldown_ve_default_selection;
-char ***Pulldown_ve_item_strings;
-char **Field_ve_title;
-char **Field_ve_user_string;
-int *Toggle_ve_choice; /* user choice */
-int *Pulldown_ve_choice; /* user choice */
-
-/* ---------------------------
- * Failed elements (API 2.04)
- * --------------------------- */
-int Any_uns_failed_model_elems = FALSE;
-
-/* ---------------------------
- * Rigidbody (API 2.05)
- * --------------------------- */
-int Any_Rigid_Body_Present = FALSE;
-
-/* ---------------------------
- * Structured Reader Cinching (API 2.06)
- * --------------------------- */
-int Doing_Structured_Cinching = FALSE;
-
-
-
-#if (defined USERD_API_100 || defined USERD_API_200)
-EINFO Elem_info[Z_MAXTYPE] = {"Z_POINT",1,
-                              "Z_BAR02",2,
-                              "Z_BAR03",3,
-                              "Z_TRI03",3,
-                              "Z_TRI06",6,
-                              "Z_QUA04",4,
-                              "Z_QUA08",8,
-                              "Z_TET04",4,
-                              "Z_TET10",10,
-                              "Z_PYR05",5,
-                              "Z_PYR13",13,
-                              "Z_PEN06",6,
-                              "Z_PEN15",15,
-                              "Z_HEX08",8,
-                              "Z_HEX20",20};
-#elif defined USERD_API_201
-EINFO Elem_info[Z_MAXTYPE] = {"Z_POINT",  1,
-                              "Z_G_POINT",1,
-                              "Z_BAR02",  2,
-                              "Z_G_BAR02",2,
-                              "Z_BAR03",  3,
-                              "Z_G_BAR03",3,
-                              "Z_TRI03",  3,
-                              "Z_G_TRI03",3,
-                              "Z_TRI06",  6,
-                              "Z_G_TRI06",6,
-                              "Z_QUA04",  4,
-                              "Z_G_QUA04",4,
-                              "Z_QUA08",  8,
-                              "Z_G_QUA08",8,
-                              "Z_TET04",  4,
-                              "Z_G_TET04",4,
-                              "Z_TET10",  10,
-                              "Z_G_TET10",10,
-                              "Z_PYR05",  5,
-                              "Z_G_PYR05",5,
-                              "Z_PYR13",  13,
-                              "Z_G_PYR13",13,
-                              "Z_PEN06",  6,
-                              "Z_G_PEN06",6,
-                              "Z_PEN15",  15,
-                              "Z_G_PEN15",15,
-                              "Z_HEX08",  8,
-                              "Z_G_HEX08",8,
-                              "Z_HEX20",  20,
-                              "Z_G_HEX20",20};
-#else
-EINFO Elem_info[Z_MAXTYPE] = {"Z_POINT",  1,
-                              "Z_G_POINT",1,
-                              "Z_BAR02",  2,
-                              "Z_G_BAR02",2,
-                              "Z_BAR03",  3,
-                              "Z_G_BAR03",3,
-                              "Z_TRI03",  3,
-                              "Z_G_TRI03",3,
-                              "Z_TRI06",  6,
-                              "Z_G_TRI06",6,
-                              "Z_QUA04",  4,
-                              "Z_G_QUA04",4,
-                              "Z_QUA08",  8,
-                              "Z_G_QUA08",8,
-                              "Z_TET04",  4,
-                              "Z_G_TET04",4,
-                              "Z_TET10",  10,
-                              "Z_G_TET10",10,
-                              "Z_PYR05",  5,
-                              "Z_G_PYR05",5,
-                              "Z_PYR13",  13,
-                              "Z_G_PYR13",13,
-                              "Z_PEN06",  6,
-                              "Z_G_PEN06",6,
-                              "Z_PEN15",  15,
-                              "Z_G_PEN15",15,
-                              "Z_HEX08",  8,
-                              "Z_G_HEX08",8,
-                              "Z_HEX20",  20,
-                              "Z_G_HEX20",20,
-                              "Z_NSIDED",  1,   /* Not yet implemented */
-                              "Z_G_NSIDED",1,   /* Not yet implemented */
-                              "Z_NFACED",  1,   /* Not yet implemented */
-                              "Z_G_NFACED",1};  /* Not yet implemented */
-#endif
-
-
-/* Prototypes
- *-----------*/
-static int load_fail_defaults(void);
-static int prelim_info(int *two_fields,
-                       int *any_extra_gui,
-                       int *any_var_extract);
-static int get_input(int set_server_number,
-                     int use_playfile,
-                     char playfile[Z_MAXFILENP],
-                     int two_fields,
-                     int any_extra_gui,
-                     int any_var_extract,
-                     int *swapbytes);
-static int time_info( void );
-static int part_build_info(int geom_time_step);
-static int variable_info( void );
-
-#if (defined GT_USERD_API_100)
-static int gold_part_builder(int geom_time_step);
-static int gold_var_loader(int var_time_step);
-#else
-static int part_builder(int geom_time_step);
-static int var_loader(int var_time_step);
-#endif
-
-#if (defined GT_USERD_API_100)
-static int materials_info( void );
-static int gold_materials_loader(int geom_time_step);
-#endif
-
-static int entity_querys(int var_time_step);
-static int exercise_bkup( void );
-static void usage( void );
-
-
-/*=============
- * Main Routine
- *=============*/
-#ifdef WIN32
-int main(int argc, char *argv[])
-#else
-int main(int argc, char *argv[])
-#endif
-{
-  /* Command line option variables
-   *------------------------------*/
-  int set_server_number = FALSE;
-  int use_playfile = FALSE;
-  char playfile[Z_MAXFILENP];
-  FILE *fplay;
-  int geom_time_step = 0;
-  int var_time_step = 0;
-
-  /* Other local variables
-   *----------------------*/
-  int i, j;
-  int err;
-  int two_fields;
-  int any_extra_gui = FALSE;
-  int any_var_extract = FALSE;
-  int swapbytes;
-  int indx;
-
-  /*----------------------------
-   * Command argument processing
-   *----------------------------*/
-  fprintf(stderr,"\n");
-  fprintf(stderr,"\n");
-  fprintf(stderr,"********************************************\n");
-  fprintf(stderr,"*  EnSight User Defined Reader Debug Tool  *\n");
-  fprintf(stderr,"********************************************\n");
-  fprintf(stderr,"\n");
-
-  indx = 1;
-  while(indx < argc) {
-
-    if(!strcmp("-h",argv[indx])) {
-      usage();
-    }
-    else if(!strcmp("-help",argv[indx])) {
-      usage();
-    }
-
-    /* if you want to test the server number routines
-     *
-     * Use:
-     * > checker -server_number
-     *
-     * You will then be prompted for the current and total
-     * number of servers
-     *-----------------------------------------------*/
-    else if(!strcmp("-server_number",argv[indx])) {
-      set_server_number = TRUE;
-    }
-
-    /* if you want to use a "playfile" instead of being prompted
-     * for the data loader information
-     *
-     * Use:
-     * > checker -p <playfile>
-     *
-     * This playfile should have 3 [or 4] lines:
-     * line 1:   the path
-     * line 2:   filename_1
-     * line 3:   [filename_2]   (if two_fields is TRUE)
-     * line 4:   0 or 1, for swapytes (0 is FALSE, 1 is TRUE)
-     *
-     * example (two_fields is FALSE, so only 3 lines):
-     *
-     *  /usr/scratch/stealth/bjn/dat/sp_gold/binary
-     *  simple.case
-     *  1
-     *
-     *------------------------------------------------------*/
-    else if(!strcmp("-p",argv[indx])) {
-      indx++;
-      if((indx < argc) && (argv[indx][0] != '-')) {
-        use_playfile = TRUE;
-        memset(playfile,EOS,Z_MAXFILENP);
-        strcpy(playfile,argv[indx]);
-      }
-      else {
-        usage();
-      }
-    }
-
-    /* if you want to specify the geometry timestep to test (default is step 0)
-     *
-     * Use:
-     * > checker -gts #
-     *
-     * Where # is the step number (zero based)
-     *-------------------------------------------------------------------------*/
-    else if(!strcmp("-gts",argv[indx])) {
-      indx++;
-      if((indx < argc) && (argv[indx][0] != '-')) {
-        geom_time_step = atoi(argv[indx]);
-      }
-      else {
-        usage();
-      }
-    }
-
-    /* if you want to specify the variable timestep to test (default is step 0)
-     * (will use this step for the appropriate timeset of each variable)
-     *
-     * Use:
-     * > checker -vts #
-     *
-     * Where # is the step number (zero based)
-     *-------------------------------------------------------------------------*/
-    else if(!strcmp("-vts",argv[indx])) {
-      indx++;
-      if((indx < argc) && (argv[indx][0] != '-')) {
-        var_time_step = atoi(argv[indx]);
-      }
-      else {
-        usage();
-      }
-    }
-    else {
-      usage();
-    }
-
-    indx++;
-  }
-
-
-  /*-------------------------------------------------------------
-   *
-   * Now start exercising EnSight
-   *
-   *--------------------------------------------------------------*/
-
-  /*-----------------
-   * Preliminary info
-   *-----------------*/
-  err = prelim_info(&two_fields,&any_extra_gui,&any_var_extract);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in prelim_info\n");
-    exit(1);
-  }
-
-
-  /*------------------
-   * User input needed
-   *------------------*/
-  err = get_input(set_server_number,
-                  use_playfile,
-                  playfile,
-                  two_fields,
-                  any_extra_gui,
-                  any_var_extract,
-                  &swapbytes);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in get_input\n");
-    exit(1);
-  }
-
-
-  /*----------
-   * Time info
-   *----------*/
-  err = time_info();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in time_info\n");
-    exit(1);
-  }
-
-
-  /*----------------
-   * Part build info
-   *----------------*/
-  err = part_build_info(geom_time_step);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in part_build_info\n");
-    exit(1);
-  }
-
-
-  /*------------------
-   * Get Variable Info
-   *------------------*/
-  err = variable_info();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in variable_info\n");
-    exit(1);
-  }
-
-
-#if (defined GT_USERD_API_202)
-  /*-------------------
-   * Get Materials Info
-   *-------------------*/
-  err = materials_info();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping because of error in materials_info\n");
-    exit(1);
-  }
-#endif
-
-#if (defined GT_USERD_API_203)
-  if (Z_ERR == load_fail_defaults()) {
-    fprintf(stderr,"Stopping due to error in failed element flag routine\n");
-    exit(1);
-  }
-#endif
-
-#if (defined GT_USERD_API_204)
-
-  /*-----------------------------------------------
-   * Mel needs to do these species routines yet!!!
-   *----------------------------------------------*/
-  /* USERD_get_matsp_info
-     USERD_get_number_of_species */
-
-
-  /* See if any rigid body in model
-   *-------------------------------*/
-  fprintf(stderr,"\n------------- rigid body existence -------------\n");
-  if(USERD_rigidbody_existence() == Z_OK) {
-    fprintf(stderr," Rigid Body values exist in the model\n");
-    Any_Rigid_Body_Present = TRUE;
-  }
-  else {
-    fprintf(stderr," N0 Rigid Body values exist in the model\n");
-  }
-
-#endif
-
-
-#if (defined GT_USERD_API_205)
-
-  /* See if doing structured cinching
-   *---------------------------------*/
-  fprintf(stderr,"\n------------- structured reader cinching existence -------------\n");
-  if(USERD_get_structured_reader_cinching() == Z_OK) {
-    fprintf(stderr," Doing structured reader cinching\n");
-    fprintf(stderr,"  for each of the i,j,k directions,\n");
-    fprintf(stderr,"    will send in min and max unchanged, but\n");
-    fprintf(stderr,"    will send in stride as 2\n");
-    Doing_Structured_Cinching = TRUE;
-  }
-  else {
-    fprintf(stderr," NOT doing structured reader cinching\n");
-  }
-#endif
-
-#if (defined GT_USERD_API_206)
-
-  /* Probably won't do either of these - trivial
-   *--------------------------------------------*/
-  /* USERD_prefer_auto_distribute   <optional> */
-  /* USERD_set_filename_button_labels  <optional> */
-#endif
-
-
-#if (defined GT_USERD_API_207)
-
-  /* If we choose to do these, Bruce should implement them
-   *------------------------------------------------------*/
-  /* All the _buffer routines!  <optional> */
-
-  /* If we choose to do these, Bill should implement them
-   *-----------------------------------------------------*/
-  /* USERD_get_num_xy_queries  <optional>
-     USERD_get_xy_query_data   <optional>
-     USERD_get_xy_query_info   <optional> */
-
-#endif
-
-#if (defined GT_USERD_API_208)
-
-  /* If we choose to do these, Bruce should implement them
-   *------------------------------------------------------*/
-  /* VGLYPH routines <optional> */
-#endif
-
-  /*------------------------
-   * Act like building parts
-   *------------------------*/
-  if(Num_parts > 0) {
-
-#if (defined GT_USERD_API_100)
-    err = gold_part_builder(geom_time_step);
-#else
-    err = part_builder(geom_time_step);
-#endif
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in part_builder\n");
-      exit(1);
-    }
-    else {
-      USERD_stop_part_building();
-    }
-  }
-
-
-  /*---------------------------
-   * Act like loading variables
-   *---------------------------*/
-  if(Num_vars > 0) {
-
-#if (defined GT_USERD_API_100)
-    err = gold_var_loader(var_time_step);
-#else
-    err = var_loader(var_time_step);
-#endif
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in var_loader\n");
-      exit(1);
-    }
-  }
-
-#if (defined GT_USERD_API_202)
-  /*---------------------------
-   * Act like loading materials
-   *---------------------------*/
-  if(Num_materials_sets > 0) {
-    err = gold_materials_loader(geom_time_step);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in materials_loader\n");
-      exit(1);
-    }
-  }
-#endif
-
-
-
-  /*----------------------------------------------------
-   * See if can do node and/or element queries over time
-   *----------------------------------------------------*/
-  if(Num_parts > 0 &&
-     Num_vars > 0) {
-    err = entity_querys(var_time_step);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Stopping because of error in entity_querys\n");
-      exit(1);
-    }
-  }
-
-  /*----------------------------------------
-   * Call the bkup file once in save mode,
-   * then again in restore mode - so someone
-   * could debug if desired
-   *----------------------------------------*/
-  err = exercise_bkup();
-  if(err == Z_ERR) {
-    fprintf(stderr,"Stopping due to error in saving and/or restoring archive\n");
-    exit(1);
-  }
-
-  /*-------------
-   * Exit Routine
-   *-------------*/
-  fprintf(stderr,"\n----------------- exiting ---------------\n");
-
-#if (defined GT_USERD_API_100)
-  USERD_exit_routine();
-#endif
-
-  fprintf(stderr,"\n\n");
-
-  return(0);
-}
-
-/*--------------
- * Usage routine
- *--------------*/
-static void
-usage( void )
-{
-  fprintf(stderr,"------------------------------------------------------------\n");
-  fprintf(stderr,"USAGE: checker [-p pfile] [-server_number] [-gts #] [-vts #]\n");
-  fprintf(stderr,"------------------------------------------------------------\n");
-  fprintf(stderr," -h, -help        Prints out this USAGE text.\n");
-  fprintf(stderr," -gts #           Specify the geometry time step to use.)\n");
-  fprintf(stderr," -p pfile         Plays the checker playfile (pfile).\n");
-  fprintf(stderr," -server_number   Cause servers numbers to be prompted for.\n");
-  fprintf(stderr," -vts #           Specify the variable time step to use.)\n");
-  fprintf(stderr,"\n");
-  exit(1);
-}
-
-
-
-
-/*------------
- * prelim_info
- *------------*/
-static int
-prelim_info(int *two_fields, int *any_extra_gui, int *any_var_extract)
-{
-  int err;
-  char reader_name[Z_MAX_USERD_NAME];
-  char release_number[Z_MAX_USERD_NAME];
-  char description[Z_MAXFILENP];
-  int i,j;
-
-  *any_extra_gui = FALSE;
-  *any_var_extract = FALSE;
-
-  /* Get the reader name
-   *--------------------*/
-  err = USERD_get_name_of_reader(reader_name,two_fields);
-  if(err == Z_OK) {
-    fprintf(stderr," Name of reader: %s\n",reader_name);
-    if(*two_fields==1) {
-      fprintf(stderr," two_fields:     TRUE\n");
-    }
-    else if(*two_fields==0){
-      fprintf(stderr," two_fields:     FALSE\n");
-    }
-    else if(*two_fields < 0) {
-      fprintf(stderr," two_fields:     -1 (optional string) \n");
-    }
-  }
-  else {
-    fprintf(stderr,"Error: Could not get name of reader\n");
-    return(Z_ERR);
-  }
-
-  /* Get the Extra GUI stuff (optional)
-   * ---------------------------------------------------------- */
-#ifdef _EGS
-
-  /* Get the Extra GUI numbers of toggles, pulldowns, & fields
-   * ---------------------------------------------------------- */
-
-  USERD_get_extra_gui_numbers( &Num_toggles,
-                               &Num_pulldowns,
-                               &Num_fields );
-
-  if ( Num_toggles > 0 || Num_pulldowns > 0 || Num_fields > 0 ) {
-
-    *any_extra_gui = TRUE;
-
-    if (Num_toggles>0) {
-      Toggle_title = (char **) calloc(Num_toggles,sizeof(char*));
-      if (Toggle_title == (char **)NULL) return(Z_ERR);
-      for (i=0; i<Num_toggles; i++) {
-        Toggle_title[i] = (char *) calloc(Z_LEN_GUI_TITLE_STR,sizeof(char));
-        if ( Toggle_title[i] == (char *)NULL ) return(Z_ERR);
-      }
-      Toggle_default_status = (int *) calloc(Num_toggles,sizeof(int));
-      Toggle_choice = (int *) calloc(Num_toggles,sizeof(int));
-    }
-
-    if (Num_pulldowns > 0) {
-      Pulldown_title = (char **) calloc( Num_pulldowns , sizeof(char*) );
-      if (Pulldown_title == (char **)NULL) return(Z_ERR);
-
-      Pulldown_item_strings = (char ***) calloc( Num_pulldowns , sizeof(char**) );
-      if (Pulldown_item_strings == (char ***)NULL) return(Z_ERR);
-
-      for (i=0; i<Num_pulldowns; i++) {
-        Pulldown_title[i] = (char *) calloc( Z_LEN_GUI_TITLE_STR , sizeof(char) );
-        if ( Pulldown_title[i] == (char *)NULL ) return(Z_ERR);
-
-        Pulldown_item_strings[i] = (char **) calloc( Z_MAX_NUM_GUI_PULL_ITEMS , sizeof(char *) );
-        if (Pulldown_item_strings[i] == (char **)NULL) return(Z_ERR);
-
-        for(j = 0; j < Z_MAX_NUM_GUI_PULL_ITEMS; j++) {
-          Pulldown_item_strings[i][j] = (char *) calloc( Z_LEN_GUI_PULL_STR , sizeof(char) );
-          if ( Pulldown_item_strings[i][j] == (char *)NULL ) return(Z_ERR);
-        }
-      }
-      Pulldown_number_in_list = (int *) calloc(Num_pulldowns,sizeof(int));
-      Pulldown_default_selection = (int *) calloc(Num_pulldowns,sizeof(int));
-      Pulldown_choice = (int *) calloc(Num_pulldowns,sizeof(int));
-    }
-
-    if (Num_fields > 0) {
-      Field_title = (char **) calloc(Num_fields,sizeof(char*));
-      Field_user_string = (char **) calloc(Num_fields,sizeof(char*));
-      if (Field_title == (char **) NULL) return(Z_ERR);
-      for (i=0; i<Num_fields; i++) {
-        Field_title[i] = (char *) calloc(Z_LEN_GUI_TITLE_STR,sizeof(char));
-        if ( Field_title[i] == (char *)NULL) return(Z_ERR);
-        Field_user_string[i] = (char *) calloc(Z_LEN_GUI_FIELD_STR,sizeof(char));
-        if ( Field_user_string[i] == (char *)NULL) return(Z_ERR);
-      }
-    }
-
-
-    err = USERD_get_extra_gui_defaults(
-          Toggle_title,                 /* [num_toggles][Z_LEN_GUI_TITLE_STR] */
-          Toggle_default_status,        /* [num_toggles] */
-          Pulldown_title,               /* [num_pulldowns][Z_LEN_GUI_TITLE_STR] */
-          Pulldown_number_in_list,      /* [num_pulldowns] */
-          Pulldown_default_selection,   /* [num_pulldowns] */
-          Pulldown_item_strings,        /* [num_pulldowns][Z_MAX_NUM_GUI_PULL_ITEMS][Z_LEN_GUI_PULL_STR] */
-          Field_title,                  /* [num_fields][Z_LEN_GUI_TITLE_STR] */
-          Field_user_string              /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-                                       );
-    if (Z_ERR == err) return(Z_ERR);
-
-    fprintf(stderr,"\n**********************************************\n");
-    fprintf(stderr,"****          Extra GUI Information        ***\n");
-    fprintf(stderr,"**********************************************\n\n");
-
-    fprintf(stderr,"\nTOGGLE INFO: %d active toggles\n",Num_toggles);
-    for (i=0; i<Num_toggles; i++) {
-      fprintf(stderr,"Toggle Title %d : %s\n",i,Toggle_title[i]);
-      fprintf(stderr,"Default status = %d \n",Toggle_default_status[i]);
-    }
-
-    fprintf(stderr,"\nPULLDOWN INFO: %d active pulldowns\n",Num_pulldowns);
-    for (i=0; i<Num_pulldowns; i++) {
-      fprintf(stderr,"Pulldown Title %d : %s\n", i , Pulldown_title[i] );
-      for (j=0; j<Z_MAX_NUM_GUI_PULL_ITEMS; j++) {
-        fprintf(stderr,"Pulldown_item %d : %s\n",j,Pulldown_item_strings[i][j]);
-        if (strlen(Pulldown_item_strings[i][j]) == 0) {
-          Pulldown_number_in_list[i] = j;
-          break;
-        }
-      }
-      fprintf(stderr,"Number of items in list: %d\n",Pulldown_number_in_list[i]);
-      fprintf(stderr,"Default selection: %d\n\n",Pulldown_default_selection[i]);
-    }
-    fprintf(stderr,"\n");
-
-    fprintf(stderr,"\nFIELDINFO: %d active fields\n",Num_fields);
-    for (i=0; i<Num_fields; i++) {
-      fprintf(stderr,"Field Title %d : %s\n",i,Field_title[i]);
-      fprintf(stderr,"Field string %d: %s\n",i,Field_user_string[i]);
-    }
-    fprintf(stderr,"\n\n\n");
-  }
-#endif
-
-
-  /* Get the var_extract stuff (optional)
-   * ---------------------------------------------------------- */
-#ifdef _VES
-
-  /* Get the var_extract numbers of toggles, pulldowns, & fields
-   * ---------------------------------------------------------- */
-  USERD_get_var_extract_gui_numbers(&Num_ve_toggles,
-                                    &Num_ve_pulldowns,
-                                    &Num_ve_fields );
-  if ( Num_ve_toggles > 0 || Num_ve_pulldowns > 0 || Num_ve_fields > 0 ) {
-
-    *any_var_extract = TRUE;
-
-    if (Num_ve_toggles > 0) {
-      Toggle_ve_title = (char **) calloc(Num_ve_toggles,sizeof(char*));
-      if (Toggle_ve_title == (char **)NULL) return(Z_ERR);
-      for (i=0; i<Num_ve_toggles; i++) {
-        Toggle_ve_title[i] = (char *) calloc(Z_LEN_GUI_TITLE_STR,sizeof(char));
-        if ( Toggle_ve_title[i] == (char *)NULL ) return(Z_ERR);
-      }
-      Toggle_ve_default_status = (int *) calloc(Num_ve_toggles,sizeof(int));
-      Toggle_ve_choice = (int *) calloc(Num_ve_toggles,sizeof(int));
-    }
-
-    if (Num_ve_pulldowns > 0) {
-      Pulldown_ve_title = (char **) calloc( Num_ve_pulldowns , sizeof(char*) );
-      if (Pulldown_ve_title == (char **)NULL) return(Z_ERR);
-
-      Pulldown_ve_item_strings = (char ***) calloc( Num_ve_pulldowns , sizeof(char**) );
-      if (Pulldown_ve_item_strings == (char ***)NULL) return(Z_ERR);
-
-      for (i=0; i<Num_ve_pulldowns; i++) {
-        Pulldown_ve_title[i] = (char *) calloc( Z_LEN_GUI_TITLE_STR , sizeof(char) );
-        if ( Pulldown_ve_title[i] == (char *)NULL ) return(Z_ERR);
-
-        Pulldown_ve_item_strings[i] = (char **)calloc(Z_MAX_NUM_GUI_PULL_ITEMS, sizeof(char *));
-        if (Pulldown_ve_item_strings[i] == (char **)NULL) return(Z_ERR);
-
-        for(j = 0; j < Z_MAX_NUM_GUI_PULL_ITEMS; j++) {
-          Pulldown_ve_item_strings[i][j] = (char *) calloc( Z_LEN_GUI_PULL_STR , sizeof(char) );
-          if ( Pulldown_ve_item_strings[i][j] == (char *)NULL ) return(Z_ERR);
-        }
-      }
-      Pulldown_ve_number_in_list = (int *) calloc(Num_ve_pulldowns,sizeof(int));
-      Pulldown_ve_default_selection = (int *) calloc(Num_ve_pulldowns,sizeof(int));
-      Pulldown_ve_choice = (int *) calloc(Num_ve_pulldowns,sizeof(int));
-    }
-
-    if (Num_ve_fields > 0) {
-      Field_ve_title = (char **) calloc(Num_ve_fields,sizeof(char*));
-      Field_ve_user_string = (char **) calloc(Num_ve_fields,sizeof(char*));
-      if (Field_ve_title == (char **) NULL) return(Z_ERR);
-      for (i=0; i<Num_ve_fields; i++) {
-        Field_ve_title[i] = (char *) calloc(Z_LEN_GUI_TITLE_STR,sizeof(char));
-        if ( Field_ve_title[i] == (char *)NULL) return(Z_ERR);
-        Field_ve_user_string[i] = (char *) calloc(Z_LEN_GUI_FIELD_STR,sizeof(char));
-        if ( Field_ve_user_string[i] == (char *)NULL) return(Z_ERR);
-      }
-    }
-
-
-    err = USERD_get_var_extract_gui_defaults(
-          Toggle_ve_title,                 /* [num_ve_toggles][Z_LEN_GUI_TITLE_STR] */
-          Toggle_ve_default_status,        /* [num_ve_toggles] */
-          Pulldown_ve_title,               /* [num_ve_pulldowns][Z_LEN_GUI_TITLE_STR] */
-          Pulldown_ve_number_in_list,      /* [num_ve_pulldowns] */
-          Pulldown_ve_default_selection,   /* [num_ve_pulldowns] */
-          Pulldown_ve_item_strings,        /* [num_ve_pulldowns][Z_MAX_NUM_GUI_PULL_ITEMS][Z_LEN_GUI_PULL_STR] */
-          Field_ve_title,                  /* [num_ve_fields][Z_LEN_GUI_TITLE_STR] */
-          Field_ve_user_string             /* [num_ve_fields][Z_LEN_GUI_FIELD_STR] */
-                                             );
-    if (Z_ERR == err) return(Z_ERR);
-
-    fprintf(stderr,"\n**********************************************\n");
-    fprintf(stderr,"****          Var Extract Information      ***\n");
-    fprintf(stderr,"**********************************************\n\n");
-
-    fprintf(stderr,"\nTOGGLE INFO: %d active toggles\n",Num_ve_toggles);
-    for (i=0; i<Num_ve_toggles; i++) {
-      fprintf(stderr,"Toggle Title %d : %s\n",i,Toggle_ve_title[i]);
-      fprintf(stderr,"Default status = %d \n",Toggle_ve_default_status[i]);
-    }
-
-    fprintf(stderr,"\nPULLDOWN INFO: %d active pulldowns\n",Num_ve_pulldowns);
-    for (i=0; i<Num_ve_pulldowns; i++) {
-      fprintf(stderr,"Pulldown Title %d : %s\n", i , Pulldown_ve_title[i] );
-      for (j=0; j<Z_MAX_NUM_GUI_PULL_ITEMS; j++) {
-        fprintf(stderr,"Pulldown_item %d : %s\n",j,Pulldown_ve_item_strings[i][j]);
-        if (strlen(Pulldown_ve_item_strings[i][j]) == 0) {
-          Pulldown_ve_number_in_list[i] = j;
-          break;
-        }
-      }
-      fprintf(stderr,"Number of items in list: %d\n",Pulldown_ve_number_in_list[i]);
-      fprintf(stderr,"Default selection: %d\n\n",Pulldown_ve_default_selection[i]);
-    }
-    fprintf(stderr,"\n");
-
-    fprintf(stderr,"\nFIELDINFO: %d active fields\n",Num_ve_fields);
-    for (i=0; i<Num_ve_fields; i++) {
-      fprintf(stderr,"Field Title %d : %s\n",i,Field_ve_title[i]);
-      fprintf(stderr,"Field string %d: %s\n",i,Field_ve_user_string[i]);
-    }
-    fprintf(stderr,"\n\n\n");
-  }
-#endif
-
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the reader api used
-   *------------------------*/
-  err = USERD_get_reader_version(Version_number);
-  if(err == Z_OK) {
-    fprintf(stderr," API version:    %s\n",Version_number);
-  }
-  else {
-    fprintf(stderr,"Error: Could not get reader api version\n");
-    return(Z_ERR);
-  }
-
-  /* Get the reader release
-   *-----------------------*/
-  err = USERD_get_reader_release(release_number);
-  if(err == Z_OK) {
-    fprintf(stderr," Release:        %s\n",release_number);
-  }
-  else {
-    fprintf(stderr,"Error: Could not get reader release\n");
-    return(Z_ERR);
-  }
-#else
-  fprintf(stderr," API version:    1.00\n");
-#endif
-
-
-#if 0
-  /* Get the reader description
-   *---------------------------*/
-  err = USERD_get_reader_descrip(description);
-  if(err == Z_OK) {
-    fprintf(stderr," Description:\n\n");
-    fprintf(stderr,"%s\n\n",description);
-  }
-  else {
-    fprintf(stderr,"Error: Could not get reader description\n");
-    return(Z_ERR);
-  }
-#else
-  fprintf(stderr,"  Note: Not currently calling USERD_get_reader_descrip\n");
-  fprintf(stderr,"        because it is optional.\n");
-#endif
-
-  return(Z_OK);
-}
-
-
-/*----------
- * get_input
- *----------*/
-static int
-get_input(int set_server_number,
-          int use_playfile,
-          char playfile[Z_MAXFILENP],
-          int two_fields,
-          int any_extra_gui,
-          int any_var_extract,
-          int *swapbytes)
-{
-  FILE *fplay;
-
-  int i, j;
-  int err;
-  int tot_servers;
-  int cur_server;
-  char the_path[Z_MAXFILENP];
-  char file1[Z_MAXFILENP];
-  char file2[Z_MAXFILENP];
-  char filename_1[Z_MAXFILENP];
-  char filename_2[Z_MAXFILENP];
-
-
-  fprintf(stderr,"\n-------------- get_input ----------------\n");
-
-  /*-----------------------------------------------------
-   * Prompt for the two input values, as the client would
-   * And set this info for the reader
-   *-----------------------------------------------------*/
-
-#if (defined GT_USERD_API_100)
-
-  /* Set the server number - if command line option to do so
-   *--------------------------------------------------------*/
-  if(set_server_number) {
-    fprintf(stderr,"     Enter total number of servers: ");
-    scanf("%d",&tot_servers);
-
-    fprintf(stderr,"     Enter current server number: ");
-    scanf("%d",&cur_server);
-
-    fprintf(stderr," Setting %d of %d for server number\n",cur_server,tot_servers);
-    USERD_set_server_number(cur_server,tot_servers);
-  }
-#endif
-
-  /* Set the filenames
-   *------------------*/
-  memset(the_path,EOS,Z_MAXFILENP);
-  memset(file1,EOS,Z_MAXFILENP);
-  memset(file2,EOS,Z_MAXFILENP);
-  memset(filename_1,EOS,Z_MAXFILENP);
-  memset(filename_2,EOS,Z_MAXFILENP);
-
-
-  if(!use_playfile) {
-    fprintf(stderr,"     Enter the path: ");
-    scanf("%s",the_path);
-
-
-    fprintf(stderr,"     Enter filename_1: ");
-    scanf("%s",file1);
-
-    if(two_fields == TRUE) {
-      fprintf(stderr,"     Enter filename_2: ");
-      scanf("%s",file2);
-    }
-
-    fprintf(stderr,"     Enter Swapbytes (0 if FALSE, 1 if TRUE): ");
-    scanf("%d",swapbytes);
-
-    if (TRUE == any_extra_gui ) {
-      fprintf(stderr,"\n**********************************************\n");
-      fprintf(stderr,"****          Extra GUI INPUT                ***\n");
-      fprintf(stderr,"**********************************************\n\n");
-
-      fprintf(stderr, "\n      TOGGLE INPUT \n");
-      for (i=0; i<Num_toggles; i++) {
-        fprintf(stderr, "      Enter Toggle Value for '%s' (1=toggle on, 0=toggle off)\n",Toggle_title[i]);
-        scanf("%d",&Toggle_choice[i]);
-      }
-      fprintf(stderr, "\n      PULLDOWN INPUT \n");
-      for (i=0; i<Num_pulldowns; i++) {
-        fprintf(stderr, "\n      PULLDOWN # %d \n",i);
-        for (j = 0; j<Pulldown_number_in_list[i]; j++) {
-          fprintf(stderr, "              %d %s\n",j,Pulldown_item_strings[i][j]);
-        }
-        fprintf(stderr, "              Enter Pulldown Value for '%s' (0 to %d)\n",Pulldown_title[i],Pulldown_number_in_list[i]-1);
-        scanf("%d",&Pulldown_choice[i]);
-      }
-      fprintf(stderr, "\n      FIELD INPUT \n");
-      for (i=0; i<Num_fields; i++) {
-        fprintf(stderr, "Enter string for field %d '%s'\n",i,Field_title[i]);
-        scanf("%s",Field_user_string[i]);
-      }
-
-    }                /* end if there is any extra gui stuff */
-
-    if (TRUE == any_var_extract ) {
-      fprintf(stderr,"\n**********************************************\n");
-      fprintf(stderr,"****          Var extract INPUT            ***\n");
-      fprintf(stderr,"**********************************************\n\n");
-
-      fprintf(stderr, "\n      TOGGLE INPUT \n");
-      for (i=0; i<Num_ve_toggles; i++) {
-        fprintf(stderr, "      Enter Toggle Value for '%s' (1=toggle on, 0=toggle off)\n",Toggle_ve_title[i]);
-        scanf("%d",&Toggle_ve_choice[i]);
-      }
-      fprintf(stderr, "\n      PULLDOWN INPUT \n");
-      for (i=0; i<Num_ve_pulldowns; i++) {
-        fprintf(stderr, "\n      PULLDOWN # %d \n",i);
-        for (j = 0; j<Pulldown_ve_number_in_list[i]; j++) {
-          fprintf(stderr, "              %d %s\n",j,Pulldown_ve_item_strings[i][j]);
-        }
-        fprintf(stderr, "              Enter Pulldown Value for '%s' (0 to %d)\n",Pulldown_ve_title[i],Pulldown_ve_number_in_list[i]-1);
-        scanf("%d",&Pulldown_ve_choice[i]);
-      }
-      fprintf(stderr, "\n      FIELD INPUT \n");
-      for (i=0; i<Num_ve_fields; i++) {
-        fprintf(stderr, "Enter string for field %d '%s'\n",i,Field_ve_title[i]);
-        scanf("%s",Field_ve_user_string[i]);
-      }
-
-    }                /* end if there is any var_extract stuff */
-
-  }                  /* end if not using playfile */
-  else {
-    fplay = fopen(playfile,"rb");
-    if(fplay == (FILE *)NULL) {
-      fprintf(stderr,"Error: Opening the playfile %s\n",playfile);
-      return(Z_ERR);
-    }
-    else {
-      fscanf(fplay,"%s",the_path);
-      fscanf(fplay,"%s",file1);
-      if(two_fields == TRUE) {
-        fscanf(fplay,"%s",file2);
-      }
-      fscanf(fplay,"%d",swapbytes);
-
-      /* ---------------------
-       * Extra GUI stuff
-       * --------------------- */
-      if (TRUE == any_extra_gui) {
-
-        for (i=0; i<Num_toggles; i++) {
-          fscanf(fplay,"%d",&Toggle_choice[i]);
-        }
-
-        for (i=0; i<Num_pulldowns; i++) {
-          fscanf(fplay,"%d",&Pulldown_choice[i]);
-        }
-
-        for (i=0; i<Num_fields; i++) {
-          fscanf(fplay,"%s",Field_user_string[i]);
-        }
-      }
-
-      /* ---------------------
-       * var_sxtract stuff
-       * --------------------- */
-      if (TRUE == any_var_extract) {
-
-        for (i=0; i<Num_ve_toggles; i++) {
-          fscanf(fplay,"%d",&Toggle_ve_choice[i]);
-        }
-
-        for (i=0; i<Num_ve_pulldowns; i++) {
-          fscanf(fplay,"%d",&Pulldown_ve_choice[i]);
-        }
-
-        for (i=0; i<Num_ve_fields; i++) {
-          fscanf(fplay,"%s",Field_ve_user_string[i]);
-        }
-      }
-
-      fclose(fplay);
-    }
-  }
-
-#ifdef _EGS
-  /* -------------------------------------------
-   * set the user choices here and run the code
-   * ------------------------------------------- */
-
-  /* set your choices here
-     Toggle_choice[0..Num_toggles]
-     Pulldown_choice[0..Num_pulldowns]
-     Field_user_string[Num_fields][0..Numfields]
-     amd then send your choices into this routine */
-
-  USERD_set_extra_gui_data(Toggle_choice,            /* [num_toggle] */
-                           Pulldown_choice,          /* [num_pulldown] */
-                           Field_user_string  );    /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-
-  for (i=0; i<Num_toggles; i++) {
-    fprintf(stderr,"Toggle Title %d : %s\n",i,Toggle_title[i]);
-    fprintf(stderr,"User selection = %d \n",Toggle_choice[i]);
-  }
-  fprintf(stderr,"\n\n");
-
-  for (i=0; i<Num_pulldowns; i++) {
-    fprintf(stderr,"Pulldown Title %d : %s\n", i , Pulldown_title[i] );
-    fprintf(stderr,"Pulldown selection is # %d : %s\n",
-            Pulldown_choice[i],Pulldown_item_strings[i][Pulldown_choice[i]]);
-  }
-
-  for (i=0; i<Num_fields; i++) {
-    fprintf(stderr,"Field Title %d : %s\n",i,Field_title[i]);
-    fprintf(stderr,"Field string %d: %s\n",i,Field_user_string[i]);
-
-  }
-#endif
-
-#ifdef _VES
-  /* -------------------------------------------
-   * set the user choices here and run the code
-   * ------------------------------------------- */
-
-  /* set your choices here
-     Toggle_ve_choice[0..Num_ve_toggles]
-     Pulldown_ve_choice[0..Num_ve_pulldowns]
-     Field_ve_user_string[Num_ve_fields][0..Numfields]
-     amd then send your choices into this routine */
-
-  USERD_set_var_extract_gui_data(Toggle_ve_choice,      /* [num_ve_toggle] */
-                                 Pulldown_ve_choice,    /* [num_ve_pulldown] */
-                                 Field_ve_user_string); /*[num_ve_fields][Z_LEN_GUI_FIELD_STR] */
-
-  for (i=0; i<Num_ve_toggles; i++) {
-    fprintf(stderr,"Toggle Title %d : %s\n",i,Toggle_ve_title[i]);
-    fprintf(stderr,"User selection = %d \n",Toggle_ve_choice[i]);
-  }
-  fprintf(stderr,"\n\n");
-
-  for (i=0; i<Num_ve_pulldowns; i++) {
-    fprintf(stderr,"Pulldown Title %d : %s\n", i , Pulldown_ve_title[i] );
-    fprintf(stderr,"Pulldown selection is # %d : %s\n",
-            Pulldown_ve_choice[i],Pulldown_ve_item_strings[i][Pulldown_ve_choice[i]]);
-  }
-
-  for (i=0; i<Num_ve_fields; i++) {
-    fprintf(stderr,"Field Title %d : %s\n",i,Field_ve_title[i]);
-    fprintf(stderr,"Field string %d: %s\n",i,Field_ve_user_string[i]);
-  }
-#endif
-
-
-  if(strncmp(file1,"/",1)) {
-    strcpy(filename_1,the_path);
-    strcat(filename_1,"/");
-    strcat(filename_1,file1);
-  }
-  if(two_fields == TRUE) {
-    if(strncmp(file2,"/",1)) {
-      strcpy(filename_2,the_path);
-      strcat(filename_2,"/");
-      strcat(filename_2,file2);
-    }
-  }
-  if(*swapbytes == 0) {
-    *swapbytes = FALSE;
-  }
-  else {
-    *swapbytes = TRUE;
-  }
-
-  /* Feedback
-   *---------*/
-  fprintf(stderr," path: %s\n",the_path);
-  fprintf(stderr," filename_1: %s\n",filename_1);
-  fprintf(stderr," filename_2: %s\n",filename_2);
-  if(*swapbytes) {
-    fprintf(stderr," Swapbytes:    TRUE\n");
-  }
-  else {
-    fprintf(stderr," Swapbytes:    FALSE\n");
-  }
-
-  err = USERD_set_filenames(filename_1,filename_2,the_path,*swapbytes);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: Trouble setting the filenames\n");
-    return(Z_ERR);
-  }
-
-  return(Z_OK);
-}
-
-
-/*----------
- * time_info
- *----------*/
-static int
-time_info( void )
-{
-  int i;
-  int err;
-  int geom_time_set;
-  int ts;
-  float *sol_times;
-  char ts_desc[Z_BUFL];
-
-  fprintf(stderr,"\n-------------- time_info ----------------\n");
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the number of timesets
-   *---------------------------*/
-  Num_time_sets = USERD_get_number_of_timesets();
-  fprintf(stderr," number of timesets: %d\n",Num_time_sets);
-  if(Num_time_sets == 0) {
-    fprintf(stderr," So, static geometry and variables\n");
-    return(Z_OK);
-  }
-
-  /* Get the timeset used for the geometry
-   *--------------------------------------*/
-  geom_time_set = USERD_get_geom_timeset_number();
-
-  fprintf(stderr," geom timeset number: %d\n",geom_time_set);
-  if(geom_time_set < 1 && Num_time_sets > 0) {
-    fprintf(stderr,"Error: timeset numbers must be 1 or greater\n");
-    fprintf(stderr,"       (unless Num_time_sets is zero also)\n");
-  }
-
-
-  /* For each timeset
-   *-----------------*/
-  for(ts=1; ts<=Num_time_sets; ++ts) {
-
-    fprintf(stderr," Timeset %d:\n",ts);
-
-    /* Get the timeset descriptions
-     *-----------------------------*/
-    err = USERD_get_timeset_description(ts,ts_desc);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Error: getting timeset description\n");
-      return(Z_ERR);
-    }
-    else {
-      fprintf(stderr,"   description: %s\n",ts_desc);
-    }
-
-    /* Get the number of time steps
-     *-----------------------------*/
-    Num_time_steps = USERD_get_num_of_time_steps(ts);
-    fprintf(stderr,"   number of time steps: %d\n",Num_time_steps);
-    if(Num_time_steps < 1) {
-      fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-      fprintf(stderr," (Must be >0 to be okay)\n");
-      return(Z_ERR);
-    }
-
-
-    /* Get the solution times
-     *-----------------------*/
-    if(Num_time_steps > 0) {
-      sol_times = (float *) calloc(Num_time_steps,sizeof(float));
-      if(sol_times == (float *)NULL) {
-        fprintf(stderr,"Error: allocating for solution times\n");
-        return(Z_ERR);
-      }
-      else {
-        err = USERD_get_sol_times(ts,sol_times);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting solution times\n");
-          return(Z_ERR);
-        }
-        else {
-          for(i=0; i<Num_time_steps; ++i) {
-            fprintf(stderr,"   At step %d, time = %f\n",i,sol_times[i]);
-          }
-        }
-      }
-      free(sol_times);
-    }
-  }
-
-#else
-
-
-  /* Get the number of time steps
-   *-----------------------------*/
-  Num_time_steps = USERD_get_number_of_time_steps();
-  fprintf(stderr," Nnumber of time steps: %d\n",Num_time_steps);
-  if(Num_time_steps < 1) {
-    fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-    fprintf(stderr," (Must be >0 to be okay)\n");
-    return(Z_ERR);
-  }
-
-
-  /* Get the solution times
-   *-----------------------*/
-  if(Num_time_steps > 0) {
-    sol_times = (float *) calloc(Num_time_steps,sizeof(float));
-    if(sol_times == (float *)NULL) {
-      fprintf(stderr,"Error: allocating for solution times\n");
-      return(Z_ERR);
-    }
-    else {
-      err = USERD_get_solution_times(sol_times);
-      if(err == Z_ERR) {
-        fprintf(stderr,"Error: getting solution times\n");
-        return(Z_ERR);
-      }
-      else {
-        for(i=0; i<Num_time_steps; ++i) {
-          fprintf(stderr,"   At step %d, time = %f\n",i,sol_times[i]);
-        }
-      }
-    }
-    free(sol_times);
-  }
-
-#endif
-
-  return(Z_OK);
-}
-
-
-
-/*----------------
- * part_build_info
- *----------------*/
-static int
-part_build_info(int geom_time_step)
-{
-  int i, j;
-  int fn;
-  int err;
-  int num_dataset_files;
-  int geom_time_set;
-  Z_QFILES *qfiles;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-
-  int *part_ids;
-  int *part_types;
-  int *number_of_nodes;
-  int **num_elems;
-  int **ijk_dimensions;
-  int **iblanking_options;
-  char **part_descriptions;
-
-  int ghosts_in_block;
-
-  int *max_num_nodes;
-  int **max_num_elems;
-  int **max_ijk_dimensions;
-  float extents[6];
-
-
-  fprintf(stderr,"\n------------ part_build_info ------------\n");
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the timeset used for the geometry
-   *--------------------------------------*/
-  geom_time_set = USERD_get_geom_timeset_number();
-
-  /* Get the number of time steps for this timeset
-   *----------------------------------------------*/
-  Num_time_steps = USERD_get_num_of_time_steps(geom_time_set);
-  if(Num_time_steps < 1) {
-    fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-    fprintf(stderr," (Must be >0 to be okay)\n");
-    return(Z_ERR);
-  }
-  if(geom_time_step > (Num_time_steps - 1)) {
-    geom_time_step = Num_time_steps - 1;
-  }
-
-  /* Set the timeset and step - to first step
-   *-----------------------------------------*/
-  USERD_set_time_set_and_step(geom_time_set,geom_time_step);
-
-#else
-
-  /* Set the time step - to first step
-   *----------------------------------*/
-  USERD_set_time_step(geom_time_step);
-
-#endif
-
-  /* Get the changing geometry status
-   *---------------------------------*/
-  Geom_status = USERD_get_changing_geometry_status();
-  if(Geom_status == Z_STATIC) {
-    fprintf(stderr," Geom changing status: Z_STATIC\n");
-  }
-  else if(Geom_status == Z_CHANGE_COORDS) {
-    fprintf(stderr," Geom changing status: Z_CHANGE_COORDS\n");
-  }
-  else if(Geom_status == Z_CHANGE_CONN) {
-    fprintf(stderr," Geom changing status: Z_CHANGE_CONN\n");
-  }
-  else {
-    fprintf(stderr," Invalid Geom changing status!!\n");
-  }
-
-
-  /* Get the node label status
-   *--------------------------*/
-  Node_labels = USERD_get_node_label_status();
-  if(Node_labels) {
-    fprintf(stderr," Node labels will be provided\n");
-  }
-  else {
-    fprintf(stderr," Node labels will NOT be provided\n");
-  }
-
-  /* Get the element label status
-   *-----------------------------*/
-  Element_labels = USERD_get_element_label_status();
-  if(Element_labels) {
-    fprintf(stderr," Element labels will be provided\n");
-  }
-  else {
-    fprintf(stderr," Element labels will NOT be provided\n");
-  }
-
-  fprintf(stderr,"\n");
-
-  /* Get the number of files in the dataset
-   *---------------------------------------*/
-  num_dataset_files = USERD_get_number_of_files_in_dataset();
-  fprintf(stderr," Number of files in dataset: %d\n",num_dataset_files);
-
-
-  /* Get the dataset query file info
-   *--------------------------------*/
-  if(num_dataset_files > 0) {
-
-    qfiles = (Z_QFILES *) calloc(num_dataset_files,sizeof(Z_QFILES));
-    if(qfiles == (Z_QFILES *)NULL) {
-      fprintf(stderr,"Error: allocating for dataset query files\n");
-      return(Z_ERR);
-    }
-    else {
-
-      for(i=0; i<num_dataset_files; ++i) {
-        qfiles[i].f_desc = (char **) calloc(10,sizeof(char *));
-        if(qfiles[i].f_desc == (char **)NULL) {
-          fprintf(stderr,"Error: allocating for dataset query descrip lines\n");
-          return(Z_ERR);
-        }
-        else {
-          for(j=0; j<10; ++j) {
-            qfiles[i].f_desc[j] = (char *) calloc(Z_MAXFILENP,sizeof(char));
-            if(qfiles[i].f_desc[j] == (char *)NULL) {
-              fprintf(stderr,"Error: allocating for dataset query descrip lines\n");
-              return(Z_ERR);
-            }
-          }
-        }
-      }
-
-      err = USERD_get_dataset_query_file_info(qfiles);
-      if(err == Z_OK) {
-        for(fn=0; fn<num_dataset_files; ++fn) {
-          fprintf(stderr," For dataset file %d:\n",fn);
-
-          fprintf(stderr,"   name:           %s\n",qfiles[fn].name);
-          fprintf(stderr,"   size:           %d\n",qfiles[fn].sizeb);
-          fprintf(stderr,"   time:           %s\n",qfiles[fn].timemod);
-          fprintf(stderr,"   num desc lines: %d\n",qfiles[fn].num_d_lines);
-          for(i=0; i<qfiles[fn].num_d_lines; ++i) {
-            fprintf(stderr,"    desc line %d: %s\n",i,qfiles[fn].f_desc[i]);
-          }
-        }
-      }
-      else {
-        fprintf(stderr,"Error: getting dataset query info\n");
-        return(Z_ERR);
-      }
-    }
-
-    /* Free allocated memory
-     *----------------------*/
-    for(i=0; i<num_dataset_files; ++i) {
-      for(j=0; j<10; ++j) {
-        free(qfiles[i].f_desc[j]);
-      }
-      free(qfiles[i].f_desc);
-    }
-    free(qfiles);
-  }
-
-  fprintf(stderr,"\n-----------------------------------------\n");
-
-#if (defined GT_USERD_API_100)
-
-  /* Get the geometry description lines
-   *-----------------------------------*/
-  err = USERD_get_descrip_lines(Z_GEOM,0,FALSE,line1,line2);
-  if(err == Z_OK) {
-    fprintf(stderr," Geom Desc line1: %s\n",line1);
-    fprintf(stderr," Geom Desc line2: %s\n",line2);
-  }
-  else {
-    fprintf(stderr,"Error: getting geom description lines\n");
-    return(Z_ERR);
-  }
-
-#else
-
-  /* Get the geometry description lines
-   *-----------------------------------*/
-  err = USERD_get_description_lines(Z_GEOM,0,line1,line2);
-  if(err == Z_OK) {
-    fprintf(stderr," Geom Desc line1: %s\n",line1);
-    fprintf(stderr," Geom Desc line2: %s\n",line2);
-  }
-  else {
-    fprintf(stderr,"Error: getting geom description lines\n");
-    return(Z_ERR);
-  }
-
-#endif
-
-  /* Get the number of model parts
-   *------------------------------*/
-  Num_parts = USERD_get_number_of_model_parts();
-  if(Num_parts > 0) {
-    fprintf(stderr," Number of parts: %d\n",Num_parts);
-  }
-  else {
-    fprintf(stderr," Problems getting number of parts\n");
-    return(Z_ERR);
-  }
-
-
-
-  /* Get the gold part build info
-   *-----------------------------*/
-  Pbuild = (BUILDINFO *) calloc(Num_parts,sizeof(BUILDINFO));
-  if(Pbuild == (BUILDINFO *)NULL) {
-    fprintf(stderr," Problems allocating for Pbuild structure\n");
-    return(Z_ERR);
-  }
-
-
-  part_ids = (int *) calloc(Num_parts,sizeof(int));
-  if(part_ids == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part ids\n");
-    return(Z_ERR);
-  }
-
-  part_types = (int *) calloc(Num_parts,sizeof(int));
-  if(part_types == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part types\n");
-    return(Z_ERR);
-  }
-
-  part_descriptions = (char **) calloc(Num_parts,sizeof(char *));
-  if(part_descriptions == (char **)NULL) {
-    fprintf(stderr," Problems allocating for part descriptions\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      part_descriptions[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(part_descriptions[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for part descriptions\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  number_of_nodes = (int *) calloc(Num_parts,sizeof(int));
-  if(number_of_nodes == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part number of nodes\n");
-    return(Z_ERR);
-  }
-
-  num_elems = (int **) calloc(Num_parts,sizeof(int *));
-  if(num_elems == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part number of elements\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      num_elems[i] = (int *) calloc(Z_MAXTYPE,sizeof(int));
-      if(num_elems[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part number of elements\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  ijk_dimensions = (int **) calloc(Num_parts,sizeof(int *));
-  if(ijk_dimensions == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part ijk dimensions\n");
-    return(Z_ERR);
-  }
-  else {
-
-#if (defined GT_USERD_API_202)
-    for(i=0; i<Num_parts; ++i) {
-      ijk_dimensions[i] = (int *) calloc(9,sizeof(int));
-      if(ijk_dimensions[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part ijk dimensions\n");
-        return(Z_ERR);
-      }
-      else {
-        for(j=0; j<9; ++j) {
-          ijk_dimensions[i][j] = -1;
-        }
-      }
-    }
-#else
-    for(i=0; i<Num_parts; ++i) {
-      ijk_dimensions[i] = (int *) calloc(3,sizeof(int));
-      if(ijk_dimensions[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part ijk dimensions\n");
-        return(Z_ERR);
-      }
-    }
-#endif
-  }
-
-  iblanking_options = (int **) calloc(Num_parts,sizeof(int *));
-  if(iblanking_options == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part iblanking options\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      iblanking_options[i] = (int *) calloc(6,sizeof(int));
-      if(iblanking_options[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part iblanking options\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-
-#if (defined GT_USERD_API_100)
-
-  err = USERD_get_gold_part_build_info(part_ids,
-                                       part_types,
-                                       part_descriptions,
-                                       number_of_nodes,
-                                       num_elems,
-                                       ijk_dimensions,
-                                       iblanking_options);
-#else
-
-  err = USERD_get_part_build_info(part_ids,
-                                  part_types,
-                                  part_descriptions,
-                                  num_elems,
-                                  ijk_dimensions,
-                                  iblanking_options);
-
-#endif
-
-  if(err == Z_ERR) {
-    fprintf(stderr," Problems getting part build info\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      fprintf(stderr," For part %d:\n",i+1);
-
-      fprintf(stderr,"   part id:   %d\n",part_ids[i]);
-      Pbuild[i].id = part_ids[i];
-
-      if(part_types[i] == Z_UNSTRUCTURED) {
-        fprintf(stderr,"   part type: Z_UNSTRUCTURED\n");
-      }
-      else if(part_types[i] == Z_STRUCTURED) {
-        fprintf(stderr,"   part type: Z_STRUCTURED\n");
-      }
-      else if(part_types[i] == Z_IBLANKED) {
-        fprintf(stderr,"   part type: Z_IBLANKED\n");
-      }
-      else {
-        fprintf(stderr,"   Invalid part type\n");
-        return(Z_ERR);
-      }
-      Pbuild[i].type = part_types[i];
-
-      fprintf(stderr,"   part desc:   %s\n",part_descriptions[i]);
-      strncpy(Pbuild[i].desc,part_descriptions[i],Z_BUFL);
-
-#if (defined GT_USERD_API_100)
-      fprintf(stderr,"   number of nodes :   %d\n",number_of_nodes[i]);
-      Pbuild[i].nn = number_of_nodes[i];
-#else
-      Pbuild[i].nn = USERD_get_number_of_global_nodes();
-#endif
-
-      for(j=0; j<Z_MAXTYPE; ++j) {
-        if(num_elems[i][j] > 0) {
-          fprintf(stderr,"   # %s elements:   %d\n",
-                  Elem_info[j].name,num_elems[i][j]);
-          Pbuild[i].ne[j] = num_elems[i][j];
-        }
-      }
-
-      if(part_types[i] != Z_UNSTRUCTURED) {
-
-        /* For this checker, we will place the following in the
-         * Pbuild[].ne[] structure:
-         *
-         *   Note this can be used for block size whether ranges or not
-         *   -------------------------------------------------------------
-         *   Pbuild[].ne[0] = i dim of current block (to the range selected)
-         *   Pbuild[].ne[1] = j dim of current block (to the range selected)
-         *   Pbuild[].ne[2] = k dim of current block (to the range selected)
-         *
-         *   Thus if ranges:
-         *   ---------------
-         *   Pbuild[].ne[3] = i min range          (-1 indicates no ranges)
-         *   Pbuild[].ne[4] = i max range
-         *   Pbuild[].ne[5] = i min range
-         *   Pbuild[].ne[6] = i max range
-         *   Pbuild[].ne[7] = i min range
-         *   Pbuild[].ne[8] = i max range
-         *
-         *   Pbuild[].ne[9]  = i dim of total block (if ranges)
-         *   Pbuild[].ne[10] = j dim of total block (if ranges)
-         *   Pbuild[].ne[11] = k dim of total block (if ranges)
-         *
-         *   What comes back from the api is:
-         *   --------------------------------
-         *   before 2.03 (no ranges)
-         *   -----------------------
-         *   ijk_dimensions[][0] = i dim of block
-         *   ijk_dimensions[][1] = j dim of block
-         *   ijk_dimensions[][2] = k dim of block
-         *
-         *   at 2.03 (if no ranges)
-         *   -------
-         *   ijk_dimensions[][0] = i dim of block
-         *   ijk_dimensions[][1] = j dim of block
-         *   ijk_dimensions[][2] = k dim of block
-         *   ijk_dimensions[][3] = -1
-         *
-         *   at 2.03 (if ranges)
-         *   -------
-         *   ijk_dimensions[][0] = i dim of total block
-         *   ijk_dimensions[][1] = j dim of total block
-         *   ijk_dimensions[][2] = k dim of total block
-         *   ijk_dimensions[][3] = i min range
-         *   ijk_dimensions[][4] = i max range
-         *   ijk_dimensions[][5] = j min range
-         *   ijk_dimensions[][6] = j max range
-         *   ijk_dimensions[][7] = k min range
-         *   ijk_dimensions[][8] = k max range
-         *--------------------------------------------------------------*/
-
-#if (defined GT_USERD_API_202)
-        if(ijk_dimensions[i][3] == -1) {
-          fprintf(stderr,"   ijk_dimensions: %d %d %d\n",
-                  ijk_dimensions[i][0],
-                  ijk_dimensions[i][1],
-                  ijk_dimensions[i][2]);
-          Pbuild[i].ne[0] = ijk_dimensions[i][0];
-          Pbuild[i].ne[1] = ijk_dimensions[i][1];
-          Pbuild[i].ne[2] = ijk_dimensions[i][2];
-          Pbuild[i].ne[3] = ijk_dimensions[i][3];
-        }
-        else {
-
-          /* If empty part
-           *--------------*/
-          if(ijk_dimensions[i][0] == 0 &&
-             ijk_dimensions[i][1] == 0 &&
-             ijk_dimensions[i][2] == 0) {
-            fprintf(stderr,"   ijk_dimensions: %d %d %d\n",
-                    ijk_dimensions[i][0],
-                    ijk_dimensions[i][1],
-                    ijk_dimensions[i][2]);
-            Pbuild[i].ne[0] = ijk_dimensions[i][0];
-            Pbuild[i].ne[1] = ijk_dimensions[i][1];
-            Pbuild[i].ne[2] = ijk_dimensions[i][2];
-            Pbuild[i].ne[3] = -1;
-          }
-
-          /* range part
-           *-----------*/
-          else {
-            Pbuild[i].ne[0] = ijk_dimensions[i][4] - ijk_dimensions[i][3] + 1;
-            Pbuild[i].ne[1] = ijk_dimensions[i][6] - ijk_dimensions[i][5] + 1;
-            Pbuild[i].ne[2] = ijk_dimensions[i][8] - ijk_dimensions[i][7] + 1;
-
-            Pbuild[i].ne[3] = ijk_dimensions[i][3];
-            Pbuild[i].ne[4] = ijk_dimensions[i][4];
-            Pbuild[i].ne[5] = ijk_dimensions[i][5];
-            Pbuild[i].ne[6] = ijk_dimensions[i][6];
-            Pbuild[i].ne[7] = ijk_dimensions[i][7];
-            Pbuild[i].ne[8] = ijk_dimensions[i][8];
-
-            Pbuild[i].ne[9] = ijk_dimensions[i][0];
-            Pbuild[i].ne[10] = ijk_dimensions[i][1];
-            Pbuild[i].ne[11] = ijk_dimensions[i][2];
-
-            fprintf(stderr,"   Part has ranges:\n");
-            fprintf(stderr,"   ijk dimensions of total block: %d %d %d\n",
-                    Pbuild[i].ne[9],
-                    Pbuild[i].ne[10],
-                    Pbuild[i].ne[11]);
-            fprintf(stderr,"     i range: %d  to  %d\n",
-                    Pbuild[i].ne[3],
-                    Pbuild[i].ne[4]);
-            fprintf(stderr,"     j range: %d  to  %d\n",
-                    Pbuild[i].ne[5],
-                    Pbuild[i].ne[6]);
-            fprintf(stderr,"     k range: %d  to  %d\n",
-                    Pbuild[i].ne[7],
-                    Pbuild[i].ne[8]);
-            fprintf(stderr,"   ijk dimensions of range portion: %d %d %d\n",
-                    Pbuild[i].ne[0],
-                    Pbuild[i].ne[1],
-                    Pbuild[i].ne[2]);
-          }
-        }
-#else
-        fprintf(stderr,"   ijk_dimensions: %d %d %d\n",
-                ijk_dimensions[i][0],
-                ijk_dimensions[i][1],
-                ijk_dimensions[i][2]);
-        Pbuild[i].ne[0] = ijk_dimensions[i][0];
-        Pbuild[i].ne[1] = ijk_dimensions[i][1];
-        Pbuild[i].ne[2] = ijk_dimensions[i][2];
-        Pbuild[i].ne[3] = -1;
-#endif
-        if(part_types[i] == Z_IBLANKED) {
-          fprintf(stderr,"   Ibanking options on:\n");
-          if(iblanking_options[i][Z_EXT]) {
-            fprintf(stderr,"     Z_EXT\n");
-          }
-          if(iblanking_options[i][Z_INT]) {
-            fprintf(stderr,"     Z_INT\n");
-          }
-          if(iblanking_options[i][Z_BND]) {
-            fprintf(stderr,"     Z_BND\n");
-          }
-          if(iblanking_options[i][Z_INTBND]) {
-            fprintf(stderr,"     Z_INTBND\n");
-          }
-          if(iblanking_options[i][Z_SYM]) {
-            fprintf(stderr,"     Z_SYM\n");
-          }
-        }
-      }
-    }
-  }
-
-
-#if (defined GT_USERD_API_200)
-
-  /* Get ghosts in model flag
-   *-------------------------*/
-  Ghosts_in_model = USERD_get_ghosts_in_model_flag();
-  if(Ghosts_in_model) {
-    fprintf(stderr," Ghosts in Model:  TRUE\n");
-  }
-  else {
-    fprintf(stderr," Ghosts in Model:  FALSE\n");
-  }
-
-  /* Get ghosts in block flag - if needed
-   *-------------------------------------*/
-  for(i=1; i<=Num_parts; ++i) {
-    if(part_types[i-1] != Z_UNSTRUCTURED && Ghosts_in_model) {
-      ghosts_in_block = USERD_get_ghosts_in_block_flag(i);
-      Pbuild[i-1].ghosts = ghosts_in_block;
-      if(ghosts_in_block) {
-        fprintf(stderr," Ghosts in block part %d:  TRUE\n",i);
-      }
-      else {
-        fprintf(stderr," Ghosts in block part %d:  FALSE\n",i);
-      }
-    }
-  }
-
-#endif
-
-
-#if (defined GT_USERD_API_100)
-
-  /* Get maxsize info
-   *-----------------*/
-  max_num_nodes = (int *) calloc(Num_parts,sizeof(int));
-  if(max_num_nodes == (int *)NULL) {
-    fprintf(stderr," Problems allocating for part max num of nodes\n");
-    return(Z_ERR);
-  }
-
-  max_num_elems = (int **) calloc(Num_parts,sizeof(int *));
-  if(max_num_elems == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part max num of elements\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      max_num_elems[i] = (int *) calloc(Z_MAXTYPE,sizeof(int));
-      if(max_num_elems[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part max_num of elements\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  max_ijk_dimensions = (int **) calloc(Num_parts,sizeof(int *));
-  if(max_ijk_dimensions == (int **)NULL) {
-    fprintf(stderr," Problems allocating for part max ijk dimensions\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_parts; ++i) {
-      max_ijk_dimensions[i] = (int *) calloc(3,sizeof(int));
-      if(max_ijk_dimensions[i] == (int *)NULL) {
-        fprintf(stderr," Problems allocating for part max ijk dimensions\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  err = USERD_get_maxsize_info(max_num_nodes,
-                               max_num_elems,
-                               max_ijk_dimensions);
-  if(err == Z_ERR) {
-    fprintf(stderr," No maxsize info provided (or error getting them)\n");
-  }
-  else {
-
-    for(i=0; i<Num_parts; ++i) {
-      fprintf(stderr," For part %d:\n",i+1);
-
-      fprintf(stderr,"   max number of nodes :   %d\n",max_num_nodes[i]);
-
-      for(j=0; j<Z_MAXTYPE; ++j) {
-        if(max_num_elems[i][j] > 0) {
-          fprintf(stderr,"   max # %s elems:   %d\n",
-                  Elem_info[j].name,max_num_elems[i][j]);
-        }
-      }
-
-      if(part_types[i] != Z_UNSTRUCTURED) {
-        fprintf(stderr,"   max_ijk_dimensions: %d %d %d\n",
-                max_ijk_dimensions[i][0],
-                max_ijk_dimensions[i][1],
-                max_ijk_dimensions[i][2]);
-      }
-    }
-  }
-
-  /* Get model extents - if given
-   *-----------------------------*/
-  err = USERD_get_model_extents(extents);
-  if(err == Z_ERR) {
-    fprintf(stderr," No extents given\n");
-  }
-  else {
-    fprintf(stderr," Min x: %g\n",extents[0]);
-    fprintf(stderr," Max x: %g\n",extents[1]);
-    fprintf(stderr," Min y: %g\n",extents[2]);
-    fprintf(stderr," Max y: %g\n",extents[3]);
-    fprintf(stderr," Min z: %g\n",extents[4]);
-    fprintf(stderr," Max z: %g\n",extents[5]);
-  }
-
-#endif
-
-  /* Free the allocated memory
-   *--------------------------*/
-  free(part_ids);
-  free(part_types);
-  free(number_of_nodes);
-
-  for(i=0; i<Num_parts; ++i) {
-    free(ijk_dimensions[i]);
-    free(num_elems[i]);
-    free(part_descriptions[i]);
-  }
-  free(ijk_dimensions);
-  free(num_elems);
-  free(iblanking_options);
-  free(part_descriptions);
-
-#if (defined GT_USERD_API_100)
-  for(i=0; i<Num_parts; ++i) {
-    free(max_ijk_dimensions[i]);
-    free(max_num_elems[i]);
-  }
-  free(max_num_nodes);
-  free(max_num_elems);
-  free(max_ijk_dimensions);
-
-#endif
-
-  return(Z_OK);
-}
-
-
-/*--------------
- * variable_info
- *--------------*/
-static int
-variable_info( void )
-{
-  int i,j;
-  int err;
-
-  char **var_description;
-  char **var_filename;
-  int *var_type;
-  int *var_classify;
-  int *var_complex;
-  char **var_ifilename;
-  float *var_freq;
-  int *var_contran;
-  int *var_timeset;
-
-
-  fprintf(stderr,"\n------------ variable_info --------------\n");
-
-  /* Get the number of variables
-   *----------------------------*/
-  Num_vars = USERD_get_number_of_variables();
-  if(Num_vars < 0) {
-    fprintf(stderr,"Error: getting the number of variables\n");
-  }
-  else {
-    fprintf(stderr," Number of variables: %d\n",Num_vars);
-  }
-
-
-  /* Get the gold variable info
-   *---------------------------*/
-  Varinfo = (VARINFO *) calloc(Num_vars,sizeof(VARINFO));
-  if(Varinfo == (VARINFO *)NULL) {
-    fprintf(stderr," Problems allocating for Varinfo structure\n");
-    return(Z_ERR);
-  }
-
-
-  var_description = (char **) calloc(Num_vars,sizeof(char *));
-  if(var_description == (char **)NULL) {
-    fprintf(stderr," Problems allocating for var description\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-      var_description[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(var_description[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for var description\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  var_filename = (char **) calloc(Num_vars,sizeof(char *));
-  if(var_filename == (char **)NULL) {
-    fprintf(stderr," Problems allocating for var filename\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-      var_filename[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(var_filename[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for var filename\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  var_type = (int *) calloc(Num_vars,sizeof(int));
-  if(var_type == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var type\n");
-    return(Z_ERR);
-  }
-
-  var_classify = (int *) calloc(Num_vars,sizeof(int));
-  if(var_classify == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var classify\n");
-    return(Z_ERR);
-  }
-
-  var_complex = (int *) calloc(Num_vars,sizeof(int));
-  if(var_complex == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var complex\n");
-    return(Z_ERR);
-  }
-
-
-  var_ifilename = (char **) calloc(Num_vars,sizeof(char *));
-  if(var_ifilename == (char **)NULL) {
-    fprintf(stderr," Problems allocating for var ifilename\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-      var_ifilename[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(var_ifilename[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for var ifilename\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  var_freq = (float *) calloc(Num_vars,sizeof(float));
-  if(var_freq == (float *)NULL) {
-    fprintf(stderr," Problems allocating for var freq\n");
-    return(Z_ERR);
-  }
-
-  var_contran = (int *) calloc(Num_vars,sizeof(int));
-  if(var_contran == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var contran\n");
-    return(Z_ERR);
-  }
-
-  var_timeset = (int *) calloc(Num_vars,sizeof(int));
-  if(var_timeset == (int *)NULL) {
-    fprintf(stderr," Problems allocating for var timeset\n");
-    return(Z_ERR);
-  }
-
-#if (defined GT_USERD_API_100)
-
-  err = USERD_get_gold_variable_info(var_description,
-                                     var_filename,
-                                     var_type,
-                                     var_classify,
-                                     var_complex,
-                                     var_ifilename,
-                                     var_freq,
-                                     var_contran,
-                                     var_timeset);
-#else
-
-  err = USERD_get_variable_info(var_description,
-                                var_filename,
-                                var_type,
-                                var_classify);
-
-#endif
-
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: getting variable info\n");
-  }
-  else {
-    for(i=0; i<Num_vars; ++i) {
-
-      /* Loading the global
-       * (for use in other routines)
-       *----------------------------*/
-      strncpy(Varinfo[i].description,var_description[i],Z_BUFL);
-      strncpy(Varinfo[i].filename,var_filename[i],Z_BUFL);
-      strncpy(Varinfo[i].ifilename,var_ifilename[i],Z_BUFL);
-      Varinfo[i].type     = var_type[i];
-      Varinfo[i].classify = var_classify[i];
-      Varinfo[i].complex  = var_complex[i];
-      Varinfo[i].freq     = var_freq[i];
-      Varinfo[i].contran  = var_contran[i];
-      Varinfo[i].timeset  = var_timeset[i];
-
-      /* Echo some feedback
-       *-------------------*/
-      fprintf(stderr," For Variable %d:\n",i+1);
-
-      fprintf(stderr,"   var desc:      %s\n",var_description[i]);
-      fprintf(stderr,"   var filename:  %s\n",var_filename[i]);
-
-#if (defined GT_USERD_API_100)
-      if(var_complex[i]) {
-        fprintf(stderr,"   var complex:   TRUE\n");
-        fprintf(stderr,"   var ifilename: %s\n",var_ifilename[i]);
-        fprintf(stderr,"   var freq:      %g\n",var_freq[i]);
-      }
-      else {
-        fprintf(stderr,"   var complex:   FALSE\n");
-      }
-#endif
-
-      if(var_type[i] == Z_CONSTANT) {
-        fprintf(stderr,"   var type:      Z_CONSTANT\n");
-
-#if (defined GT_USERD_API_100)
-        if(var_contran[i]) {
-          fprintf(stderr,"   var contran:  TRUE\n");
-        }
-        else {
-          fprintf(stderr,"   var contran:  FALSE\n");
-        }
-#endif
-
-      }
-      else if(var_type[i] == Z_SCALAR) {
-        fprintf(stderr,"   var type:      Z_SCALAR\n");
-      }
-      else if(var_type[i] == Z_VECTOR) {
-        fprintf(stderr,"   var type:      Z_VECTOR\n");
-      }
-      else if(var_type[i] == Z_TENSOR) {
-        fprintf(stderr,"   var type:      Z_TENSOR\n");
-      }
-      else if(var_type[i] == Z_TENSOR9) {
-        fprintf(stderr,"   var type:      Z_TENSOR9\n");
-      }
-      else {
-        fprintf(stderr,"   Invalid var type\n");
-        return(Z_ERR);
-      }
-
-      if(var_classify[i] == Z_PER_NODE) {
-        fprintf(stderr,"   var classify:  Z_PER_NODE\n");
-      }
-      else if(var_classify[i] == Z_PER_ELEM) {
-        fprintf(stderr,"   var classify:  Z_PER_ELEM\n");
-      }
-      else if(var_classify[i] != Z_CONSTANT) {
-        fprintf(stderr,"   Invalid var classify\n");
-        return(Z_ERR);
-      }
-
-#if (defined GT_USERD_API_100)
-      fprintf(stderr,"   var timeset:   %d\n",var_timeset[i]);
-#endif
-    }
-  }
-
-  /* Free the allocated memory
-   *--------------------------*/
-  for(i=0; i<Num_vars; ++i) {
-    free(var_description[i]);
-    free(var_filename[i]);
-    free(var_ifilename[i]);
-  }
-  free(var_description);
-  free(var_filename);
-  free(var_ifilename);
-  free(var_type);
-  free(var_classify);
-  free(var_complex);
-  free(var_freq);
-  free(var_contran);
-  free(var_timeset);
-
-  return(Z_OK);
-}
-
-
-#if (defined GT_USERD_API_100)
-/*------------------
- * gold_part_builder
- *------------------*/
-static int
-gold_part_builder(int geom_time_step)
-{
-  int i, j, k, jj, kk;
-  int err;
-  int geom_timeset;
-  int p, pn;
-  int et, ne;
-  int *elemids;
-  int **conns;
-  int nn;
-  int comp;
-  int bdim[3];
-  int ib[5];
-  int num_ghosts;
-  int num_dims;
-  int cell_type;
-  float mm[6];
-  float **coords;
-  int *nodeids;
-  int *iblanking;
-  int *ghost_flag;
-  short *parent_type;
-  int *parent_num;
-  int num_elems[Z_MAXTYPE];
-  CRD *crds;
-  int bd1,bd2,bd3;
-  int empty_part;
-  int *pdata;
-  int nsid_len;
-  int *nsid_con;
-  int nface_len;
-  int *nface_con;
-  int npf_len;
-  int *npf_con;
-  int maxcheck;
-  int num_failed = 0;
-  int *fail_flags = (int *) NULL;
-  float values[14], vals[10];
-
-  fprintf(stderr,"\n------------- part_builder --------------\n");
-
-  if(Num_time_sets > 0) {
-    /* Get the timeset used for the geometry
-     *--------------------------------------*/
-    geom_timeset = USERD_get_geom_timeset_number();
-
-    /* Get the number of time steps for this timeset
-     *----------------------------------------------*/
-    Num_time_steps = USERD_get_num_of_time_steps(geom_timeset);
-    if(Num_time_steps < 1) {
-      fprintf(stderr," Error: Number of time steps returned: %d\n",Num_time_steps);
-      fprintf(stderr," (Must be >0 to be okay)\n");
-      return(Z_ERR);
-    }
-    if(geom_time_step > (Num_time_steps - 1)) {
-      geom_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the timeset and step - to first step by default, but
-     * can set it at others using -gts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_set_and_step(geom_timeset,geom_time_step);
-
-    fprintf(stderr," Using timeset:   %d  (step range is %d through %d)\n",
-            geom_timeset,0,Num_time_steps-1);
-    fprintf(stderr," Using time step: %d\n",geom_time_step);
-  }
-
-  for(p=0; p<Num_parts; ++p) {
-    pn = p+1;
-
-    fprintf(stderr,"\n\n----------------------------------------");
-    fprintf(stderr," Part %d:\n",pn);
-
-    /*-----------------------
-     * For unstructured parts
-     *-----------------------*/
-    if(Pbuild[p].type == Z_UNSTRUCTURED) {
-
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-
-          pdata = (int *)calloc(ne*Elem_info[et].con_len,sizeof(int));
-          if(pdata == (int *) NULL) {
-            fprintf(stderr,"Error: allocating conns array\n");
-            return(Z_ERR);
-          }
-          else {
-            conns = (int **) calloc(ne,sizeof(int *));
-            if(conns == (int **) NULL) {
-              fprintf(stderr,"Error: allocating conns array\n");
-              return(Z_ERR);
-            }
-            for(i=0; i<ne; ++i) {
-              conns[i] = pdata;
-              pdata += Elem_info[et].con_len;
-            }
-          }
-
-
-          /* Get the elements
-           *-----------------*/
-          err = USERD_get_part_elements_by_type(pn,et,conns);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting element connectivities\n");
-            return(Z_ERR);
-          }
-
-          if(Element_labels) {
-            elemids = (int *) calloc(ne,sizeof(int));
-            if(elemids == (int *) NULL) {
-              fprintf(stderr,"Error: allocating elemids array\n");
-              return(Z_ERR);
-            }
-          }
-
-          /* Get the element ids - if any
-           *-----------------------------*/
-          if(Element_labels) {
-            err = USERD_get_part_element_ids_by_type(pn,et,elemids);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting element ids\n");
-              return(Z_ERR);
-            }
-          }
-
-          /* Echo "some" info
-           *-----------------*/
-
-#if (defined GT_USERD_API_202)
-
-          maxcheck = Z_NSIDED;
-
-          /* Nsided elements, if any
-           *------------------------*/
-          if(et == Z_NSIDED ||
-             et == Z_G_NSIDED) {
-
-            nsid_len = 0;
-            for(i=0; i<ne; ++i) {
-              nsid_len += conns[i][0];
-            }
-
-            nsid_con = (int *) calloc(nsid_len,sizeof(int));
-            if(nsid_con == (int *) NULL) {
-              fprintf(stderr,"Error: allocating nsided conn array\n");
-              return(Z_ERR);
-            }
-
-            err = USERD_get_nsided_conn(pn,nsid_con);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting nsided conn array\n");
-              return(Z_ERR);
-            }
-
-            /* First element of the type
-             *--------------------------*/
-            i = 0;
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            if(Element_labels) {
-              fprintf(stderr,"      id: %d\n",elemids[i]);
-            }
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<conns[i][0]; ++j) {
-              fprintf(stderr," %d",nsid_con[j]);
-            }
-            fprintf(stderr,"\n");
-
-            /* Last element of the type
-             *-------------------------*/
-            i = ne - 1;
-            if(i > 0) {
-              fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-              if(Element_labels) {
-                fprintf(stderr,"      id: %d\n",elemids[i]);
-              }
-              fprintf(stderr,"      connectivity:");
-
-              for(j=nsid_len-conns[i][0]; j<nsid_len; ++j) {
-                fprintf(stderr," %d",nsid_con[j]);
-              }
-              fprintf(stderr,"\n");
-            }
-          }
-
-          /* Nfaced elements if any
-           *-----------------------*/
-          if(et == Z_NFACED ||
-             et == Z_G_NFACED) {
-
-            nface_len = 0;
-            for(i=0; i<ne; ++i) {
-              nface_len += conns[i][0];
-            }
-
-            nface_con = (int *) calloc(nface_len,sizeof(int));
-            if(nface_con == (int *) NULL) {
-              fprintf(stderr,"Error: allocating nfaced face array\n");
-              return(Z_ERR);
-            }
-
-            err = USERD_get_nfaced_nodes_per_face(pn,nface_con);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting nfaced face array array\n");
-              return(Z_ERR);
-            }
-
-            npf_len = 0;
-            for(i=0; i<nface_len; ++i) {
-              npf_len += nface_con[i];
-            }
-
-            npf_con = (int *) calloc(npf_len,sizeof(int));
-            if(npf_con == (int *) NULL) {
-              fprintf(stderr,"Error: allocating nfaced npf array\n");
-              return(Z_ERR);
-            }
-
-            err = USERD_get_nfaced_conn(pn,npf_con);
-            if(err == Z_ERR) {
-              fprintf(stderr,"Error: getting nfaced conn array\n");
-              return(Z_ERR);
-            }
-
-            /* First element of the type
-             *--------------------------*/
-            jj = 0;
-            kk = 0;
-            for(i=0; i<ne; ++i) {
-
-              if(i == 0 ||
-                 i == ne-1) {
-                fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,
-                        i+1,ne);
-                if(Element_labels) {
-                  fprintf(stderr,"      id: %d\n",elemids[i]);
-                }
-                for(j=0; j<conns[i][0]; ++j) {
-                  fprintf(stderr,"      face %d connectivity:",j+1);
-                  for(k=0; k<nface_con[jj]; ++k) {
-                    fprintf(stderr," %d",npf_con[kk]);
-                    ++kk;
-                  }
-                  fprintf(stderr,"\n");
-                  ++jj;
-                }
-              }
-              else {
-                for(j=0; j<conns[i][0]; ++j) {
-                  for(k=0; k<nface_con[jj]; ++k) {
-                    ++kk;
-                  }
-                  ++jj;
-                }
-              }
-            }
-          }
-#else
-
-          maxcheck = Z_MAXTYPE;
-
-#endif
-
-          /* Regular elements
-           *-----------------*/
-          if(et < maxcheck) {
-
-            /* First element of the type
-             *--------------------------*/
-            i = 0;
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            if(Element_labels) {
-              fprintf(stderr,"      id: %d\n",elemids[i]);
-            }
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<Elem_info[et].con_len; ++j) {
-              fprintf(stderr," %d",conns[i][j]);
-            }
-            fprintf(stderr,"\n");
-
-            /* check the connectivity for negative numbers
-             * -------------------------------------------*/
-#if defined GT_USERD_API_100
-            for (i=0;i<ne;i++){
-              for(j=0; j<Elem_info[et].con_len; ++j) {
-                /* ---------- uncomment to print out connectivity values ---------- */
-/*              fprintf(stderr," %d",conns[i][j]);  */
-                if (conns[i][j] <= 0 || conns[i][j] > Pbuild[p].nn ) {
-                  fprintf(stderr,"\n****************************\n");
-                  fprintf(stderr,"Connectivity value out of bounds: \n");
-                  fprintf(stderr,"Either less than zero or greater than \n");
-                  fprintf(stderr,"  number of nodes in part!!  \n");
-                  fprintf(stderr,"i = %d   j = %d  conns[i][j] = %d \n",i,j,conns[i][j]);
-                  fprintf(stderr,"****************************\n");
-                }
-              }
-                /* ---------- uncomment to print out connectivity values ---------- */
-/*            fprintf(stderr,"\n"); */
-            }
-#endif
-            /* Last element of the type
-             *-------------------------*/
-            i = ne - 1;
-            if(i > 0) {
-              fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-              if(Element_labels) {
-                fprintf(stderr,"      id: %d\n",elemids[i]);
-              }
-              fprintf(stderr,"      connectivity:");
-              for(j=0; j<Elem_info[et].con_len; ++j) {
-                fprintf(stderr," %d",conns[i][j]);
-              }
-              fprintf(stderr,"\n");
-            }
-          }
-
-          /* Free the allocated memory
-           *--------------------------*/
-          if(NULL != conns) {
-            if(NULL != *conns) {
-              free(*conns);
-              *conns = NULL;
-            }
-            free(conns);
-            conns = NULL;
-          }
-
-          if(Element_labels) {
-            free(elemids);
-          }
-        }
-      }
-
-      /* Get the coords
-       *---------------*/
-      nn = Pbuild[p].nn;
-
-      if(nn > 0) {
-
-        coords = (float **) calloc(3,sizeof(float *));
-        if(coords == (float **) NULL) {
-          fprintf(stderr,"Error: allocating coords array\n");
-          return(Z_ERR);
-        }
-        else {
-          for(i=0; i<3; ++i) {
-            coords[i] = (float *) calloc((nn+1),sizeof(float));
-            if(coords[i] == (float *) NULL) {
-              fprintf(stderr,"Error: allocating coords array\n");
-              return(Z_ERR);
-            }
-          }
-        }
-
-        if(Node_labels) {
-          nodeids = (int *) calloc((nn+1),sizeof(int));
-          if(nodeids == (int *) NULL) {
-            fprintf(stderr,"Error: allocating nodeids array\n");
-            return(Z_ERR);
-          }
-        }
-
-
-        err = USERD_get_part_coords(pn,coords);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting unstructured coords\n");
-          return(Z_ERR);
-        }
-
-        if(Node_labels) {
-          err = USERD_get_part_node_ids(pn,nodeids);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting nodeids\n");
-            return(Z_ERR);
-          }
-        }
-
-        /* Echo "some" info
-         *-----------------*/
-
-        /* First node
-         *-----------*/
-        i = 1;
-        fprintf(stderr,"   Node %d of %d:\n",i,nn);
-        if(Node_labels) {
-          fprintf(stderr,"      id: %d\n",nodeids[i]);
-        }
-        fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                coords[0][i], coords[1][i], coords[2][i]);
-        mm[0] = mm[1] = coords[0][i];
-        mm[2] = mm[3] = coords[1][i];
-        mm[4] = mm[5] = coords[2][i];
-
-
-        /* Last node
-         *----------*/
-        i = nn;
-        if(i > 1) {
-          fprintf(stderr,"   Node %d of %d:\n",i,nn);
-          if(Node_labels) {
-            fprintf(stderr,"      id: %d\n",nodeids[i]);
-          }
-          fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                  coords[0][i], coords[1][i], coords[2][i]);
-        }
-
-        /* Min and max coordinate values
-         *------------------------------*/
-        for(i=2; i<=nn; ++i) {
-          if(coords[0][i] < mm[0]) {
-            mm[0] = coords[0][i];
-          }
-          if(coords[0][i] > mm[1]) {
-            mm[1] = coords[0][i];
-          }
-          if(coords[1][i] < mm[2]) {
-            mm[2] = coords[1][i];
-          }
-          if(coords[1][i] > mm[3]) {
-            mm[3] = coords[1][i];
-          }
-          if(coords[2][i] < mm[4]) {
-            mm[4] = coords[2][i];
-          }
-          if(coords[2][i] > mm[5]) {
-            mm[5] = coords[2][i];
-          }
-        }
-
-        fprintf(stderr,"   Coordinate ranges:\n");
-        fprintf(stderr,"      min x: %g\n",mm[0]);
-        fprintf(stderr,"      max x: %g\n",mm[1]);
-        fprintf(stderr,"      min y: %g\n",mm[2]);
-        fprintf(stderr,"      max y: %g\n",mm[3]);
-        fprintf(stderr,"      min z: %g\n",mm[4]);
-        fprintf(stderr,"      max z: %g\n",mm[5]);
-
-
-        /* Free the allocated memory
-         *--------------------------*/
-        for(i=0; i<3; ++i) {
-          free(coords[i]);
-        }
-        free(coords);
-        if(Node_labels) {
-          free(nodeids);
-        }
-      }
-    }
-
-
-    /*---------------------
-     * For structured parts
-     *---------------------*/
-    else {
-
-      empty_part = FALSE;
-      if(Pbuild[p].ne[0] == 0 &&
-         Pbuild[p].ne[1] == 0 &&
-         Pbuild[p].ne[2] == 0) {
-        empty_part = TRUE;
-      }
-
-      if(!empty_part) {
-
-        /* Get the block coords
-         *---------------------*/
-        for(comp=0; comp<3; ++comp) {
-          if(Pbuild[p].ne[comp] < 1) {
-            bdim[comp] = 1;
-          }
-          else {
-
-            if(Doing_Structured_Cinching) {
-              bdim[comp] = Pbuild[p].ne[comp];
-
-              /* even */
-              if((bdim[comp] % 2) == 0) {
-                bdim[comp] = (bdim[comp]/2) + 1;
-              }
-              /* odd */
-              else {
-                bdim[comp] = ((bdim[comp]-1)/2) + 1;
-              }
-            }
-
-            else {
-              bdim[comp] = Pbuild[p].ne[comp];
-            }
-          }
-        }
-
-        nn = bdim[0] * bdim[1] * bdim[2];
-
-        bd1 = bdim[0]-1;
-        if(bd1 < 1) {
-          bd1 = 1;
-        }
-        bd2 = bdim[1]-1;
-        if(bd2 < 1) {
-          bd2 = 1;
-        }
-        bd3 = bdim[2]-1;
-        if(bd3 < 1) {
-          bd3 = 1;
-        }
-        ne = bd1 * bd2 * bd3;
-
-        /* Determine cell type
-         *--------------------*/
-        num_dims = 3;
-        for(i=0; i<3; ++i) {
-          if(bdim[i] == 1) {
-            --num_dims;
-          }
-        }
-        if(num_dims == 3) {
-          cell_type = Z_HEX08;
-        }
-        else if(num_dims == 2) {
-          cell_type = Z_QUA04;
-        }
-        else {
-          cell_type = Z_BAR02;
-        }
-
-        coords = (float **) calloc(num_dims,sizeof(float *));
-        if(coords == (float **) NULL) {
-          fprintf(stderr,"Error: allocating coords array\n");
-          return(Z_ERR);
-        }
-        else {
-          for(i=0; i<num_dims; ++i) {
-            coords[i] = (float *) calloc(nn,sizeof(float));
-            if(coords[i] == (float *) NULL) {
-              fprintf(stderr,"Error: allocating coords array\n");
-              return(Z_ERR);
-            }
-          }
-        }
-
-        /* Get the coords
-         *---------------*/
-        for(comp=0; comp<num_dims; ++comp) {
-
-          /* For structured cinching, send in one less on each end and stride of 2
-           *----------------------------------------------------------------------*/
-          if(Doing_Structured_Cinching) {
-            err = USERD_set_block_range_and_stride(pn,
-                                                   0, Pbuild[p].ne[0]-1, 2,
-                                                   0, Pbuild[p].ne[1]-1, 2,
-                                                   0, Pbuild[p].ne[2]-1, 2);
-          }
-
-          err = USERD_get_block_coords_by_component(pn,comp,coords[comp]);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting block coords\n");
-            return(Z_ERR);
-          }
-        }
-
-
-#if (defined GT_USERD_API_200)
-
-        if(Node_labels) {
-          nodeids = (int *) calloc(nn,sizeof(int));
-          if(nodeids == (int *) NULL) {
-            fprintf(stderr,"Error: allocating nodeids array\n");
-            return(Z_ERR);
-          }
-        }
-        /* Get the node ids - if any
-         *--------------------------*/
-        if(Node_labels) {
-          err = USERD_get_part_node_ids(pn,nodeids);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting nodeids\n");
-            return(Z_ERR);
-          }
-        }
-#endif
-
-        /* Echo "some" info
-         *-----------------*/
-
-        /* First node
-         *-----------*/
-        if(nn > 0) {
-          i = 0;
-          fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-#if (defined GT_USERD_API_200)
-
-          if(Node_labels) {
-            fprintf(stderr,"      id: %d\n",nodeids[i]);
-          }
-#endif
-          if(num_dims == 3) {
-            fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                    coords[0][i], coords[1][i], coords[2][i]);
-            mm[0] = mm[1] = coords[0][i];
-            mm[2] = mm[3] = coords[1][i];
-            mm[4] = mm[5] = coords[2][i];
-          }
-          else if(num_dims == 2) {
-            fprintf(stderr,"      x y coordinates: %g %g\n",
-                    coords[0][i], coords[1][i]);
-            mm[0] = mm[1] = coords[0][i];
-            mm[2] = mm[3] = coords[1][i];
-          }
-          else {
-            fprintf(stderr,"      x coordinates: %g\n",
-                    coords[0][i]);
-            mm[0] = mm[1] = coords[0][i];
-          }
-
-
-          /* Last node
-           *----------*/
-          i = nn-1;
-          if(i > 1) {
-            fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-#if (defined GT_USERD_API_200)
-            if(Node_labels) {
-              fprintf(stderr,"      id: %d\n",nodeids[i]);
-            }
-#endif
-            if(num_dims == 3) {
-              fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                      coords[0][i], coords[1][i], coords[2][i]);
-            }
-            else if(num_dims == 2) {
-              fprintf(stderr,"      x y coordinates: %g %g\n",
-                      coords[0][i], coords[1][i]);
-            }
-            else {
-              fprintf(stderr,"      x coordinates: %g\n",
-                      coords[0][i]);
-            }
-          }
-        }
-
-        /* Min and max coordinate values
-         *------------------------------*/
-        for(i=1; i<nn; ++i) {
-          if(coords[0][i] < mm[0]) {
-            mm[0] = coords[0][i];
-          }
-          if(coords[0][i] > mm[1]) {
-            mm[1] = coords[0][i];
-          }
-          if(num_dims > 1) {
-            if(coords[1][i] < mm[2]) {
-              mm[2] = coords[1][i];
-            }
-            if(coords[1][i] > mm[3]) {
-              mm[3] = coords[1][i];
-            }
-          }
-          if(num_dims > 2) {
-            if(coords[2][i] < mm[4]) {
-              mm[4] = coords[2][i];
-            }
-            if(coords[2][i] > mm[5]) {
-              mm[5] = coords[2][i];
-            }
-          }
-        }
-
-        fprintf(stderr,"   Coordinate ranges:\n");
-        fprintf(stderr,"      min x: %g\n",mm[0]);
-        fprintf(stderr,"      max x: %g\n",mm[1]);
-        if(num_dims > 1) {
-          fprintf(stderr,"      min y: %g\n",mm[2]);
-          fprintf(stderr,"      max y: %g\n",mm[3]);
-        }
-        if(num_dims > 2) {
-          fprintf(stderr,"      min z: %g\n",mm[4]);
-          fprintf(stderr,"      max z: %g\n",mm[5]);
-        }
-
-        /* Free the allocated memory - so far
-         *-----------------------------------*/
-        for(i=0; i<num_dims; ++i) {
-          free(coords[i]);
-        }
-        free(coords);
-
-#if (defined GT_USERD_API_200)
-        if(Node_labels) {
-          free(nodeids);
-        }
-#endif
-
-        /* Get the block iblanking - if any
-         *---------------------------------*/
-        if(Pbuild[p].type == Z_IBLANKED) {
-
-          iblanking = (int *) calloc(nn,sizeof(int));
-          if(iblanking == (int *) NULL) {
-            fprintf(stderr,"Error: allocating iblanking array\n");
-            return(Z_ERR);
-          }
-
-          err = USERD_get_block_iblanking(pn,iblanking);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting block iblanking\n");
-            return(Z_ERR);
-          }
-
-          /* Echo "some" info
-           *-----------------*/
-          ib[Z_EXT]    = 0;
-          ib[Z_INT]    = 0;
-          ib[Z_BND]    = 0;
-          ib[Z_INTBND] = 0;
-          ib[Z_SYM]    = 0;
-
-          for(i=0; i<nn; ++i) {
-            ++ib[iblanking[i]];
-          }
-
-          fprintf(stderr,"   Iblanking breakdown:\n");
-          fprintf(stderr,"      Number of Z_EXT:    %d\n",ib[Z_EXT]);
-          fprintf(stderr,"      Number of Z_INT:    %d\n",ib[Z_INT]);
-          fprintf(stderr,"      Number of Z_BND:    %d\n",ib[Z_BND]);
-          fprintf(stderr,"      Number of Z_INTBND: %d\n",ib[Z_INTBND]);
-          fprintf(stderr,"      Number of Z_SYM:    %d\n",ib[Z_SYM]);
-
-          free(iblanking);
-        }
-
-#if (defined GT_USERD_API_200)
-
-        /* Get the ghost flags - if any
-         *-----------------------------*/
-        if(Pbuild[p].ghosts) {
-
-          ghost_flag = (int *) calloc(ne,sizeof(int));
-          if(ghost_flag == (int *) NULL) {
-            fprintf(stderr,"Error: allocating ghost_flag array\n");
-            return(Z_ERR);
-          }
-
-          err = USERD_get_block_ghost_flags(pn,ghost_flag);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting block ghost flags\n");
-            return(Z_ERR);
-          }
-
-          /* Echo "some" info
-           *-----------------*/
-          num_ghosts = 0;
-
-          for(i=0; i<ne; ++i) {
-            if(ghost_flag[i] > 0) {
-              ++num_ghosts;
-            }
-          }
-
-          fprintf(stderr,"   Block Ghost flag breakdown:\n");
-          fprintf(stderr,"      %d ghost cells out of %d total cells\n",
-                  num_ghosts,ne);
-
-          free(ghost_flag);
-        }
-
-        /* Get the element ids - if any
-         *-----------------------------*/
-        if(Element_labels) {
-
-          elemids = (int *) calloc(ne,sizeof(int));
-          if(elemids == (int *) NULL) {
-            fprintf(stderr,"Error: allocating elemids array\n");
-            return(Z_ERR);
-          }
-
-
-          et = cell_type;
-          err = USERD_get_part_element_ids_by_type(pn,et,elemids);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting element ids\n");
-            return(Z_ERR);
-          }
-
-          /* First element of the type
-           *--------------------------*/
-          i = 0;
-          fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-          fprintf(stderr,"      id: %d\n",elemids[i]);
-
-          /* Last element of the type
-           *-------------------------*/
-          i = ne - 1;
-          if(i > 0) {
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            fprintf(stderr,"      id: %d\n",elemids[i]);
-          }
-
-          free(elemids);
-        }
-#endif
-      }
-      else {
-        fprintf(stderr,"   Empty structured part\n");
-      }
-    }
-
-    /* Get border availability
-     *------------------------*/
-    err = USERD_get_border_availability(pn,num_elems);
-    if(err == Z_OK) {
-
-      /* Get border elements - if any
-       *-----------------------------*/
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = num_elems[et];
-        if(ne > 0) {
-
-          conns = (int **) calloc(ne,sizeof(int *));
-          if(conns == (int **) NULL) {
-            fprintf(stderr,"Error: allocating border conns array\n");
-            return(Z_ERR);
-          }
-          else {
-            for(i=0; i<ne; ++i) {
-              conns[i] = (int *) calloc(Elem_info[et].con_len,sizeof(int));
-              if(conns[i] == (int *) NULL) {
-                fprintf(stderr,"Error: allocating border conns array\n");
-                return(Z_ERR);
-              }
-            }
-          }
-
-          parent_type = (short *) calloc(ne,sizeof(short));
-          if(parent_type == (short *) NULL) {
-            fprintf(stderr,"Error: allocating border parent_type array\n");
-            return(Z_ERR);
-          }
-
-          parent_num = (int *) calloc(ne,sizeof(int));
-          if(parent_num == (int *) NULL) {
-            fprintf(stderr,"Error: allocating border parent_num array\n");
-            return(Z_ERR);
-          }
-
-
-          err = USERD_get_border_elements_by_type(pn,
-                                                  et,
-                                                  conns,
-                                                  parent_type,
-                                                  parent_num);
-          if(err == Z_ERR) {
-            fprintf(stderr,"Error: getting border elements\n");
-            return(Z_ERR);
-          }
-
-
-          /* Echo "some" info
-           *-----------------*/
-
-          /* First element of the type
-           *--------------------------*/
-          i = 0;
-          fprintf(stderr,"   %s border element %d of %d:\n",
-                  Elem_info[et].name,i+1,ne);
-          fprintf(stderr,"      Parent type: %s\n",
-                  Elem_info[parent_type[i]].name);
-          fprintf(stderr,"      Parent num:  %d\n",parent_num[i]);
-          fprintf(stderr,"      connectivity:");
-          for(j=0; j<Elem_info[et].con_len; ++j) {
-            fprintf(stderr," %d",conns[i][j]);
-          }
-          fprintf(stderr,"\n");
-
-          /* Last element of the type
-           *-------------------------*/
-          i = ne - 1;
-          if(i > 0) {
-            fprintf(stderr,"   %s border element %d of %d:\n",
-                    Elem_info[et].name,i+1,ne);
-            fprintf(stderr,"      Parent type: %s\n",
-                    Elem_info[parent_type[i]].name);
-            fprintf(stderr,"      Parent num:  %d\n",parent_num[i]);
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<Elem_info[et].con_len; ++j) {
-              fprintf(stderr," %d",conns[i][j]);
-            }
-            fprintf(stderr,"\n");
-          }
-
-
-          /* Free the allocated memory
-           *--------------------------*/
-          for(i=0; i<ne; ++i) {
-            free(conns[i]);
-          }
-          free(conns);
-          free(parent_type);
-          free(parent_num);
-        }
-      }
-    }
-
-
-#if (defined GT_USERD_API_204)
-    /* See if any rigid body in model
-     *-------------------------------*/
-    if(Any_Rigid_Body_Present) {
-
-#if (defined GT_USERD_API_207)
-      if(USERD_rigidbody_values(pn,values) == Z_OK) {
-        fprintf(stderr,"      Rigid Body values:\n");
-        fprintf(stderr,"        IX = %g\n",values[0]);
-        fprintf(stderr,"        IY = %g\n",values[1]);
-        fprintf(stderr,"        IZ = %g\n",values[2]);
-        fprintf(stderr,"        E0 = %g\n",values[3]);
-        fprintf(stderr,"        E1 = %g\n",values[4]);
-        fprintf(stderr,"        E2 = %g\n",values[5]);
-        fprintf(stderr,"        E3 = %g\n",values[6]);
-        fprintf(stderr,"        XOFF = %g\n",values[7]);
-        fprintf(stderr,"        YOFF = %g\n",values[8]);
-        fprintf(stderr,"        ZOFF = %g\n",values[9]);
-        fprintf(stderr,"        ROT_ORDER = %g\n",values[10]);
-        fprintf(stderr,"        XROT = %g\n",values[11]);
-        fprintf(stderr,"        YROT = %g\n",values[12]);
-        fprintf(stderr,"        ZROT = %g\n",values[13]);
-      }
-#else
-      if(USERD_rigidbody_values(pn,vals) == Z_OK) {
-        fprintf(stderr,"      Rigid Body values:\n");
-        fprintf(stderr,"        IX = %g\n",vals[0]);
-        fprintf(stderr,"        IY = %g\n",vals[1]);
-        fprintf(stderr,"        IZ = %g\n",vals[2]);
-        fprintf(stderr,"        E0 = %g\n",vals[3]);
-        fprintf(stderr,"        E1 = %g\n",vals[4]);
-        fprintf(stderr,"        E2 = %g\n",vals[5]);
-        fprintf(stderr,"        E3 = %g\n",vals[6]);
-        fprintf(stderr,"        XOFF = %g\n",vals[7]);
-        fprintf(stderr,"        YOFF = %g\n",vals[8]);
-        fprintf(stderr,"        ZOFF = %g\n",vals[9]);
-      }
-#endif
-    }
-#endif
-
-  } /* end for p = 0 to Num_parts */
-
-  return(Z_OK);
-}
-
-
-/*----------------
- * gold_var_loader
- *----------------*/
-static int
-gold_var_loader(int var_time_step)
-{
-  int i, j;
-  int err;
-  int v, vn;
-  int var_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_comps;
-  int num_dims;
-  int nsize;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  float constant_val;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-  float *values;
-  float minv,maxv;
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n--------------- var_loader --------------\n");
-
-  for(v=0; v<Num_vars; ++v) {
-    vn = v + 1;
-
-    if(v > 0) {
-      fprintf(stderr,"\n");
-    }
-    if(Varinfo[v].classify == Z_PER_NODE) {
-      fprintf(stderr," Z_PER_NODE Variable %d:\n",vn);
-    }
-    else {
-      fprintf(stderr," Z_PER_ELEM Variable %d:\n",vn);
-    }
-
-
-    if(Num_time_sets > 0) {
-      /* Get the timeset used for the variable
-       *---------------------------------------*/
-      var_timeset = Varinfo[v].timeset;
-
-      /* Get the number of time steps for this timeset
-       *----------------------------------------------*/
-      Num_time_steps = USERD_get_num_of_time_steps(var_timeset);
-      if(Num_time_steps < 1) {
-        fprintf(stderr," Error: Number of time steps returned: %d\n",
-                Num_time_steps);
-        fprintf(stderr," (Must be >0 to be okay)\n");
-        return(Z_ERR);
-      }
-      if(var_time_step > (Num_time_steps - 1)) {
-        var_time_step = Num_time_steps - 1;
-      }
-
-      /* Set the timeset and step - to first step by default, but
-       * can set it at others using -vts command argument
-       *---------------------------------------------------------*/
-      USERD_set_time_set_and_step(var_timeset,var_time_step);
-
-      fprintf(stderr,"   Using timeset:   %d  (step range is %d through %d)\n",
-              var_timeset,0,Num_time_steps-1);
-      fprintf(stderr,"   Using time step: %d\n",var_time_step);
-    }
-
-
-    /* Constants
-     *----------*/
-    if(Varinfo[v].type == Z_CONSTANT) {
-
-      constant_val = USERD_get_constant_val(vn,FALSE);
-      fprintf(stderr,"   Constant (%s):\n",Varinfo[v].description);
-      fprintf(stderr,"     value: %g\n",constant_val);
-
-      if(Varinfo[v].complex) {
-        constant_val = USERD_get_constant_val(vn,TRUE);
-        fprintf(stderr,"   value (imag): %g\n",constant_val);
-      }
-    }
-
-    /* Scalars, Vectors, Tensors
-     *--------------------------*/
-    else {
-
-      /* Get the var description line
-       *-----------------------------*/
-      err = USERD_get_descrip_lines(Z_VARI,vn,FALSE,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-      if(Varinfo[v].complex) {
-        err = USERD_get_descrip_lines(Z_VARI,vn,TRUE,line1,line2);
-        if(err == Z_OK) {
-          fprintf(stderr,"   Desc line (imag): %s\n",line1);
-        }
-        else {
-          fprintf(stderr,"Error: getting var description line (imag)\n");
-          return(Z_ERR);
-        }
-      }
-
-
-      /* Get the values by component
-       *-----------------------------*/
-      if(Varinfo[v].type == Z_SCALAR) {
-        num_comps = 1;
-      }
-      else if(Varinfo[v].type == Z_VECTOR) {
-        num_comps = 3;
-      }
-      else if(Varinfo[v].type == Z_TENSOR) {
-        num_comps = 6;
-      }
-      else if(Varinfo[v].type == Z_TENSOR9) {
-        num_comps = 9;
-      }
-
-
-      /* Per_Node
-       *---------*/
-      if(Varinfo[v].classify == Z_PER_NODE) {
-
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            nsize = Pbuild[p].nn;
-          }
-          else {
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-
-                if(Doing_Structured_Cinching) {
-                  bdim[comp] = Pbuild[p].ne[comp];
-
-                  /* even */
-                  if((bdim[comp] % 2) == 0) {
-                    bdim[comp] = (bdim[comp]/2) + 1;
-                  }
-                  /* odd */
-                  else {
-                    bdim[comp] = ((bdim[comp]-1)/2) + 1;
-                  }
-                }
-
-                else {
-                  bdim[comp] = Pbuild[p].ne[comp];
-                }
-              }
-            }
-            nsize = bdim[0] * bdim[1] * bdim[2];
-
-            /* For structured cinching, send in one less on each end and stride of 2
-             *----------------------------------------------------------------------*/
-            if(Doing_Structured_Cinching) {
-              err = USERD_set_block_range_and_stride(pn,
-                                                     0, Pbuild[p].ne[0]-1, 2,
-                                                     0, Pbuild[p].ne[1]-1, 2,
-                                                     0, Pbuild[p].ne[2]-1, 2);
-            }
-          }
-
-
-          fprintf(stderr,"   For part %d, with %d nodes:\n",pn,nsize);
-
-          if(nsize > 0) {
-            values = (float *) calloc((nsize+1),sizeof(float));
-            if(values == (float *) NULL) {
-              fprintf(stderr,"Error: alocating variable values\n");
-              return(Z_ERR);
-            }
-
-            for(comp=0; comp<num_comps; ++comp) {
-
-              err = USERD_get_var_by_component(vn,
-                                               pn,
-                                               Varinfo[v].type,
-                                               0,
-                                               FALSE,
-                                               comp,
-                                               values);
-              if(err == Z_UNDEF) {
-                fprintf(stderr,"  Variable not defined on this part\n");
-              }
-
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              minv = maxv = values[1];
-              for(i=2; i<=nsize; ++i) {
-                if(values[i] < minv) {
-                  minv = values[i];
-                }
-                if(values[i] > maxv) {
-                  maxv = values[i];
-                }
-              }
-
-              fprintf(stderr,"     For component %d: \n",comp);
-              fprintf(stderr,"       node %10d value:   %g\n",1,values[1]);
-              fprintf(stderr,"       node %10d value:   %g\n",nsize,values[nsize]);
-              fprintf(stderr,"       min value:               %g\n",minv);
-              fprintf(stderr,"       max value:               %g\n",maxv);
-
-              if(Varinfo[v].complex) {
-                err = USERD_get_var_by_component(vn,
-                                                 pn,
-                                                 Varinfo[v].type,
-                                                 0,
-                                                 FALSE,
-                                                 comp,
-                                                 values);
-                if(err == Z_UNDEF) {
-                  fprintf(stderr,"  Variable not defined on this part\n");
-                }
-
-                /* For the component, show 1st node, last node, min, max values
-                 *-------------------------------------------------------------*/
-                minv = maxv = values[1];
-                for(i=2; i<=nsize; ++i) {
-                  if(values[i] < minv) {
-                    minv = values[i];
-                  }
-                  if(values[i] > maxv) {
-                    maxv = values[i];
-                  }
-                }
-
-                fprintf(stderr,"     For component %d (imag): \n",comp);
-                fprintf(stderr,"       node %10d value:   %g\n",1,values[1]);
-                fprintf(stderr,"       node %10d value:   %g\n",nsize,values[nsize]);
-                fprintf(stderr,"       min value:               %g\n",minv);
-                fprintf(stderr,"       max value:               %g\n",maxv);
-              }
-            }
-            free(values);
-          }
-        }
-      }
-
-      /* Per_Elem
-       *---------*/
-      else {
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type != Z_UNSTRUCTURED) {
-
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                if(Doing_Structured_Cinching) {
-                  bdim[comp] = Pbuild[p].ne[comp];
-
-                  /* even */
-                  if((bdim[comp] % 2) == 0) {
-                    bdim[comp] = (bdim[comp]/2) + 1;
-                  }
-                  /* odd */
-                  else {
-                    bdim[comp] = ((bdim[comp]-1)/2) + 1;
-                  }
-                }
-
-                else {
-                  bdim[comp] = Pbuild[p].ne[comp];
-                }
-              }
-            }
-
-            bd1 = bdim[0]-1;
-            if(bd1 < 1) {
-              bd1 = 1;
-            }
-            bd2 = bdim[1]-1;
-            if(bd2 < 1) {
-              bd2 = 1;
-            }
-            bd3 = bdim[2]-1;
-            if(bd3 < 1) {
-              bd3 = 1;
-            }
-            nsize = bd1 * bd2 * bd3;
-
-
-            /* Determine cell type
-             *--------------------*/
-            num_dims = 3;
-            for(i=0; i<3; ++i) {
-              if(bdim[i] == 1) {
-                --num_dims;
-              }
-            }
-            if(num_dims == 3) {
-              cell_type = Z_HEX08;
-            }
-            else if(num_dims == 2) {
-              cell_type = Z_QUA04;
-            }
-            else {
-              cell_type = Z_BAR02;
-            }
-          }
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            e1 = 0;
-            e2 = Z_MAXTYPE-1;
-          }
-          else {
-            e1 = e2 = cell_type;
-
-
-            /* For structured cinching, send in one less on each end and stride of 2
-             *----------------------------------------------------------------------*/
-            if(Doing_Structured_Cinching) {
-              err = USERD_set_block_range_and_stride(pn,
-                                                     0, Pbuild[p].ne[0]-1, 2,
-                                                     0, Pbuild[p].ne[1]-1, 2,
-                                                     0, Pbuild[p].ne[2]-1, 2);
-            }
-          }
-
-          for(et=e1; et<=e2; ++et) {
-
-            if(Pbuild[p].type == Z_UNSTRUCTURED) {
-              nsize = Pbuild[p].ne[et];
-            }
-
-            if(nsize > 0) {
-
-              fprintf(stderr,"   For part %d, with %d elems of type %s:\n",
-                      pn,nsize,Elem_info[et].name);
-
-
-              values = (float *) calloc((nsize+1),sizeof(float));
-              if(values == (float *) NULL) {
-                fprintf(stderr,"Error: alocating variable values\n");
-                return(Z_ERR);
-              }
-
-              for(comp=0; comp<num_comps; ++comp) {
-
-                err = USERD_get_var_by_component(vn,
-                                                 pn,
-                                                 Varinfo[v].type,
-                                                 et,
-                                                 FALSE,
-                                                 comp,
-                                                 values);
-                if(err == Z_UNDEF) {
-                  fprintf(stderr,"  Variable not defined on this part\n");
-                }
-
-                /* For the component, show 1st elem, last elem, min, max values
-                 *-------------------------------------------------------------*/
-                minv = maxv = values[1];
-                for(i=2; i<=nsize; ++i) {
-                  if(values[i] < minv) {
-                    minv = values[i];
-                  }
-                  if(values[i] > maxv) {
-                    maxv = values[i];
-                  }
-                }
-
-                fprintf(stderr,"     For component %d: \n",comp);
-                fprintf(stderr,"       elem %10d value:  %g\n",1,values[1]);
-                fprintf(stderr,"       elem %10d value:  %g\n",nsize,values[nsize]);
-                fprintf(stderr,"       min value:              %g\n",minv);
-                fprintf(stderr,"       max value:              %g\n",maxv);
-
-                if(Varinfo[v].complex) {
-                  err = USERD_get_var_by_component(vn,
-                                                   pn,
-                                                   Varinfo[v].type,
-                                                   et,
-                                                   FALSE,
-                                                   comp,
-                                                   values);
-                  if(err == Z_UNDEF) {
-                    fprintf(stderr,"  Variable not defined on this part\n");
-                  }
-
-                  /* For the component, show 1st elem, last elem, min, max values
-                   *-------------------------------------------------------------*/
-                  minv = maxv = values[1];
-                  for(i=2; i<=nsize; ++i) {
-                    if(values[i] < minv) {
-                      minv = values[i];
-                    }
-                    if(values[i] > maxv) {
-                      maxv = values[i];
-                    }
-                  }
-
-                  fprintf(stderr,"     For component %d (imag): \n",comp);
-                  fprintf(stderr,"       elem %10d value:  %g\n",1,values[1]);
-                  fprintf(stderr,"       elem %10d value:  %g\n",nsize,values[nsize]);
-                  fprintf(stderr,"       min value:              %g\n",minv);
-                  fprintf(stderr,"       max value:              %g\n",maxv);
-
-                }
-              }
-              free(values);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-#else
-
-/*-------------
- * part_builder
- *-------------*/
-static int
-part_builder(int geom_time_step)
-{
-  int i, j;
-  int err;
-  int p, pn;
-  int et, ne;
-  int *elemids[Z_MAXTYPE];
-  int **conns[Z_MAXTYPE];
-  int nn;
-  int comp;
-  int bdim[3];
-  int ib[5];
-  int num_dims;
-  int cell_type;
-  float mm[6];
-  float **coords;
-  int *nodeids;
-  int *iblanking;
-  CRD *crds;
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n------------- part_builder --------------\n");
-
-
-  if(Num_time_steps > 1) {
-    if(geom_time_step > (Num_time_steps - 1)) {
-      geom_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the time step - to first step by default, but
-     * can set it at others using -gts command argument
-     *---------------------------------------------------*/
-    USERD_set_time_step(geom_time_step);
-
-    fprintf(stderr," Using time step: %d  (where range is %d through %d\n",
-            geom_time_step,0,Num_time_steps-1);
-  }
-
-
-  /* Get the global coords
-   *----------------------*/
-  nn = USERD_get_number_of_global_nodes();
-
-  if(nn > 0) {
-
-    crds = (CRD *) calloc(nn,sizeof(CRD));
-    if(crds == (CRD *) NULL) {
-      fprintf(stderr,"Error: allocating crds array\n");
-      return(Z_ERR);
-    }
-
-    if(Node_labels) {
-      nodeids = (int *) calloc(nn,sizeof(int));
-      if(nodeids == (int *) NULL) {
-        fprintf(stderr,"Error: allocating nodeids array\n");
-        return(Z_ERR);
-      }
-    }
-
-
-    err = USERD_get_global_coords(crds);
-    if(err == Z_ERR) {
-      fprintf(stderr,"Error: getting unstructured coords\n");
-      return(Z_ERR);
-    }
-
-    if(Node_labels) {
-      err = USERD_get_global_node_ids(nodeids);
-      if(err == Z_ERR) {
-        fprintf(stderr,"Error: getting nodeids\n");
-        return(Z_ERR);
-      }
-    }
-
-    /* Echo "some" info
-     *-----------------*/
-
-    /* First node
-     *-----------*/
-    i = 0;
-    fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-    if(Node_labels) {
-      fprintf(stderr,"      id: %d\n",nodeids[i]);
-    }
-    fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-            crds[i].xyz[0], crds[i].xyz[1], crds[i].xyz[2]);
-    mm[0] = mm[1] = crds[i].xyz[0];
-    mm[2] = mm[3] = crds[i].xyz[1];
-    mm[4] = mm[5] = crds[i].xyz[2];
-
-
-    /* Last node
-     *----------*/
-    i = nn-1;
-    if(i > 0) {
-      fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-      if(Node_labels) {
-        fprintf(stderr,"      id: %d\n",nodeids[i]);
-      }
-      fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-              crds[i].xyz[0], crds[i].xyz[1], crds[i].xyz[2]);
-    }
-
-    /* Min and max coordinate values
-     *------------------------------*/
-    for(i=1; i<nn; ++i) {
-      if(crds[i].xyz[0] < mm[0]) {
-        mm[0] = crds[i].xyz[0];
-      }
-      if(crds[i].xyz[0] > mm[1]) {
-        mm[1] = crds[i].xyz[0];
-      }
-      if(crds[i].xyz[1] < mm[2]) {
-        mm[2] = crds[i].xyz[1];
-      }
-      if(crds[i].xyz[1] > mm[3]) {
-        mm[3] = crds[i].xyz[1];
-      }
-      if(crds[i].xyz[2] < mm[4]) {
-        mm[4] = crds[i].xyz[2];
-      }
-      if(crds[i].xyz[2] > mm[5]) {
-        mm[5] = crds[i].xyz[2];
-      }
-    }
-
-    fprintf(stderr,"   Global coordinate ranges:\n");
-    fprintf(stderr,"      min x: %g\n",mm[0]);
-    fprintf(stderr,"      max x: %g\n",mm[1]);
-    fprintf(stderr,"      min y: %g\n",mm[2]);
-    fprintf(stderr,"      max y: %g\n",mm[3]);
-    fprintf(stderr,"      min z: %g\n",mm[4]);
-    fprintf(stderr,"      max z: %g\n",mm[5]);
-
-
-    /* Free the allocated memory
-     *--------------------------*/
-    free(crds);
-    if(Node_labels) {
-      free(nodeids);
-    }
-  }
-
-
-
-  for(p=0; p<Num_parts; ++p) {
-    pn = p+1;
-
-    fprintf(stderr,"\n");
-    fprintf(stderr," Part %d:\n",pn);
-
-    /*-----------------------
-     * For unstructured parts
-     *-----------------------*/
-    if(Pbuild[p].type == Z_UNSTRUCTURED) {
-
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-
-          conns[et] = (int **) calloc(ne,sizeof(int *));
-          if(conns[et] == (int **) NULL) {
-            fprintf(stderr,"Error: allocating conns array\n");
-            return(Z_ERR);
-          }
-          else {
-            for(i=0; i<ne; ++i) {
-              conns[et][i] = (int *) calloc(Elem_info[et].con_len,sizeof(int));
-              if(conns[et][i] == (int *) NULL) {
-                fprintf(stderr,"Error: allocating conns array\n");
-                return(Z_ERR);
-              }
-            }
-          }
-
-          if(Element_labels) {
-            elemids[et] = (int *) calloc(ne,sizeof(int));
-            if(elemids[et] == (int *) NULL) {
-              fprintf(stderr,"Error: allocating elemids array\n");
-              return(Z_ERR);
-            }
-          }
-        }
-      }
-
-      /* Get the elements
-       *-----------------*/
-      err = USERD_get_element_connectivities_for_part(pn,conns);
-      if(err == Z_ERR) {
-        fprintf(stderr,"Error: getting element connectivities\n");
-        return(Z_ERR);
-      }
-
-      /* Get the element ids - if any
-       *-----------------------------*/
-      if(Element_labels) {
-        err = USERD_get_element_ids_for_part(pn,elemids);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting element ids\n");
-          return(Z_ERR);
-        }
-      }
-
-      /* Echo "some" info
-       *-----------------*/
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-
-          /* First element of the type
-           *--------------------------*/
-          i = 0;
-          fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-          if(Element_labels) {
-            fprintf(stderr,"      id: %d\n",elemids[et][i]);
-          }
-          fprintf(stderr,"      connectivity:");
-          for(j=0; j<Elem_info[et].con_len; ++j) {
-            fprintf(stderr," %d",conns[et][i][j]);
-          }
-          fprintf(stderr,"\n");
-
-          /* Last element of the type
-           *-------------------------*/
-          i = ne - 1;
-          if(i > 0) {
-            fprintf(stderr,"   %s Element %d of %d:\n",Elem_info[et].name,i+1,ne);
-            if(Element_labels) {
-              fprintf(stderr,"      id: %d\n",elemids[et][i]);
-            }
-            fprintf(stderr,"      connectivity:");
-            for(j=0; j<Elem_info[et].con_len; ++j) {
-              fprintf(stderr," %d",conns[et][i][j]);
-            }
-            fprintf(stderr,"\n");
-          }
-        }
-      }
-
-      /* Free the allocated memory
-       *--------------------------*/
-      for(et=0; et<Z_MAXTYPE; ++et) {
-        ne = Pbuild[p].ne[et];
-
-        if(ne > 0) {
-          for(i=0; i<ne; ++i) {
-            free(conns[et][i]);
-          }
-          free(conns[et]);
-
-          if(Element_labels) {
-            free(elemids[et]);
-          }
-        }
-      }
-    }
-
-
-    /*---------------------
-     * For structured parts
-     *---------------------*/
-    else {
-
-      /* Get the block coords
-       *---------------------*/
-      for(comp=0; comp<3; ++comp) {
-        if(Pbuild[p].ne[comp] < 1) {
-          bdim[comp] = 1;
-        }
-        else {
-          bdim[comp] = Pbuild[p].ne[comp];
-        }
-      }
-      nn = bdim[0] * bdim[1] * bdim[2];
-
-      bd1 = bdim[0]-1;
-      if(bd1 < 1) {
-        bd1 = 1;
-      }
-      bd2 = bdim[1]-1;
-      if(bd2 < 1) {
-        bd2 = 1;
-      }
-      bd3 = bdim[2]-1;
-      if(bd3 < 1) {
-        bd3 = 1;
-      }
-      ne = bd1 * bd2 * bd3;
-
-
-      /* Determine cell type
-       *--------------------*/
-      num_dims = 3;
-      for(i=0; i<3; ++i) {
-        if(bdim[i] == 1) {
-          --num_dims;
-        }
-      }
-      if(num_dims == 3) {
-        cell_type = Z_HEX08;
-      }
-      else if(num_dims == 2) {
-        cell_type = Z_QUA04;
-      }
-      else {
-        cell_type = Z_BAR02;
-      }
-
-      coords = (float **) calloc(num_dims,sizeof(float *));
-      if(coords == (float **) NULL) {
-        fprintf(stderr,"Error: allocating coords array\n");
-        return(Z_ERR);
-      }
-      else {
-        for(i=0; i<num_dims; ++i) {
-          coords[i] = (float *) calloc(nn,sizeof(float));
-          if(coords[i] == (float *) NULL) {
-            fprintf(stderr,"Error: allocating coords array\n");
-            return(Z_ERR);
-          }
-        }
-      }
-
-      /* Get the coords
-       *---------------*/
-      for(comp=0; comp<num_dims; ++comp) {
-        err = USERD_get_block_coords_by_component(pn,comp,coords[comp]);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting block coords\n");
-          return(Z_ERR);
-        }
-      }
-
-
-      /* Echo "some" info
-       *-----------------*/
-
-      /* First node
-       *-----------*/
-      if(nn > 0) {
-        i = 0;
-        fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-        if(num_dims == 3) {
-          fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                  coords[0][i], coords[1][i], coords[2][i]);
-          mm[0] = mm[1] = coords[0][i];
-          mm[2] = mm[3] = coords[1][i];
-          mm[4] = mm[5] = coords[2][i];
-        }
-        else if(num_dims == 2) {
-          fprintf(stderr,"      x y coordinates: %g %g\n",
-                  coords[0][i], coords[1][i]);
-          mm[0] = mm[1] = coords[0][i];
-          mm[2] = mm[3] = coords[1][i];
-        }
-        else {
-          fprintf(stderr,"      x coordinates: %g\n",
-                  coords[0][i]);
-          mm[0] = mm[1] = coords[0][i];
-        }
-
-
-        /* Last node
-         *----------*/
-        i = nn-1;
-        if(i > 1) {
-          fprintf(stderr,"   Node %d of %d:\n",i+1,nn);
-
-          if(num_dims == 3) {
-            fprintf(stderr,"      x y z coordinates: %g %g %g\n",
-                    coords[0][i], coords[1][i], coords[2][i]);
-          }
-          else if(num_dims == 2) {
-            fprintf(stderr,"      x y coordinates: %g %g\n",
-                    coords[0][i], coords[1][i]);
-          }
-          else {
-            fprintf(stderr,"      x coordinates: %g\n",
-                    coords[0][i]);
-          }
-        }
-      }
-
-      /* Min and max coordinate values
-       *------------------------------*/
-      for(i=2; i<=nn; ++i) {
-        if(coords[0][i] < mm[0]) {
-          mm[0] = coords[0][i];
-        }
-        if(coords[0][i] > mm[1]) {
-          mm[1] = coords[0][i];
-        }
-        if(num_dims > 1) {
-          if(coords[1][i] < mm[2]) {
-            mm[2] = coords[1][i];
-          }
-          if(coords[1][i] > mm[3]) {
-            mm[3] = coords[1][i];
-          }
-        }
-        if(num_dims > 2) {
-          if(coords[2][i] < mm[4]) {
-            mm[4] = coords[2][i];
-          }
-          if(coords[2][i] > mm[5]) {
-            mm[5] = coords[2][i];
-          }
-        }
-      }
-
-      fprintf(stderr,"   Coordinate ranges:\n");
-      fprintf(stderr,"      min x: %g\n",mm[0]);
-      fprintf(stderr,"      max x: %g\n",mm[1]);
-      if(num_dims > 1) {
-        fprintf(stderr,"      min y: %g\n",mm[2]);
-        fprintf(stderr,"      max y: %g\n",mm[3]);
-      }
-      if(num_dims > 2) {
-        fprintf(stderr,"      min z: %g\n",mm[4]);
-        fprintf(stderr,"      max z: %g\n",mm[5]);
-      }
-
-      /* Free the allocated memory - so far
-       *-----------------------------------*/
-      for(i=0; i<num_dims; ++i) {
-        free(coords[i]);
-      }
-      free(coords);
-
-
-      /* Get the block iblanking - if any
-       *---------------------------------*/
-      if(Pbuild[p].type == Z_IBLANKED) {
-
-        iblanking = (int *) calloc(nn,sizeof(int));
-        if(iblanking == (int *) NULL) {
-          fprintf(stderr,"Error: allocating iblanking array\n");
-          return(Z_ERR);
-        }
-
-        err = USERD_get_block_iblanking(pn,iblanking);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting block iblanking\n");
-          return(Z_ERR);
-        }
-
-        /* Echo "some" info
-         *-----------------*/
-        ib[Z_EXT]    = 0;
-        ib[Z_INT]    = 0;
-        ib[Z_BND]    = 0;
-        ib[Z_INTBND] = 0;
-        ib[Z_SYM]    = 0;
-
-        for(i=0; i<nn; ++i) {
-          ++ib[iblanking[i]];
-        }
-
-        fprintf(stderr,"   Iblanking breakdown:\n");
-        fprintf(stderr,"      Number of Z_EXT:    %d\n",ib[Z_EXT]);
-        fprintf(stderr,"      Number of Z_INT:    %d\n",ib[Z_INT]);
-        fprintf(stderr,"      Number of Z_BND:    %d\n",ib[Z_BND]);
-        fprintf(stderr,"      Number of Z_INTBND: %d\n",ib[Z_INTBND]);
-        fprintf(stderr,"      Number of Z_SYM:    %d\n",ib[Z_SYM]);
-
-        free(iblanking);
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-
-/*-----------
- * var_loader
- *-----------*/
-static int
-var_loader(int var_time_step)
-{
-  int i, j, k;
-  int err;
-  int v, vn;
-  int var_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_comps;
-  int num_dims;
-  int nsize;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  float constant_val;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-  float *values;
-  float *tvalues;
-  float minv[3],maxv[3];
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n--------------- var_loader --------------\n");
-
-  if(Num_time_steps > 1 && v == 0) {
-    if(var_time_step > (Num_time_steps - 1)) {
-      var_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the time step - to first step by default, but
-     * can set it at others using -vts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_step(var_time_step);
-
-    fprintf(stderr," Using time step: %d  (where range is %d through %d)\n\n",
-            var_time_step,0,Num_time_steps-1);
-  }
-
-  for(v=0; v<Num_vars; ++v) {
-    vn = v + 1;
-
-    if(v > 0) {
-      fprintf(stderr,"\n");
-    }
-    if(Varinfo[v].classify == Z_PER_NODE) {
-      fprintf(stderr," Z_PER_NODE Variable %d:\n",vn);
-    }
-    else {
-      fprintf(stderr," Z_PER_ELEM Variable %d:\n",vn);
-    }
-
-    /* Constants
-     *----------*/
-    if(Varinfo[v].type == Z_CONSTANT) {
-
-      constant_val = USERD_get_constant_value(vn);
-      fprintf(stderr,"   Constant (%s):\n",Varinfo[v].description);
-      fprintf(stderr,"     value: %g\n",constant_val);
-    }
-
-
-    /* Scalars, Vectors, Tensors
-     *--------------------------*/
-    else {
-
-      /* Get the var description line
-       *-----------------------------*/
-      err = USERD_get_description_lines(Z_VARI,vn,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-
-      /* Get the values by component
-       *-----------------------------*/
-      if(Varinfo[v].type == Z_SCALAR) {
-        num_comps = 1;
-      }
-      else if(Varinfo[v].type == Z_VECTOR) {
-        num_comps = 3;
-      }
-      else if(Varinfo[v].type == Z_TENSOR) {
-        num_comps = 6;
-      }
-      else if(Varinfo[v].type == Z_TENSOR9) {
-        num_comps = 9;
-      }
-
-
-      /* Per_Node
-       *---------*/
-      if(Varinfo[v].classify == Z_PER_NODE) {
-
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            nsize = Pbuild[p].nn;
-          }
-          else {
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            nsize = bdim[0] * bdim[1] * bdim[2];
-          }
-
-
-          fprintf(stderr,"   For part %d, with %d nodes:\n",pn,nsize);
-
-          if(nsize > 0) {
-            values = (float *) calloc((num_comps * nsize),sizeof(float));
-            if(values == (float *) NULL) {
-              fprintf(stderr,"Error: alocating variable values\n");
-              return(Z_ERR);
-            }
-
-            if(num_comps == 1) {
-
-              if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                err = USERD_get_scalar_values(vn,
-                                              pn,
-                                              0,
-                                              values);
-                if(err == Z_ERR) {
-                  fprintf(stderr,"Error: getting scalar values\n");
-                  return(Z_ERR);
-                }
-              }
-              else {
-                err = USERD_get_block_scalar_values(pn,
-                                                    vn,
-                                                    values);
-                if(err == Z_ERR) {
-                  fprintf(stderr,"Error: getting block scalar values\n");
-                  return(Z_ERR);
-                }
-              }
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              minv[0] = maxv[0] = values[0];
-              for(i=0; i<nsize; ++i) {
-                if(values[i] < minv[0]) {
-                  minv[0] = values[i];
-                }
-                if(values[i] > maxv[0]) {
-                  maxv[0] = values[i];
-                }
-              }
-
-              fprintf(stderr,"       node %10d value: %g\n",1,values[0]);
-              fprintf(stderr,"       node %10d value: %g\n",nsize,values[nsize-1]);
-              fprintf(stderr,"       min value:             %g\n",minv[0]);
-              fprintf(stderr,"       max value:             %g\n",maxv[0]);
-
-            }
-
-            else if(num_comps == 3) {
-
-              if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                err = USERD_get_vector_values(vn,
-                                              pn,
-                                              0,
-                                              values);
-                if(err == Z_ERR) {
-                  fprintf(stderr,"Error: getting vector values\n");
-                  return(Z_ERR);
-                }
-              }
-              else {
-
-                tvalues = (float *) calloc(nsize,sizeof(float));
-                if(tvalues == (float *) NULL) {
-                  fprintf(stderr,"Error: alocating tvalues array\n");
-                  return(Z_ERR);
-                }
-
-                for(i=0; i<3; ++i) {
-                  err = USERD_get_block_vector_values_by_component(pn,
-                                                                   vn,
-                                                                   i,
-                                                                   tvalues);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting vector values\n");
-                    return(Z_ERR);
-                  }
-                  for(j=0; j<nsize; ++j) {
-                    k = j*3 + i;
-                    values[k] = tvalues[j];
-                  }
-                }
-                free(tvalues);
-              }
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              minv[0] = maxv[0] = values[0];
-              minv[1] = maxv[1] = values[1];
-              minv[2] = maxv[2] = values[2];
-              for(i=0; i<nsize; ++i) {
-                j = i*3;
-                for(k=0; k<3; ++k) {
-                  if(values[j+k] < minv[k]) {
-                    minv[k] = values[j+k];
-                  }
-                  if(values[j+k] > maxv[k]) {
-                    maxv[k] = values[j+k];
-                  }
-                }
-              }
-
-              fprintf(stderr,"       node %10d values: %g %g %g\n",1,
-                      values[0],values[1],values[2]);
-              fprintf(stderr,"       node %10d values: %g %g %g\n",nsize,
-                      values[3*nsize-3],values[3*nsize-2],values[3*nsize-1]);
-              fprintf(stderr,"       min values:             %g %g %g\n",
-                      minv[0],minv[1],minv[2]);
-              fprintf(stderr,"       max values:             %g %g %g\n",
-                      maxv[0],maxv[1],maxv[2]);
-
-            }
-            free(values);
-          }
-        }
-      }
-
-      /* Per_Elem
-       *---------*/
-      else {
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type != Z_UNSTRUCTURED) {
-
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            bd1 = bdim[0]-1;
-            if(bd1 < 1) {
-              bd1 = 1;
-            }
-            bd2 = bdim[1]-1;
-            if(bd2 < 1) {
-              bd2 = 1;
-            }
-            bd3 = bdim[2]-1;
-            if(bd3 < 1) {
-              bd3 = 1;
-            }
-            nsize = bd1 * bd2 * bd3;
-
-
-            /* Determine cell type
-             *--------------------*/
-            num_dims = 3;
-            for(i=0; i<3; ++i) {
-              if(bdim[i] == 1) {
-                --num_dims;
-              }
-            }
-            if(num_dims == 3) {
-              cell_type = Z_HEX08;
-            }
-            else if(num_dims == 2) {
-              cell_type = Z_QUA04;
-            }
-            else {
-              cell_type = Z_BAR02;
-            }
-          }
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            e1 = 0;
-            e2 = Z_MAXTYPE-1;
-          }
-          else {
-            e1 = e2 = cell_type;
-          }
-
-          for(et=e1; et<=e2; ++et) {
-
-            if(Pbuild[p].type == Z_UNSTRUCTURED) {
-              nsize = Pbuild[p].ne[et];
-            }
-
-            if(nsize > 0) {
-
-              fprintf(stderr,"   For part %d, with %d elems of type %s:\n",
-                      pn,nsize,Elem_info[et].name);
-
-              values = (float *) calloc((num_comps * nsize),sizeof(float));
-              if(values == (float *) NULL) {
-                fprintf(stderr,"Error: alocating variable values\n");
-                return(Z_ERR);
-              }
-
-              if(num_comps == 1) {
-                if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                  err = USERD_get_scalar_values(vn,
-                                                pn,
-                                                et,
-                                                values);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting scalar values\n");
-                    return(Z_ERR);
-                  }
-                }
-                else {
-                  err = USERD_get_block_scalar_values(pn,
-                                                      vn,
-                                                      values);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting block scalar values\n");
-                    return(Z_ERR);
-                  }
-                }
-
-                /* For the component, show 1st node, last node, min, max values
-                 *-------------------------------------------------------------*/
-                minv[0] = maxv[0] = values[0];
-                for(i=1; i<nsize; ++i) {
-                  if(values[i] < minv[0]) {
-                    minv[0] = values[i];
-                  }
-                  if(values[i] > maxv[0]) {
-                    maxv[0] = values[i];
-                  }
-                }
-
-                fprintf(stderr,"       elem %10d value: %g\n",1,values[0]);
-                fprintf(stderr,"       elem %10d value: %g\n",nsize,values[nsize-1]);
-                fprintf(stderr,"       min value:             %g\n",minv[0]);
-                fprintf(stderr,"       max value:             %g\n",maxv[0]);
-
-              }
-
-              else if(num_comps == 3) {
-
-                if(Pbuild[p].type == Z_UNSTRUCTURED) {
-                  err = USERD_get_vector_values(vn,
-                                                pn,
-                                                et,
-                                                values);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"Error: getting vector values\n");
-                    return(Z_ERR);
-                  }
-                }
-                else {
-
-                  tvalues = (float *) calloc(nsize,sizeof(float));
-                  if(tvalues == (float *) NULL) {
-                    fprintf(stderr,"Error: alocating tvalues array\n");
-                    return(Z_ERR);
-                  }
-
-                  for(i=0; i<3; ++i) {
-                    err = USERD_get_block_vector_values_by_component(pn,
-                                                                     vn,
-                                                                     i,
-                                                                     tvalues);
-                    if(err == Z_ERR) {
-                      fprintf(stderr,"Error: getting vector values\n");
-                      return(Z_ERR);
-                    }
-                    for(j=0; j<nsize; ++j) {
-                      k = j*3 + i;
-                      values[k] = tvalues[j];
-                    }
-                  }
-                  free(tvalues);
-                }
-
-                /* For the component, show 1st node, last node, min, max values
-                 *-------------------------------------------------------------*/
-                minv[0] = maxv[0] = values[0];
-                minv[1] = maxv[1] = values[1];
-                minv[2] = maxv[2] = values[2];
-                for(i=1; i<=nsize; ++i) {
-                  j = i*3;
-                  for(k=0; k<3; ++k) {
-                    if(values[j+k] < minv[k]) {
-                      minv[k] = values[j+k];
-                    }
-                    if(values[j+k] > maxv[k]) {
-                      maxv[k] = values[j+k];
-                    }
-                  }
-                }
-
-                fprintf(stderr,"       elem %10d values: %g %g %g\n",1,
-                        values[0],values[1],values[2]);
-                fprintf(stderr,"       elem %10d values: %g %g %g\n",nsize,
-                        values[3*nsize-3],values[3*nsize-2],values[3*nsize-1]);
-                fprintf(stderr,"       min values:             %g %g %g\n",
-                        minv[0],minv[1],minv[2]);
-                fprintf(stderr,"       max values:             %g %g %g\n",
-                        maxv[0],maxv[1],maxv[2]);
-
-              }
-              free(values);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-#endif
-
-
-#if (defined GT_USERD_API_202)
-
-
-/*---------------
- * materials_info
- *---------------*/
-static int
-materials_info( void )
-{
-  int i,j;
-  int err;
-  int   *num_materials;
-  int   *msids;
-  char **msname;
-  int   *mids;
-  char **mdesc;
-
-
-  fprintf(stderr,"\n------------- materials info --------------\n");
-
-  /* Get the number of variables
-   *----------------------------*/
-  Num_materials_sets = USERD_get_number_of_material_sets();
-  if(Num_materials_sets < 0) {
-    fprintf(stderr,"Error: getting the number of material sets\n");
-    return(Z_ERR);
-  }
-  else {
-    if(Num_materials_sets == 0) {
-      fprintf(stderr," No materials sets in the model\n");
-      return (Z_OK);
-    }
-    else if(Num_materials_sets > 1) {
-      fprintf(stderr," Number of materials sets: %d\n",Num_materials_sets);
-      fprintf(stderr," Currently, EnSight 7.6 only supports 1 material set\n");
-      return(Z_ERR);
-    }
-    else {
-      fprintf(stderr," Number of materials sets: %d\n",Num_materials_sets);
-    }
-  }
-
-  /* Get the material set index list and names
-   *------------------------------------------*/
-  msids = (int *) calloc(Num_materials_sets,sizeof(int));
-  if(msids == (int *)NULL) {
-    fprintf(stderr," Problems allocating for material set ids\n");
-    return(Z_ERR);
-  }
-
-  num_materials = (int *) calloc(Num_materials_sets,sizeof(int));
-  if(num_materials == (int *)NULL) {
-    fprintf(stderr," Problems allocating for material set num materials\n");
-    return(Z_ERR);
-  }
-
-  msname = (char **) calloc(Num_materials_sets,sizeof(char *));
-  if(msname == (char **)NULL) {
-    fprintf(stderr," Problems allocating for material set names\n");
-    return(Z_ERR);
-  }
-  else {
-    for(i=0; i<Num_materials_sets; ++i) {
-      msname[i] = (char *) calloc(Z_BUFL,sizeof(char));
-      if(msname[i] == (char *)NULL) {
-        fprintf(stderr," Problems allocating for material set names\n");
-        return(Z_ERR);
-      }
-    }
-  }
-
-  err = USERD_get_matf_set_info(msids,msname);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: getting material set info\n");
-  }
-  else {
-    for(i=0; i<Num_materials_sets; ++i) {
-
-      /* Echo some feedback
-       *-------------------*/
-      fprintf(stderr," For Material set %d:\n",i+1);
-
-      fprintf(stderr,"   id:   %d\n",msids[i]);
-      fprintf(stderr,"   name: %s\n",msname[i]);
-
-      num_materials[i] = USERD_get_number_of_materials(i);
-      if(num_materials[i] < 0) {
-        fprintf(stderr,"Error: getting the number of materials in set %d\n",i);
-        return (Z_ERR);
-      }
-      else if(num_materials[i] == 0) {
-        fprintf(stderr," No materials in Materials set %d\n",i);
-        return (Z_OK);
-      }
-      else {
-        mids = (int *) calloc(num_materials[i],sizeof(int));
-        if(mids == (int *)NULL) {
-          fprintf(stderr," Problems allocating for material ids\n");
-          return(Z_ERR);
-        }
-
-        mdesc = (char **) calloc(num_materials[i],sizeof(char *));
-        if(mdesc == (char **)NULL) {
-          fprintf(stderr," Problems allocating for material desc\n");
-          return(Z_ERR);
-        }
-        else {
-          for(j=0; j<num_materials[i]; ++j) {
-            mdesc[j] = (char *) calloc(Z_BUFL,sizeof(char));
-            if(mdesc[j] == (char *)NULL) {
-              fprintf(stderr," Problems allocating for material desc\n");
-              return(Z_ERR);
-            }
-          }
-        }
-
-        err = USERD_get_matf_var_info(i,mids,mdesc);
-        if(err == Z_ERR) {
-          fprintf(stderr,"Error: getting material info\n");
-        }
-        else {
-
-          for(j=0; j<num_materials[i]; ++j) {
-            /* Echo some feedback
-             *-------------------*/
-            fprintf(stderr,"   For Material %d:\n",j+1);
-
-            fprintf(stderr,"     index:       %d\n",mids[j]);
-            fprintf(stderr,"     description: %s\n",mdesc[j]);
-          }
-        }
-      }
-    }
-  }
-
-  /* Free the allocated memory
-   *--------------------------*/
-  for(i=0; i<Num_materials_sets; ++i) {
-    free(msname[i]);
-
-    for(j=0; j<num_materials[i]; ++j) {
-      free(mdesc[j]);
-    }
-  }
-  free(msname);
-  free(msids);
-  free(num_materials);
-  free(mdesc);
-  free(mids);
-
-  return(Z_OK);
-}
-
-
-/*----------------------
- * gold_materials_loader
- *----------------------*/
-static int
-gold_materials_loader(int geom_time_step)
-{
-  int i, j, k, ms, nn;
-  int err, err1, err2;
-  int geom_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_dims;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  int bd1,bd2,bd3;
-  int *ivals;
-  float *fvals;
-  int do_num;
-  int mixed_present;
-  int matf_size, matfv_size;
-
-
-  fprintf(stderr,"\n-------------- materials_loader --------------\n");
-
-  if(Num_time_sets > 0) {
-    /* Get the timeset used for the geometry
-     *--------------------------------------*/
-    geom_timeset = USERD_get_geom_timeset_number();
-
-    /* Get the number of time steps for this timeset
-     *----------------------------------------------*/
-    Num_time_steps = USERD_get_num_of_time_steps(geom_timeset);
-    if(Num_time_steps < 1) {
-      fprintf(stderr," Error: Num time steps returned: %d\n",Num_time_steps);
-      fprintf(stderr," (Must be >0 to be okay)\n");
-      return(Z_ERR);
-    }
-    if(geom_time_step > (Num_time_steps - 1)) {
-      geom_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the timeset and step - to first step by default, but
-     * can set it at others using -gts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_set_and_step(geom_timeset,geom_time_step);
-
-    fprintf(stderr," Using timeset:   %d  (step range is %d through %d)\n",
-            geom_timeset,0,Num_time_steps-1);
-    fprintf(stderr," Using time step: %d\n",geom_time_step);
-  }
-
-  for(ms=0; ms<Num_materials_sets; ++ms) {
-    fprintf(stderr,"\n");
-    fprintf(stderr," Materials Set %d:\n",ms+1);
-
-    for(p=0; p<Num_parts; ++p) {
-      pn = p+1;
-
-      fprintf(stderr,"\n");
-      fprintf(stderr,"   Part %d:\n",pn);
-
-      /*-----------------------
-       * For unstructured parts
-       *-----------------------*/
-      if(Pbuild[p].type == Z_UNSTRUCTURED) {
-
-        e1 = 0;
-        e2 = Z_MAXTYPE;
-      }
-      else {
-        for(comp=0; comp<3; ++comp) {
-          if(Pbuild[p].ne[comp] < 1) {
-            bdim[comp] = 1;
-          }
-          else {
-            bdim[comp] = Pbuild[p].ne[comp];
-          }
-        }
-        nn = bdim[0] * bdim[1] * bdim[2];
-
-        bd1 = bdim[0]-1;
-        if(bd1 < 1) {
-          bd1 = 1;
-        }
-        bd2 = bdim[1]-1;
-        if(bd2 < 1) {
-          bd2 = 1;
-        }
-        bd3 = bdim[2]-1;
-        if(bd3 < 1) {
-          bd3 = 1;
-        }
-        ne = bd1 * bd2 * bd3;
-
-        /* Determine cell type
-         *--------------------*/
-        num_dims = 3;
-        for(i=0; i<3; ++i) {
-          if(bdim[i] == 1) {
-            --num_dims;
-          }
-        }
-        if(num_dims == 3) {
-          cell_type = Z_HEX08;
-        }
-        else if(num_dims == 2) {
-          cell_type = Z_QUA04;
-        }
-        else {
-          cell_type = Z_BAR02;
-        }
-
-        e1 = cell_type;
-        e2 = cell_type + 1;
-      }
-
-
-      for(et=e1; et<e2; ++et) {
-
-        if(Pbuild[p].type == Z_UNSTRUCTURED) {
-          ne = Pbuild[p].ne[et];
-        }
-
-        if(ne > 0) {
-
-          /* Get the material ids, if any
-           *-----------------------------*/
-          err = USERD_size_matf_data(ms,
-                                     pn,
-                                     et,
-                                     Z_MAT_INDEX,
-                                     &matf_size);
-          if(err == Z_OK && matf_size > 0) {
-
-
-            /* Go get the material ids
-             *------------------------*/
-            ivals = (int *) calloc(matf_size,sizeof(int));
-            if(ivals == (int *)NULL) {
-              fprintf(stderr," Problems allocating for material ids\n");
-              return(Z_ERR);
-            }
-            err = USERD_load_matf_data(ms,
-                                       pn,
-                                       et,
-                                       Z_MAT_INDEX,
-                                       ivals,
-                                       fvals);
-            if(err == Z_OK) {
-              if(matf_size < 20) {
-                fprintf(stderr,"     Printing all mat ids for %s elements\n",
-                        Elem_info[et].name);
-                do_num = matf_size;
-              }
-              else {
-                fprintf(stderr,"     Printing first 20 mat ids for %s elements\n",
-                        Elem_info[et].name);
-                do_num = 20;
-              }
-
-              /* See if any mixed materials
-               *---------------------------*/
-              mixed_present = FALSE;
-              for(k=0; k<matf_size; ++k) {
-                if(ivals[k] < 0) {
-                  mixed_present = TRUE;
-                  break;
-                }
-              }
-
-              /* Feedback
-               *---------*/
-              for(k=0; k<do_num; ++k) {
-                fprintf(stderr,"       mat id[%d] = %d\n",k,ivals[k]);
-              }
-              free(ivals);
-            }
-            else {
-              fprintf(stderr,"     Trouble getting mat ids for %s elements\n",
-                      Elem_info[et].name);
-              free(ivals);
-              return(Z_ERR);
-            }
-          }
-          else {
-            fprintf(stderr,"     %s elements have no material ids\n",
-                    Elem_info[et].name);
-          }
-
-
-          /* Get the mixed material ids, if any
-           *-----------------------------------*/
-          if(mixed_present) {
-            err1 = USERD_size_matf_data(ms,
-                                        pn,
-                                        et,
-                                        Z_MIX_INDEX,
-                                        &matf_size);
-            err2 = USERD_size_matf_data(ms,
-                                        pn,
-                                        et,
-                                        Z_MIX_VALUE,
-                                        &matfv_size);
-
-            if(err1 == Z_OK &&
-               err2 == Z_OK &&
-               matf_size > 0 &&
-               matfv_size > 0) {
-
-              /* Go get the material ids
-               *------------------------*/
-              ivals = (int *) calloc(matf_size,sizeof(int));
-              if(ivals == (int *)NULL) {
-                fprintf(stderr," Problems allocating for mixed material ids\n");
-                return(Z_ERR);
-              }
-              fvals = (float *) calloc(matfv_size,sizeof(float));
-              if(fvals == (float *)NULL) {
-                fprintf(stderr," Problems allocating for mixed material values\n");
-                return(Z_ERR);
-              }
-
-              err1 = USERD_load_matf_data(ms,
-                                          pn,
-                                          et,
-                                          Z_MIX_INDEX,
-                                          ivals,
-                                          fvals);
-
-              err2 = USERD_load_matf_data(ms,
-                                          pn,
-                                          et,
-                                          Z_MIX_VALUE,
-                                          ivals,
-                                          fvals);
-              if(err1 == Z_OK &&
-                 err2 == Z_OK) {
-                if(matf_size < 20) {
-                  fprintf(stderr,"     Printing all mixed mat ids for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = matf_size;
-                }
-                else {
-                  fprintf(stderr,"     Printing first 20 mixed mat ids for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = 20;
-                }
-                for(k=0; k<do_num; ++k) {
-                  fprintf(stderr,"       mixed mat id[%d] = %d\n",k,ivals[k]);
-                }
-                free(ivals);
-
-                if(matfv_size < 20) {
-                  fprintf(stderr,"     Printing all mixed mat values for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = matfv_size;
-                }
-                else {
-                  fprintf(stderr,"     Printing first 20 mixed mat values for %s elements\n",
-                          Elem_info[et].name);
-                  do_num = 20;
-                }
-                for(k=0; k<do_num; ++k) {
-                  fprintf(stderr,"       mixed mat val[%d] = %f\n",k,fvals[k]);
-                }
-                free(fvals);
-              }
-              else {
-                fprintf(stderr,"     Trouble getting mixed mat ids or vals for %s elements\n",
-                        Elem_info[et].name);
-                free(ivals);
-                free(fvals);
-                return(Z_ERR);
-              }
-            }
-            else {
-              fprintf(stderr,"     Trouble getting mixed mat sizes for %s elements\n",
-                      Elem_info[et].name);
-              return(Z_ERR);
-            }
-          }
-          else {
-            fprintf(stderr,"       (%s elements have no mixed material ids)\n",
-                    Elem_info[et].name);
-          }
-        }
-      }
-    }
-  }
-  return(Z_OK);
-}
-
-#endif
-
-
-/*--------------
- * entity_querys
- *--------------*/
-static int
-entity_querys(int var_time_step)
-{
-  int i, j;
-  int err;
-  int v, vn;
-  int var_timeset;
-  int p, pn;
-  int et, e1, e2;
-  int num_comps;
-  int num_dims;
-  int nsize;
-  int comp;
-  int bdim[3];
-  int ne;
-  int cell_type;
-  char line1[Z_BUFL];
-  char line2[Z_BUFL];
-  float qvals[3];
-  int bd1,bd2,bd3;
-
-
-  fprintf(stderr,"\n-------------- entity_querys ------------\n");
-  fprintf(stderr,"       (scalar & vector variables only)    \n");
-  fprintf(stderr,"\n");
-
-#if (defined USERD_API_100)
-
-  if(Num_time_steps > 1) {
-    /* Get the number of time steps for this timeset
-     *----------------------------------------------*/
-    if(var_time_step > (Num_time_steps - 1)) {
-      var_time_step = Num_time_steps - 1;
-    }
-
-    /* Set the time step - to first step by default, but
-     * can set it at others using -vts command argument
-     *---------------------------------------------------------*/
-    USERD_set_time_step(var_time_step);
-
-    fprintf(stderr," Using time step: %d  (where range is %d through %d)\n\n",
-            var_time_step,0,Num_time_steps-1);
-  }
-#endif
-
-  for(v=0; v<Num_vars; ++v) {
-    vn = v + 1;
-
-    /* Scalar or vectors only
-     *-----------------------*/
-    if(Varinfo[v].type == Z_SCALAR || Varinfo[v].type == Z_VECTOR) {
-
-
-      if(Varinfo[v].classify == Z_PER_NODE) {
-        fprintf(stderr," Z_PER_NODE Variable %d:\n",vn);
-      }
-      else {
-        fprintf(stderr," Z_PER_ELEM Variable %d:\n",vn);
-      }
-
-#if (defined GT_USERD_API_100)
-
-      if(Num_time_sets > 0) {
-        /* Get the timeset used for the variable
-         *---------------------------------------*/
-        var_timeset = Varinfo[v].timeset;
-
-        /* Get the number of time steps for this timeset
-         *----------------------------------------------*/
-        Num_time_steps = USERD_get_num_of_time_steps(var_timeset);
-        if(Num_time_steps < 1) {
-          fprintf(stderr," Error: Number of time steps returned: %d\n",
-                  Num_time_steps);
-          fprintf(stderr," (Must be >0 to be okay)\n");
-          return(Z_ERR);
-        }
-        if(var_time_step > (Num_time_steps - 1)) {
-          var_time_step = Num_time_steps - 1;
-        }
-
-        /* Set the timeset and step - to first step by default, but
-         * can set it at others using -vts command argument
-         *---------------------------------------------------------*/
-        USERD_set_time_set_and_step(var_timeset,var_time_step);
-
-        fprintf(stderr,"   Using timeset:   %d  (step range is %d through %d)\n",
-                var_timeset,0,Num_time_steps-1);
-        fprintf(stderr,"   Using time step: %d\n",var_time_step);
-      }
-#endif
-
-
-      /* Get the var description line
-       *-----------------------------*/
-#if (defined GT_USERD_API_100)
-      err = USERD_get_descrip_lines(Z_VARI,vn,FALSE,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-      if(Varinfo[v].complex) {
-        err = USERD_get_descrip_lines(Z_VARI,vn,TRUE,line1,line2);
-        if(err == Z_OK) {
-          fprintf(stderr,"   Desc line (imag): %s\n",line1);
-        }
-        else {
-          fprintf(stderr,"Error: getting var description line (imag)\n");
-          return(Z_ERR);
-        }
-      }
-#else
-
-      err = USERD_get_description_lines(Z_VARI,vn,line1,line2);
-      if(err == Z_OK) {
-        fprintf(stderr,"   Desc line: %s\n",line1);
-      }
-      else {
-        fprintf(stderr,"Error: getting var description line\n");
-        return(Z_ERR);
-      }
-
-#endif
-
-      /* Get the values by component
-       *-----------------------------*/
-      if(Varinfo[v].type == Z_SCALAR) {
-        num_comps = 1;
-      }
-      else if(Varinfo[v].type == Z_VECTOR) {
-        num_comps = 3;
-      }
-
-      /* Per_Node
-       *---------*/
-      if(Varinfo[v].classify == Z_PER_NODE) {
-
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            nsize = Pbuild[p].nn;
-          }
-          else {
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            nsize = bdim[0] * bdim[1] * bdim[2];
-          }
-
-
-
-          if(nsize > 0) {
-
-            fprintf(stderr,"   For part %d, using node %d:\n",pn,nsize);
-
-#if (defined GT_USERD_API_100)
-            err = USERD_get_var_value_at_specific(vn,
-                                                  nsize,
-                                                  pn,
-                                                  0,
-                                                  var_time_step,
-                                                  qvals,
-                                                  FALSE);
-#else
-            err = USERD_get_variable_value_at_specific(vn,
-                                                       nsize,
-                                                       pn,
-                                                       0,
-                                                       var_time_step,
-                                                       qvals);
-#endif
-            if(err == Z_NOT_IMPLEMENTED) {
-              fprintf(stderr,"  Node and element queries not implemented\n");
-              return(Z_OK);
-            }
-            else if(err == Z_ERR) {
-              fprintf(stderr,"     Could not get value\n");
-            }
-            else {
-
-              /* For the component, show 1st node, last node, min, max values
-               *-------------------------------------------------------------*/
-              if(Varinfo[v].type == Z_SCALAR) {
-                fprintf(stderr,"     Scalar value is: %g\n",qvals[0]);
-              }
-              else {
-                fprintf(stderr,"     Vector values are: %g %g %g\n",
-                        qvals[0],qvals[1],qvals[2]);
-              }
-
-#if (defined GT_USERD_API_100)
-              if(Varinfo[v].complex) {
-
-                err = USERD_get_var_value_at_specific(vn,
-                                                      nsize,
-                                                      pn,
-                                                      0,
-                                                      var_time_step,
-                                                      qvals,
-                                                      TRUE);
-
-                if(err == Z_ERR) {
-                  fprintf(stderr,"     Could not get imag value\n");
-                }
-                else {
-
-                  /* For the component, show 1st node, last node, min, max values
-                   *-------------------------------------------------------------*/
-                  if(Varinfo[v].type == Z_SCALAR) {
-                    fprintf(stderr,"     Scalar value (imag) is: %g\n",qvals[0]);
-                  }
-                  else {
-                    fprintf(stderr,"     Vector values (imag) are: %g %g %g\n",
-                            qvals[0],qvals[1],qvals[2]);
-                  }
-                }
-              }
-#endif
-
-            }
-          }
-        }
-      }
-
-      /* Per_Elem
-       *---------*/
-      else {
-        for(p=0; p<Num_parts; ++p) {
-          pn = p + 1;
-
-          if(Pbuild[p].type != Z_UNSTRUCTURED) {
-
-            for(comp=0; comp<3; ++comp) {
-              if(Pbuild[p].ne[comp] < 1) {
-                bdim[comp] = 1;
-              }
-              else {
-                bdim[comp] = Pbuild[p].ne[comp];
-              }
-            }
-            bd1 = bdim[0]-1;
-            if(bd1 < 1) {
-              bd1 = 1;
-            }
-            bd2 = bdim[1]-1;
-            if(bd2 < 1) {
-              bd2 = 1;
-            }
-            bd3 = bdim[2]-1;
-            if(bd3 < 1) {
-              bd3 = 1;
-            }
-            nsize = bd1 * bd2 * bd3;
-
-
-            /* Determine cell type
-             *--------------------*/
-            num_dims = 3;
-            for(i=0; i<3; ++i) {
-              if(bdim[i] == 1) {
-                --num_dims;
-              }
-            }
-            if(num_dims == 3) {
-              cell_type = Z_HEX08;
-            }
-            else if(num_dims == 2) {
-              cell_type = Z_QUA04;
-            }
-            else {
-              cell_type = Z_BAR02;
-            }
-          }
-
-          if(Pbuild[p].type == Z_UNSTRUCTURED) {
-            e1 = 0;
-            e2 = Z_MAXTYPE-1;
-          }
-          else {
-            e1 = e2 = cell_type;
-          }
-
-          for(et=e1; et<=e2; ++et) {
-
-            if(Pbuild[p].type == Z_UNSTRUCTURED) {
-              nsize = Pbuild[p].ne[et];
-            }
-
-            if(nsize > 0) {
-
-
-              fprintf(stderr,"   For part %d, using elem %d of type %s:\n",
-                      pn,nsize,Elem_info[et].name);
-
-
-#if (defined GT_USERD_API_100)
-              err = USERD_get_var_value_at_specific(vn,
-                                                    nsize,
-                                                    pn,
-                                                    et,
-                                                    var_time_step,
-                                                    qvals,
-                                                    FALSE);
-#else
-            err = USERD_get_variable_value_at_specific(vn,
-                                                       nsize,
-                                                       pn,
-                                                       et,
-                                                       var_time_step,
-                                                       qvals);
-#endif
-
-              if(err == Z_NOT_IMPLEMENTED) {
-                fprintf(stderr,"  Node and element queries not implemented\n");
-                return(Z_OK);
-              }
-              else if(err == Z_ERR) {
-                fprintf(stderr,"     Could not get value\n");
-              }
-              else {
-                if(Varinfo[v].type == Z_SCALAR) {
-                  fprintf(stderr,"     Scalar value is: %g\n",qvals[0]);
-                }
-                else {
-                  fprintf(stderr,"     Vector values are: %g %g %g\n",
-                          qvals[0],qvals[1],qvals[2]);
-                }
-
-#if (defined GT_USERD_API_100)
-                if(Varinfo[v].complex) {
-
-                  err = USERD_get_var_value_at_specific(vn,
-                                                        nsize,
-                                                        pn,
-                                                        et,
-                                                        var_time_step,
-                                                        qvals,
-                                                        TRUE);
-                  if(err == Z_ERR) {
-                    fprintf(stderr,"     Could not get imag value\n");
-                  }
-                  else {
-                    if(Varinfo[v].type == Z_SCALAR) {
-                      fprintf(stderr,"     Scalar value (imag) is: %g\n",qvals[0]);
-                    }
-                    else {
-                      fprintf(stderr,"     Vector values (imag) are: %g %g %g\n",
-                              qvals[0],qvals[1],qvals[2]);
-                    }
-                  }
-                }
-#endif
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  return(Z_OK);
-}
-
-
-/*--------------
- * exercise_bkup
- *--------------*/
-static int
-exercise_bkup( void )
-{
-  int err;
-  FILE *arcfile;
-
-  fprintf(stderr,"\n------------ exercise_archive -----------\n");
-
-  arcfile = fopen("test.arc","wb");
-  if(arcfile == (FILE *)NULL) {
-    fprintf(stderr,"Error: opening test archive file\n");
-    return(Z_ERR);
-  }
-  err = USERD_bkup(arcfile,Z_SAVE_ARCHIVE);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: saving to test archive file\n");
-    return(Z_ERR);
-  }
-  fclose(arcfile);
-
-  arcfile = fopen("test.arc","rb");
-  err = USERD_bkup(arcfile,Z_REST_ARCHIVE);
-  if(err == Z_ERR) {
-    fprintf(stderr,"Error: restoring from test archive file\n");
-    return(Z_ERR);
-  }
-
-  fprintf(stderr," Archive test completed\n");
-
-  fclose(arcfile);
-
-  return(Z_OK);
-}
-
-/* -------------------------------------------------------
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ------------------------------------------------------ */
-int load_fail_defaults(void)
-{
-  int check_for_failed = FALSE;
-  int cri1 = 0;                 /* Criteria1 ELE_FAILED_GREATER, etc */
-  int cri2 = 0;
-  int  logic_cri2 = 0;        /* Logic for criteria 2  ELE_FAILED_LOGIC_NONE, AND, etc */
-  float val1 = 0.0;           /* failure threshold 1 */
-  float  val2= 0.0;           /* failure threshold 2 */
-  char failed_var_name[Z_MXVARIABLEDESC]={EOS};
-
-  check_for_failed =  USERD_get_uns_failed_params( failed_var_name,
-                                                   &val1, &val2, &cri1, &cri2,
-                                                   &logic_cri2 );
-  fprintf(stderr,"\n------------- failed element info -------------\n");
-  if (check_for_failed == TRUE) {
-    fprintf(stderr," Failed element criteria info \n");
-    fprintf(stderr," Variable name = %s\n",failed_var_name);
-    fprintf(stderr," Criteria 1 = %d\n",cri1);
-    fprintf(stderr," Criteria 2 = %d\n",cri1);
-    fprintf(stderr," Logic criteria = %d\n",logic_cri2);
-    fprintf(stderr," Value 1 = %f\n",val1);
-    fprintf(stderr," Value 2 = %f\n",val2);
-  } else {
-    fprintf(stderr," No Failed elements\n");
-  }
-  return(Z_OK);
-}
-
-
-/* End of File */
diff --git a/applications/test/ensightFoamReader/udr_checker.c b/applications/test/ensightFoamReader/udr_checker.c
deleted file mode 120000
index 2e9390c3103319daef639094dccfc34f83de8ee5..0000000000000000000000000000000000000000
--- a/applications/test/ensightFoamReader/udr_checker.c
+++ /dev/null
@@ -1 +0,0 @@
-udr_checker-80.c
\ No newline at end of file
diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/getTimeIndex.H b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/getTimeIndex.H
index 8ce3150b75672bbc0c3c1739f3e5f08e6b0c9729..b83ba15cef6405c848c02e6746397d4701204d93 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/getTimeIndex.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsightParts/getTimeIndex.H
@@ -1,8 +1,8 @@
 // Read time index from */uniform/time, but treat 0 and constant specially
 // or simply increment from the '-index' option if it was supplied
 
-    label timeIndex = 0;
-
+label timeIndex = 0;
+{
     if (optIndex)
     {
         timeIndex = indexingNumber++;
@@ -37,7 +37,4 @@
             continue;
         }
     }
-
-    Info<< nl << "Time [" << timeIndex << "] = " << runTime.timeName() << nl;
-
-// end-of-file
+}
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertLagrangian.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertLagrangian.H
index 2719ccc85a4442365ea886b13af5f6159f13ce6e..07341e6dad46dcf0c543e8afced3b35d7b989799 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertLagrangian.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertLagrangian.H
@@ -94,7 +94,7 @@ if (doLagrangian)
         );
 
         Info<< "    Lagrangian: "
-            << runTime.relativePath(writer.output()) << nl;
+            << args.relativePath(writer.output()) << nl;
 
         writer.writeTimeValue(mesh.time().value());
         writer.writeGeometry();
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H
index 5ab48ff99d95b685f0dd41c44dc71e77bfbc72de..a35a3de15e4ee889ac3390eb2603b8a122ffde41 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertSurfaceFields.H
@@ -107,7 +107,7 @@ Description
             );
 
             Info<< "    Surface   : "
-                << runTime.relativePath(writer.output()) << nl;
+                << args.relativePath(writer.output()) << nl;
 
 
             writer.writeTimeValue(timeValue);
@@ -211,7 +211,7 @@ Description
             );
 
             Info<< "    FaceZone  : "
-                << runTime.relativePath(writer.output()) << nl;
+                << args.relativePath(writer.output()) << nl;
 
 
             writer.beginFile(fz.name());
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertTopoSet.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertTopoSet.H
index e2a96e898f7a2f9dd11169b4cba419d5dd0406bc..270843cf7f1ac446b0b9a1d93351d3f2fa522782 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertTopoSet.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertTopoSet.H
@@ -42,7 +42,7 @@ if (faceSetName.size())
     );
 
     Info<< "    faceSet   : "
-        << runTime.relativePath(outputName) << nl;
+        << args.relativePath(outputName) << nl;
 
     vtk::writeFaceSet
     (
@@ -70,7 +70,7 @@ if (pointSetName.size())
     );
 
     Info<< "    pointSet  : "
-        << runTime.relativePath(outputName) << nl;
+        << args.relativePath(outputName) << nl;
 
     vtk::writePointSet
     (
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertVolumeFields.H b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertVolumeFields.H
index 763b3fa3d9fd93b77690ca57492e5ed4e540d5d2..ad4e27ef5169d54ab53318f2d02a76b53204e27f 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/convertVolumeFields.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/convertVolumeFields.H
@@ -113,7 +113,7 @@ Description
         );
 
         Info<< "    Internal  : "
-            << runTime.relativePath(internalWriter->output()) << nl;
+            << args.relativePath(internalWriter->output()) << nl;
 
         internalWriter->writeTimeValue(mesh.time().value());
         internalWriter->writeGeometry();
@@ -163,7 +163,7 @@ Description
         );
 
         Info<< "    Boundaries: "
-            << runTime.relativePath(writer->output()) << nl;
+            << args.relativePath(writer->output()) << nl;
 
         writer->writeTimeValue(timeValue);
         writer->writeGeometry();
@@ -229,7 +229,7 @@ Description
             );
 
             Info<< "    Boundary  : "
-                << runTime.relativePath(writer->output()) << nl;
+                << args.relativePath(writer->output()) << nl;
 
             writer->writeTimeValue(timeValue);
             writer->writeGeometry();
diff --git a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
index 2d727012ce00fe7f3090daa484cc361d882d0e80..9108061b3a304cc43e6e380656493fad6a98cc62 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
+++ b/applications/utilities/postProcessing/dataConversion/foamToVTK/foamToVTK.C
@@ -575,7 +575,7 @@ int main(int argc, char *argv[])
 
     fvMeshSubsetProxy::subsetType cellSubsetType = fvMeshSubsetProxy::NONE;
 
-    string vtkName = runTime.globalCaseName();
+    string vtkName = args.globalCaseName();
 
     if (regionNames.size() == 1)
     {
@@ -628,7 +628,7 @@ int main(int argc, char *argv[])
     // Sub-directory for output
     const word vtkDirName = args.opt<word>("name", "VTK");
 
-    const fileName outputDir(runTime.globalPath()/vtkDirName);
+    const fileName outputDir(args.globalPath()/vtkDirName);
 
     if (Pstream::master())
     {
@@ -650,7 +650,7 @@ int main(int argc, char *argv[])
             if (args.found("overwrite") && isDir(regionDir))
             {
                 Info<< "Removing old directory "
-                    << runTime.relativePath(regionDir)
+                    << args.relativePath(regionDir)
                     << nl << endl;
                 rmDir(regionDir);
             }
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoam.C b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoam.C
index 1cf6e69aaf718c77be7f598239d47d94d0c4a38b..794949c3f9105ada66b53eef3b9648debc04b84e 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoam.C
+++ b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVFoam/vtkPVFoam.C
@@ -30,6 +30,7 @@ License
 #include "areaFaMesh.H"
 #include "faMesh.H"
 #include "fvMesh.H"
+#include "foamVersion.H"
 #include "Time.H"
 #include "patchZones.H"
 #include "IOobjectList.H"
@@ -314,6 +315,9 @@ Foam::vtkPVFoam::vtkPVFoam
         fullCasePath = cwd();
     }
 
+    // OPENFOAM API
+    setEnv("FOAM_API", std::to_string(foamVersion::api), true);
+
     // The name of the executable, unless already present in the environment
     setEnv("FOAM_EXECUTABLE", "paraview", false);
 
diff --git a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/vtkPVblockMesh.C b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/vtkPVblockMesh.C
index 6a9037c38540e54f51f46a3ed603652210c35b1e..efec807d266af56655fd4865ace86adefa4e5817 100644
--- a/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/vtkPVblockMesh.C
+++ b/applications/utilities/postProcessing/graphics/PVReaders/vtkPVblockMesh/vtkPVblockMesh.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -29,6 +29,7 @@ License
 // OpenFOAM includes
 #include "blockMesh.H"
 #include "blockMeshTools.H"
+#include "foamVersion.H"
 #include "Time.H"
 #include "patchZones.H"
 #include "StringStream.H"
@@ -206,6 +207,9 @@ Foam::vtkPVblockMesh::vtkPVblockMesh
         fullCasePath = cwd();
     }
 
+    // OPENFOAM API
+    setEnv("FOAM_API", std::to_string(foamVersion::api), true);
+
     // The name of the executable, unless already present in the environment
     setEnv("FOAM_EXECUTABLE", "paraview", false);
 
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/Allwmake b/applications/utilities/postProcessing/graphics/ensightFoamReader/Allwmake
deleted file mode 100755
index ecb7039b93a994de65d349fce9bea25d936eea56..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/Allwmake
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/sh
-cd ${0%/*} || exit 1                        # Run from this directory
-. $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
-
-#------------------------------------------------------------------------------
-
-wmake $targetType
-
-#------------------------------------------------------------------------------
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/Make/files b/applications/utilities/postProcessing/graphics/ensightFoamReader/Make/files
deleted file mode 100644
index 4a5c265dcd9c28a1ce3b541e4e68c42d0497f2e1..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/Make/files
+++ /dev/null
@@ -1,3 +0,0 @@
-libuserd.C
-
-LIB = $(FOAM_LIBBIN)/libuserd-foam
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/Make/options b/applications/utilities/postProcessing/graphics/ensightFoamReader/Make/options
deleted file mode 100644
index 0d76f0304cb80b84d3b76b745da396950249f4a5..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/Make/options
+++ /dev/null
@@ -1,14 +0,0 @@
-EXE_INC = \
-    -I$(LIB_SRC)/finiteVolume/lnInclude \
-    -I$(LIB_SRC)/meshTools/lnInclude \
-    -I$(LIB_SRC)/browser/lnInclude \
-    -I$(LIB_SRC)/sampling/lnInclude \
-    -I$(LIB_SRC)/lagrangian/basic/lnInclude
-
-LIB_LIBS = \
-    -lOpenFOAM \
-    -lfiniteVolume \
-    -lmeshTools \
-    -lgenericPatchFields \
-    -llagrangian \
-    $(PROJECT_LIBS)
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README b/applications/utilities/postProcessing/graphics/ensightFoamReader/README
deleted file mode 100644
index 24ed777c767b9d643e7d173b0e324ccd7add4f30..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README
+++ /dev/null
@@ -1,1847 +0,0 @@
---------------------------------------
-EnSight User Defined Reader Capability
---------------------------------------
-
-A user defined reader capability is included in EnSight which allows otherwise
-unsupported structured or unstructured data to be read.  The user defined
-reader utilizes a dynamic shared library composed of routines defined in this
-document, but produced by the user (or some third party). This capability is
-currently available for dec, ibm, hp, sgi, and sun servers.
-
-****************************************************************************
-Note: Several user defined readers have been included with your EnSight
-      release and can be accessed by changing the ENSIGHT6_READER
-      environment variable as outlined in step 3. below.   Please be aware
-      that these are "unsupported" readers, but many of them are being used
-      successfully.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
---------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy library and for various other working or
-        sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $ENSIGHT6_HOME/ensight62/user_defined_src/readers
-
-        examples:
-        --------
-        The default library. Basic dummy routines.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/dummy
-
-        Sample library which reads unstructured binary EnSight6 data.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/ensight6
-
-        Sample library which reads binary static plot3d data.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/plot3d
-
-        Reads binary LS-DYNA3D state database.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/ls-dyna3d
-
-        Reads FORTRAN binary Unstrutured dytran data base.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/dytran
-
-        Reads FlowScience "flsgrf" flow3d data.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/flow3d
-
-        Reads Tecplot "plt" files.        
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/tecplot
-
-        Reads Common File Format data.        
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/cff
-
-        Reads Cobalt grid and picture/restart file data.        
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/cobalt
- 
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-	routines are called, which is provided in this file, along with
- 	the example libraries, should make it possible for you to produce
-	code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-        This is a compiling and loading process which varies according to
-        the type of machine you are on.  Thus, a separate makefile is provided
-        for each machine type.  Operating system level differences could cause
-        you to have to modify these makefiles slightly, but the general
-        process is very straightforward.  Note that for the SGI environment you
-        must compile with the following flags to ensure compatability with
-        the EnSight server:  Irix_5.3     -mips1
-                             Irix_6.2     -mips2
-                             Irix_6.5_n32 -mips3
-                             Irix_6.5_n64 -mips4 -64
-
-       __________________________________________________________________
-      | MACHINE | MAKEFILE TO USE       |  SHARED LIBRARY NAME PRODUCED  |
-      |  TYPE   |--------------------------------------------------------|
-      |         |         LD COMMAND USED IN MAKEFILE                    |
-       ==================================================================
-       __________________________________________________________________
-      | sgi     | makefile.sgi          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -shared -all -o libuserd.so libuserd.o              |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | hp      | makefile.hp           |  libuserd.sl                   |
-      |         |--------------------------------------------------------|
-      |         | ld -b -o libuserd.sl libuserd.o                        |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | sun     | makefile.sun          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -G -o libuserd.so libuserd.o                        |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | dec     | makefile.dec          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -shared -all -o libuserd.so libuserd.o -lc          |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | ibm     | makefile.ibm          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -G -o libuserd.so libuserd.o -bnoentry -bexpall -lc |
-       ------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice under:
-
-     $ENSIGHT6_HOME/machines/$ENSIGHT6_ARCH/lib_readers
-
-   Thus, if you created a reader for "mydata", you should create the
-   following directory, and place your libuserd.so into it:
-
-     $ENSIGHT6_HOME/machines/$ENSIGHT6_ARCH/lib_readers/mydata
-
-
-3. Set up the ENSIGHT6_READER environment variable so EnSight will know
-   which reader directory to use at runtime.
-
-   Ensight will look for the library under:
-
-     $ENSIGHT6_HOME/machines/$ENSIGHT6_ARCH/lib_readers/$ENSIGHT6_READER
-
-   When EnSight was installed, you set this variable to "dummy", with:
-
-     setenv ENSIGHT6_READER dummy
-
-   You can use any of the other provided readers by changing this variable.
-   For example, to use the dytran reader:
-
-     setenv ENSIGHT6_READER dytran 
-
-   Thus, you can use your reader in the same way.  If you provided "mydata",
-   change ENSIGHT6_READER to:
- 
-     setenv ENSIGHT6_READER mydata
-
-
-   For your information, EnSight makes sure that the appropriate library
-   environment variable is set for your machine architecture. You do not
-   have to deal with this if you locate your library as outlined above.
-   The library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-IMPORTANT:  Unless the shared library is available in the
-            .../$ENSIGHT6_READER directory, EnSight will not run.
-
-As always, EnSight support is available if you need it.
-
-
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_number_of_global_nodes                number of global nodes
-USERD_get_global_coords                         global node coordinates
-USERD_get_global_node_ids                       global node ids
-USERD_get_element_connectivities_for_part       part's element connectivites
-USERD_get_element_ids_for_part                  part's element ids
-USERD_get_scalar_values                         global scalar variables
-USERD_get_vector_values                         global vector variables
-
-
-Generally Needed for BLOCK data
------------------------------------------
-USERD_get_block_coords_by_component             block coordinates
-USERD_get_block_iblanking                       block iblanking values
-USERD_get_block_scalar_values                   block scalar variables
-USERD_get_block_vector_values_by_component      block vector variables 
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_set_filenames                             filenames entered in GUI
-USERD_set_time_step                             current time step
-
-USERD_get_name_of_reader                        name of reader for GUI
-USERD_get_number_of_files_in_dataset            number of files in model
-USERD_get_dataset_query_file_info               info about each model file
-USERD_get_changing_geometry_status              changing geometry?
-USERD_get_node_label_status                     node labels?
-USERD_get_element_label_status                  element labels?
-USERD_get_number_of_time_steps                  number of time steps
-USERD_get_solution_times                        solution time values
-USERD_get_description_lines                     file associated descrip lines
-USERD_get_number_of_variables                   number of variables
-USERD_get_variable_info                         variable type/descrip etc.
-USERD_get_constant_value                        constant variable's value
-USERD_get_number_of_model_parts                 number of model parts
-USERD_get_part_build_info                       part type/descrip etc.
-USERD_get_variable_value_at_specific            node's or element's variable
-                                                   value over time
-
-USERD_stop_part_building                        cleanup routine
-USERD_bkup                                      archive routine
-
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-
-2. Setting filenames and getting time info
-        USERD_set_filenames
-        USERD_get_number_of_time_steps
-        USERD_get_solution_times
-        USERD_set_time_step
-
-3. Gathering info for part builder
-
-        USERD_set_time_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_description_lines             (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_part_build_info
-        USERD_get_number_global_nodes
-        USERD_get_global_coords                 (for model extents)
-        USERD_get_block_coords_by_component     (for model extents)
-
-4. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_variable_info
-              
-5. Part building (per part created)
-
-        USERD_set_time_step
-        USERD_get_global_coords
-        USERD_get_global_node_ids
-        USERD_get_element_connectivities_for_part
-        USERD_get_element_ids_for_part
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-6. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_step
-        USERD_get_constant_value
-          
-        scalars:
-        -------
-        USERD_get_description_lines
-        USERD_set_time_step
-        USERD_get_scalar_values
-        USERD_get_block_scalar_values
-
-        vectors:
-        -------
-        USERD_get_description_lines
-        USERD_set_time_step
-        USERD_get_vector_values
-        USERD_get_block_vector_values_by_component
-
-7. Changing geometry
-
-        changing coords only:
-        --------------------
-        USERD_set_time_step
-        USERD_get_global_coords
-        USERD_get_block_coords_by_component
-
-        changing connectivity:
-        ---------------------
-        USERD_set_time_step
-        USERD_get_number_of_model_parts
-        USERD_get_part_build_info
-        USERD_get_number_global_nodes
-        USERD_get_global_coords
-        USERD_get_global_node_ids
-        USERD_get_element_connectivities_for_part
-        USERD_get_element_ids_for_part
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-  
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available      = 0;
-static int Num_unstructured_parts  = 0;
-static int Num_structured_blocks   = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_time_steps          = 1;
-static int Num_global_nodes        = 0;
-static int Num_variables           = 0;
-static int Num_dataset_files       = 0;
-static int Current_time_step       = 0;
-
-
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
-
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_scalar_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each node of a block, for a given scalar variable
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a block, for a given scalar variable
-
-   Specification:
-   -------------
-   int USERD_get_block_scalar_values(int block_number,
-                                     int which_scalar,
-                                     float *scalar_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-   (IN)  which_scalar            = The variable number
-   (OUT) scalar_array            = 1D array containing scalar values
-                                   for each node or element.
-
-                                   Array will have been allocated:
-        
-                                   if Z_PER_NODE:
-                                      i*j*k for the block long
-
-                                   if Z_PER_ELEM:
-                                      (i-1)*(i-1)*(k-1) for the block long
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0,
-     Num_variables is > 0, and there are some scalar type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_vector_values_by_component
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each node of a block, for a given vector
-     variable, one component at a time.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a block, for a given vector
-     variable, one component at a time.
-
-
-   Specification:
-   -------------
-   int USERD_get_block_vector_values_by_component(int block_number,
-                                                  int which_vector,
-                                                  int which_component,
-                                                  float *vector_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-
-   (IN)  which_vector            = The variable number
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) vector_array            = 1D array containing vector
-                                   component value for each node or element.
-
-                                   Array will have been allocated:
-        
-                                   if Z_PER_NODE:
-                                      i*j*k for the block long
-
-                                   if Z_PER_ELEM:
-                                      (i-1)*(i-1)*(k-1) for the block long
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0,
-     Num_variables is > 0, and there are some vector type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.
-
-
-
---------------------------------------------------------------------
-USERD_get_constant_value
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_BUFLEN is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-
-
-
---------------------------------------------------------------------
-USERD_get_description_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_description_lines(int which_type,
-                                   int which_var,
-                                   char line1[Z_BUFL],
-                                   char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_connectivities_for_part
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of an unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_element_connectivities_for_part(int part_number,
-                                                 int **conn_array[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-
-   (OUT) conn_array              = 3D array containing connectivity
-                                   of each element of each type.
-
-                                  (Array will have been allocated
-                                   Z_MAXTYPE by num_of_elements of
-                                   each type by connectivity length
-                                   of each type)
-
-                       ex) If num_of_elements[Z_TRI03] = 25
-                              num_of_elements[Z_QUA04] = 100
-                              num_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[Z_TRI03][25][3]
-                              conn_array[Z_QUA04][100][4]
-                              conn_array[Z_HEX08][30][8]
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * The coord_array loaded in USERD_get_global_coords is zero-based,
-     but within EnSight it will become a one-based array.
-     Thus, coord_array[0] will be accessed by node 1 from the conn_array,
-           coord_array[1] will be accessed by node 2 from the conn_array, etc.
-
-      ex) Given a model of two triangles, you should load coord_array in
-          USERD_get_global_coords as follows:
-
-                            node  coordinates
-                            ----  -----------
-          4 --------- 3      1    coord_array[0].xyz[0] = 0.0
-           |\        |            coord_array[0].xyz[1] = 0.0
-           | \  T2   |            coord_array[0].xyz[2] = 0.0
-           |  \      |
-           |   \     |       2    coord_array[1].xyz[0] = 1.0
-           |    \    |            coord_array[1].xyz[1] = 0.0
-           |     \   |            coord_array[1].xyz[2] = 0.0
-           |      \  |
-           |  T1   \ |       3    coord_array[2].xyz[0] = 1.0
-           |        \|            coord_array[2].xyz[1] = 1.6
-          1 --------- 2           coord_array[2].xyz[2] = 0.0
-
-                             4    coord_array[3].xyz[0] = 0.0
-                                  coord_array[3].xyz[1] = 1.6
-                                  coord_array[3].xyz[2] = 0.0
-
-
-        And conn_array here as follows:
-                                               
-        Triangle  Connectivity
-        --------  ------------
-           T1     conn_array[Z_TRI03][0][0] = 1
-                  conn_array[Z_TRI03][0][1] = 2
-                  conn_array[Z_TRI03][0][2] = 4
-
-           T2     conn_array[Z_TRI03][1][0] = 2
-                  conn_array[Z_TRI03][1][1] = 3
-                  conn_array[Z_TRI03][1][2] = 4
-
-
-
---------------------------------------------------------------------
-USERD_get_element_ids_for_part
-
-   Description:
-   -----------
-   Gets the ids for the elements of an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_element_ids_for_part(int part_number,
-                                      int *elemid_array[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-
-   (OUT) elemid_array            = 2D array containing id of each
-                                   element of each type.
-
-                                  (Array will have been allocated
-                                   Z_MAXTYPE by num_of_elements of
-                                   each type)
-
-                       ex) If num_of_elements[Z_TRI03] = 25
-                              num_of_elements[Z_QUA04] = 100
-                              num_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[Z_TRI03][25]
-                              conn_array[Z_QUA04][100]
-                              conn_array[Z_HEX08][30]
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and element
-     label status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_global_coords
-
-   Description:
-   -----------
-   Gets the coordinates for the global nodes.
-
-   Specification:
-   -------------
-   int USERD_get_global_coords(CRD *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) coord_array             = 1D array of CRD structures,
-                                   which contains x,y,z coordinates
-                                   of each node.
-
-                                  (Array will have been allocated
-                                   Num_global_nodes long)
-
-    For reference, CRD structure (which is in global_extern) is:
-
-         typedef struct {
-            float xyz[3];
-         }CRD;
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * The coord_array is zero-based, but within EnSight it will become
-     a one-based array.
-     Thus, coord_array[0] will be accessed by node 1 from the conn_array,
-           coord_array[1] will be accessed by node 2 from the conn_array, etc.
-
-      ex) Given a model of two triangles, you should load coord_array as
-          follows:
-
-                            node  coordinates
-                            ----  -----------
-          4 --------- 3      1    coord_array[0].xyz[0] = 0.0
-           |\        |            coord_array[0].xyz[1] = 0.0
-           | \  T2   |            coord_array[0].xyz[2] = 0.0
-           |  \      |
-           |   \     |       2    coord_array[1].xyz[0] = 1.0
-           |    \    |            coord_array[1].xyz[1] = 0.0
-           |     \   |            coord_array[1].xyz[2] = 0.0
-           |      \  |
-           |  T1   \ |       3    coord_array[2].xyz[0] = 1.0
-           |        \|            coord_array[2].xyz[1] = 1.6
-          1 --------- 2           coord_array[2].xyz[2] = 0.0
-
-                             4    coord_array[3].xyz[0] = 0.0
-                                  coord_array[3].xyz[1] = 1.6
-                                  coord_array[3].xyz[2] = 0.0
-
-
-        And conn_array in USERD_get_element_connectivities_for_part
-        as follows:
-                                               
-        Triangle  Connectivity
-        --------  ------------
-           T1     conn_array[Z_TRI03][0][0] = 1
-                  conn_array[Z_TRI03][0][1] = 2
-                  conn_array[Z_TRI03][0][2] = 4
-
-           T2     conn_array[Z_TRI03][1][0] = 2
-                  conn_array[Z_TRI03][1][1] = 3
-                  conn_array[Z_TRI03][1][2] = 4
-
---------------------------------------------------------------------
-USERD_get_global_node_ids
-
-   Description:
-   -----------
-   Gets the node ids assigned to each of the global nodes.
-
-   Specification:
-   -------------
-   int USERD_get_global_node_ids(int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node. The ids must be > 0
-
-                                   (Array will have been allocated
-                                    Num_global_nodes long)
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and node label
-     status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) *two_fields          = FALSE if only one data field required
-				      in the data dialog of EnSight.
-				TRUE if two data fields required.
-
-   Notes:
-   -----
-   * Always called.  Provide a name for your custom reader format.
-
-   * If you don't want a custom reader to show up in the data dialog
-     choices, return a name of "No_Custom"
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  The must also be
-       positive numbers greater than zero.
-
-         USERD_get_global_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         Also be aware that if you say node labels are available,
-         the connectivity of elements must be according to these
-         node ids.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_global_nodes
-
-   Description:
-   -----------
-   Gets the number of global nodes, used for unstructured parts.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_global_nodes()
-
-   Returns:
-   -------
-   Number of global nodes (>=0 if okay, <0 if problems)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * For unstructured data:
-           EnSight wants  1. A global array of nodes
-                          2. Element connectivities by part, which
-                             reference the node numbers of the global
-                             node array.
-                IMPORTANT:
-                ---------
-                If you provide node ids, then element connectivities
-                must be in terms of the node ids.  If you do not
-                provide node ids, then element connectivities must be
-                in terms of the index into the node array, but shifted
-                to start at 1
-
-   * Num_global_nodes would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if probs).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_time_steps( void )
-
-   Returns:
-   -------
-   Number of time steps  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, and vector types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_part_build_info(int *part_numbers,
-                                 int *part_types,
-                                 char *part_description[Z_BUFL],
-                                 int *number_of_elements[Z_MAXTYPE],
-                                 int *ijk_dimensions[3],
-                                 int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) part_numbers           = Array containing part numbers for
-                                  each of the model parts.
-
-                                  IMPORTANT:
-                                   Parts numbers must be >= 1
-
-            ********************************************
-             The numbers provided here are the ones by
-             which the parts will be referred to in any
-             of the other routines which receive a part
-             number or block number as an argument!! 
-            ********************************************
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimensions
-                                  for each structured model part.
-                                           ----------
-                                  (Ignored if Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 3 long)
-
-                             ijk_dimensions[][0] = I dimension
-                             ijk_dimensions[][1] = J dimension
-                             ijk_dimensions[][2] = K dimension
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_scalar_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each global node for a given scalar variable.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a specific part and type for a
-     given scalar variable.
-
-   Specification:
-   -------------
-   int USERD_get_scalar_values(int which_scalar,
-                               int which_part,
-                               int which_type,
-                               float *scalar_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_scalar            = The variable number (of scalar type)
-
-   (IN)  which_part 
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The part number
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-
-   (OUT) scalar_array 
-
-            if Z_PER_NODE:       = 1D array containing scalar values
-                                    for each node.
-
-                                   (Array will have been allocated
-                                    Num_global_nodes long)
-
-            if Z_PER_ELEM:       = 1d array containing scalar values for
-                                   each element of a particular part and type.
-                                    
-                                   (Array will have been allocated
-                                    number_of_elements[which_part][which_type]
-                                    long.  See USERD_get_part_build_info)
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0,
-     Num_variables is > 0, and you have some scalar type variables.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_solution_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step.
-
-   Specification:
-   -------------
-   int USERD_get_solution_times(float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) solution_times       = 1D array of solution times/time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_variable_info(char **var_description,
-                               char **var_filename,
-                               int *var_type,
-                               int *var_classify)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_filename         = Variable filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-              etc.
-
-
-
---------------------------------------------------------------------
-USERD_get_variable_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_variable_value_at_specific(int which_var,
-                                            int which_node_or_elem,
-                                            int which_part,
-                                            int which_elem_type,
-                                            int time_step,
-                                            float values[3])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-                        If Z_PER_NODE:
-                          = The node number.  This is not the id, but is
-                                              the index of the global node 
-                                              list (1 based), or the block's
-                                              node list (1 based).
-
-                            Thus,  coord_array[1]
-                                   coord_array[2]
-                                   coord_array[3]
-                                        .      |
-                                        .      |which_node_or_elem index
-                                        .             ----
-
-
-                        If Z_PER_ELEM:
-                          = The element number.  This is not the id, but is
-                                                 the element number index
-                                                 of the number_of_element array
-                                                 (see USERD_get_part_build_info),
-                                                 or the block's element list
-  zzzzz                                          (1 based).
-
-                            Thus,  for which_part:
-                                   conn_array[which_elem_type][0]
-                                   conn_array[which_elem_type][1]
-                                   conn_array[which_elem_type][2]
-                                        .                      |
-                                        .          which_node_or_elem index
-                                        .                        ----
-
-
-   (IN)  which_part
-
-                        If Z_PER_NODE, or block part:
-                          = Not used
-
-                        If Z_PER_ELEM:
-                          = The part number
-
-   (IN)  which_elem_type
-
-                        If Z_PER_NODE, or block part:
-                          = Not used
-
-                        If Z_PER_ELEM:
-                          = The element type.    This is the element type index
-                                                 of the number_of_element array
-                                                 (see USERD_get_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-
---------------------------------------------------------------------
-USERD_get_vector_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each global node for a given vector variable.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a specific part and type for a
-     given vector variable.
-
-   Specification:
-   -------------
-   int USERD_get_vector_values(int which_vector,
-                               int which_part,
-                               int which_type,
-                               float *vector_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_vector            = The variable number
-
-   (IN)  which_part 
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The part number
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-
-   (OUT) vector_array 
-
-            if Z_PER_NODE:       = 1D array containing vector values
-                                    for each node.
-
-                                   (Array will have been allocated
-                                    3 by Num_global_nodes long)
-
-                      Info stored in this fashion:
-                            vector_array[0] = xcomp of node 1
-                            vector_array[1] = ycomp of node 1
-                            vector_array[2] = zcomp of node 1
-
-                            vector_array[3] = xcomp of node 2
-                            vector_array[4] = ycomp of node 2
-                            vector_array[5] = zcomp of node 2
-
-                            vector_array[6] = xcomp of node 3
-                            vector_array[7] = ycomp of node 3
-                            vector_array[8] = zcomp of node 3
-                                    etc.
-
-            if Z_PER_ELEM:       = 1d array containing vector values for
-                                   each element of a particular part and type.
-                                    
-                                 (Array will have been allocated
-                                  3 by number_of_elements[which_part][which_type]
-                                  long.  See USERD_get_part_build_info)
-
-                      Info stored in this fashion:
-                            vector_array[0] = xcomp of elem 1 (of part and type)
-                            vector_array[1] = ycomp of elem 1         "
-                            vector_array[2] = zcomp of elem 1         "
-
-                            vector_array[3] = xcomp of elem 2         "
-                            vector_array[4] = ycomp of elem 2         "
-                            vector_array[5] = zcomp of elem 2         "
-
-                            vector_array[6] = xcomp of elem 3         "
-                            vector_array[7] = ycomp of elem 3         "
-                            vector_array[8] = zcomp of elem 3         "
-                                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0,
-     Num_variables is > 0,  and you have some vector type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed.
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-   (IN) filename_2   = the filename entered into the result
-                         field of the data dialog.
-			 (If the two_fields flag in USERD_get_name_of_reader
-			  is FALSE, this will be null string)
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
-
---------------------------------------------------------------------
-USERD_set_time_step
-
-   Description:
-   -----------
-   Set the current time step.  All functions that need time, and
-   that do not explicitly pass it in, will use the time step set by
-   this routine.
-
-   Specification:
-   -------------
-   void USERD_set_time_step(int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) time_step - The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step would be set here
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README7 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README7
deleted file mode 100644
index 197c3c572e95bc490b21c5f7e9fd81be8df784c6..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README7
+++ /dev/null
@@ -1,1847 +0,0 @@
---------------------------------------
-EnSight User Defined Reader Capability
---------------------------------------
-
-A user defined reader capability is included in EnSight which allows otherwise
-unsupported structured or unstructured data to be read.  The user defined
-reader utilizes a dynamic shared library composed of routines defined in this
-document, but produced by the user (or some third party). This capability is
-currently available for dec, ibm, hp, sgi, and sun servers.
-
-****************************************************************************
-Note: Several user defined readers have been included with your EnSight
-      release and can be accessed by changing the ENSIGHT6_READER
-      environment variable as outlined in step 3. below.   Please be aware
-      that these are "unsupported" readers, but many of them are being used
-      successfully.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
---------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy library and for various other working or
-        sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $ENSIGHT6_HOME/ensight62/user_defined_src/readers
-
-        examples:
-        --------
-        The default library. Basic dummy routines.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/dummy
-
-        Sample library which reads unstructured binary EnSight6 data.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/ensight6
-
-        Sample library which reads binary static plot3d data.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/plot3d
-
-        Reads binary LS-DYNA3D state database.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/ls-dyna3d
-
-        Reads FORTRAN binary Unstrutured dytran data base.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/dytran
-
-        Reads FlowScience "flsgrf" flow3d data.
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/flow3d
-
-        Reads Tecplot "plt" files.        
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/tecplot
-
-        Reads Common File Format data.        
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/cff
-
-        Reads Cobalt grid and picture/restart file data.        
-          $ENSIGHT6_HOME/ensight62/user_defined_src/readers/cobalt
- 
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-	routines are called, which is provided in this file, along with
- 	the example libraries, should make it possible for you to produce
-	code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-        This is a compiling and loading process which varies according to
-        the type of machine you are on.  Thus, a separate makefile is provided
-        for each machine type.  Operating system level differences could cause
-        you to have to modify these makefiles slightly, but the general
-        process is very straightforward.  Note that for the SGI environment you
-        must compile with the following flags to ensure compatability with
-        the EnSight server:  Irix_5.3     -mips1
-                             Irix_6.2     -mips2
-                             Irix_6.5_n32 -mips3
-                             Irix_6.5_n64 -mips4 -64
-
-       __________________________________________________________________
-      | MACHINE | MAKEFILE TO USE       |  SHARED LIBRARY NAME PRODUCED  |
-      |  TYPE   |--------------------------------------------------------|
-      |         |         LD COMMAND USED IN MAKEFILE                    |
-       ==================================================================
-       __________________________________________________________________
-      | sgi     | makefile.sgi          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -shared -all -o libuserd.so libuserd.o              |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | hp      | makefile.hp           |  libuserd.sl                   |
-      |         |--------------------------------------------------------|
-      |         | ld -b -o libuserd.sl libuserd.o                        |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | sun     | makefile.sun          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -G -o libuserd.so libuserd.o                        |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | dec     | makefile.dec          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -shared -all -o libuserd.so libuserd.o -lc          |
-       ------------------------------------------------------------------
-       __________________________________________________________________
-      | ibm     | makefile.ibm          |  libuserd.so                   |
-      |         |--------------------------------------------------------|
-      |         | ld -G -o libuserd.so libuserd.o -bnoentry -bexpall -lc |
-       ------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice under:
-
-     $ENSIGHT6_HOME/machines/$ENSIGHT6_ARCH/lib_readers
-
-   Thus, if you created a reader for "mydata", you should create the
-   following directory, and place your libuserd.so into it:
-
-     $ENSIGHT6_HOME/machines/$ENSIGHT6_ARCH/lib_readers/mydata
-
-
-3. Set up the ENSIGHT6_READER environment variable so EnSight will know
-   which reader directory to use at runtime.
-
-   Ensight will look for the library under:
-
-     $ENSIGHT6_HOME/machines/$ENSIGHT6_ARCH/lib_readers/$ENSIGHT6_READER
-
-   When EnSight was installed, you set this variable to "dummy", with:
-
-     setenv ENSIGHT6_READER dummy
-
-   You can use any of the other provided readers by changing this variable.
-   For example, to use the dytran reader:
-
-     setenv ENSIGHT6_READER dytran 
-
-   Thus, you can use your reader in the same way.  If you provided "mydata",
-   change ENSIGHT6_READER to:
- 
-     setenv ENSIGHT6_READER mydata
-
-
-   For your information, EnSight makes sure that the appropriate library
-   environment variable is set for your machine architecture. You do not
-   have to deal with this if you locate your library as outlined above.
-   The library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-IMPORTANT:  Unless the shared library is available in the
-            .../$ENSIGHT6_READER directory, EnSight will not run.
-
-As always, EnSight support is available if you need it.
-
-
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_number_of_global_nodes                number of global nodes
-USERD_get_global_coords                         global node coordinates
-USERD_get_global_node_ids                       global node ids
-USERD_get_element_connectivities_for_part       part's element connectivites
-USERD_get_element_ids_for_part                  part's element ids
-USERD_get_scalar_values                         global scalar variables
-USERD_get_vector_values                         global vector variables
-
-
-Generally Needed for BLOCK data
------------------------------------------
-USERD_get_block_coords_by_component             block coordinates
-USERD_get_block_iblanking                       block iblanking values
-USERD_get_block_scalar_values                   block scalar variables
-USERD_get_block_vector_values_by_component      block vector variables 
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_set_filenames                             filenames entered in GUI
-USERD_set_time_step                             current time step
-
-USERD_get_name_of_reader                        name of reader for GUI
-USERD_get_number_of_files_in_dataset            number of files in model
-USERD_get_dataset_query_file_info               info about each model file
-USERD_get_changing_geometry_status              changing geometry?
-USERD_get_node_label_status                     node labels?
-USERD_get_element_label_status                  element labels?
-USERD_get_number_of_time_steps                  number of time steps
-USERD_get_solution_times                        solution time values
-USERD_get_description_lines                     file associated descrip lines
-USERD_get_number_of_variables                   number of variables
-USERD_get_variable_info                         variable type/descrip etc.
-USERD_get_constant_value                        constant variable's value
-USERD_get_number_of_model_parts                 number of model parts
-USERD_get_part_build_info                       part type/descrip etc.
-USERD_get_variable_value_at_specific            node's or element's variable
-                                                   value over time
-
-USERD_stop_part_building                        cleanup routine
-USERD_bkup                                      archive routine
-
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-
-2. Setting filenames and getting time info
-        USERD_set_filenames
-        USERD_get_number_of_time_steps
-        USERD_get_solution_times
-        USERD_set_time_step
-
-3. Gathering info for part builder
-
-        USERD_set_time_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_description_lines             (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_part_build_info
-        USERD_get_number_global_nodes
-        USERD_get_global_coords                 (for model extents)
-        USERD_get_block_coords_by_component     (for model extents)
-
-4. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_variable_info
-              
-5. Part building (per part created)
-
-        USERD_set_time_step
-        USERD_get_global_coords
-        USERD_get_global_node_ids
-        USERD_get_element_connectivities_for_part
-        USERD_get_element_ids_for_part
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-6. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_step
-        USERD_get_constant_value
-          
-        scalars:
-        -------
-        USERD_get_description_lines
-        USERD_set_time_step
-        USERD_get_scalar_values
-        USERD_get_block_scalar_values
-
-        vectors:
-        -------
-        USERD_get_description_lines
-        USERD_set_time_step
-        USERD_get_vector_values
-        USERD_get_block_vector_values_by_component
-
-7. Changing geometry
-
-        changing coords only:
-        --------------------
-        USERD_set_time_step
-        USERD_get_global_coords
-        USERD_get_block_coords_by_component
-
-        changing connectivity:
-        ---------------------
-        USERD_set_time_step
-        USERD_get_number_of_model_parts
-        USERD_get_part_build_info
-        USERD_get_number_global_nodes
-        USERD_get_global_coords
-        USERD_get_global_node_ids
-        USERD_get_element_connectivities_for_part
-        USERD_get_element_ids_for_part
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-  
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available      = 0;
-static int Num_unstructured_parts  = 0;
-static int Num_structured_blocks   = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_time_steps          = 1;
-static int Num_global_nodes        = 0;
-static int Num_variables           = 0;
-static int Num_dataset_files       = 0;
-static int Current_time_step       = 0;
-
-
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
-
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_scalar_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each node of a block, for a given scalar variable
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a block, for a given scalar variable
-
-   Specification:
-   -------------
-   int USERD_get_block_scalar_values(int block_number,
-                                     int which_scalar,
-                                     float *scalar_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-   (IN)  which_scalar            = The variable number
-   (OUT) scalar_array            = 1D array containing scalar values
-                                   for each node or element.
-
-                                   Array will have been allocated:
-        
-                                   if Z_PER_NODE:
-                                      i*j*k for the block long
-
-                                   if Z_PER_ELEM:
-                                      (i-1)*(i-1)*(k-1) for the block long
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0,
-     Num_variables is > 0, and there are some scalar type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_vector_values_by_component
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each node of a block, for a given vector
-     variable, one component at a time.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a block, for a given vector
-     variable, one component at a time.
-
-
-   Specification:
-   -------------
-   int USERD_get_block_vector_values_by_component(int block_number,
-                                                  int which_vector,
-                                                  int which_component,
-                                                  float *vector_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-
-   (IN)  which_vector            = The variable number
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) vector_array            = 1D array containing vector
-                                   component value for each node or element.
-
-                                   Array will have been allocated:
-        
-                                   if Z_PER_NODE:
-                                      i*j*k for the block long
-
-                                   if Z_PER_ELEM:
-                                      (i-1)*(i-1)*(k-1) for the block long
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0,
-     Num_variables is > 0, and there are some vector type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.
-
-
-
---------------------------------------------------------------------
-USERD_get_constant_value
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-
-
-
---------------------------------------------------------------------
-USERD_get_description_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_description_lines(int which_type,
-                                   int which_var,
-                                   char line1[Z_BUFL],
-                                   char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_connectivities_for_part
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of an unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_element_connectivities_for_part(int part_number,
-                                                 int **conn_array[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-
-   (OUT) conn_array              = 3D array containing connectivity
-                                   of each element of each type.
-
-                                  (Array will have been allocated
-                                   Z_MAXTYPE by num_of_elements of
-                                   each type by connectivity length
-                                   of each type)
-
-                       ex) If num_of_elements[Z_TRI03] = 25
-                              num_of_elements[Z_QUA04] = 100
-                              num_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[Z_TRI03][25][3]
-                              conn_array[Z_QUA04][100][4]
-                              conn_array[Z_HEX08][30][8]
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * The coord_array loaded in USERD_get_global_coords is zero-based,
-     but within EnSight it will become a one-based array.
-     Thus, coord_array[0] will be accessed by node 1 from the conn_array,
-           coord_array[1] will be accessed by node 2 from the conn_array, etc.
-
-      ex) Given a model of two triangles, you should load coord_array in
-          USERD_get_global_coords as follows:
-
-                            node  coordinates
-                            ----  -----------
-          4 --------- 3      1    coord_array[0].xyz[0] = 0.0
-           |\        |            coord_array[0].xyz[1] = 0.0
-           | \  T2   |            coord_array[0].xyz[2] = 0.0
-           |  \      |
-           |   \     |       2    coord_array[1].xyz[0] = 1.0
-           |    \    |            coord_array[1].xyz[1] = 0.0
-           |     \   |            coord_array[1].xyz[2] = 0.0
-           |      \  |
-           |  T1   \ |       3    coord_array[2].xyz[0] = 1.0
-           |        \|            coord_array[2].xyz[1] = 1.6
-          1 --------- 2           coord_array[2].xyz[2] = 0.0
-
-                             4    coord_array[3].xyz[0] = 0.0
-                                  coord_array[3].xyz[1] = 1.6
-                                  coord_array[3].xyz[2] = 0.0
-
-
-        And conn_array here as follows:
-                                               
-        Triangle  Connectivity
-        --------  ------------
-           T1     conn_array[Z_TRI03][0][0] = 1
-                  conn_array[Z_TRI03][0][1] = 2
-                  conn_array[Z_TRI03][0][2] = 4
-
-           T2     conn_array[Z_TRI03][1][0] = 2
-                  conn_array[Z_TRI03][1][1] = 3
-                  conn_array[Z_TRI03][1][2] = 4
-
-
-
---------------------------------------------------------------------
-USERD_get_element_ids_for_part
-
-   Description:
-   -----------
-   Gets the ids for the elements of an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_element_ids_for_part(int part_number,
-                                      int *elemid_array[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-
-   (OUT) elemid_array            = 2D array containing id of each
-                                   element of each type.
-
-                                  (Array will have been allocated
-                                   Z_MAXTYPE by num_of_elements of
-                                   each type)
-
-                       ex) If num_of_elements[Z_TRI03] = 25
-                              num_of_elements[Z_QUA04] = 100
-                              num_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[Z_TRI03][25]
-                              conn_array[Z_QUA04][100]
-                              conn_array[Z_HEX08][30]
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and element
-     label status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_global_coords
-
-   Description:
-   -----------
-   Gets the coordinates for the global nodes.
-
-   Specification:
-   -------------
-   int USERD_get_global_coords(CRD *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) coord_array             = 1D array of CRD structures,
-                                   which contains x,y,z coordinates
-                                   of each node.
-
-                                  (Array will have been allocated
-                                   Num_global_nodes long)
-
-    For reference, CRD structure (which is in global_extern) is:
-
-         typedef struct {
-            float xyz[3];
-         }CRD;
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * The coord_array is zero-based, but within EnSight it will become
-     a one-based array.
-     Thus, coord_array[0] will be accessed by node 1 from the conn_array,
-           coord_array[1] will be accessed by node 2 from the conn_array, etc.
-
-      ex) Given a model of two triangles, you should load coord_array as
-          follows:
-
-                            node  coordinates
-                            ----  -----------
-          4 --------- 3      1    coord_array[0].xyz[0] = 0.0
-           |\        |            coord_array[0].xyz[1] = 0.0
-           | \  T2   |            coord_array[0].xyz[2] = 0.0
-           |  \      |
-           |   \     |       2    coord_array[1].xyz[0] = 1.0
-           |    \    |            coord_array[1].xyz[1] = 0.0
-           |     \   |            coord_array[1].xyz[2] = 0.0
-           |      \  |
-           |  T1   \ |       3    coord_array[2].xyz[0] = 1.0
-           |        \|            coord_array[2].xyz[1] = 1.6
-          1 --------- 2           coord_array[2].xyz[2] = 0.0
-
-                             4    coord_array[3].xyz[0] = 0.0
-                                  coord_array[3].xyz[1] = 1.6
-                                  coord_array[3].xyz[2] = 0.0
-
-
-        And conn_array in USERD_get_element_connectivities_for_part
-        as follows:
-                                               
-        Triangle  Connectivity
-        --------  ------------
-           T1     conn_array[Z_TRI03][0][0] = 1
-                  conn_array[Z_TRI03][0][1] = 2
-                  conn_array[Z_TRI03][0][2] = 4
-
-           T2     conn_array[Z_TRI03][1][0] = 2
-                  conn_array[Z_TRI03][1][1] = 3
-                  conn_array[Z_TRI03][1][2] = 4
-
---------------------------------------------------------------------
-USERD_get_global_node_ids
-
-   Description:
-   -----------
-   Gets the node ids assigned to each of the global nodes.
-
-   Specification:
-   -------------
-   int USERD_get_global_node_ids(int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node. The ids must be > 0
-
-                                   (Array will have been allocated
-                                    Num_global_nodes long)
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and node label
-     status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) *two_fields          = FALSE if only one data field required
-				      in the data dialog of EnSight.
-				TRUE if two data fields required.
-
-   Notes:
-   -----
-   * Always called.  Provide a name for your custom reader format.
-
-   * If you don't want a custom reader to show up in the data dialog
-     choices, return a name of "No_Custom"
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  The must also be
-       positive numbers greater than zero.
-
-         USERD_get_global_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         Also be aware that if you say node labels are available,
-         the connectivity of elements must be according to these
-         node ids.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_global_nodes
-
-   Description:
-   -----------
-   Gets the number of global nodes, used for unstructured parts.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_global_nodes()
-
-   Returns:
-   -------
-   Number of global nodes (>=0 if okay, <0 if problems)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * For unstructured data:
-           EnSight wants  1. A global array of nodes
-                          2. Element connectivities by part, which
-                             reference the node numbers of the global
-                             node array.
-                IMPORTANT:
-                ---------
-                If you provide node ids, then element connectivities
-                must be in terms of the node ids.  If you do not
-                provide node ids, then element connectivities must be
-                in terms of the index into the node array, but shifted
-                to start at 1
-
-   * Num_global_nodes would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if probs).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_time_steps( void )
-
-   Returns:
-   -------
-   Number of time steps  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, and vector types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_part_build_info(int *part_numbers,
-                                 int *part_types,
-                                 char *part_description[Z_BUFL],
-                                 int *number_of_elements[Z_MAXTYPE],
-                                 int *ijk_dimensions[3],
-                                 int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) part_numbers           = Array containing part numbers for
-                                  each of the model parts.
-
-                                  IMPORTANT:
-                                   Parts numbers must be >= 1
-
-            ********************************************
-             The numbers provided here are the ones by
-             which the parts will be referred to in any
-             of the other routines which receive a part
-             number or block number as an argument!! 
-            ********************************************
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimensions
-                                  for each structured model part.
-                                           ----------
-                                  (Ignored if Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 3 long)
-
-                             ijk_dimensions[][0] = I dimension
-                             ijk_dimensions[][1] = J dimension
-                             ijk_dimensions[][2] = K dimension
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_scalar_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each global node for a given scalar variable.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a specific part and type for a
-     given scalar variable.
-
-   Specification:
-   -------------
-   int USERD_get_scalar_values(int which_scalar,
-                               int which_part,
-                               int which_type,
-                               float *scalar_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_scalar            = The variable number (of scalar type)
-
-   (IN)  which_part 
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The part number
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-
-   (OUT) scalar_array 
-
-            if Z_PER_NODE:       = 1D array containing scalar values
-                                    for each node.
-
-                                   (Array will have been allocated
-                                    Num_global_nodes long)
-
-            if Z_PER_ELEM:       = 1d array containing scalar values for
-                                   each element of a particular part and type.
-                                    
-                                   (Array will have been allocated
-                                    number_of_elements[which_part][which_type]
-                                    long.  See USERD_get_part_build_info)
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0,
-     Num_variables is > 0, and you have some scalar type variables.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_solution_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step.
-
-   Specification:
-   -------------
-   int USERD_get_solution_times(float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) solution_times       = 1D array of solution times/time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_variable_info(char **var_description,
-                               char **var_filename,
-                               int *var_type,
-                               int *var_classify)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_filename         = Variable filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-              etc.
-
-
-
---------------------------------------------------------------------
-USERD_get_variable_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_variable_value_at_specific(int which_var,
-                                            int which_node_or_elem,
-                                            int which_part,
-                                            int which_elem_type,
-                                            int time_step,
-                                            float values[3])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-                        If Z_PER_NODE:
-                          = The node number.  This is not the id, but is
-                                              the index of the global node 
-                                              list (1 based), or the block's
-                                              node list (1 based).
-
-                            Thus,  coord_array[1]
-                                   coord_array[2]
-                                   coord_array[3]
-                                        .      |
-                                        .      |which_node_or_elem index
-                                        .             ----
-
-
-                        If Z_PER_ELEM:
-                          = The element number.  This is not the id, but is
-                                                 the element number index
-                                                 of the number_of_element array
-                                                 (see USERD_get_part_build_info),
-                                                 or the block's element list
-  zzzzz                                          (1 based).
-
-                            Thus,  for which_part:
-                                   conn_array[which_elem_type][0]
-                                   conn_array[which_elem_type][1]
-                                   conn_array[which_elem_type][2]
-                                        .                      |
-                                        .          which_node_or_elem index
-                                        .                        ----
-
-
-   (IN)  which_part
-
-                        If Z_PER_NODE, or block part:
-                          = Not used
-
-                        If Z_PER_ELEM:
-                          = The part number
-
-   (IN)  which_elem_type
-
-                        If Z_PER_NODE, or block part:
-                          = Not used
-
-                        If Z_PER_ELEM:
-                          = The element type.    This is the element type index
-                                                 of the number_of_element array
-                                                 (see USERD_get_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-
---------------------------------------------------------------------
-USERD_get_vector_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each global node for a given vector variable.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a specific part and type for a
-     given vector variable.
-
-   Specification:
-   -------------
-   int USERD_get_vector_values(int which_vector,
-                               int which_part,
-                               int which_type,
-                               float *vector_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_vector            = The variable number
-
-   (IN)  which_part 
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The part number
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-
-   (OUT) vector_array 
-
-            if Z_PER_NODE:       = 1D array containing vector values
-                                    for each node.
-
-                                   (Array will have been allocated
-                                    3 by Num_global_nodes long)
-
-                      Info stored in this fashion:
-                            vector_array[0] = xcomp of node 1
-                            vector_array[1] = ycomp of node 1
-                            vector_array[2] = zcomp of node 1
-
-                            vector_array[3] = xcomp of node 2
-                            vector_array[4] = ycomp of node 2
-                            vector_array[5] = zcomp of node 2
-
-                            vector_array[6] = xcomp of node 3
-                            vector_array[7] = ycomp of node 3
-                            vector_array[8] = zcomp of node 3
-                                    etc.
-
-            if Z_PER_ELEM:       = 1d array containing vector values for
-                                   each element of a particular part and type.
-                                    
-                                 (Array will have been allocated
-                                  3 by number_of_elements[which_part][which_type]
-                                  long.  See USERD_get_part_build_info)
-
-                      Info stored in this fashion:
-                            vector_array[0] = xcomp of elem 1 (of part and type)
-                            vector_array[1] = ycomp of elem 1         "
-                            vector_array[2] = zcomp of elem 1         "
-
-                            vector_array[3] = xcomp of elem 2         "
-                            vector_array[4] = ycomp of elem 2         "
-                            vector_array[5] = zcomp of elem 2         "
-
-                            vector_array[6] = xcomp of elem 3         "
-                            vector_array[7] = ycomp of elem 3         "
-                            vector_array[8] = zcomp of elem 3         "
-                                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0,
-     Num_variables is > 0,  and you have some vector type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed.
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-   (IN) filename_2   = the filename entered into the result
-                         field of the data dialog.
-			 (If the two_fields flag in USERD_get_name_of_reader
-			  is FALSE, this will be null string)
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
-
---------------------------------------------------------------------
-USERD_set_time_step
-
-   Description:
-   -----------
-   Set the current time step.  All functions that need time, and
-   that do not explicitly pass it in, will use the time step set by
-   this routine.
-
-   Specification:
-   -------------
-   void USERD_set_time_step(int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) time_step - The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step would be set here
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_1.0_to_2.0 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_1.0_to_2.0
deleted file mode 100644
index 35d80156fba477688c7399771da89a51f1adea4c..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_1.0_to_2.0
+++ /dev/null
@@ -1,361 +0,0 @@
-README_1.0_to_2.0
-=================
-This document exists to help those who already have a working user defined
-reader (using the 1.0 API) to change it into the 2.0 API format - if desired.
-
-Note that you do not have to update your (1.0 API) user defined reader if it
-is already working fine for you.
-
-You should consider it if:
-  - efficieny gains are needed or
-  - you need access to complex variables or
-  - you need access to tensor variables or
-  - you need multiple timeset capability or
-  - you want to provide your own "border" elements (as opposed to EnSight's
-                                                    computation of them)
-
-As an indication of the differences that might be realized in efficency,
-consider the following comparison on an unstructured model consisting of:
-
-1,639,058 nodes
-7,079,211 elements      240530 tria3
-                          3984 quad4
-                       5927663 tetra4
-                           653 pyramid5
-                        906381 penta6
-
-12 parts
-
-The same model was represented in EnSight6 and EnSight Gold format.
-
-
-                    EnSight6 format into:           EnSight Gold format into:
-            ------------------------------------    -------------------------
-            EnSight7.1  |Ensight7.2  |Ensight 7.1  |EnSight7.2  |Ensight7.2
-            internal    |internal    |userd reader |internal    |userd reader
-            reader      |reader      |(API 1.0)    |reader      |(API 2.0)
-                        |            |             |            |
-            Time | Mem  |Time | Mem  |Time | Mem   |Time | Mem  |Time | Mem
-            (sec)| (Mb) |(sec)| (Mb) |(sec)| (Mb)  |(sec)| (Mb) |(sec)| (Mb)
-            ----------- |----------- |-----------  |----------- |-----------
-@ part       4.3   27.6 | 3.5   28.4 | 4.0   27.6  | 3.3    8.8 | 3.3    8.9
-loader                  |            |             |            |
-                        |            |             |            |
-after       14.0  243.4 |12.8  244.3 |49.8  475.8  | 6.0  211.5 | 6.2  211.6
-loading all             |            |             |            |
-12 parts                |            |             |            |
-(non-visual)            |            |             |            |
-                        |            |             |            |
-after       16.8  263.2 |16.0  264.2 |52.8  490.7  | 9.1  236.2 | 9.5  236.2
-activate of             |            |             |            |
-a vector.               |            |             |            |
-                                           ^                          ^
-                                          /|\                        /|\
-                                           |                          |
-                                           |                          |
-                                           |                          |
-                                                Compare these two!
-
-
-Significant is the inefficiency of the 1.0 API, and the fact that the
-2.0 API has the same improved efficiency (both in speed and memory) as
-the gold internal reader!
-
-Note: Structured data will not show much difference between the two API's,
-but it was more efficient initially.
-
-
-=========================================================
-A note on philosophical differences between the two API's:
-=========================================================
-
-API 1.0 deals with:
--------------------
- -> global coordinate array  & corresponding
-    -> global node id array
-    -> global nodal variables
-
- -> for each part:
-    -> local element connectivities (grouped by type) & corresponding
-       -> local element ids
-       -> local elemental variables
-
-
-The element connectivities, within parts, reference the global coordinate
-array. If node ids are provided, the element connectivities have to be in
-terms of the node ids. If node ids are not provided, the connectivities are in
-terms of the (one-based) index number of each node in the global coordinate
-array. Thus, node ids are more than labels - they are a part of the
-connectivity referencing scheme. Element ids are purely labels.
-
-This API was originally setup to try to make the interface to other codes as
-straightforward as possible.  Efficiency was not the major consideration.
-
-EnSight must do a fair amount of work to get data provided in the manner
-described above into the form that it uses internally. There is mapping that
-has to be setup and maintained between the global arrays and the local part
-arrays so that updating over time can be accomplished efficiently. There is
-hashing that is required in order to deal efficently with node ids.
-
-All of this leads to a considerable amount of temporary memory and processing,
-in order to get a model read into EnSight.
-
-
-API 2.0 deals with:
--------------------
- -> for each part:
-    -> part coordinates  & corresponding
-    -> part node ids
-    -> part nodal variables
-
-    -> part element connectivities (grouped by type) & corresponding
-       -> part element ids
-       -> part elemental variables
-
-API 2.0 requires that the coordinates and corresponding nodal variables be
-provided per part. This eliminates the global to local mapping with all its
-associated temporary memory and processing time. The connectivity of the
-elements in each part reference the node indicies of its own (one-based) part
-coordinate array.  The connectivity of the elements do not reference the nodes
-according to node ids.  Node ids (and element ids for that matter) are purely
-labels for screen display and for query operations within EnSight. This
-eliminates the need for node id hashing as a model is read.
- 
-The 2.0 API has been created for those needing more efficiency - both in terms
-of memory use and speed. The increased efficiency is possible because data is
-requested in a manner which more closely represents the way that EnSight
-stores and manipulates information internally. The new API requests size
-information and allocates the actual internal structures and arrays
-accordingly.  Pointers to these arrays are passed directly to you in the
-routines which gather data, thus eliminating a considerable amount of
-temporary memory (and allocation time) that is needed in the old
-API. Depending on what you must do to get your data into the form required,
-the memory savings and the speed improvement when loading models can be quite
-significant!!
- 
-Additionally, the ability to handle tensor and complex variables has been
-added to the new API, and support for multiple timesets is provided.
-------------------------------------------------
-
-
-So, with that said, if you determine that you want to convert your existing
-reader to the new API format, The following may be helpful.
-
-====================
-First the Good News!  The following routines are identical in both API's!!
-====================  ----------------------------------------------------
-USERD_bkup
-USERD_get_block_coords_by_component
-USERD_get_block_iblanking
-USERD_get_changing_geometry_status
-USERD_get_dataset_query_file_info
-USERD_get_element_label_status
-USERD_get_name_of_reader
-USERD_get_node_label_status
-USERD_get_number_of_files_in_dataset
-USERD_get_number_of_model_parts
-USERD_get_number_of_variables
-USERD_set_filenames
-USERD_stop_part_building
-
-
-
-========================
-Second, pretty Good News!    The following routines have minor changes,
-========================     namely a slight name change and the addition
-                             of arguments related to complex data, constant
-(Note, the name changes      type, or self contained parts vs global coords.
- are needed so both
- API's can exist together)   The arguments must be added, but depending on
-                             your situation, many might simply be place
-                             holders.
--------------------------------------------------------------------------------
-
-   -----------------------------------------------------
-A) Changes related to imaginary flag for complex data
-   =====================================================
-   If you don't deal with complex variables, simply add
-   this flag to your argument list and ignore its value.
-   ----------------------------------------------------- 
-
-API 1.0                                 API 2.0
--------                                 -------
-USERD_get_constant_value                USERD_get_constant_val
-(                                       (
- int which var                           int which_var,
-                                         int imag_data
-)                                       )
-
-USERD_get_description_lines             USERD_get_descrip_lines
-(                                       (
- int which_type,                         int which_type,
- int which_var,                          int which_var,
-                                         int imag_data,
- char line1[Z_BUFL],                     char line1[Z_BUFL],
- char line2[Z_BUFL]                      char line2[Z_BUFL]
-)                                       )
-
-USERD_get_variable_value_at_specific    USERD_get_var_value_at_specific
-(                                       (
- int which_var,                          int which_var,
- int which_node_or_elem,                 int which_node_or_elem,
- int which_part,                         int which_part,
- int which_elem_type,                    int which_elem_type,
- int time_step,                          int time_step,
- float values[3]                         float values[3],
-                                         int imag_data
-)                                       )
-
-
-   ---------------------------------------------------------
-B) Changes related to complex data info, and constant type
-   (and some of the multiple timeset support)
-   =========================================================
-   If you don't deal with complex variables, simply add the
-   arguments for var_complex, var_ifilename, and var_freq
-   and assign var_complex to be FALSE.
-
-   The argument var_contran needs to be added, and set
-   appropriately if you have constant variables, to indicate
-   if the constant variable is fixed for all time or varies
-   over time.
-
-   The argument var_timeset needs to be added, and set
-   appropriately.
-   --------------------------------------------------------- 
-
-API 1.0                                 API 2.0
--------                                 -------
-USERD_get_variable_info                 USERD_get_gold_variable_info
-(                                       (
- char **var_description,                 char **var_description,
- char **var_filename,                    char **var_filename,
- int *var_type,                          int *var_type,
- int *var_classify                       int *var_classify,
-                                         int *var_complex,
-                                         char **var_ifilename,
-                                         float *var_freq,
-                                         int *var_contran,
-                                         int *var_timeset
-)                                       )
-
-
-   ------------------------------------------------------
-C) Changes related to self contained part coordinates
-   ======================================================
-   The number_of_nodes argument needs to be added and
-   set for each part. This one is critical for you to do.
-   ------------------------------------------------------
-
-API 1.0                                 API 2.0
--------                                 -------
-USERD_get_part_build_info               USERD_get_gold_part_build_info
-(                                       (
- int *part_numbers,                      int *part_types,
- int *part_types,                        int *part_types,
- char *part_description[Z_BUFL],         char *part_description[Z_BUFL],
-                                         int *number_of_nodes,
- int *number_of_elements[Z_MAXTYPE],     int *number_of_elements[Z_MAXTYPE],
- int *ijk_dimensions[3],                 int *ijk_dimensions[3],
- int *iblanking_options[6]               int *iblanking_options[6]
-)                                       )
-
-
-   ------------------------------------------------------
-D) Changes related to multiple timeset support
-   ======================================================
-   The timeset_number argument needs to be added for the
-   following three routines.
-
-   The multiple timeset support also includes the change
-   in B) above for USERD_get_gold_variable_info and the
-   last three new routines in the third section of this
-   readme file.
-   ------------------------------------------------------
-
-API 1.0                                 API 2.0
--------                                 -------
-USERD_get_number_of_time_steps          USERD_get_num_of_time_steps
-(                                       (
- void                                    int timeset_number
-)                                       )
-
-USERD_get_solution_times                USERD_get_sol_times
-(                                       (
-                                         int timeset_number,
- float *solution_times                   float *solution_times
-)                                       )
-
-USERD_set_time_step                     USERD_set_time_set_and_step
-(                                       (
-                                         int timeset_number,
- int time_step                           int time_step
-)                                       )
-
-
-   ------------------------------------------------------
-E) Changes related to global_extern.h
-   ======================================================
-
-   Be sure to include the updated global_extern.h file that comes 
-   with the EnSight 7.2 release (not the one from previous releases).
-
-
-
-
-=================================================================
-Third, deleted and new routines.  (Here is where the work lies)
-
-  Several old routines are gone. You will have to create the new
-  routines that replace them. I think you will find in most cases
-  that your old routines will form the basis of the new routines,
-  and that it isn't too difficult to provide the information in
-  the new way.
-
-  The detailed specifications for these new routines can be found
-  in README_USERD_2.0 (or the headers in libuserd.c of the
-  dummy_gold or ensight_gold readers).
-=================================================================
-
-API 1.0                                     API 2.0
--------                                     -------
-
-These routines:                             replaced by the single routine:
----------------------------                 -------------------------------
-USERD_get_block_scalar_values               USERD_get_var_by_component
-USERD_get_block_vector_values_by_component    
-USERD_get_scalar_values                       
-USERD_get_vector_values                       
-
-These global coordinate routines:           replaced by part coord routines:
----------------------------------           --------------------------------
-USERD_get_global_coords                     USERD_get_part_coords
-USERD_get_global_node_ids                   USERD_get_part_node_ids
-USERD_get_number_of_global_nodes
-
-These part connectivity routines:           replaced by part by type routines:
----------------------------------           ----------------------------------
-USERD_get_element_connectivities_for_part   USERD_get_part_elements_by_type
-USERD_get_element_ids_for_part              USERD_get_part_element_ids_by_type
-
-
-                                            These are New Routines
-                                            ----------------------
-                      (Can be a dummy) ->   USERD_exit_routine
-                      (Can be a dummy) ->   USERD_get_model_extents
-                            (Required) ->   USERD_get_reader_version
-
-     multiple timeset releated:
-                            (Required) ->   USERD_get_number_timesets
-                            (Required) ->   USERD_get_timeset_description
-                            (Required) ->   USERD_get_geom_timeset_number
-
-     border provided by the reader option:
-                            (Required) ->   USERD_get_border_availability
-                      (Can be a dummy) ->   USERD_get_border_elements_by_type
-
-     transient model allocation efficency:
-                      (Can be a dummy) ->   USERD_get_maxsize_info
-
-     Possible use with Server-of-Servers:
-                      (Can be a dummy) ->   USERD_set_server_number
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_2.01_to_2.03 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_2.01_to_2.03
deleted file mode 100644
index 23f27ec89d62391a3a7d3569af49848bfb4916c1..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_2.01_to_2.03
+++ /dev/null
@@ -1,1374 +0,0 @@
-README_USERD_2.03
-=================
-
-At this API revision level:
-
-1. Routines to handle materials have been added.
-2. Routines to handle nsided and nfaced elements have been added
-3. A routine has modified so structured ranges can be specified
-
-****************************************************************************
-Note: The dummy_gold reader, the Ensight Gold example reader, and the
-      SILO reader have been moved to this 2.03 API level.
-****************************************************************************
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-The new new routines are:
--------------------------
-USERD_get_number_of_material_sets    Gets the number of material sets
-USERD_get_matf_set_info              Gets the material set indices and names
-USERD_get_number_of_materials        Gets the number of materials
-USERD_get_matf_var_info              Gets the material indices and descriptions
-USERD_size_matf_data                 Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                 Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_get_nsided_conn                Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face      Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-The modified routine is:
-------------------------
-USERD_get_gold_part_build_info       Gets the info needed for part building
-                                        process
-
---------------------
-Header files changes
---------------------
-global_extern.h         has appropriate changes, must use it
-global_extern_proto.h   new file, access from global_extern.h
-
-Basically the the old global_extern.h file has been split into two files now.
-
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-
-      If any material sets in the model (calls these once per material set):
-        USERD_get_matf_set_info
-        USERD_get_number_of_materials
-        USERD_get_matf_var_info
-
-      For each elment type of each part containing material ids, calls:
-        USERD_size_matf_data
-        USERD_load_matf_data
-
-      If there are any elements with mixed materials, when a domain or
-      interface is created, calls these again per part:
-
-        USERD_size_matf_data
-        USERD_load_matf_data
-
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-          If any nsided elements:
-  
-            USERD_get_nsided_conn
-
-          If any nfaced elements:
-
-            USERD_get_nfaced_nodes_per_face
-            USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
- 
-         .
-         .
-         .
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_203
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.03" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is access from the new global_extern.h    
-
-*******************************************************************************
-*******************************************************************************
-
-____________________
---------------------
-New Library Routines
-____________________
---------------------
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                                                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns: 
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-  
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-  
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-  
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-  
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-  
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-  
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-  
-  
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-  
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-  
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-  
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-  
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-  
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-  
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
- 
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-  
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-  
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-  
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-  
-  
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-  
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-  
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-  
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-  
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-  
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-  
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-  
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-  
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-  
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-  
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-  
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-  
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-  
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-  
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-  
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-  
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-  
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-  
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-  
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-  
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-  
-  
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-  
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-  
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-  
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-  
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-  
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-  
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-  
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-  
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-  
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-  
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-  
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-  
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-  
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-  
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-  
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-  
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-  
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-________________________
-------------------------
-Modified Library Routine
-________________________
-------------------------
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for part building process
-
-   Specification:
-   -------------
-   int
-   USERD_get_gold_part_build_info(int *part_id,
-                                  int *part_types,
-                                  char *part_description[Z_BUFL],
-                                  int *number_of_nodes,
-                                  int *number_of_elements[Z_MAXTYPE],
-                                  int *ijk_dimensions[9],
-                                  int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) part_id                = Array containing the external part
-                                  ids for each of the model parts.
- 
-                                  IMPORTANT:
-                                   Parts numbers must be >= 1, because
-                                   of the way they are used in the GUI
- 
-              *******************************************
-               The ids provided here are the numbers by
-               which the parts will be referred to in the
-               GUI (if possible). They are basically
-               labels as far as you are concerned.
- 
-               Note: The part numbers you pass to routines
-               which receive a part_number or block_number
-               or which_part as an argument are the 1-based
-               table index of the parts!
- 
-               example:  If Numparts_available = 3
- 
-                         Table index        part_id
-                         -----------        -------
-                          1                  13
-                          2                  57
-                          3                  125
- 
-                          ^                   ^
-                          |                   |
-                          |                    These are placed in:
-                          |                      part_id[0] = 13
-                          |                      part_id[1] = 57
-                          |                      part_id[2] = 125
-                          |                    for GUI labeling purposes.
-                          |
-                           These implied table indices are the part_number,
-                           block_number, or which_part numbers that you would
-                           pass to routines like:
- 
-                          USERD_get_part_coords(int part_number,...
-                          USERD_get_part_node_ids(int part_number,...
-                          USERD_get_part_elements_by_type(int part_number,...
-                          USERD_get_part_element_ids_by_type(int part_number,...
-                          USERD_get_block_coords_by_component(int block_number,...
-                          USERD_get_block_iblanking(int block_number,...
-                          USERD_get_block_ghost_flags(int block_number,...
-                          USERD_get_ghosts_in_block_flag(int block_number)
-                          USERD_get_border_availability( int part_number,...
-                          USERD_get_border_elements_by_type( int part_number,...
-                          USERD_get_var_by_component(int which_variable,
-                                                     int which_part,...
-                          USERD_get_var_value_at_specific(int which_var,
-                                                          int which_node_or_elem,
-                                                          int which_part,...
-              ********************************************
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
- 
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
- 
-                                        Z_UNSTRUCTURED or
-                                        Z_STRUCTURED  or
-                                        Z_IBLANKED
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
- 
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
- 
-                                   (Array will have been allocated
-                                    Numparts_available by Z_BUFL
-                                    long)
- 
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
- 
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
- 
-                                 Z_POINT   =  point
-                                 Z_BAR02   =  2-noded bar
-                                 Z_BAR03   =  3-noded bar
-                                 Z_TRI03   =  3-noded triangle
-                                 Z_TRI06   =  6-noded triangle
-                                 Z_QUA04   =  4-noded quadrilateral
-                                 Z_QUA08   =  8-noded quadrilateral
-                                 Z_TET04   =  4-noded tetrahedron
-                                 Z_TET10   = 10-noded tetrahedron
-                                 Z_PYR05   =  5-noded pyramid
-                                 Z_PYR13   = 13-noded pyramid
-                                 Z_PEN06   =  6-noded pentahedron
-                                 Z_PEN15   = 15-noded pentahedron
-                                 Z_HEX08   =  8-noded hexahedron
-                                 Z_HEX20   = 20-noded hexahedron
- 
-    Starting at API 2.01:
-    ====================
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
- 
-    Starting at API 2.02:
-    ====================
-                                 Z_NSIDED     n node nsided polygon
-                                 Z_NFACED     n face nfaced polyhedron
-                                 Z_G_NSIDED   n node ghost nsided polygon
-                                 Z_G_NFACED   n face ghost nfaced polyhedron
- 
-                                (Ignored unless Z_UNSTRUCTURED type)
- 
-                                   (Array will have been allocated
-                                    Numparts_available by
-                                    Z_MAXTYPE long)
- 
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
- 
-                                  For Z_UNSTRUCTURED - is ignored
- 
-                                  For Z_STRUCTURED or Z_IBLANKED
- 
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
- 
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
- 
- 
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
- 
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
- 
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
- 
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
- 
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
- 
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
- 
- 
- 
-                              2. Using ranges.
- 
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
- 
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
- 
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
- 
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
- 
- 
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
- 
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
- 
- 
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
- 
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][3] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][5] = 3
-                            2 .................    ijk_dimension[0][6] = 4
-                              .       .       .    ijk_dimension[0][7] = 1
-                              .       .       .    ijk_dimension[0][8] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
- 
- 
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][3] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][5] = 1
-                            2 *-------*-------*    ijk_dimension[1][6] = 3
-                              |       |       |    ijk_dimension[1][7] = 1
-                              |       |       |    ijk_dimension[1][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
- 
- 
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
- 
- 
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
- 
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
- 
-       iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                        [][Z_INT]     = TRUE if internal (inside)
-                        [][Z_BND]     = TRUE if boundary
-                        [][Z_INTBND]  = TRUE if internal boundary
-                        [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   If you haven't built a table of pointers to the different parts,
-   you might want to do so here as you gather the needed info.
- 
-   This will be based on Current_time_step
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_1.0 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_1.0
deleted file mode 100644
index 6453be2655961e483172748fd93e4ab758410e89..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_1.0
+++ /dev/null
@@ -1,2013 +0,0 @@
-README_USERD_1.0
-================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 1.0)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-Two versions of this API are available starting with EnSight Version 7.2. The
-1.0 API (which was designed to be friendly to those producing it, but requires
-more manipulation internally by EnSight) may be a little easier to
-produce, but requires more memory and processing time.  The 2.0 API is
-considerably more efficient, and was designed more with that in mind. It
-requires that all data be provided on a part basis.
-
-If you already have a working 1.0 API reader and are happy with it - there is
-probably no reason to modify it to the 2.0 API unless:
- - you deal with large models and the memory use and load times are a
-   problem or
- - you need tensor variable support or
- - you need complex variable support or
- - you need multiple timeset capability or
- _ you want to provide your own "border" elements (as opposed to EnSight's
-                                                    computation of them).
-
-If you are producing a new reader, you should consider which will work best
-for your needs.
-
-
-API 1.0 (defined in this README_USERD_1.0 document)
-=======
-The original user defined reader API (used with EnSight Versions 6 through
-7.1) will continue to be supported. (Note that there was a change in the way
-that the libraries were made at version 7.1 of EnSight, but underlying code
-was kept the same.) Thus, any readers that work with EnSight 7.1, should still
-function with EnSight 7.2.
-
-
-API 2.0  (defined in README_USERD_2.0 document)
-=======
-This new API has been defined to be more efficient and includes access to new
-capabilities of EnSight 7.2.  It lends itself closely to the EnSight "gold"
-type format.
-
-Some of its advantages are::
-
- * Most intermediate temporary arrays have been eliminated, such that the user
-   defined routines write directly into internal part structures. This is a 
-   considerable improvement in memory use, and improves speed as well since
-   far less memory need be allocated, initialized, etc.
-
- * Parts are self contained. Coordinates, connectivity and all variables are
-   provided on a part basis. This eliminates the need for several global to
-   local coordinate mapping operations and the need for node id connectivity
-   hashing.  This can greatly improve the speed at which models are loaded.
-
- * Model extents can be provided directly, such that EnSight need not read
-   all the coordinate data at load time.
-
- * Tensor variables are supported
-
- * Complex variables are supported
-
- * A routine is provided as EnSight exits, so cleanup operations such as
-   removing temporary files can be easily accomplished.
-
- * Geometry and variables can be provided on different time lines.
-
- * If your data format already provides boundary shell information, you can
-   use it instead of the "border" representation that EnSight would compute.
-
-Further discussion on the philosophical differences between the two API's and
-an efficiency comparison example can be found in the README_1.0_to_2.0 file.
-This file also contains guidance on necessary changes to modify an existing
-1.0 API to the new 2.0 API.
-
-
-****************************************************************************
-Note: Several (1.0 API) user defined readers have been included with your
-      EnSight release and are configured by default.  There are site- and
-      user-configurable options outlined in step 3 below.  Please be aware
-      that these are "unsupported" readers, but many of them are being used
-      successfully.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy library and for various other working or
-        sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $ENSIGHT7_HOME/user_defined_src/readers
-
-        examples of API 1.0:
-        -------------------
-        Basic dummy routines provide skeleton for a new reader
-          $ENSIGHT7_HOME/user_defined_src/readers/dummy
-
-        Sample library which reads unstructured binary EnSight6 data
-          $ENSIGHT7_HOME/user_defined_src/readers/ensight6
-
-        Sample library which reads binary static plot3d data
-          $ENSIGHT7_HOME/user_defined_src/readers/plot3d
-
-        Reads binary LS-DYNA3D state database
-          $ENSIGHT7_HOME/user_defined_src/readers/ls-dyna3d
-
-        Reads FORTRAN binary Unstructured dytran data base
-          $ENSIGHT7_HOME/user_defined_src/readers/dytran
-
-        Reads FlowScience "flsgrf" flow3d data
-          $ENSIGHT7_HOME/user_defined_src/readers/flow3d
-
-        Reads Tecplot "plt" files
-          $ENSIGHT7_HOME/user_defined_src/readers/tecplot
-
-        Reads Common File Format data
-          $ENSIGHT7_HOME/user_defined_src/readers/cff
-
-        Reads Cobalt grid and picture/restart file data
-          $ENSIGHT7_HOME/user_defined_src/readers/cobalt
- 
-        Reads binary Nastran OP2 data base
-          $ENSIGHT7_HOME/user_defined_src/readers/nastran
-
-        Reads binary and ascii cfx data
-          $ENSIGHT7_HOME/user_defined_src/readers/cfx4
-
-        Reads Exodus II data base
-          $ENSIGHT7_HOME/user_defined_src/readers/exodus
-
-        Reads Parallel Exodus data base
-          $ENSIGHT7_HOME/user_defined_src/readers/pxi
-
-        Reads FORTRAN binary SCRYU data
-          $ENSIGHT7_HOME/user_defined_src/readers/scryu
-
-        Reads binary and ascii STL data
-          $ENSIGHT7_HOME/user_defined_src/readers/stl
-
-        Reads Vectis data
-          $ENSIGHT7_HOME/user_defined_src/readers/vectis
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $ENSIGHT7_HOME/machines/$ENSIGHT7_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $ENSIGHT7_HOME/machines/$ENSIGHT7_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $ENSIGHT7_HOME/machines/$ENSIGHT7_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
-
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_number_of_global_nodes              number of global nodes
-USERD_get_global_coords                       global node coordinates
-USERD_get_global_node_ids                     global node ids
-USERD_get_element_connectivities_for_part     part's element connectivites
-USERD_get_element_ids_for_part                part's element ids
-USERD_get_scalar_values                       global scalar variables
-USERD_get_vector_values                       global vector variables
-
-
-Generally Needed for BLOCK data
------------------------------------------
-USERD_get_block_coords_by_component           block coordinates
-USERD_get_block_iblanking                     block iblanking values
-USERD_get_block_scalar_values                 block scalar variables
-USERD_get_block_vector_values_by_component    block vector variables 
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_set_filenames                           filenames entered in GUI
-USERD_set_time_step                           current time step
-
-USERD_get_name_of_reader                      name of reader for GUI
-USERD_get_number_of_files_in_dataset          number of files in model
-USERD_get_dataset_query_file_info             info about each model file
-USERD_get_changing_geometry_status            changing geometry?
-USERD_get_node_label_status                   node labels?
-USERD_get_element_label_status                element labels?
-USERD_get_number_of_time_steps                number of time steps
-USERD_get_solution_times                      solution time values
-USERD_get_description_lines                   file associated descrip lines
-USERD_get_number_of_variables                 number of variables
-USERD_get_variable_info                       variable type/descrip etc.
-USERD_get_constant_value                      constant variable's value
-USERD_get_number_of_model_parts               number of model parts
-USERD_get_part_build_info                     part type/descrip etc.
-USERD_get_variable_value_at_specific          node's or element's variable
-                                                 value over time
-
-USERD_stop_part_building                      cleanup routine
-USERD_bkup                                    archive routine
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-
-2. Setting filenames and getting time info
-        USERD_set_filenames
-        USERD_get_number_of_time_steps
-        USERD_get_solution_times
-        USERD_set_time_step
-
-3. Gathering info for part builder
-
-        USERD_set_time_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_description_lines             (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_part_build_info
-        USERD_get_number_global_nodes
-        USERD_get_global_coords                 (for model extents)
-        USERD_get_block_coords_by_component     (for model extents)
-
-4. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_variable_info
-              
-5. Part building (per part created)
-
-        USERD_set_time_step
-        USERD_get_global_coords
-        USERD_get_global_node_ids
-        USERD_get_element_connectivities_for_part
-        USERD_get_element_ids_for_part
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-6. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_step
-        USERD_get_constant_value
-          
-        scalars:
-        -------
-        USERD_get_description_lines
-        USERD_set_time_step
-        USERD_get_scalar_values
-        USERD_get_block_scalar_values
-
-        vectors:
-        -------
-        USERD_get_description_lines
-        USERD_set_time_step
-        USERD_get_vector_values
-        USERD_get_block_vector_values_by_component
-
-7. Changing geometry
-
-        changing coords only:
-        --------------------
-        USERD_set_time_step
-        USERD_get_global_coords
-        USERD_get_block_coords_by_component
-
-        changing connectivity:
-        ---------------------
-        USERD_set_time_step
-        USERD_get_number_of_model_parts
-        USERD_get_part_build_info
-        USERD_get_number_global_nodes
-        USERD_get_global_coords
-        USERD_get_global_node_ids
-        USERD_get_element_connectivities_for_part
-        USERD_get_element_ids_for_part
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-  
-8. Node or Element queries over time
-
-        USERD_get_variable_value_at_specific
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines.
-
-       #include "global_extern.h"
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available      = 0;
-static int Num_unstructured_parts  = 0;
-static int Num_structured_blocks   = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_time_steps          = 1;
-static int Num_global_nodes        = 0;
-static int Num_variables           = 0;
-static int Num_dataset_files       = 0;
-static int Current_time_step       = 0;
-
-
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
-
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_scalar_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each node of a block, for a given scalar variable
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a block, for a given scalar variable
-
-   Specification:
-   -------------
-   int USERD_get_block_scalar_values(int block_number,
-                                     int which_scalar,
-                                     float *scalar_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-   (IN)  which_scalar            = The variable number
-   (OUT) scalar_array            = 1D array containing scalar values
-                                   for each node or element.
-
-                                   Array will have been allocated:
-        
-                                   if Z_PER_NODE:
-                                      i*j*k for the block long
-
-                                   if Z_PER_ELEM:
-                                      (i-1)*(i-1)*(k-1) for the block long
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0,
-     Num_variables is > 0, and there are some scalar type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_vector_values_by_component
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each node of a block, for a given vector
-     variable, one component at a time.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a block, for a given vector
-     variable, one component at a time.
-
-
-   Specification:
-   -------------
-   int USERD_get_block_vector_values_by_component(int block_number,
-                                                  int which_vector,
-                                                  int which_component,
-                                                  float *vector_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-
-   (IN)  which_vector            = The variable number
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) vector_array            = 1D array containing vector
-                                   component value for each node or element.
-
-                                   Array will have been allocated:
-        
-                                   if Z_PER_NODE:
-                                      i*j*k for the block long
-
-                                   if Z_PER_ELEM:
-                                      (i-1)*(i-1)*(k-1) for the block long
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0,
-     Num_variables is > 0, and there are some vector type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.
-
-
-
---------------------------------------------------------------------
-USERD_get_constant_value
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-
-
-
---------------------------------------------------------------------
-USERD_get_description_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_description_lines(int which_type,
-                                   int which_var,
-                                   char line1[Z_BUFL],
-                                   char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_connectivities_for_part
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of an unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_element_connectivities_for_part(int part_number,
-                                                 int **conn_array[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-
-   (OUT) conn_array              = 3D array containing connectivity
-                                   of each element of each type.
-
-                                  (Array will have been allocated
-                                   Z_MAXTYPE by num_of_elements of
-                                   each type by connectivity length
-                                   of each type)
-
-                       ex) If num_of_elements[Z_TRI03] = 25
-                              num_of_elements[Z_QUA04] = 100
-                              num_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[Z_TRI03][25][3]
-                              conn_array[Z_QUA04][100][4]
-                              conn_array[Z_HEX08][30][8]
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * The coord_array loaded in USERD_get_global_coords is zero-based,
-     but within EnSight it will become a one-based array.
-     Thus, coord_array[0] will be accessed by node 1 from the conn_array,
-           coord_array[1] will be accessed by node 2 from the conn_array, etc.
-
-      ex) Given a model of two triangles, you should load coord_array in
-          USERD_get_global_coords as follows:
-
-                            node  coordinates
-                            ----  -----------
-          4 --------- 3      1    coord_array[0].xyz[0] = 0.0
-           |\        |            coord_array[0].xyz[1] = 0.0
-           | \  T2   |            coord_array[0].xyz[2] = 0.0
-           |  \      |
-           |   \     |       2    coord_array[1].xyz[0] = 1.0
-           |    \    |            coord_array[1].xyz[1] = 0.0
-           |     \   |            coord_array[1].xyz[2] = 0.0
-           |      \  |
-           |  T1   \ |       3    coord_array[2].xyz[0] = 1.0
-           |        \|            coord_array[2].xyz[1] = 1.6
-          1 --------- 2           coord_array[2].xyz[2] = 0.0
-
-                             4    coord_array[3].xyz[0] = 0.0
-                                  coord_array[3].xyz[1] = 1.6
-                                  coord_array[3].xyz[2] = 0.0
-
-
-        And conn_array here as follows:
-                                               
-        Triangle  Connectivity
-        --------  ------------
-           T1     conn_array[Z_TRI03][0][0] = 1
-                  conn_array[Z_TRI03][0][1] = 2
-                  conn_array[Z_TRI03][0][2] = 4
-
-           T2     conn_array[Z_TRI03][1][0] = 2
-                  conn_array[Z_TRI03][1][1] = 3
-                  conn_array[Z_TRI03][1][2] = 4
-
-
-
---------------------------------------------------------------------
-USERD_get_element_ids_for_part
-
-   Description:
-   -----------
-   Gets the ids for the elements of an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_element_ids_for_part(int part_number,
-                                      int *elemid_array[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-
-   (OUT) elemid_array            = 2D array containing id of each
-                                   element of each type.
-
-                                  (Array will have been allocated
-                                   Z_MAXTYPE by num_of_elements of
-                                   each type)
-
-                       ex) If num_of_elements[Z_TRI03] = 25
-                              num_of_elements[Z_QUA04] = 100
-                              num_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[Z_TRI03][25]
-                              conn_array[Z_QUA04][100]
-                              conn_array[Z_HEX08][30]
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and element
-     label status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_global_coords
-
-   Description:
-   -----------
-   Gets the coordinates for the global nodes.
-
-   Specification:
-   -------------
-   int USERD_get_global_coords(CRD *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) coord_array             = 1D array of CRD structures,
-                                   which contains x,y,z coordinates
-                                   of each node.
-
-                                  (Array will have been allocated
-                                   Num_global_nodes long)
-
-    For reference, CRD structure (which is in global_extern) is:
-
-         typedef struct {
-            float xyz[3];
-         }CRD;
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * The coord_array is zero-based, but within EnSight it will become
-     a one-based array.
-     Thus, coord_array[0] will be accessed by node 1 from the conn_array,
-           coord_array[1] will be accessed by node 2 from the conn_array, etc.
-
-      ex) Given a model of two triangles, you should load coord_array as
-          follows:
-
-                            node  coordinates
-                            ----  -----------
-          4 --------- 3      1    coord_array[0].xyz[0] = 0.0
-           |\        |            coord_array[0].xyz[1] = 0.0
-           | \  T2   |            coord_array[0].xyz[2] = 0.0
-           |  \      |
-           |   \     |       2    coord_array[1].xyz[0] = 1.0
-           |    \    |            coord_array[1].xyz[1] = 0.0
-           |     \   |            coord_array[1].xyz[2] = 0.0
-           |      \  |
-           |  T1   \ |       3    coord_array[2].xyz[0] = 1.0
-           |        \|            coord_array[2].xyz[1] = 1.6
-          1 --------- 2           coord_array[2].xyz[2] = 0.0
-
-                             4    coord_array[3].xyz[0] = 0.0
-                                  coord_array[3].xyz[1] = 1.6
-                                  coord_array[3].xyz[2] = 0.0
-
-
-        And conn_array in USERD_get_element_connectivities_for_part
-        as follows:
-                                               
-        Triangle  Connectivity
-        --------  ------------
-           T1     conn_array[Z_TRI03][0][0] = 1
-                  conn_array[Z_TRI03][0][1] = 2
-                  conn_array[Z_TRI03][0][2] = 4
-
-           T2     conn_array[Z_TRI03][1][0] = 2
-                  conn_array[Z_TRI03][1][1] = 3
-                  conn_array[Z_TRI03][1][2] = 4
-
---------------------------------------------------------------------
-USERD_get_global_node_ids
-
-   Description:
-   -----------
-   Gets the node ids assigned to each of the global nodes.
-
-   Specification:
-   -------------
-   int USERD_get_global_node_ids(int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node. The ids must be > 0
-
-                                   (Array will have been allocated
-                                    Num_global_nodes long)
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and node label
-     status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) *two_fields          = FALSE if only one data field required
-				      in the data dialog of EnSight.
-				TRUE if two data fields required.
-
-   Notes:
-   -----
-   * Always called.  Provide a name for your custom reader format.
-
-   * If you don't want a custom reader to show up in the data dialog
-     choices, return a name of "No_Custom"
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  The must also be
-       positive numbers greater than zero.
-
-         USERD_get_global_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         Also be aware that if you say node labels are available,
-         the connectivity of elements must be according to these
-         node ids.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_global_nodes
-
-   Description:
-   -----------
-   Gets the number of global nodes, used for unstructured parts.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_global_nodes()
-
-   Returns:
-   -------
-   Number of global nodes (>=0 if okay, <0 if problems)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-   * For unstructured data:
-           EnSight wants  1. A global array of nodes
-                          2. Element connectivities by part, which
-                             reference the node numbers of the global
-                             node array.
-                IMPORTANT:
-                ---------
-                If you provide node ids, then element connectivities
-                must be in terms of the node ids.  If you do not
-                provide node ids, then element connectivities must be
-                in terms of the index into the node array, but shifted
-                to start at 1
-
-   * Num_global_nodes would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if probs).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_time_steps( void )
-
-   Returns:
-   -------
-   Number of time steps  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, and vector types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_part_build_info(int *part_numbers,
-                                 int *part_types,
-                                 char *part_description[Z_BUFL],
-                                 int *number_of_elements[Z_MAXTYPE],
-                                 int *ijk_dimensions[3],
-                                 int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) part_numbers           = Array containing part numbers for
-                                  each of the model parts.
-
-                                  IMPORTANT:
-                                   Parts numbers must be >= 1
-
-            ********************************************
-             The numbers provided here are the ones by
-             which the parts will be referred to in any
-             of the other routines which receive a part
-             number or block number as an argument!! 
-            ********************************************
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimensions
-                                  for each structured model part.
-                                           ----------
-                                  (Ignored if Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 3 long)
-
-                             ijk_dimensions[][0] = I dimension
-                             ijk_dimensions[][1] = J dimension
-                             ijk_dimensions[][2] = K dimension
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_scalar_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each global node for a given scalar variable.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a specific part and type for a
-     given scalar variable.
-
-   Specification:
-   -------------
-   int USERD_get_scalar_values(int which_scalar,
-                               int which_part,
-                               int which_type,
-                               float *scalar_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_scalar            = The variable number (of scalar type)
-
-   (IN)  which_part 
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The part number
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-
-   (OUT) scalar_array 
-
-            if Z_PER_NODE:       = 1D array containing scalar values
-                                    for each node.
-
-                                   (Array will have been allocated
-                                    Num_global_nodes long)
-
-            if Z_PER_ELEM:       = 1d array containing scalar values for
-                                   each element of a particular part and type.
-                                    
-                                   (Array will have been allocated
-                                    number_of_elements[which_part][which_type]
-                                    long.  See USERD_get_part_build_info)
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0,
-     Num_variables is > 0, and you have some scalar type variables.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_solution_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step.
-
-   Specification:
-   -------------
-   int USERD_get_solution_times(float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) solution_times       = 1D array of solution times/time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_variable_info(char **var_description,
-                               char **var_filename,
-                               int *var_type,
-                               int *var_classify)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_filename         = Variable filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-              etc.
-
-
-
---------------------------------------------------------------------
-USERD_get_variable_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_variable_value_at_specific(int which_var,
-                                            int which_node_or_elem,
-                                            int which_part,
-                                            int which_elem_type,
-                                            int time_step,
-                                            float values[3])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_part_build_info),
-                                        or the block's element list (1 based).
-
-                            Thus,  for which_part:
-                                   conn_array[which_elem_type][0]
-                                   conn_array[which_elem_type][1]
-                                   conn_array[which_elem_type][2]
-                                        .                      |
-                                        .          which_node_or_elem index
-                                        .                        ----
-
-
-   (IN)  which_part
-
-                        If Z_PER_NODE, or block part:
-                          = Not used
-
-                        If Z_PER_ELEM:
-                          = The part number
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-
---------------------------------------------------------------------
-USERD_get_vector_values
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the values at each global node for a given vector variable.
-
-   or if Z_PER_ELEM:
-     Get the values at each element of a specific part and type for a
-     given vector variable.
-
-   Specification:
-   -------------
-   int USERD_get_vector_values(int which_vector,
-                               int which_part,
-                               int which_type,
-                               float *vector_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_vector            = The variable number
-
-   (IN)  which_part 
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The part number
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-
-   (OUT) vector_array 
-
-        if Z_PER_NODE:       = 1D array containing vector values
-                               for each node.
-
-                               (Array will have been allocated
-                                3 by Num_global_nodes long)
-
-                  Info stored in this fashion:
-                        vector_array[0] = xcomp of node 1
-                        vector_array[1] = ycomp of node 1
-                        vector_array[2] = zcomp of node 1
-
-                        vector_array[3] = xcomp of node 2
-                        vector_array[4] = ycomp of node 2
-                        vector_array[5] = zcomp of node 2
-
-                        vector_array[6] = xcomp of node 3
-                        vector_array[7] = ycomp of node 3
-                        vector_array[8] = zcomp of node 3
-                                etc.
-
-        if Z_PER_ELEM:       = 1D array containing vector values for
-                               each element of a particular part and type.
-                                    
-                             (Array will have been allocated
-                              3 by number_of_elements[which_part][which_type]
-                              long.  See USERD_get_part_build_info)
-
-                  Info stored in this fashion:
-                       vector_array[0] = xcomp of elem 1 (of part and type)
-                       vector_array[1] = ycomp of elem 1         "
-                       vector_array[2] = zcomp of elem 1         "
-
-                       vector_array[3] = xcomp of elem 2         "
-                       vector_array[4] = ycomp of elem 2         "
-                       vector_array[5] = zcomp of elem 2         "
-
-                       vector_array[6] = xcomp of elem 3         "
-                       vector_array[7] = ycomp of elem 3         "
-                       vector_array[8] = zcomp of elem 3         "
-                               etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0,
-     Num_variables is > 0,  and you have some vector type variables
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed.
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-   (IN) filename_2   = the filename entered into the result
-                         field of the data dialog.
-			 (If the two_fields flag in USERD_get_name_of_reader
-			  is FALSE, this will be null string)
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
-
---------------------------------------------------------------------
-USERD_set_time_step
-
-   Description:
-   -----------
-   Set the current time step.  All functions that need time, and
-   that do not explicitly pass it in, will use the time step set by
-   this routine.
-
-   Specification:
-   -------------
-   void USERD_set_time_step(int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) time_step - The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step would be set here
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
-
-
----- end of doucment ----
-
-
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.0 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.0
deleted file mode 100644
index 93ac1f4fff0d59add85ae4224cf70e14e7ca87db..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.0
+++ /dev/null
@@ -1,2537 +0,0 @@
-README_USERD_2.0
-================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.0)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-Two versions of this API are available starting with EnSight Version 7.2. The
-1.0 API (which was designed to be friendly to those producing it, but requires
-more manipulation internally by EnSight) may be a little easier to
-produce, but requires more memory and processing time.  The 2.0 API is
-considerably more efficient, and was designed more with that in mind. It
-requires that all data be provided on a part basis.
-
-If you already have a working 1.0 API reader and are happy with it - there is
-probably no reason to modify it to the 2.0 API unless:
- - you deal with large models and the memory use and load times are a
-   problem or
- - you need tensor variable support or
- - you need complex variable support or
- - you need multiple timeset capability or
- _ you want to provide your own "border" elements (as opposed to EnSight's
-                                                    computation of them).
-
-If you are producing a new reader, you should consider which will work best
-for your needs.
-
-
-API 1.0  (defined in README_USERD_1.0 document)
-=======
-The original user defined reader API (used with EnSight Versions 6 through
-7.1) will continue to be supported. (Note that there was a change in the way
-that the libraries were made at version 7.1 of EnSight, but underlying code
-was kept the same.) Thus, any readers that work with EnSight 7.1, should still
-function with EnSight 7.2.
-
-
-API 2.0  (defined in this README_USERD_2.0 document)
-=======
-This new API has been defined to be more efficient and includes access to new
-capabilities of EnSight 7.2.  It lends itself closely to the EnSight "gold"
-type format.
-
-Some of its advantages are::
-
- * Most intermediate temporary arrays have been eliminated, such that the user
-   defined routines write directly into internal part structures. This is a
-   considerable improvement in memory use, and improves speed as well since
-   far less memory need be allocated, initialized, etc.
-
- * Parts are self contained. Coordinates, connectivity and all variables are
-   provided on a part basis. This eliminates the need for several global to
-   local coordinate mapping operations and the need for node id connectivity
-   hashing.  This can greatly improve the speed at which models are loaded.
-
- * Model extents can be provided directly, such that EnSight need not read
-   all the coordinate data at load time.
-
- * Tensor variables are supported
-
- * Complex variables are supported
-
- * A routine is provided as EnSight exits, so cleanup operations such as
-   removing temporary files can be easily accomplished.
-
- * Geometry and variables can be provided on different time lines (timesets).
-
- * If your data format already provides boundary shell information, you can
-   use it instead of the "border" representation that EnSight would compute.
-
-Further discussion on the philosophical differences between the two API's and
-an efficiency comparison example can be found in the README_1.0_to_2.0 file.
-This file also contains guidance on necessary changes to modify an existing
-1.0 API to the new 2.0 API.
-
-
-****************************************************************************
-Note: A default dummy_gold reader and an Ensight Gold example of this new 2.0
-      user defined reader API has been included with your EnSight release.
-      Also, the SILO reader included in the release utilizes the 2.0 API. 
-
-      And while not identical, the API 1.0 readers might be useful to
-      examine as examples.  Many of the routines are the same or similar.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
-
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                         part's node coordinates
-USERD_get_part_node_ids                       part's node ids
-USERD_get_part_elements_by_type               part's element connectivites
-USERD_get_part_element_ids_by_type            part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component           block coordinates
-USERD_get_block_iblanking                     block iblanking values
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader                      name of reader for GUI
-USERD_get_reader_version                      provide reader version number
-USERD_get_reader_descrip                      provide GUI more description(optional)
-
-USERD_set_filenames                           filenames entered in GUI
-USERD_set_server_number                       server which of how many
-
-USERD_get_number_of_timesets                  number of timesets
-USERD_get_timeset_description                 description of timeset
-USERD_get_geom_timeset_number                 timeset # to use for geom
-
-USERD_get_num_of_time_steps                   number of time steps
-USERD_get_sol_times                           solution time values
-USERD_set_time_set_and_step                   current timeset and time step
-
-
-USERD_get_changing_geometry_status            changing geometry?
-USERD_get_node_label_status                   node labels?
-USERD_get_element_label_status                element labels?
-USERD_get_model_extents                       provide model bounding extents
-USERD_get_number_of_files_in_dataset          number of files in model
-USERD_get_dataset_query_file_info             info about each model file
-USERD_get_descrip_lines                       file associated description lines
-USERD_get_number_of_model_parts               number of model parts
-USERD_get_part_build_info                     part/block type/descrip etc.
-USERD_get_maxsize_info                        part/block allocation maximums
-
-USERD_get_border_availability                 part border provided?
-USERD_get_border_elements_by_type             part border conn and parent info
-
-USERD_get_number_of_variables                 number of variables
-USERD_get_gold_variable_info                  variable type/descrip etc.
-USERD_get_var_by_component                    part or block variable values
-USERD_get_constant_val                        constant variable's value
-USERD_get_var_value_at_specific               node's or element's variable
-                                                 value over time
-USERD_stop_part_building                      cleanup after part build routine
-
-USERD_bkup                                    archive routine
-
-USERD_exit_routine                            cleanup upon exit routine
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip    (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        USERD_set_server_number
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_maxsize_info
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        USERD_set_time_set_and_step
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[3],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-  
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-  
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-  
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-  
-                example:  If Numparts_available = 3
-  
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-  
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-  
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability( int part_number,...
-                           USERD_get_border_elements_by_type( int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-  
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimensions
-                                  for each structured model part.
-                                           ----------
-                                  (Ignored if Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 3 long)
-
-                             ijk_dimensions[][0] = I dimension
-                             ijk_dimensions[][1] = J dimension
-                             ijk_dimensions[][2] = K dimension
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) *two_fields          = FALSE if only one data field required
-				      in the data dialog of EnSight.
-				TRUE if two data fields required.
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT    node point element
-                                   Z_BAR02    2 node bar
-                                   Z_BAR03    3 node bar
-                                   Z_TRI03    3 node triangle
-                                   Z_TRI06    6 node triangle
-                                   Z_QUA04    4 node quad
-                                   Z_QUA08    8 node quad
-                                   Z_TET04    4 node tetrahedron
-                                   Z_TET10   10 node tetrahedron
-                                   Z_PYR05    5 node pyramid
-                                   Z_PYR13   13 node pyramid
-                                   Z_PEN06    6 node pentahedron
-                                   Z_PEN15   15 node pentahedron
-                                   Z_HEX08    8 node hexahedron
-                                   Z_HEX20   20 node hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and element
-     label status is TRUE
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-                                 Z_TET04    4 node tetrahedron
-                                 Z_TET10   10 node tetrahedron
-                                 Z_PYR05    5 node pyramid
-                                 Z_PYR13   13 node pyramid
-                                 Z_PEN06    6 node pentahedron
-                                 Z_PEN15   15 node pentahedron
-                                 Z_HEX08    8 node hexahedron
-                                 Z_HEX20   20 node hexahedron
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0  and node label
-     status is TRUE
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0 instead of 2.0
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-  
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-  
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT    node point element
-                                   Z_BAR02    2 node bar
-                                   Z_BAR03    3 node bar
-                                   Z_TRI03    3 node triangle
-                                   Z_TRI06    6 node triangle
-                                   Z_QUA04    4 node quad
-                                   Z_QUA08    8 node quad
-                                   Z_TET04    4 node tetrahedron
-                                   Z_TET10   10 node tetrahedron
-                                   Z_PYR05    5 node pyramid
-                                   Z_PYR13   13 node pyramid
-                                   Z_PEN06    6 node pentahedron
-                                   Z_PEN15   15 node pentahedron
-                                   Z_HEX08    8 node hexahedron
-                                   Z_HEX20   20 node hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-  
-                                    (1-based index of part table, namely:
-  
-                                       1 ... Numparts_available.
-  
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-  
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) filename_2   = the filename entered into the result
-                         field of the data dialog.
-			 (If the two_fields flag in USERD_get_name_of_reader
-			  is FALSE, this will be null string)
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
-
----- end of doucment ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.01 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.01
deleted file mode 100644
index e76880e74e5ce0919e964662a9c5aed2a83bd499..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.01
+++ /dev/null
@@ -1,2787 +0,0 @@
-README_USERD_2.01
-=================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.01)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-You should refer to beginning of README_USERD_2.0  and/or README_1.0_to_2.0
-for a discussion of the differences between API 1.0 and API 2.*.
-
-
-***>> API 2.01 adds the capabilty of handling ghost cells.
-
-
-API 2.01  (defined in this README_USERD_2.01 document)
-========
-This new API has been defined to be more efficient and includes access to new
-capabilities of EnSight 7.4.  It lends itself closely to the EnSight "gold"
-type format.
-
-Some of its advantages are::
-
- * Most intermediate temporary arrays have been eliminated, such that the user
-   defined routines write directly into internal part structures. This is a
-   considerable improvement in memory use, and improves speed as well since
-   far less memory need be allocated, initialized, etc.
-
- * Parts are self contained. Coordinates, connectivity and all variables are
-   provided on a part basis. This eliminates the need for several global to
-   local coordinate mapping operations and the need for node id connectivity
-   hashing.  This can greatly improve the speed at which models are loaded.
-
- * Model extents can be provided directly, such that EnSight need not read
-   all the coordinate data at load time.
-
- * Tensor variables are supported
-
- * Complex variables are supported
-
- * A routine is provided as EnSight exits, so cleanup operations such as
-   removing temporary files can be easily accomplished.
-
- * Geometry and variables can be provided on different time lines (timesets).
-
- * If your data format already provides boundary shell information, you can
-   use it instead of the "border" representation that EnSight would compute.
-
- * Ghost cells are supported, for both unstructured and structured models.
-
-
-****************************************************************************
-Note: A default dummy_gold reader and an Ensight Gold example of this new 2.01
-      user defined reader API has been included with your EnSight release.
-      Also, the SILO and ExodusII_gold reader included in the release
-      utilizes the 2.01 API. 
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                         part's node coordinates
-USERD_get_part_node_ids                       part's node ids
-USERD_get_part_elements_by_type               part's element connectivites
-USERD_get_part_element_ids_by_type            part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component           block coordinates
-USERD_get_block_iblanking                     block iblanking values
-USERD_get_ghosts_in_block_flag                block ghost cell existence?
-USERD_get_block_ghost_flags                   block ghost cell flags
-
-  These routines, which formerly were only for unstructured data, will now
-  also be called for structured data if you specify that ids will be given
-  in the USERD_get_node_label_status and USERD_get_element_label_status rotuines
-  ------------------------------------------------------------------------------ 
-  USERD_get_part_node_ids                       part's node ids
-  USERD_get_part_element_ids_by_type            part's element ids
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader                      name of reader for GUI
-USERD_get_reader_version                      provide reader version number
-USERD_get_reader_descrip                      provide GUI more description(optional)
-
-USERD_set_filenames                           filenames entered in GUI
-USERD_set_server_number                       server which of how many
-
-USERD_get_number_of_timesets                  number of timesets
-USERD_get_timeset_description                 description of timeset
-USERD_get_geom_timeset_number                 timeset # to use for geom
-
-USERD_get_num_of_time_steps                   number of time steps
-USERD_get_sol_times                           solution time values
-USERD_set_time_set_and_step                   current timeset and time step
-
-
-USERD_get_changing_geometry_status            changing geometry?
-USERD_get_node_label_status                   node labels?
-USERD_get_element_label_status                element labels?
-USERD_get_model_extents                       provide model bounding extents
-USERD_get_number_of_files_in_dataset          number of files in model
-USERD_get_dataset_query_file_info             info about each model file
-USERD_get_descrip_lines                       file associated description lines
-USERD_get_number_of_model_parts               number of model parts
-USERD_get_part_build_info                     part/block type/descrip etc.
-USERD_get_maxsize_info                        part/block allocation maximums
-USERD_get_ghosts_in_model_flag                model contains ghost cells?
-
-USERD_get_border_availability                 part border provided?
-USERD_get_border_elements_by_type             part border conn and parent info
-
-USERD_get_number_of_variables                 number of variables
-USERD_get_gold_variable_info                  variable type/descrip etc.
-USERD_get_var_by_component                    part or block variable values
-USERD_get_constant_val                        constant variable's value
-USERD_get_var_value_at_specific               node's or element's variable
-                                                 value over time
-USERD_stop_part_building                      cleanup after part build routine
-
-USERD_bkup                                    archive routine
-
-USERD_exit_routine                            cleanup upon exit routine
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip        (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        USERD_set_server_number
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_maxsize_info
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-
-        else if structured part:
-        -----------------------
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        both again:
-        ----------
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-You must use the global_extern.h file associated with the proper release of
-EnSight when you build readers.  Namely, this header file can change per EnSight
-release.  For example, readers compiled for EnSight 7.3 will not run properly in
-EnSight 7.4 and vica versa because there was a critical change in the
-global_extern.h file between these two versions.  In most cases the only thing
-needed to produce a workable reader is to remake it with the proper header file.
-
-*******************************************************************************
-*******************************************************************************
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
-----------------------------------------------------------------------
-USERD_get_block_ghost_flags
-
-   Description:
-   -----------
-   Get the ghost_flags value at each element of a block containing ghost cells.
-
-   Specification:
-   -------------
-   int USERD_get_block_ghost_flags(int block_number,
-                                   int *ghost_flags)
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) ghost_flags             = 1D array containing ghost flag value
-                                     for each block cell.
-  
-                                    (Array will have been allocated
-                                     (i-1)*(j-1)*(k-1) for the block long)
-  
-            possible values are:    0  = non-ghost cell  (normal cell)
-                                   >0  = ghost cell
-  
-    Notes:
-    -----
-    * This routine is new in the 2.01 API
-
-    * This will be based on Current_time_step
-  
-    * Only called for structured "block" parts that have some ghost cells
-      as indicated by the USERD_get_ghost_in_block_flag.  The model must
-      of course also have been indicated to have some ghost cells in the
-      USERD_get_ghost_in_model_flag routine.
-  
-    * It is sufficient to set the value to be 1 to flag as a ghost cell,
-      but the value can be any non-zero value, so you could use it to
-      indicate which block or which server (for Server-of-server use) the
-      cell is actually in.
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-       API 1.0:
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       API 2.0:
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model (especially
-       if you are dealing with a decomposed dataset).
-
-       USERD_get_part_element_ids_by_type is used to obtain the ids,
-       on an element type by part basis, if TRUE status is returned here.
-
-   * Will call USERD_get_part_element_ids_by_type for each type of
-     of each part if this routine returns TRUE.
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[3],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-
-                example:  If Numparts_available = 3
-
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability(int part_number,...
-                           USERD_get_border_elements_by_type(int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimensions
-                                  for each structured model part.
-                                           ----------
-                                  (Ignored if Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 3 long)
-
-                             ijk_dimensions[][0] = I dimension
-                             ijk_dimensions[][1] = J dimension
-                             ijk_dimensions[][2] = K dimension
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_block_flag
-
-   Description:
-   -----------
-   Gets whether ghost cells present in block or not
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_block_flag(int block_number)
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in this structured part
-   FALSE if no ghost cells in this structured part
-
-   Arguments:
-   ---------
-   (IN) block_number      = The block part number
-                              (1-based index of part table, namely:
-
-                                1 ... Numparts_available.
-
-                              It is NOT the part_id that
-                              is loaded in USERD_get_gold_part_build_info)
-
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-    * This will be based on Current_time_step
-  
-    * Intended for structured parts only, value will be ignored for
-      unstructured parts
-
-
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_model_flag
-
-   Description:
-   -----------
-   Answers the question as to whether any ghost cells in the model.
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_model_flag( void )
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in the model
-   FALSE if no ghost cells in the model
-
-   Arguments:
-   ---------
-  
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) *two_fields          = FALSE if only one data field required
-				      in the data dialog of EnSight.
-				TRUE if two data fields required.
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model. They must
-       also be positive numbers greater than zero.
-
-       USERD_get_part_node_ids is used to obtain the ids, if the
-       status returned here is TRUE.
-
-   * Will call USERD_get_part_node_ids for each part if this routine
-     returns TRUE.
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured
-   or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless element label status is set to TRUE in
-     USERD_get_element_label_status
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT      node point element
-                                 Z_BAR02      2 node bar
-                                 Z_BAR03      3 node bar
-                                 Z_TRI03      3 node triangle
-                                 Z_TRI06      6 node triangle
-                                 Z_QUA04      4 node quad
-                                 Z_QUA08      8 node quad
-                                 Z_TET04      4 node tetrahedron
-                                 Z_TET10     10 node tetrahedron
-                                 Z_PYR05      5 node pyramid
-                                 Z_PYR13     13 node pyramid
-                                 Z_PEN06      6 node pentahedron
-                                 Z_PEN15     15 node pentahedron
-                                 Z_HEX08      8 node hexahedron
-                                 Z_HEX20     20 node hexahedron
-
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
-
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless node label status is TRUE, as returned from
-     USERD_get_node_label_status
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0
-
-   * should set it to "2.010" for this version of the API
-
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) filename_2   = the filename entered into the result
-                         field of the data dialog.
-			 (If the two_fields flag in USERD_get_name_of_reader
-			  is FALSE, this will be null string)
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
-
----- end of doucment ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.03 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.03
deleted file mode 100644
index 14d40c799a11f9ed321b5f35cce01a62df232658..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.03
+++ /dev/null
@@ -1,3838 +0,0 @@
-README_USERD_2.03
-=================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.03)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-You should refer to beginning of README_USERD_2.0  and/or README_1.0_to_2.0
-for a discussion of the differences between API 1.0 and API 2.*.
-
-
-***>> API 2.03 additional capabilities (beyond API 2.01):
-1. Routines to handle materials
-2. Routines to handle nsided and nfaced elements
-3. Modified routine to handle structured ranges
-
-
-****************************************************************************
-Note: The dummy_gold reader, the Ensight Gold example reader, and the
-      SILO reader have been moved to this 2.03 API level.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                 part's node coordinates
-USERD_get_part_node_ids               part's node ids
-USERD_get_part_elements_by_type       part's element connectivites
-USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component   block coordinates
-USERD_get_block_iblanking             block iblanking values
-USERD_get_ghosts_in_block_flag        block ghost cell existence?
-USERD_get_block_ghost_flags           block ghost cell flags
-
-  These routines, which formerly were only for unstructured data, will now
-  also be called for structured data if you specify that ids will be given
-  in the USERD_get_node_label_status and USERD_get_element_label_status rotuines
-  ------------------------------------------------------------------------------ 
-  USERD_get_part_node_ids               part's node ids
-  USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader              name of reader for GUI
-USERD_get_reader_version              provide reader version number
-USERD_get_reader_descrip              provide GUI more description (optional)
-
-USERD_set_filenames                   filenames entered in GUI
-USERD_set_server_number               server which of how many
-
-USERD_get_number_of_timesets          number of timesets
-USERD_get_timeset_description         description of timeset
-USERD_get_geom_timeset_number         timeset # to use for geom
-
-USERD_get_num_of_time_steps           number of time steps
-USERD_get_sol_times                   solution time values
-USERD_set_time_set_and_step           current timeset and time step
-
-USERD_get_gold_part_build_info        Gets the info needed for part building process
-USERD_get_changing_geometry_status    changing geometry?
-USERD_get_node_label_status           node labels?
-USERD_get_element_label_status        element labels?
-USERD_get_model_extents               provide model bounding extents
-USERD_get_number_of_files_in_dataset  number of files in model
-USERD_get_dataset_query_file_info     info about each model file
-USERD_get_descrip_lines               file associated description lines
-USERD_get_number_of_model_parts       number of model parts
-USERD_get_part_build_info             part/block type/descrip etc.
-USERD_get_maxsize_info                part/block allocation maximums
-USERD_get_ghosts_in_model_flag        model contains ghost cells?
-USERD_get_nsided_conn                 Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face       Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                 Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-
-
-USERD_get_border_availability         part border provided?
-USERD_get_border_elements_by_type     part border conn and parent info
-
-USERD_get_number_of_variables         number of variables
-USERD_get_gold_variable_info          variable type/descrip etc.
-USERD_get_var_by_component            part or block variable values
-USERD_get_constant_val                constant variable's value
-USERD_get_var_value_at_specific       node's or element's variable value over time
-USERD_stop_part_building              cleanup after part build routine
-
-USERD_get_number_of_material_sets     Gets the number of material sets
-USERD_get_matf_set_info               Gets the material set indices and names
-USERD_get_number_of_materials         Gets the number of materials
-USERD_get_matf_var_info               Gets the material indices and descriptions
-USERD_size_matf_data                  Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                  Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_bkup                            archive routine
-
-USERD_exit_routine                    cleanup upon exit routine
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip        (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        USERD_set_server_number
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_maxsize_info
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-        If any nsided elements:
-
-          USERD_get_nsided_conn
-
-        If any nfaced elements:
-
-          USERD_get_nfaced_nodes_per_face
-          USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-
-        else if structured part:
-        -----------------------
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        both again:
-        ----------
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-        USERD_get_matf_set_info
-
-        If any material sets in the model (calls these once per material set):
-          USERD_get_number_of_materials
-          USERD_get_matf_var_info
-
-        For each elment type of each part containing material ids, calls:
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-        If there are any elements with mixed materials, when a domain or
-        interface is created, calls these again per part:
-
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-And it references:
-
-       #include "global_extern_proto.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_203
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.03" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is accessed from the new global_extern.h
-
-*******************************************************************************
-*******************************************************************************
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
-----------------------------------------------------------------------
-USERD_get_block_ghost_flags
-
-   Description:
-   -----------
-   Get the ghost_flags value at each element of a block containing ghost cells.
-
-   Specification:
-   -------------
-   int USERD_get_block_ghost_flags(int block_number,
-                                   int *ghost_flags)
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) ghost_flags             = 1D array containing ghost flag value
-                                     for each block cell.
-  
-                                    (Array will have been allocated
-                                     (i-1)*(j-1)*(k-1) for the block long)
-  
-            possible values are:    0  = non-ghost cell  (normal cell)
-                                   >0  = ghost cell
-  
-    Notes:
-    -----
-    * This routine is new in the 2.01 API
-
-    * This will be based on Current_time_step
-  
-    * Only called for structured "block" parts that have some ghost cells
-      as indicated by the USERD_get_ghost_in_block_flag.  The model must
-      of course also have been indicated to have some ghost cells in the
-      USERD_get_ghost_in_model_flag routine.
-  
-    * It is sufficient to set the value to be 1 to flag as a ghost cell,
-      but the value can be any non-zero value, so you could use it to
-      indicate which block or which server (for Server-of-server use) the
-      cell is actually in.
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-       API 1.0:
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       API 2.0:
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model (especially
-       if you are dealing with a decomposed dataset).
-
-       USERD_get_part_element_ids_by_type is used to obtain the ids,
-       on an element type by part basis, if TRUE status is returned here.
-
-   * Will call USERD_get_part_element_ids_by_type for each type of
-     of each part if this routine returns TRUE.
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[9],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-
-                example:  If Numparts_available = 3
-
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability(int part_number,...
-                           USERD_get_border_elements_by_type(int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
-
-                                  For Z_UNSTRUCTURED - is ignored
-
-                                  For Z_STRUCTURED or Z_IBLANKED
-
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
-
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
-
-
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
-
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
-
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
-
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
-
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-
-                              2. Using ranges.
-
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
-
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
-
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
-
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
-
-
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
-
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][3] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][5] = 3
-                            2 .................    ijk_dimension[0][6] = 4
-                              .       .       .    ijk_dimension[0][7] = 1
-                              .       .       .    ijk_dimension[0][8] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
-
-
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][3] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][5] = 1
-                            2 *-------*-------*    ijk_dimension[1][6] = 3
-                              |       |       |    ijk_dimension[1][7] = 1
-                              |       |       |    ijk_dimension[1][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
-
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_block_flag
-
-   Description:
-   -----------
-   Gets whether ghost cells present in block or not
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_block_flag(int block_number)
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in this structured part
-   FALSE if no ghost cells in this structured part
-
-   Arguments:
-   ---------
-   (IN) block_number      = The block part number
-                              (1-based index of part table, namely:
-
-                                1 ... Numparts_available.
-
-                              It is NOT the part_id that
-                              is loaded in USERD_get_gold_part_build_info)
-
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-    * This will be based on Current_time_step
-  
-    * Intended for structured parts only, value will be ignored for
-      unstructured parts
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_model_flag
-
-   Description:
-   -----------
-   Answers the question as to whether any ghost cells in the model.
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_model_flag( void )
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in the model
-   FALSE if no ghost cells in the model
-
-   Arguments:
-   ---------
-  
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) *two_fields          = FALSE if only one data field required
-				      in the data dialog of EnSight.
-				TRUE if two data fields required.
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
-
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model. They must
-       also be positive numbers greater than zero.
-
-       USERD_get_part_node_ids is used to obtain the ids, if the
-       status returned here is TRUE.
-
-   * Will call USERD_get_part_node_ids for each part if this routine
-     returns TRUE.
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-
-
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured
-   or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless element label status is set to TRUE in
-     USERD_get_element_label_status
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT      node point element
-                                 Z_BAR02      2 node bar
-                                 Z_BAR03      3 node bar
-                                 Z_TRI03      3 node triangle
-                                 Z_TRI06      6 node triangle
-                                 Z_QUA04      4 node quad
-                                 Z_QUA08      8 node quad
-                                 Z_TET04      4 node tetrahedron
-                                 Z_TET10     10 node tetrahedron
-                                 Z_PYR05      5 node pyramid
-                                 Z_PYR13     13 node pyramid
-                                 Z_PEN06      6 node pentahedron
-                                 Z_PEN15     15 node pentahedron
-                                 Z_HEX08      8 node hexahedron
-                                 Z_HEX20     20 node hexahedron
-
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
-
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless node label status is TRUE, as returned from
-     USERD_get_node_label_status
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0
-
-   * should set it to "2.010" for this version of the API
-
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) filename_2   = the filename entered into the result
-                         field of the data dialog.
-			 (If the two_fields flag in USERD_get_name_of_reader
-			  is FALSE, this will be null string)
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
-
----- end of doucment ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.03_CHANGES b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.03_CHANGES
deleted file mode 100644
index 90941e03e3722d7602ae6f87c02e1b9525ab2547..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.03_CHANGES
+++ /dev/null
@@ -1,1374 +0,0 @@
-README_USERD_2.03
-=================
-
-At this API revision level:
-
-1. Routines to handle materials have been added.
-2. Routines to handle nsided and nfaced elements have been added
-3. A routine has modified so structured ranges can be specified
-
-****************************************************************************
-Note: The dummy_gold reader, the Ensight Gold example reader, and the
-      SILO reader have been moved to this 2.03 API level.
-****************************************************************************
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-The new new routines are:
--------------------------
-USERD_get_number_of_material_sets    Gets the number of material sets
-USERD_get_matf_set_info              Gets the material set indices and names
-USERD_get_number_of_materials        Gets the number of materials
-USERD_get_matf_var_info              Gets the material indices and descriptions
-USERD_size_matf_data                 Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                 Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_get_nsided_conn                Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face      Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-The modified routine is:
-------------------------
-USERD_get_gold_part_build_info       Gets the info needed for part building
-                                        process
-
---------------------
-Header files changes
---------------------
-global_extern.h         has appropriate changes, must use it
-global_extern_protr.h   new file, access from global_extern.h
-
-Basically the the old global_extern.h file has been split into two files now.
-
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-
-      If any material sets in the model (calls these once per material set):
-        USERD_get_matf_set_info
-        USERD_get_number_of_materials
-        USERD_get_matf_var_info
-
-      For each elment type of each part containing material ids, calls:
-        USERD_size_matf_data
-        USERD_load_matf_data
-
-      If there are any elements with mixed materials, when a domain or
-      interface is created, calls these again per part:
-
-        USERD_size_matf_data
-        USERD_load_matf_data
-
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-          If any nsided elements:
-  
-            USERD_get_nsided_conn
-
-          If any nfaced elements:
-
-            USERD_get_nfaced_nodes_per_face
-            USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
- 
-         .
-         .
-         .
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_203
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.03" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is access from the new global_extern.h    
-
-*******************************************************************************
-*******************************************************************************
-
-____________________
---------------------
-New Library Routines
-____________________
---------------------
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                                                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns: 
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-  
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-  
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-  
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-  
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-  
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-  
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-  
-  
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-  
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-  
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-  
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-  
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-  
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-  
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
- 
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-  
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-  
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-  
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-  
-  
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-  
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-  
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-  
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-  
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-  
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-  
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-  
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-  
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-  
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-  
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-  
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-  
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-  
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-  
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-  
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-  
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-  
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-  
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-  
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-  
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-  
-  
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-  
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-  
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-  
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-  
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-  
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-  
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-  
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-  
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-  
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-  
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-  
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-  
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-  
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-  
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-  
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-  
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-  
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-________________________
-------------------------
-Modified Library Routine
-________________________
-------------------------
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for part building process
-
-   Specification:
-   -------------
-   int
-   USERD_get_gold_part_build_info(int *part_id,
-                                  int *part_types,
-                                  char *part_description[Z_BUFL],
-                                  int *number_of_nodes,
-                                  int *number_of_elements[Z_MAXTYPE],
-                                  int *ijk_dimensions[9],
-                                  int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) part_id                = Array containing the external part
-                                  ids for each of the model parts.
- 
-                                  IMPORTANT:
-                                   Parts numbers must be >= 1, because
-                                   of the way they are used in the GUI
- 
-              *******************************************
-               The ids provided here are the numbers by
-               which the parts will be referred to in the
-               GUI (if possible). They are basically
-               labels as far as you are concerned.
- 
-               Note: The part numbers you pass to routines
-               which receive a part_number or block_number
-               or which_part as an argument are the 1-based
-               table index of the parts!
- 
-               example:  If Numparts_available = 3
- 
-                         Table index        part_id
-                         -----------        -------
-                          1                  13
-                          2                  57
-                          3                  125
- 
-                          ^                   ^
-                          |                   |
-                          |                    These are placed in:
-                          |                      part_id[0] = 13
-                          |                      part_id[1] = 57
-                          |                      part_id[2] = 125
-                          |                    for GUI labeling purposes.
-                          |
-                           These implied table indices are the part_number,
-                           block_number, or which_part numbers that you would
-                           pass to routines like:
- 
-                          USERD_get_part_coords(int part_number,...
-                          USERD_get_part_node_ids(int part_number,...
-                          USERD_get_part_elements_by_type(int part_number,...
-                          USERD_get_part_element_ids_by_type(int part_number,...
-                          USERD_get_block_coords_by_component(int block_number,...
-                          USERD_get_block_iblanking(int block_number,...
-                          USERD_get_block_ghost_flags(int block_number,...
-                          USERD_get_ghosts_in_block_flag(int block_number)
-                          USERD_get_border_availability( int part_number,...
-                          USERD_get_border_elements_by_type( int part_number,...
-                          USERD_get_var_by_component(int which_variable,
-                                                     int which_part,...
-                          USERD_get_var_value_at_specific(int which_var,
-                                                          int which_node_or_elem,
-                                                          int which_part,...
-              ********************************************
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
- 
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
- 
-                                        Z_UNSTRUCTURED or
-                                        Z_STRUCTURED  or
-                                        Z_IBLANKED
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
- 
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
- 
-                                   (Array will have been allocated
-                                    Numparts_available by Z_BUFL
-                                    long)
- 
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
- 
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
- 
-                                 Z_POINT   =  point
-                                 Z_BAR02   =  2-noded bar
-                                 Z_BAR03   =  3-noded bar
-                                 Z_TRI03   =  3-noded triangle
-                                 Z_TRI06   =  6-noded triangle
-                                 Z_QUA04   =  4-noded quadrilateral
-                                 Z_QUA08   =  8-noded quadrilateral
-                                 Z_TET04   =  4-noded tetrahedron
-                                 Z_TET10   = 10-noded tetrahedron
-                                 Z_PYR05   =  5-noded pyramid
-                                 Z_PYR13   = 13-noded pyramid
-                                 Z_PEN06   =  6-noded pentahedron
-                                 Z_PEN15   = 15-noded pentahedron
-                                 Z_HEX08   =  8-noded hexahedron
-                                 Z_HEX20   = 20-noded hexahedron
- 
-    Starting at API 2.01:
-    ====================
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
- 
-    Starting at API 2.02:
-    ====================
-                                 Z_NSIDED     n node nsided polygon
-                                 Z_NFACED     n face nfaced polyhedron
-                                 Z_G_NSIDED   n node ghost nsided polygon
-                                 Z_G_NFACED   n face ghost nfaced polyhedron
- 
-                                (Ignored unless Z_UNSTRUCTURED type)
- 
-                                   (Array will have been allocated
-                                    Numparts_available by
-                                    Z_MAXTYPE long)
- 
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
- 
-                                  For Z_UNSTRUCTURED - is ignored
- 
-                                  For Z_STRUCTURED or Z_IBLANKED
- 
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
- 
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
- 
- 
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
- 
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
- 
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
- 
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
- 
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
- 
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
- 
- 
- 
-                              2. Using ranges.
- 
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
- 
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
- 
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
- 
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
- 
- 
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
- 
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
- 
- 
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
- 
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][4] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][4] = 3
-                            2 .................    ijk_dimension[0][4] = 4
-                              .       .       .    ijk_dimension[0][4] = 1
-                              .       .       .    ijk_dimension[0][4] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
- 
- 
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][4] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][4] = 1
-                            2 *-------*-------*    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][4] = 1
-                              |       |       |    ijk_dimension[1][4] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
- 
- 
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
- 
- 
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
- 
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
- 
-       iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                        [][Z_INT]     = TRUE if internal (inside)
-                        [][Z_BND]     = TRUE if boundary
-                        [][Z_INTBND]  = TRUE if internal boundary
-                        [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   If you haven't built a table of pointers to the different parts,
-   you might want to do so here as you gather the needed info.
- 
-   This will be based on Current_time_step
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.05 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.05
deleted file mode 100644
index b92bb1c988a6b4b337f05feefcd9ddb4f3f9c892..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.05
+++ /dev/null
@@ -1,4543 +0,0 @@
-README_USERD_2.05
-=================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.05)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-You should refer to beginning of README_USERD_2.0  and/or README_1.0_to_2.0
-for a discussion of the differences between API 1.0 and API 2.*.
-
-***>> API 2.05 additional capabilities (beyond API 2.04):
-Routines to handle material species.
-    USERD_get_number_of_species
-    USERD_get_matsp_info
-
-Routines to handle variable extraction parameters after a read, and then
-update the variables accordingly.  Similar to the extra GUI capabilities
-(which are processed before a read).  (Can actually be added to pre-2.05 readers)
-    USERD_get_var_extract_gui_numbers
-    USERD_get_var_extract_gui_defaults
-    USERD_set_var_extract_gui_data
-
-Routines to obtain rigid body values from a reader.
-(Routines were added - EnSight is now using for Nastran and STL readers
-                       with Dynasty rigid body motion data file)
-    USERD_rigidbody_existence
-    USERD_rigidbody_values
-
-Routine that lets reader know when EnSight is getting the right side of a time
-interval for variable interpolation between steps.  Not generally needed for
-most readers - however, may be needed for those that implement rigid body, and
-wish to cache left and right timespan information for interpolation within the
-reader itself.  (Can actually be added to pre-2.05 readers)
-    USERD_set_right_side
-
-
-***>> API 2.04 additional capabilities (beyond API 2.03):
-Routines to handle failed elements.  Basically 
-a.One routine to return a flag indicating the existence of 
-  failed elements in at least one part in at least one 
-  timestep in the model.  
-b.A second routine to return a matrix of flags indexed by part and
-  element type indicating which parts and element types have failed
-  elements at the current time step.
-c.Finally a third routine to return an array of flags for a given
-  part and element type that is number of elements of that type long
-  indicating which elements have failed, and which have not failed.
-
-
-***>> API 2.03 additional capabilities (beyond API 2.01):
-1. Routines to handle materials
-2. Routines to handle nsided and nfaced elements
-3. Modified routine to handle structured ranges
-
-
-****************************************************************************
-Note: The dummy_gold reader, the Ensight Gold example reader, the
-      ABAQUS_ODB reader and the LS-DYNA reader have been moved to 
-      this 2.04 API level.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                 part's node coordinates
-USERD_get_part_node_ids               part's node ids
-USERD_get_part_elements_by_type       part's element connectivites
-USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component   block coordinates
-USERD_get_block_iblanking             block iblanking values
-USERD_get_ghosts_in_block_flag        block ghost cell existence?
-USERD_get_block_ghost_flags           block ghost cell flags
-
-  These routines, which formerly were only for unstructured data, will now
-  also be called for structured data if you specify that ids will be given
-  in the USERD_get_node_label_status and USERD_get_element_label_status rotuines
-  ------------------------------------------------------------------------------ 
-  USERD_get_part_node_ids               part's node ids
-  USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader              name of reader for GUI
-USERD_get_reader_version              provide reader version number
-USERD_get_reader_descrip              provide GUI more description (optional)
-
-USERD_set_filenames                   filenames entered in GUI
-USERD_set_server_number               server which of how many
-
-USERD_get_number_of_timesets          number of timesets
-USERD_get_timeset_description         description of timeset
-USERD_get_geom_timeset_number         timeset # to use for geom
-
-USERD_get_num_of_time_steps           number of time steps
-USERD_get_sol_times                   solution time values
-USERD_set_time_set_and_step           current timeset and time step
-
-USERD_get_gold_part_build_info        Gets the info needed for part building process
-USERD_get_changing_geometry_status    changing geometry?
-USERD_get_node_label_status           node labels?
-USERD_get_element_label_status        element labels?
-USERD_get_model_extents               provide model bounding extents
-USERD_get_number_of_files_in_dataset  number of files in model
-USERD_get_dataset_query_file_info     info about each model file
-USERD_get_descrip_lines               file associated description lines
-USERD_get_number_of_model_parts       number of model parts
-USERD_get_part_build_info             part/block type/descrip etc.
-USERD_get_maxsize_info                part/block allocation maximums
-USERD_get_ghosts_in_model_flag        model contains ghost cells?
-USERD_get_nsided_conn                 Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face       Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                 Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-
-
-USERD_get_border_availability         part border provided?
-USERD_get_border_elements_by_type     part border conn and parent info
-
-USERD_get_number_of_variables         number of variables
-USERD_get_gold_variable_info          variable type/descrip etc.
-USERD_get_var_by_component            part or block variable values
-USERD_get_constant_val                constant variable's value
-USERD_get_var_value_at_specific       node's or element's variable value over time
-USERD_stop_part_building              cleanup after part build routine
-
-USERD_get_number_of_material_sets     Gets the number of material sets
-USERD_get_matf_set_info               Gets the material set indices and names
-USERD_get_number_of_materials         Gets the number of materials
-USERD_get_matf_var_info               Gets the material indices and descriptions
-USERD_size_matf_data                  Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                  Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_bkup                            archive routine
-
-USERD_exit_routine                    cleanup upon exit routine
-
-
----------------------------
-Optional Extra GUI Info
-Adds Toggle(s), Pulldown(s) Field(s)
-that can be used for additonal input
----------------------------
-USERD_get_extra_gui_numbers          Gets the number of toggles, pulldowns and fields
-USERD_get_extra_gui_defaults         Gets the default values for the GUI members
-USERD_set_extra_gui_data             Returns the answers provided by the user
-
-USERD_rigidbody_existence            Returns whether rigid body transformation
-                                       data exists for the model.
-USERD_rigidbody_values               Returns the euler and location values for a
-                                       given part
-
-USERD_set_right_side                 Simply informs the reader when the time set
-                                     is for the right side of a time span during
-                                     variable interpolation between time steps.
-
-New at 2.04
------------
-
-/* ----------------------------------------------------------
- *
- *  Failure criteria in LS-DYNA 
- *  if fail flag == threshold_val1 (0.0) then element fails
- *    logic_criteria2 not used
- *    threshold_val2 not used
- *    threshold_operator2 not used
- *  Return (Z_ERR) if this is not used.
- * Return Z_OK if failed element feature should be used
- *
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ---------------------------------------------------------- */
-
-int USERD_get_uns_failed_params(
-                char *fail_var_name,           /* variable name to be used in failure
-                                            must be scalar, per elem      */
-                float *threshold_val1,     /* number to compare for failure */
-                float *threshold_val2,     /* number to compare for failure */
-                int *threshold_operator1,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *threshold_operator2,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-		int *logic_criteria2
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip        (optional)
-        USERD_get_extra_gui_numbers     (optional)
-	USERD_get_extra_gui_defaults    (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        USERD_set_server_number
-	USERD_set_extra_gui_data        (optional)
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_uns_failed_model_flag  
-        USERD_get_gold_part_build_info
-        USERD_get_uns_failed_etype_flags
-        USERD_get_ghosts_in_model_flag
-        USERD_get_maxsize_info
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-        If any nsided elements:
-
-          USERD_get_nsided_conn
-
-        If any nfaced elements:
-
-          USERD_get_nfaced_nodes_per_face
-          USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_uns_failed_elist_flags
-
-        else if structured part:
-        -----------------------
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        both again:
-        ----------
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-	USERD_get_uns_failed_model_flag
-	USERD_get_uns_failed_etype_flags
-	USERD_get_uns_failed_elist_flags
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_uns_failed_model_flag
-        USERD_get_gold_part_build_info
-        USERD_get_uns_failed_etype_flags
-        USERD_get_ghosts_in_model_flag
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_uns_failed_elist_flags
-        USERD_get_block_iblanking
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-        USERD_get_matf_set_info
-
-        If any material sets in the model (calls these once per material set):
-          USERD_get_number_of_materials
-          USERD_get_matf_var_info
-
-        For each elment type of each part containing material ids, calls:
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-        If there are any elements with mixed materials, when a domain or
-        interface is created, calls these again per part:
-
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-11. To modify the variable extraction parameters and have the variables
-    update accordingly.
-
-        USERD_get_var_extract_gui_numbers
-        USERD_get_var_extract_gui_defaults
-        USERD_set_var_extract_gui_data
-
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-And it references:
-
-       #include "global_extern_proto.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_204
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.04" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is accessed from the new global_extern.h
-
-*******************************************************************************
-*******************************************************************************
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
-----------------------------------------------------------------------
-USERD_get_block_ghost_flags
-
-   Description:
-   -----------
-   Get the ghost_flags value at each element of a block containing ghost cells.
-
-   Specification:
-   -------------
-   int USERD_get_block_ghost_flags(int block_number,
-                                   int *ghost_flags)
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) ghost_flags             = 1D array containing ghost flag value
-                                     for each block cell.
-  
-                                    (Array will have been allocated
-                                     (i-1)*(j-1)*(k-1) for the block long)
-  
-            possible values are:    0  = non-ghost cell  (normal cell)
-                                   >0  = ghost cell
-  
-    Notes:
-    -----
-    * This routine is new in the 2.01 API
-
-    * This will be based on Current_time_step
-  
-    * Only called for structured "block" parts that have some ghost cells
-      as indicated by the USERD_get_ghost_in_block_flag.  The model must
-      of course also have been indicated to have some ghost cells in the
-      USERD_get_ghost_in_model_flag routine.
-  
-    * It is sufficient to set the value to be 1 to flag as a ghost cell,
-      but the value can be any non-zero value, so you could use it to
-      indicate which block or which server (for Server-of-server use) the
-      cell is actually in.
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-       API 1.0:
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       API 2.0:
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model (especially
-       if you are dealing with a decomposed dataset).
-
-       USERD_get_part_element_ids_by_type is used to obtain the ids,
-       on an element type by part basis, if TRUE status is returned here.
-
-   * Will call USERD_get_part_element_ids_by_type for each type of
-     of each part if this routine returns TRUE.
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[9],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-
-                example:  If Numparts_available = 3
-
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability(int part_number,...
-                           USERD_get_border_elements_by_type(int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
-
-                                  For Z_UNSTRUCTURED - is ignored
-
-                                  For Z_STRUCTURED or Z_IBLANKED
-
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
-
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
-
-
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
-
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
-
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
-
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
-
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-
-                              2. Using ranges.
-
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
-
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
-
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
-
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
-
-
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
-
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][3] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][5] = 3
-                            2 .................    ijk_dimension[0][6] = 4
-                              .       .       .    ijk_dimension[0][7] = 1
-                              .       .       .    ijk_dimension[0][8] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
-
-
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][3] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][5] = 1
-                            2 *-------*-------*    ijk_dimension[1][6] = 3
-                              |       |       |    ijk_dimension[1][7] = 1
-                              |       |       |    ijk_dimension[1][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
-
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_block_flag
-
-   Description:
-   -----------
-   Gets whether ghost cells present in block or not
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_block_flag(int block_number)
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in this structured part
-   FALSE if no ghost cells in this structured part
-
-   Arguments:
-   ---------
-   (IN) block_number      = The block part number
-                              (1-based index of part table, namely:
-
-                                1 ... Numparts_available.
-
-                              It is NOT the part_id that
-                              is loaded in USERD_get_gold_part_build_info)
-
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-    * This will be based on Current_time_step
-  
-    * Intended for structured parts only, value will be ignored for
-      unstructured parts
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_model_flag
-
-   Description:
-   -----------
-   Answers the question as to whether any ghost cells in the model.
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_model_flag( void )
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in the model
-   FALSE if no ghost cells in the model
-
-   Arguments:
-   ---------
-  
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) two_fields          = FALSE if only one data field is      
-                                      required.                      
-                                TRUE if two data fields required     
- 
-                                -1   if one field (Geom) required 
-                                     and one field (Param) is optional
-                                     Param field can contain any text
-                                     for example a file name, modifiers,
-                                     etc. that can be used to modify the
-                                     reader's behavior.
- 
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
-
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model. They must
-       also be positive numbers greater than zero.
-
-       USERD_get_part_node_ids is used to obtain the ids, if the
-       status returned here is TRUE.
-
-   * Will call USERD_get_part_node_ids for each part if this routine
-     returns TRUE.
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-
-
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured
-   or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless element label status is set to TRUE in
-     USERD_get_element_label_status
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT      node point element
-                                 Z_BAR02      2 node bar
-                                 Z_BAR03      3 node bar
-                                 Z_TRI03      3 node triangle
-                                 Z_TRI06      6 node triangle
-                                 Z_QUA04      4 node quad
-                                 Z_QUA08      8 node quad
-                                 Z_TET04      4 node tetrahedron
-                                 Z_TET10     10 node tetrahedron
-                                 Z_PYR05      5 node pyramid
-                                 Z_PYR13     13 node pyramid
-                                 Z_PEN06      6 node pentahedron
-                                 Z_PEN15     15 node pentahedron
-                                 Z_HEX08      8 node hexahedron
-                                 Z_HEX20     20 node hexahedron
-
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
-
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless node label status is TRUE, as returned from
-     USERD_get_node_label_status
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0
-
-   * should set it to "2.010" for this version of the API
-
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) param_2      = The usage of this string depends on
-                       'two_fields' in USERD_get_name_of_reader.
- 
-                       If two_fields is FALSE then it's empty.
- 
-                       If two_fields is TRUE, this is the 
-                       manditory results file entered 
-                       into the result field of the data dialog.
- 
-                       If two_fields is -1, then this contains
-                       optional text (filenames, modifiers, etc.)
-                       that can be parsed and used to modify 
-                       reader 
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
---------------------------------------------------------------------
-USERD_rigidbody_existence
-
-   Description:
-   -----------
-   Gets the existence of rigid body values or not in the model
-
-   Specification:
-   -------------
-   int USERD_rigidbody_existence( void )
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_rigidbody_values
-
-   Description:
-   -----------
-   Gets the rigid body values for each part
-
-   Specification:
-   -------------
-   int USERD_rigidbody_values(int part_number,
-                              float values[7])
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   (IN)  part_number        = The part number
- 
-                              (1-based index of part table, namely:
- 
-                                 1 ... Numparts_available.
- 
-                               It is NOT the part_id that
-                               is loaded in USERD_get_gold_part_build_info)
- 
-   (OUT) values             values[0] = IX   (x location)
-                            values[1] = IY   (y location)
-                            values[2] = IZ   (z location)
-                            values[3] = E0   (e0 euler value)
-                            values[4] = E1   (e1 euler value)
-                            values[5] = E2   (e2 euler value)
-                            values[6] = E3   (e3 euler value)
-
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-   * It will not be called unless USERD_rigidbody_existence indicates
-       that there are some values in the model by returning Z_OK.
-
-
---------------------------------------------------------------------
-USERD_set_right_side
-
-   Description:
-   -----------
-   Informs the reader that the time currently set is the right side of a time
-   span used for variable interpolation between time steps
-
-   Specification:
-   -------------
-   void USERD_set_right_side( void )
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Applies to Current_time_step
-
-
-
-
-
-------------------------------------------------------------------
-	ENHANCED GUI ROUTINES
-
---------------------------------------------------------------------
-USERD_get_extra_gui_numbers
-
-   Description:
-   -----------
-   The Enhanced GUI routines are added to allow
-   the user to customize a portion of the Data
-   Reader dialog to pass in options to their
-   user defined reader.
-
-   Specification:
-   -------------
-   void USERD__get_extra_gui_numbers(int *num_Toggles,
-                                     int *num_pulldowns,
-                                     int *num_fields)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_extra_gui_numbers
-     USERD_get_extra_gui_defaults
-     USERD_set_extra_gui_data
-
-     The existence of these routine indicates that
-     you wish to add customize entries to the
-     Data Reader dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_extra_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_extra_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_extra_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_extra_gui_defaults(char **toggle_Title,
-                                    int *toggle_default_status,
-                                    char **pulldown_Title,
-                                    int *pulldown_number_in_list,
-                                    int *pulldown_default_selection,
-                                    char ***pulldown_item_strings,
-                                    char **field_Title,
-                                    char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_extra_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_extra_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_numbers
-
-   Description:
-   -----------
-   The Var_Extract_GUI routines are added to allow
-   the user to customize a extraction parameters
-   for variables "after" the file has been read.
-   These things can be modified and the variables will
-   be update/refreshed according to the new parameters set
-
-   Specification:
-   -------------
-   void USERD_get_var_extract_gui_numbers(int *num_Toggles,
-                                          int *num_pulldowns,
-                                          int *num_fields)
-
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_var_extract_gui_numbers
-     USERD_get_var_extract_gui_defaults (this one)
-     USERD_set_var_extract_gui_data
-
-     The existence of these routine indicates that
-     you wish to have the Var Extract Parameters dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_var_extract_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_var_extract_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_var_extract_gui_defaults(char **toggle_Title,
-                                          int *toggle_default_status,
-                                          char **pulldown_Title,
-                                          int *pulldown_number_in_list,
-                                          int *pulldown_default_selection,
-                                          char ***pulldown_item_strings,
-                                          char **field_Title,
-                                          char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_var_extract_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_var_extract_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
-
-
------------------------------------------------------------------------------------
-/* ----------------------------------------------------------
- *  New in EnSight 8 is the capability to remove (fail) elements
- *   based on variable threshold values.  Basically the variable
- *   name, a couple of thresholds, a couple of values and a logic 
- *   criteria are read in from this routine.  Every element that
- *   satisfies the failure criteria is removed and not used in
- *   EnSight calculations.
- *   
- *  Example Failure criteria 
- *     Let fail_var_name = "fail_flag"
- *         threshold_val1 = 0
- *         threshold_operator1 = Z_EQUAL_TO  
- *         logic_criteria2 not used
- *         threshold_val2 not used
- *         threshold_operator2 not used
- *     For each value of "fail_flag" at each element, 
- *         if fail flag == threshold_val1 (0.0) then element fails
- *   Return (Z_ERR) if this is not used.
- *   Return (Z_OK) if failed element feature should be used
- *
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ---------------------------------------------------------- */
-int USERD_get_uns_failed_params(
-                char *fail_var_name,           /* variable name to be used in failure
-                                             must be scalar, per elem      */
-                float *threshold_val1,     /* number to compare for failure */
-                float *threshold_val2,     /* number to compare for failure */
-                int *threshold_operator1,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *threshold_operator2,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-		int *logic_criteria2
-
-
-
-
----- end of document ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.06 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.06
deleted file mode 100644
index 88c4955c810c5273db3a5240921714c7fc13fc5c..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.06
+++ /dev/null
@@ -1,4603 +0,0 @@
-README_USERD_2.06
-=================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.06)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-You should refer to beginning of README_USERD_2.0  and/or README_1.0_to_2.0
-for a discussion of the differences between API 1.0 and API 2.*.
-
-***>> API 2.06 additional capabilities (beyond API 2.05):
-Routines to allow userd defined readers for structured data
-to deal with min, max, and stride within the reader itself
-instead of within EnSight.
-    USERD_get_structured_reader_cinching
-    USERD_set_block_range_and_stride
-
-
-***>> API 2.05 additional capabilities (beyond API 2.04):
-Routines to handle material species.
-    USERD_get_number_of_species
-    USERD_get_matsp_info
-
-Routines to handle variable extraction parameters after a read, and then
-update the variables accordingly.  Similar to the extra GUI capabilities
-(which are processed before a read).  (Can actually be added to pre-2.05 readers)
-    USERD_get_var_extract_gui_numbers
-    USERD_get_var_extract_gui_defaults
-    USERD_set_var_extract_gui_data
-
-Routines to obtain rigid body values from a reader.
-(Routines were added - EnSight is now using for Nastran and STL readers
-                       with Dynasty rigid body motion data file)
-    USERD_rigidbody_existence
-    USERD_rigidbody_values
-
-Routine that lets reader know when EnSight is getting the right side of a time
-interval for variable interpolation between steps.  Not generally needed for
-most readers - however, may be needed for those that implement rigid body, and
-wish to cache left and right timespan information for interpolation within the
-reader itself.  (Can actually be added to pre-2.05 readers)
-    USERD_set_right_side
-
-
-***>> API 2.04 additional capabilities (beyond API 2.03):
-Routines to handle failed elements.  Basically 
-a.One routine to return a flag indicating the existence of 
-  failed elements in at least one part in at least one 
-  timestep in the model.  
-b.A second routine to return a matrix of flags indexed by part and
-  element type indicating which parts and element types have failed
-  elements at the current time step.
-c.Finally a third routine to return an array of flags for a given
-  part and element type that is number of elements of that type long
-  indicating which elements have failed, and which have not failed.
-
-
-***>> API 2.03 additional capabilities (beyond API 2.01):
-1. Routines to handle materials
-2. Routines to handle nsided and nfaced elements
-3. Modified routine to handle structured ranges
-
-
-****************************************************************************
-Note: Only the the Ensight Gold example reader, has been moved to 
-      this 2.06 API level.  And it is purely for an example - it does not
-      actually provide a benefit.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                 part's node coordinates
-USERD_get_part_node_ids               part's node ids
-USERD_get_part_elements_by_type       part's element connectivites
-USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component   block coordinates
-USERD_get_block_iblanking             block iblanking values
-USERD_get_ghosts_in_block_flag        block ghost cell existence?
-USERD_get_block_ghost_flags           block ghost cell flags
-
-  These routines, which formerly were only for unstructured data, will now
-  also be called for structured data if you specify that ids will be given
-  in the USERD_get_node_label_status and USERD_get_element_label_status rotuines
-  ------------------------------------------------------------------------------ 
-  USERD_get_part_node_ids               part's node ids
-  USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader              name of reader for GUI
-USERD_get_reader_release              release string of reader
-USERD_get_reader_version              provide reader version number
-USERD_get_reader_descrip              provide GUI more description (optional)
-
-USERD_get_extra_gui_numbers           Gets the number of toggles, pulldowns and fields
-USERD_get_extra_gui_defaults          Gets the default values for the GUI members
-USERD_set_extra_gui_data              Returns the answers provided by the user
-
-USERD_set_filenames                   filenames entered in GUI
-USERD_set_server_number               server which of how many
-
-USERD_get_number_of_timesets          number of timesets
-USERD_get_timeset_description         description of timeset
-USERD_get_geom_timeset_number         timeset # to use for geom
-
-USERD_get_num_of_time_steps           number of time steps
-USERD_get_sol_times                   solution time values
-USERD_set_time_set_and_step           current timeset and time step
-
-USERD_get_changing_geometry_status    changing geometry?
-USERD_get_node_label_status           node labels?
-USERD_get_element_label_status        element labels?
-USERD_get_model_extents               provide model bounding extents
-USERD_get_number_of_files_in_dataset  number of files in model
-USERD_get_dataset_query_file_info     info about each model file
-USERD_get_descrip_lines               file associated description lines
-USERD_get_number_of_model_parts       number of model parts
-USERD_get_gold_part_build_info        Gets the info needed for part building process
-USERD_get_part_build_info             part/block type/descrip etc.
-USERD_get_maxsize_info                part/block allocation maximums
-USERD_get_ghosts_in_model_flag        model contains ghost cells?
-USERD_get_nsided_conn                 Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face       Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                 Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-
-
-USERD_get_border_availability         part border provided?
-USERD_get_border_elements_by_type     part border conn and parent info
-
-USERD_get_number_of_variables         number of variables
-USERD_get_gold_variable_info          variable type/descrip etc.
-USERD_get_var_by_component            part or block variable values
-USERD_get_constant_val                constant variable's value
-USERD_get_var_value_at_specific       node's or element's variable value over time
-USERD_stop_part_building              cleanup after part build routine
-
-USERD_get_number_of_material_sets     Gets the number of material sets
-USERD_get_matf_set_info               Gets the material set indices and names
-USERD_get_number_of_materials         Gets the number of materials
-USERD_get_matf_var_info               Gets the material indices and descriptions
-USERD_size_matf_data                  Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                  Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_bkup                            archive routine
-
-USERD_exit_routine                    cleanup upon exit routine
-
-USERD_get_uns_failed_params           Gets thresholds/criteria for failure  
-
-USERD_rigidbody_existence             Returns whether rigid body transformation
-                                       data exists for the model.
-USERD_rigidbody_values                Returns the euler and location values for a
-                                       given part
-
-USERD_set_right_side                  Simply informs the reader when the time set
-                                      is for the right side of a time span during
-                                      variable interpolation between time steps.
-
-USERD_get_structured_reader_cinching  Tells if the reader will do structured
-                                        cinching
-USERD_set_block_range_and_stride      Sets the min, max, and stride of a block
-                                        if doing structured cinching
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip        (optional)
-        USERD_get_extra_gui_numbers     (optional)
-	USERD_get_extra_gui_defaults    (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        <USERD_set_extra_gui_data> (optional if reader has
-                                    USERD_get_extra_gui_defaults routine)
-        USERD_get_structured_reader_cinching
-        USERD_set_server_number
-	USERD_set_extra_gui_data        (optional)
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_maxsize_info
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-        If any nsided elements:
-
-          USERD_get_nsided_conn
-
-        If any nfaced elements:
-
-          USERD_get_nfaced_nodes_per_face
-          USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-
-        else if structured part:
-        -----------------------
-        USERD_get_block_iblanking
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        both again:
-        ----------
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-         <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-        USERD_get_matf_set_info
-
-        If any material sets in the model (calls these once per material set):
-          USERD_get_number_of_materials
-          USERD_get_matf_var_info
-
-        For each elment type of each part containing material ids, calls:
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-        If there are any elements with mixed materials, when a domain or
-        interface is created, calls these again per part:
-
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-11. To modify the variable extraction parameters and have the variables
-    update accordingly.
-
-        USERD_get_var_extract_gui_numbers
-        USERD_get_var_extract_gui_defaults
-        USERD_set_var_extract_gui_data
-
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-And it references:
-
-       #include "global_extern_proto.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_204
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.04" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is accessed from the new global_extern.h
-
-*******************************************************************************
-*******************************************************************************
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
-----------------------------------------------------------------------
-USERD_get_block_ghost_flags
-
-   Description:
-   -----------
-   Get the ghost_flags value at each element of a block containing ghost cells.
-
-   Specification:
-   -------------
-   int USERD_get_block_ghost_flags(int block_number,
-                                   int *ghost_flags)
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) ghost_flags             = 1D array containing ghost flag value
-                                     for each block cell.
-  
-                                    (Array will have been allocated
-                                     (i-1)*(j-1)*(k-1) for the block long)
-  
-            possible values are:    0  = non-ghost cell  (normal cell)
-                                   >0  = ghost cell
-  
-    Notes:
-    -----
-    * This routine is new in the 2.01 API
-
-    * This will be based on Current_time_step
-  
-    * Only called for structured "block" parts that have some ghost cells
-      as indicated by the USERD_get_ghost_in_block_flag.  The model must
-      of course also have been indicated to have some ghost cells in the
-      USERD_get_ghost_in_model_flag routine.
-  
-    * It is sufficient to set the value to be 1 to flag as a ghost cell,
-      but the value can be any non-zero value, so you could use it to
-      indicate which block or which server (for Server-of-server use) the
-      cell is actually in.
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-       API 1.0:
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       API 2.0:
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model (especially
-       if you are dealing with a decomposed dataset).
-
-       USERD_get_part_element_ids_by_type is used to obtain the ids,
-       on an element type by part basis, if TRUE status is returned here.
-
-   * Will call USERD_get_part_element_ids_by_type for each type of
-     of each part if this routine returns TRUE.
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[9],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-
-                example:  If Numparts_available = 3
-
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability(int part_number,...
-                           USERD_get_border_elements_by_type(int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
-
-                                  For Z_UNSTRUCTURED - is ignored
-
-                                  For Z_STRUCTURED or Z_IBLANKED
-
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
-
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
-
-
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
-
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
-
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
-
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
-
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-
-                              2. Using ranges.
-
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
-
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
-
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
-
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
-
-
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
-
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][3] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][5] = 3
-                            2 .................    ijk_dimension[0][6] = 4
-                              .       .       .    ijk_dimension[0][7] = 1
-                              .       .       .    ijk_dimension[0][8] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
-
-
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][3] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][5] = 1
-                            2 *-------*-------*    ijk_dimension[1][6] = 3
-                              |       |       |    ijk_dimension[1][7] = 1
-                              |       |       |    ijk_dimension[1][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
-
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_block_flag
-
-   Description:
-   -----------
-   Gets whether ghost cells present in block or not
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_block_flag(int block_number)
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in this structured part
-   FALSE if no ghost cells in this structured part
-
-   Arguments:
-   ---------
-   (IN) block_number      = The block part number
-                              (1-based index of part table, namely:
-
-                                1 ... Numparts_available.
-
-                              It is NOT the part_id that
-                              is loaded in USERD_get_gold_part_build_info)
-
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-    * This will be based on Current_time_step
-  
-    * Intended for structured parts only, value will be ignored for
-      unstructured parts
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_model_flag
-
-   Description:
-   -----------
-   Answers the question as to whether any ghost cells in the model.
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_model_flag( void )
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in the model
-   FALSE if no ghost cells in the model
-
-   Arguments:
-   ---------
-  
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) two_fields          = FALSE if only one data field is      
-                                      required.                      
-                                TRUE if two data fields required     
- 
-                                -1   if one field (Geom) required 
-                                     and one field (Param) is optional
-                                     Param field can contain any text
-                                     for example a file name, modifiers,
-                                     etc. that can be used to modify the
-                                     reader's behavior.
- 
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
-
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model. They must
-       also be positive numbers greater than zero.
-
-       USERD_get_part_node_ids is used to obtain the ids, if the
-       status returned here is TRUE.
-
-   * Will call USERD_get_part_node_ids for each part if this routine
-     returns TRUE.
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-
-
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured
-   or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless element label status is set to TRUE in
-     USERD_get_element_label_status
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT      node point element
-                                 Z_BAR02      2 node bar
-                                 Z_BAR03      3 node bar
-                                 Z_TRI03      3 node triangle
-                                 Z_TRI06      6 node triangle
-                                 Z_QUA04      4 node quad
-                                 Z_QUA08      8 node quad
-                                 Z_TET04      4 node tetrahedron
-                                 Z_TET10     10 node tetrahedron
-                                 Z_PYR05      5 node pyramid
-                                 Z_PYR13     13 node pyramid
-                                 Z_PEN06      6 node pentahedron
-                                 Z_PEN15     15 node pentahedron
-                                 Z_HEX08      8 node hexahedron
-                                 Z_HEX20     20 node hexahedron
-
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
-
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless node label status is TRUE, as returned from
-     USERD_get_node_label_status
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0
-
-   * should set it to "2.010" for this version of the API
-
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) param_2      = The usage of this string depends on
-                       'two_fields' in USERD_get_name_of_reader.
- 
-                       If two_fields is FALSE then it's empty.
- 
-                       If two_fields is TRUE, this is the 
-                       manditory results file entered 
-                       into the result field of the data dialog.
- 
-                       If two_fields is -1, then this contains
-                       optional text (filenames, modifiers, etc.)
-                       that can be parsed and used to modify 
-                       reader 
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
---------------------------------------------------------------------
-USERD_rigidbody_existence
-
-   Description:
-   -----------
-   Gets the existence of rigid body values or not in the model
-
-   Specification:
-   -------------
-   int USERD_rigidbody_existence( void )
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_rigidbody_values
-
-   Description:
-   -----------
-   Gets the rigid body values for each part
-
-   Specification:
-   -------------
-   int USERD_rigidbody_values(int part_number,
-                              float values[7])
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   (IN)  part_number        = The part number
- 
-                              (1-based index of part table, namely:
- 
-                                 1 ... Numparts_available.
- 
-                               It is NOT the part_id that
-                               is loaded in USERD_get_gold_part_build_info)
- 
-   (OUT) values             values[0] = IX   (x location)
-                            values[1] = IY   (y location)
-                            values[2] = IZ   (z location)
-                            values[3] = E0   (e0 euler value)
-                            values[4] = E1   (e1 euler value)
-                            values[5] = E2   (e2 euler value)
-                            values[6] = E3   (e3 euler value)
-
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-   * It will not be called unless USERD_rigidbody_existence indicates
-       that there are some values in the model by returning Z_OK.
-
-
---------------------------------------------------------------------
-USERD_set_right_side
-
-   Description:
-   -----------
-   Informs the reader that the time currently set is the right side of a time
-   span used for variable interpolation between time steps
-
-   Specification:
-   -------------
-   void USERD_set_right_side( void )
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Applies to Current_time_step
-
-
-
-
-
-------------------------------------------------------------------
-	ENHANCED GUI ROUTINES
-
---------------------------------------------------------------------
-USERD_get_extra_gui_numbers
-
-   Description:
-   -----------
-   The Enhanced GUI routines are added to allow
-   the user to customize a portion of the Data
-   Reader dialog to pass in options to their
-   user defined reader.
-
-   Specification:
-   -------------
-   void USERD__get_extra_gui_numbers(int *num_Toggles,
-                                     int *num_pulldowns,
-                                     int *num_fields)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_extra_gui_numbers
-     USERD_get_extra_gui_defaults
-     USERD_set_extra_gui_data
-
-     The existence of these routine indicates that
-     you wish to add customize entries to the
-     Data Reader dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_extra_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_extra_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_extra_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_extra_gui_defaults(char **toggle_Title,
-                                    int *toggle_default_status,
-                                    char **pulldown_Title,
-                                    int *pulldown_number_in_list,
-                                    int *pulldown_default_selection,
-                                    char ***pulldown_item_strings,
-                                    char **field_Title,
-                                    char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_extra_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_extra_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_numbers
-
-   Description:
-   -----------
-   The Var_Extract_GUI routines are added to allow
-   the user to customize a extraction parameters
-   for variables "after" the file has been read.
-   These things can be modified and the variables will
-   be update/refreshed according to the new parameters set
-
-   Specification:
-   -------------
-   void USERD_get_var_extract_gui_numbers(int *num_Toggles,
-                                          int *num_pulldowns,
-                                          int *num_fields)
-
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_var_extract_gui_numbers
-     USERD_get_var_extract_gui_defaults (this one)
-     USERD_set_var_extract_gui_data
-
-     The existence of these routine indicates that
-     you wish to have the Var Extract Parameters dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_var_extract_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_var_extract_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_var_extract_gui_defaults(char **toggle_Title,
-                                          int *toggle_default_status,
-                                          char **pulldown_Title,
-                                          int *pulldown_number_in_list,
-                                          int *pulldown_default_selection,
-                                          char ***pulldown_item_strings,
-                                          char **field_Title,
-                                          char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_var_extract_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_var_extract_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
-
-
------------------------------------------------------------------------------------
-/* ----------------------------------------------------------
- *  New in EnSight 8 is the capability to remove (fail) elements
- *   based on variable threshold values.  Basically the variable
- *   name, a couple of thresholds, a couple of values and a logic 
- *   criteria are read in from this routine.  Every element that
- *   satisfies the failure criteria is removed and not used in
- *   EnSight calculations.
- *   
- *  Example Failure criteria 
- *     Let fail_var_name = "fail_flag"
- *         threshold_val1 = 0
- *         threshold_operator1 = Z_EQUAL_TO  
- *         logic_criteria2 not used
- *         threshold_val2 not used
- *         threshold_operator2 not used
- *     For each value of "fail_flag" at each element, 
- *         if fail flag == threshold_val1 (0.0) then element fails
- *   Return (Z_ERR) if this is not used.
- *   Return (Z_OK) if failed element feature should be used
- *
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ---------------------------------------------------------- */
-int USERD_get_uns_failed_params(
-                char *fail_var_name,           /* variable name to be used in failure
-                                             must be scalar, per elem      */
-                float *threshold_val1,     /* number to compare for failure */
-                float *threshold_val2,     /* number to compare for failure */
-                int *threshold_operator1,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *threshold_operator2,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-		int *logic_criteria2
-
-
-/*--------------------------------------------------------------------
- * USERD_get_structured_reader_cinching -
- *--------------------------------------------------------------------
- *
- *  Gets whether this reader will do structured cinching for block data
- *  This means that it will handle the min, max, and step values for a
- *  given block and return the coordinate components or variable components
- *  in their "cinched" state when partial extraction or striding is used.
- *  This is as opposed to returning the entire component (ignoring min, max
- *  and stride) and letting Ensight pick out the values actually used.
- *
- *  returns: Z_OK    if the reader will handle the
- *                   min, max, and stride and return
- *                   the cinched values only.
- *
- *           Z_UNDEF or Z_ERR if will return entire component
- *                            and rely on EnSight to cinch.
- *
- * Notes:
- *  Unless you can actually pull out the desired min, max, and stride
- *  without using a full component of memory, don't enable this feature.
- *--------------------------------------------------------------------*/
-int
-USERD_get_structured_reader_cinching( void )
-
-
-
-/*--------------------------------------------------------------------
- * USERD_set_block_range_and_stride -
- *--------------------------------------------------------------------
- *
- *  Sets the min, max, and step values in each of the i, j, and k, directions
- *  for the given part.
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in
- *                                               USERD_get_gold_part_build_info)
- *
- *  (IN) mini        = min i plane desired  (zero based)
- *       maxi        = max i plane desired  (zero based)
- *       stepi       = i stride
- *       minj        = min j plane desired  (zero based)
- *       maxj        = max j plane desired  (zero based)
- *       stepj       = j stride
- *       mink        = min k plane desired  (zero based)
- *       maxk        = max k plane desired  (zero based)
- *       stepk       = k stride
- *
- *
- *  returns: Z_OK    if no problems
- *           Z_ERR   if an error
- *
- *  Notes:
- *  * It will not be called unless USERD_get_structured_reader_cinching
- *    indicates that this reader does structured cinching by returning
- *    a Z_OK.
- *
- *  * It will actually be called before each geom component and before
- *    each part variable - so if you are storing things locally, you should
- *    make this routine be able to quickly check whether anything needs
- *    updated or not.
- *
- *  * If the stride (step) does not hit right on the max, the last element
- *    in each direction will be shortened appropriately.
- *    For example, if a block had 0 to 12 in the i direction,
- *                 and the user specified min = 1
- *                                        max = 8
- *                                        step = 3
- *
- *             0   1   2   3   4   5   6   7   8   9   10  11  12
- *             |   |   |   |   |   |   |   |   |   |   |   |   |
- *
- *                 |           |           |   |
- *
- *      Namely, the coarser cell boundaries in this direction would be at 1, 4,
-7, and 8
- *
- *--------------------------------------------------------------------*/
-int
-USERD_set_block_range_and_stride(int part_number,
-                                 int mini, int maxi, int stepi,
-                                 int minj, int maxj, int stepj,
-                                 int mink, int maxk, int stepk)
-
-
-
----- end of document ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.07 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.07
deleted file mode 100644
index 3b52eed3a35b84def62d261234314aaf7e387460..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.07
+++ /dev/null
@@ -1,4617 +0,0 @@
-README_USERD_2.07
-=================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.07)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-You should refer to beginning of README_USERD_2.0  and/or README_1.0_to_2.0
-for a discussion of the differences between API 1.0 and API 2.*.
-
-***>> API 2.07 additional capabilities (beyond API 2.06):
-Optional routine to allow userd defined readers to indicate their auto 
-distribute preference when used with SOS.  This is used to set the auto 
-distribute flag default in the client.  If the function does not exist, 
-then it defaults to 'use auto distribute'.  If the function does exist and 
-indicates 'no auto distribute', then it's up to the UDR to decompose a 
-distributed data set.
-    USERD_prefer_auto_distribute
-Optional routine to allow userd defined readers to indicate their 
-preference for the 'Set file...' button labels in the client's File->Open 
-dialog.  If the function does not exist or it returns a null string for 
-an argument, then the default values are used.
-    USERD_set_filename_button_labels
-
-***>> API 2.06 additional capabilities (beyond API 2.05):
-Routines to allow userd defined readers for structured data
-to deal with min, max, and stride within the reader itself
-instead of within EnSight.
-    USERD_get_structured_reader_cinching
-    USERD_set_block_range_and_stride
-
-
-***>> API 2.05 additional capabilities (beyond API 2.04):
-Routines to handle material species.
-    USERD_get_number_of_species
-    USERD_get_matsp_info
-
-Routines to handle variable extraction parameters after a read, and then
-update the variables accordingly.  Similar to the extra GUI capabilities
-(which are processed before a read).  (Can actually be added to pre-2.05 readers)
-    USERD_get_var_extract_gui_numbers
-    USERD_get_var_extract_gui_defaults
-    USERD_set_var_extract_gui_data
-
-Routines to obtain rigid body values from a reader.
-(Routines were added - EnSight is now using for Nastran and STL readers
-                       with Dynasty rigid body motion data file)
-    USERD_rigidbody_existence
-    USERD_rigidbody_values
-
-Routine that lets reader know when EnSight is getting the right side of a time
-interval for variable interpolation between steps.  Not generally needed for
-most readers - however, may be needed for those that implement rigid body, and
-wish to cache left and right timespan information for interpolation within the
-reader itself.  (Can actually be added to pre-2.05 readers)
-    USERD_set_right_side
-
-
-***>> API 2.04 additional capabilities (beyond API 2.03):
-Routines to handle failed elements.  Basically 
-a.One routine to return a flag indicating the existence of 
-  failed elements in at least one part in at least one 
-  timestep in the model.  
-b.A second routine to return a matrix of flags indexed by part and
-  element type indicating which parts and element types have failed
-  elements at the current time step.
-c.Finally a third routine to return an array of flags for a given
-  part and element type that is number of elements of that type long
-  indicating which elements have failed, and which have not failed.
-
-
-***>> API 2.03 additional capabilities (beyond API 2.01):
-1. Routines to handle materials
-2. Routines to handle nsided and nfaced elements
-3. Modified routine to handle structured ranges
-
-
-****************************************************************************
-Note: Only the the Ensight Gold example reader, has been moved to 
-      this 2.06 API level.  And it is purely for an example - it does not
-      actually provide a benefit.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                 part's node coordinates
-USERD_get_part_node_ids               part's node ids
-USERD_get_part_elements_by_type       part's element connectivites
-USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component   block coordinates
-USERD_get_block_iblanking             block iblanking values
-USERD_get_ghosts_in_block_flag        block ghost cell existence?
-USERD_get_block_ghost_flags           block ghost cell flags
-
-  These routines, which formerly were only for unstructured data, will now
-  also be called for structured data if you specify that ids will be given
-  in the USERD_get_node_label_status and USERD_get_element_label_status rotuines
-  ------------------------------------------------------------------------------ 
-  USERD_get_part_node_ids               part's node ids
-  USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader              name of reader for GUI
-USERD_get_reader_release              release string of reader
-USERD_get_reader_version              provide reader version number
-USERD_get_reader_descrip              provide GUI more description (optional)
-
-USERD_get_extra_gui_numbers           Gets the number of toggles, pulldowns and fields
-USERD_get_extra_gui_defaults          Gets the default values for the GUI members
-USERD_set_extra_gui_data              Returns the answers provided by the user
-
-USERD_set_filenames                   filenames entered in GUI
-USERD_set_server_number               server which of how many
-
-USERD_get_number_of_timesets          number of timesets
-USERD_get_timeset_description         description of timeset
-USERD_get_geom_timeset_number         timeset # to use for geom
-
-USERD_get_num_of_time_steps           number of time steps
-USERD_get_sol_times                   solution time values
-USERD_set_time_set_and_step           current timeset and time step
-
-USERD_get_changing_geometry_status    changing geometry?
-USERD_get_node_label_status           node labels?
-USERD_get_element_label_status        element labels?
-USERD_get_model_extents               provide model bounding extents
-USERD_get_number_of_files_in_dataset  number of files in model
-USERD_get_dataset_query_file_info     info about each model file
-USERD_get_descrip_lines               file associated description lines
-USERD_get_number_of_model_parts       number of model parts
-USERD_get_gold_part_build_info        Gets the info needed for part building process
-USERD_get_part_build_info             part/block type/descrip etc.
-USERD_get_maxsize_info                part/block allocation maximums
-USERD_get_ghosts_in_model_flag        model contains ghost cells?
-USERD_get_nsided_conn                 Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face       Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                 Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-
-
-USERD_get_border_availability         part border provided?
-USERD_get_border_elements_by_type     part border conn and parent info
-
-USERD_get_number_of_variables         number of variables
-USERD_get_gold_variable_info          variable type/descrip etc.
-USERD_get_var_by_component            part or block variable values
-USERD_get_constant_val                constant variable's value
-USERD_get_var_value_at_specific       node's or element's variable value over time
-USERD_stop_part_building              cleanup after part build routine
-
-USERD_get_number_of_material_sets     Gets the number of material sets
-USERD_get_matf_set_info               Gets the material set indices and names
-USERD_get_number_of_materials         Gets the number of materials
-USERD_get_matf_var_info               Gets the material indices and descriptions
-USERD_size_matf_data                  Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                  Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_bkup                            archive routine
-
-USERD_exit_routine                    cleanup upon exit routine
-
-USERD_get_uns_failed_params           Gets thresholds/criteria for failure  
-
-USERD_rigidbody_existence             Returns whether rigid body transformation
-                                       data exists for the model.
-USERD_rigidbody_values                Returns the euler and location values for a
-                                       given part
-
-USERD_set_right_side                  Simply informs the reader when the time set
-                                      is for the right side of a time span during
-                                      variable interpolation between time steps.
-
-USERD_get_structured_reader_cinching  Tells if the reader will do structured
-                                        cinching
-USERD_set_block_range_and_stride      Sets the min, max, and stride of a block
-                                        if doing structured cinching
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip        (optional)
-        USERD_get_extra_gui_numbers     (optional)
-	USERD_get_extra_gui_defaults    (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        <USERD_set_extra_gui_data> (optional if reader has
-                                    USERD_get_extra_gui_defaults routine)
-        USERD_get_structured_reader_cinching
-        USERD_set_server_number
-	USERD_set_extra_gui_data        (optional)
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_maxsize_info
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-        If any nsided elements:
-
-          USERD_get_nsided_conn
-
-        If any nfaced elements:
-
-          USERD_get_nfaced_nodes_per_face
-          USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-
-        else if structured part:
-        -----------------------
-        USERD_get_block_iblanking
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        both again:
-        ----------
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-         <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-        USERD_get_matf_set_info
-
-        If any material sets in the model (calls these once per material set):
-          USERD_get_number_of_materials
-          USERD_get_matf_var_info
-
-        For each elment type of each part containing material ids, calls:
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-        If there are any elements with mixed materials, when a domain or
-        interface is created, calls these again per part:
-
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-11. To modify the variable extraction parameters and have the variables
-    update accordingly.
-
-        USERD_get_var_extract_gui_numbers
-        USERD_get_var_extract_gui_defaults
-        USERD_set_var_extract_gui_data
-
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-And it references:
-
-       #include "global_extern_proto.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_204
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.04" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is accessed from the new global_extern.h
-
-*******************************************************************************
-*******************************************************************************
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
-----------------------------------------------------------------------
-USERD_get_block_ghost_flags
-
-   Description:
-   -----------
-   Get the ghost_flags value at each element of a block containing ghost cells.
-
-   Specification:
-   -------------
-   int USERD_get_block_ghost_flags(int block_number,
-                                   int *ghost_flags)
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) ghost_flags             = 1D array containing ghost flag value
-                                     for each block cell.
-  
-                                    (Array will have been allocated
-                                     (i-1)*(j-1)*(k-1) for the block long)
-  
-            possible values are:    0  = non-ghost cell  (normal cell)
-                                   >0  = ghost cell
-  
-    Notes:
-    -----
-    * This routine is new in the 2.01 API
-
-    * This will be based on Current_time_step
-  
-    * Only called for structured "block" parts that have some ghost cells
-      as indicated by the USERD_get_ghost_in_block_flag.  The model must
-      of course also have been indicated to have some ghost cells in the
-      USERD_get_ghost_in_model_flag routine.
-  
-    * It is sufficient to set the value to be 1 to flag as a ghost cell,
-      but the value can be any non-zero value, so you could use it to
-      indicate which block or which server (for Server-of-server use) the
-      cell is actually in.
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-       API 1.0:
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       API 2.0:
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model (especially
-       if you are dealing with a decomposed dataset).
-
-       USERD_get_part_element_ids_by_type is used to obtain the ids,
-       on an element type by part basis, if TRUE status is returned here.
-
-   * Will call USERD_get_part_element_ids_by_type for each type of
-     of each part if this routine returns TRUE.
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[9],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-
-                example:  If Numparts_available = 3
-
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability(int part_number,...
-                           USERD_get_border_elements_by_type(int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
-
-                                  For Z_UNSTRUCTURED - is ignored
-
-                                  For Z_STRUCTURED or Z_IBLANKED
-
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
-
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
-
-
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
-
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
-
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
-
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
-
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-
-                              2. Using ranges.
-
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
-
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
-
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
-
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
-
-
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
-
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][3] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][5] = 3
-                            2 .................    ijk_dimension[0][6] = 4
-                              .       .       .    ijk_dimension[0][7] = 1
-                              .       .       .    ijk_dimension[0][8] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
-
-
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][3] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][5] = 1
-                            2 *-------*-------*    ijk_dimension[1][6] = 3
-                              |       |       |    ijk_dimension[1][7] = 1
-                              |       |       |    ijk_dimension[1][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
-
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_block_flag
-
-   Description:
-   -----------
-   Gets whether ghost cells present in block or not
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_block_flag(int block_number)
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in this structured part
-   FALSE if no ghost cells in this structured part
-
-   Arguments:
-   ---------
-   (IN) block_number      = The block part number
-                              (1-based index of part table, namely:
-
-                                1 ... Numparts_available.
-
-                              It is NOT the part_id that
-                              is loaded in USERD_get_gold_part_build_info)
-
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-    * This will be based on Current_time_step
-  
-    * Intended for structured parts only, value will be ignored for
-      unstructured parts
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_model_flag
-
-   Description:
-   -----------
-   Answers the question as to whether any ghost cells in the model.
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_model_flag( void )
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in the model
-   FALSE if no ghost cells in the model
-
-   Arguments:
-   ---------
-  
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) two_fields          = FALSE if only one data field is      
-                                      required.                      
-                                TRUE if two data fields required     
- 
-                                -1   if one field (Geom) required 
-                                     and one field (Param) is optional
-                                     Param field can contain any text
-                                     for example a file name, modifiers,
-                                     etc. that can be used to modify the
-                                     reader's behavior.
- 
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
-
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model. They must
-       also be positive numbers greater than zero.
-
-       USERD_get_part_node_ids is used to obtain the ids, if the
-       status returned here is TRUE.
-
-   * Will call USERD_get_part_node_ids for each part if this routine
-     returns TRUE.
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-
-
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured
-   or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless element label status is set to TRUE in
-     USERD_get_element_label_status
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT      node point element
-                                 Z_BAR02      2 node bar
-                                 Z_BAR03      3 node bar
-                                 Z_TRI03      3 node triangle
-                                 Z_TRI06      6 node triangle
-                                 Z_QUA04      4 node quad
-                                 Z_QUA08      8 node quad
-                                 Z_TET04      4 node tetrahedron
-                                 Z_TET10     10 node tetrahedron
-                                 Z_PYR05      5 node pyramid
-                                 Z_PYR13     13 node pyramid
-                                 Z_PEN06      6 node pentahedron
-                                 Z_PEN15     15 node pentahedron
-                                 Z_HEX08      8 node hexahedron
-                                 Z_HEX20     20 node hexahedron
-
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
-
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless node label status is TRUE, as returned from
-     USERD_get_node_label_status
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0
-
-   * should set it to "2.010" for this version of the API
-
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) param_2      = The usage of this string depends on
-                       'two_fields' in USERD_get_name_of_reader.
- 
-                       If two_fields is FALSE then it's empty.
- 
-                       If two_fields is TRUE, this is the 
-                       manditory results file entered 
-                       into the result field of the data dialog.
- 
-                       If two_fields is -1, then this contains
-                       optional text (filenames, modifiers, etc.)
-                       that can be parsed and used to modify 
-                       reader 
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
---------------------------------------------------------------------
-USERD_rigidbody_existence
-
-   Description:
-   -----------
-   Gets the existence of rigid body values or not in the model
-
-   Specification:
-   -------------
-   int USERD_rigidbody_existence( void )
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_rigidbody_values
-
-   Description:
-   -----------
-   Gets the rigid body values for each part
-
-   Specification:
-   -------------
-   int USERD_rigidbody_values(int part_number,
-                              float values[7])
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   (IN)  part_number        = The part number
- 
-                              (1-based index of part table, namely:
- 
-                                 1 ... Numparts_available.
- 
-                               It is NOT the part_id that
-                               is loaded in USERD_get_gold_part_build_info)
- 
-   (OUT) values             values[0] = IX   (x location)
-                            values[1] = IY   (y location)
-                            values[2] = IZ   (z location)
-                            values[3] = E0   (e0 euler value)
-                            values[4] = E1   (e1 euler value)
-                            values[5] = E2   (e2 euler value)
-                            values[6] = E3   (e3 euler value)
-
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-   * It will not be called unless USERD_rigidbody_existence indicates
-       that there are some values in the model by returning Z_OK.
-
-
---------------------------------------------------------------------
-USERD_set_right_side
-
-   Description:
-   -----------
-   Informs the reader that the time currently set is the right side of a time
-   span used for variable interpolation between time steps
-
-   Specification:
-   -------------
-   void USERD_set_right_side( void )
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Applies to Current_time_step
-
-
-
-
-
-------------------------------------------------------------------
-	ENHANCED GUI ROUTINES
-
---------------------------------------------------------------------
-USERD_get_extra_gui_numbers
-
-   Description:
-   -----------
-   The Enhanced GUI routines are added to allow
-   the user to customize a portion of the Data
-   Reader dialog to pass in options to their
-   user defined reader.
-
-   Specification:
-   -------------
-   void USERD__get_extra_gui_numbers(int *num_Toggles,
-                                     int *num_pulldowns,
-                                     int *num_fields)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_extra_gui_numbers
-     USERD_get_extra_gui_defaults
-     USERD_set_extra_gui_data
-
-     The existence of these routine indicates that
-     you wish to add customize entries to the
-     Data Reader dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_extra_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_extra_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_extra_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_extra_gui_defaults(char **toggle_Title,
-                                    int *toggle_default_status,
-                                    char **pulldown_Title,
-                                    int *pulldown_number_in_list,
-                                    int *pulldown_default_selection,
-                                    char ***pulldown_item_strings,
-                                    char **field_Title,
-                                    char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_extra_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_extra_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_numbers
-
-   Description:
-   -----------
-   The Var_Extract_GUI routines are added to allow
-   the user to customize a extraction parameters
-   for variables "after" the file has been read.
-   These things can be modified and the variables will
-   be update/refreshed according to the new parameters set
-
-   Specification:
-   -------------
-   void USERD_get_var_extract_gui_numbers(int *num_Toggles,
-                                          int *num_pulldowns,
-                                          int *num_fields)
-
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_var_extract_gui_numbers
-     USERD_get_var_extract_gui_defaults (this one)
-     USERD_set_var_extract_gui_data
-
-     The existence of these routine indicates that
-     you wish to have the Var Extract Parameters dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_var_extract_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_var_extract_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_var_extract_gui_defaults(char **toggle_Title,
-                                          int *toggle_default_status,
-                                          char **pulldown_Title,
-                                          int *pulldown_number_in_list,
-                                          int *pulldown_default_selection,
-                                          char ***pulldown_item_strings,
-                                          char **field_Title,
-                                          char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_var_extract_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_var_extract_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
-
-
------------------------------------------------------------------------------------
-/* ----------------------------------------------------------
- *  New in EnSight 8 is the capability to remove (fail) elements
- *   based on variable threshold values.  Basically the variable
- *   name, a couple of thresholds, a couple of values and a logic 
- *   criteria are read in from this routine.  Every element that
- *   satisfies the failure criteria is removed and not used in
- *   EnSight calculations.
- *   
- *  Example Failure criteria 
- *     Let fail_var_name = "fail_flag"
- *         threshold_val1 = 0
- *         threshold_operator1 = Z_EQUAL_TO  
- *         logic_criteria2 not used
- *         threshold_val2 not used
- *         threshold_operator2 not used
- *     For each value of "fail_flag" at each element, 
- *         if fail flag == threshold_val1 (0.0) then element fails
- *   Return (Z_ERR) if this is not used.
- *   Return (Z_OK) if failed element feature should be used
- *
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ---------------------------------------------------------- */
-int USERD_get_uns_failed_params(
-                char *fail_var_name,           /* variable name to be used in failure
-                                             must be scalar, per elem      */
-                float *threshold_val1,     /* number to compare for failure */
-                float *threshold_val2,     /* number to compare for failure */
-                int *threshold_operator1,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *threshold_operator2,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-		int *logic_criteria2
-
-
-/*--------------------------------------------------------------------
- * USERD_get_structured_reader_cinching -
- *--------------------------------------------------------------------
- *
- *  Gets whether this reader will do structured cinching for block data
- *  This means that it will handle the min, max, and step values for a
- *  given block and return the coordinate components or variable components
- *  in their "cinched" state when partial extraction or striding is used.
- *  This is as opposed to returning the entire component (ignoring min, max
- *  and stride) and letting Ensight pick out the values actually used.
- *
- *  returns: Z_OK    if the reader will handle the
- *                   min, max, and stride and return
- *                   the cinched values only.
- *
- *           Z_UNDEF or Z_ERR if will return entire component
- *                            and rely on EnSight to cinch.
- *
- * Notes:
- *  Unless you can actually pull out the desired min, max, and stride
- *  without using a full component of memory, don't enable this feature.
- *--------------------------------------------------------------------*/
-int
-USERD_get_structured_reader_cinching( void )
-
-
-
-/*--------------------------------------------------------------------
- * USERD_set_block_range_and_stride -
- *--------------------------------------------------------------------
- *
- *  Sets the min, max, and step values in each of the i, j, and k, directions
- *  for the given part.
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in
- *                                               USERD_get_gold_part_build_info)
- *
- *  (IN) mini        = min i plane desired  (zero based)
- *       maxi        = max i plane desired  (zero based)
- *       stepi       = i stride
- *       minj        = min j plane desired  (zero based)
- *       maxj        = max j plane desired  (zero based)
- *       stepj       = j stride
- *       mink        = min k plane desired  (zero based)
- *       maxk        = max k plane desired  (zero based)
- *       stepk       = k stride
- *
- *
- *  returns: Z_OK    if no problems
- *           Z_ERR   if an error
- *
- *  Notes:
- *  * It will not be called unless USERD_get_structured_reader_cinching
- *    indicates that this reader does structured cinching by returning
- *    a Z_OK.
- *
- *  * It will actually be called before each geom component and before
- *    each part variable - so if you are storing things locally, you should
- *    make this routine be able to quickly check whether anything needs
- *    updated or not.
- *
- *  * If the stride (step) does not hit right on the max, the last element
- *    in each direction will be shortened appropriately.
- *    For example, if a block had 0 to 12 in the i direction,
- *                 and the user specified min = 1
- *                                        max = 8
- *                                        step = 3
- *
- *             0   1   2   3   4   5   6   7   8   9   10  11  12
- *             |   |   |   |   |   |   |   |   |   |   |   |   |
- *
- *                 |           |           |   |
- *
- *      Namely, the coarser cell boundaries in this direction would be at 1, 4,
-7, and 8
- *
- *--------------------------------------------------------------------*/
-int
-USERD_set_block_range_and_stride(int part_number,
-                                 int mini, int maxi, int stepi,
-                                 int minj, int maxj, int stepj,
-                                 int mink, int maxk, int stepk)
-
-
-
----- end of document ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.08 b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.08
deleted file mode 100644
index 29e185d4d0cc03fefd8d608d98618fbbaa8a253b..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_2.08
+++ /dev/null
@@ -1,4653 +0,0 @@
-README_USERD_2.08
-=================
---------------------------------------
-EnSight User Defined Reader Capability   ===> (API 2.08)
---------------------------------------
-A user defined reader capability is included in EnSight which can allow
-otherwise unsupported structured or unstructured data to be read.  The user
-defined reader capability utilizes dynamic shared libraries composed of
-routines defined in this document but produced by you, the user, (or some
-third party). This capability is currently available for dec, ibm, hp, sgi,
-sun, linux, alpha linux, and NT servers.
-
-You should refer to beginning of README_USERD_2.0  and/or README_1.0_to_2.0
-for a discussion of the differences between API 1.0 and API 2.*.
-
-***>> API 2.08 invloves a slight change to API 2.05 and later:
-Namely, rotational (yaw,pitch,roll) values were added to the values
-argument of USERD_rigidbody_values routine.
-
-***>> API 2.07 additional capabilities (beyond API 2.06):
-Optional routine to allow userd defined readers to indicate their auto 
-distribute preference when used with SOS.  This is used to set the auto 
-distribute flag default in the client.  If the function does not exist, 
-then it defaults to 'use auto distribute'.  If the function does exist and 
-indicates 'no auto distribute', then it's up to the UDR to decompose a 
-distributed data set.
-    USERD_prefer_auto_distribute
-Optional routine to allow userd defined readers to indicate their 
-preference for the 'Set file...' button labels in the client's File->Open 
-dialog.  If the function does not exist or it returns a null string for 
-an argument, then the default values are used.
-    USERD_set_filename_button_labels
-
-***>> API 2.06 additional capabilities (beyond API 2.05):
-Routines to allow userd defined readers for structured data
-to deal with min, max, and stride within the reader itself
-instead of within EnSight.
-    USERD_get_structured_reader_cinching
-    USERD_set_block_range_and_stride
-
-
-***>> API 2.05 additional capabilities (beyond API 2.04):
-Routines to handle material species.
-    USERD_get_number_of_species
-    USERD_get_matsp_info
-
-Routines to handle variable extraction parameters after a read, and then
-update the variables accordingly.  Similar to the extra GUI capabilities
-(which are processed before a read).  (Can actually be added to pre-2.05 readers)
-    USERD_get_var_extract_gui_numbers
-    USERD_get_var_extract_gui_defaults
-    USERD_set_var_extract_gui_data
-
-Routines to obtain rigid body values from a reader.
-(Routines were added - EnSight is now using for Nastran and STL readers
-                       with Dynasty rigid body motion data file)
-    USERD_rigidbody_existence
-    USERD_rigidbody_values
-
-Routine that lets reader know when EnSight is getting the right side of a time
-interval for variable interpolation between steps.  Not generally needed for
-most readers - however, may be needed for those that implement rigid body, and
-wish to cache left and right timespan information for interpolation within the
-reader itself.  (Can actually be added to pre-2.05 readers)
-    USERD_set_right_side
-
-
-***>> API 2.04 additional capabilities (beyond API 2.03):
-Routines to handle failed elements.  Basically 
-a.One routine to return a flag indicating the existence of 
-  failed elements in at least one part in at least one 
-  timestep in the model.  
-b.A second routine to return a matrix of flags indexed by part and
-  element type indicating which parts and element types have failed
-  elements at the current time step.
-c.Finally a third routine to return an array of flags for a given
-  part and element type that is number of elements of that type long
-  indicating which elements have failed, and which have not failed.
-
-
-***>> API 2.03 additional capabilities (beyond API 2.01):
-1. Routines to handle materials
-2. Routines to handle nsided and nfaced elements
-3. Modified routine to handle structured ranges
-
-
-****************************************************************************
-Note: Only the the Ensight Gold example reader, has been moved to 
-      this 2.06 API level.  And it is purely for an example - it does not
-      actually provide a benefit.
-****************************************************************************
-
-
-The process for producing a user defined reader is:
----------------------------------------------------
-1. Write code for all pertinent routines in the library (Unless someone else
-   has done this for you).
-
-        This is of course where the work is done by the user.  The word
-        "pertinent" is used because depending on the nature of the data, some
-        of the routines in the library may be dummy routines.
-
-        The source code for a dummy_gold library and for various other
-        working or sample libraries is copied from the installation CD during
-        installation.  These will be located in directories under:
-
-        $CEI_HOME/ensight76/user_defined_src/readers
-
-        examples:
-        --------
-        Basic dummy_gold routines provide skeleton for a new reader
-          $CEI_HOME/ensight76/user_defined_src/readers/dummy_gold
-
-        Sample library which reads unstructured binary EnSight Gold data
-          $CEI_HOME/ensight76/user_defined_src/readers/ensight_gold
-
-        You may find it useful to place your library source in this area as
-        well, but are not limited to this location.
-
- * ===>	The descriptions of each library routine and the order that the
-        routines are called, which is provided in this file, along with
-        the example libraries, should make it possible for you to produce
-        code for your own data reader.	
-
-
-2. Produce the dynamic shared library.
-
-   This is a compiling and loading process which varies according to
-   the type of machine you are on.  In the user-defined-reader source
-   tree we have tried to isolate the machine dependent parts of the
-   build process using a set of files in the 'config' directory.  In this
-   directory there is a configuration file for each platform on which
-   EnSight is supported.  Before you can compile the installed readers
-   you should run the script called 'init' in the config directory.
-
-      i.e.  (for UNIX)
-            cd config
-            ./init sgi_6.5_n64
-            cd ..
-            make
-
-   If you are compiling for Windows NT, there are two options.  If you
-   have the Cygwin GNU utilities installed, you can use GNU make as for
-   Unix.  Otherwise, there is a script called makeall.cmd which will
-   build all of the readers using nmake.  The Makefiles in each reader
-   directory will work using either make or nmake.
-
-      i.e.  (WIN32 Cygwin)                 (using nmake)
-            cd config                      cd config
-            sh init win32                  cp win32 config
-            cd ..                          cd ..
-                                           mkdir lib
-            make                           makeall.cmd
-
-   If you have platform-specific portions of code in your reader, the
-   build system defines a set of flags which can be used within
-   #ifdef ... #endif regions in your source, as shown in the table
-   below.
-
-   Because the readers are now dynamically opened by EnSight, you may
-   have to include dependent libraries on your link-line to avoid having
-   unresolved symbols.  If you are having problems with a reader, start
-   ensight as "ensight7 -readerdbg" and you will get feedback on any
-   problems encountered in loading a reader.  If there are unresolved
-   symbols, you need to find the library which contains the missing
-   symbols and link it into your reader by adding it to the example
-   link commands below.
-
-   If you choose to use a different build environment for your reader,
-   you should take care to use compatible compilation flags to ensure
-   compatibilty with the EnSight executables, most notably on the SGI
-   and HP-UX 11.0 platforms, which should use the following flags:
-
-      sgi_6.2_o32: -mips2
-      sgi_6.2_n64: -mips4 -64
-      sgi_6.5_n32: -mips3
-      sgi_6.5_n64: -mips4 -64
-       hp_11.0_32: +DA2.0
-       hp_11.0_64: +DA2.0W
-
-    ______________________________________________________________________
-   | MACHINE | OS flag               |  SHARED LIBRARY NAME PRODUCED      |
-   |  TYPE   |------------------------------------------------------------|
-   |         |         LD COMMAND USED IN MAKEFILE                        |
-    ======================================================================
-    ______________________________________________________________________
-   | sgi     | -DSGI                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o              |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | hp      | -DHP                  |  libuserd-X.sl                     |
-   |         |------------------------------------------------------------|
-   |         | ld -b -o libuserd-X.sl libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | sun     | -DSUN                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o                        |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | dec     | -DDEC                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -all -o libuserd-X.so libuserd-X.o -lc          |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | linux   | -DLINUX               |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | alpha   | -DALINUX              |  libuserd-X.so                     |
-   | linux   |------------------------------------------------------------|
-   |         | ld -shared -o libuserd-X.so libuserd-X.o -lc               |
-    ----------------------------------------------------------------------
-    ______________________________________________________________________
-   | ibm     | -DIBM                 |  libuserd-X.so                     |
-   |         |------------------------------------------------------------|
-   |         | ld -G -o libuserd-X.so libuserd-X.o -bnoentry -bexpall -lc |
-    ----------------------------------------------------------------------
-
-   Once you have created your library, you should place it in a directory
-   of your choice or in the standard reader location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   For example, if you created a reader for "mydata", you should create
-   the reader libuserd-mydata.so and place the file in your own reader
-   directory (see section 3 below) or in the standard location:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers/libuserd-mydata.so
-
-
-3. By default EnSight will load all readers found in the directory:
-
-      $CEI_HOME/ensight76/machines/$CEI_ARCH/lib_readers
-
-   Files with names "libuserd-X.so" (where X is a name unique to the reader)
-   are assumed to be user-defined readers.
-
-   There are two methods which can be used to supplement the default
-   behavior.
-
-   (1) A feature which is useful for site-level or user-level configuration
-       is the optional environment variable $ENSIGHT7_READER.  This
-       variable directs EnSight to load all readers in the specified reader
-       directory (you should probably specify a full path) before loading
-       the built-in readers.  If the same reader exists in both directories
-       (as determined by the name returned by USERD_get_name_of_reader(),
-       NOT by the filename), the locally configured reader will take
-       precedence.
-
-   (2) A useful feature for end-users is the use of the libuserd-devel
-       reader.  EnSight will search for a reader named libuserd-devel.so
-       (.sl for HP or .dll for NT).  This reader can exist anywhere in the
-       library path (see below) of the user.  This is useful for an
-       individual actively developing a reader because the existence of a
-       libuserd-devel library will take precedence over any other library
-       which returns the same name from USERD_get_name_of_reader().
-
-   As an example, a site may install commonly used readers in a common
-   location, and users can set the ENSIGHT7_READER variable to access them:
-
-      setenv ENSIGHT7_READER /usr/local/lib/e7readers
-  
-   A user working on a new reader may compile the reader and place it in
-   a directory specified by the library path:
-
-      cp libuserd-myreader.so ~/lib/libuserd-devel.so
-      setenv <librarypath> ~/lib:$<librarypath>
-
-   The user is responsible for correctly configuring the library path
-   variable in order to make use of the libuserd-devel feature.  The
-   library environment variables used are:
-
-        Machine type    Environment variable to set
-        ------------    ---------------------------
-        sgi             LD_LIBRARY_PATH
-        dec             LD_LIBRARY_PATH
-        sun             LD_LIBRARY_PATH
-        linux           LD_LIBRARY_PATH
-        alpha linux     LD_LIBRARY_PATH
-        hp              SHLIB_PATH
-        ibm             LIBPATH
-
-As always, EnSight support is available if you need it.
-
--------------------------------
-Quick Index of Library Routines
--------------------------------
-
-Generally Needed for UNSTRUCTURED data
---------------------------------------
-USERD_get_part_coords                 part's node coordinates
-USERD_get_part_node_ids               part's node ids
-USERD_get_part_elements_by_type       part's element connectivites
-USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally Needed for BLOCK data
---------------------------------------
-USERD_get_block_coords_by_component   block coordinates
-USERD_get_block_iblanking             block iblanking values
-USERD_get_ghosts_in_block_flag        block ghost cell existence?
-USERD_get_block_ghost_flags           block ghost cell flags
-
-  These routines, which formerly were only for unstructured data, will now
-  also be called for structured data if you specify that ids will be given
-  in the USERD_get_node_label_status and USERD_get_element_label_status rotuines
-  ------------------------------------------------------------------------------ 
-  USERD_get_part_node_ids               part's node ids
-  USERD_get_part_element_ids_by_type    part's element ids
-
-
-Generally needed for either or both kinds of data
--------------------------------------------------
-USERD_get_name_of_reader              name of reader for GUI
-USERD_get_reader_release              release string of reader
-USERD_get_reader_version              provide reader version number
-USERD_get_reader_descrip              provide GUI more description (optional)
-
-USERD_get_extra_gui_numbers           Gets the number of toggles, pulldowns and fields
-USERD_get_extra_gui_defaults          Gets the default values for the GUI members
-USERD_set_extra_gui_data              Returns the answers provided by the user
-
-USERD_set_filenames                   filenames entered in GUI
-USERD_set_server_number               server which of how many
-
-USERD_get_number_of_timesets          number of timesets
-USERD_get_timeset_description         description of timeset
-USERD_get_geom_timeset_number         timeset # to use for geom
-
-USERD_get_num_of_time_steps           number of time steps
-USERD_get_sol_times                   solution time values
-USERD_set_time_set_and_step           current timeset and time step
-
-USERD_get_changing_geometry_status    changing geometry?
-USERD_get_node_label_status           node labels?
-USERD_get_element_label_status        element labels?
-USERD_get_model_extents               provide model bounding extents
-USERD_get_number_of_files_in_dataset  number of files in model
-USERD_get_dataset_query_file_info     info about each model file
-USERD_get_descrip_lines               file associated description lines
-USERD_get_number_of_model_parts       number of model parts
-USERD_get_gold_part_build_info        Gets the info needed for part building process
-USERD_get_part_build_info             part/block type/descrip etc.
-USERD_get_maxsize_info                part/block allocation maximums
-USERD_get_ghosts_in_model_flag        model contains ghost cells?
-USERD_get_nsided_conn                 Gets the element connectivities for nsided
-                                        elements. (utilizes the number of nodes
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_nodes_per_face       Gets the number of nodes per face for nfaced
-                                        elements (utilizes the number of faces
-                                        per element obtained in
-                                        USERD_get_part_elements_by_type)
-USERD_get_nfaced_conn                 Gets the element connectivities for nfaced
-                                        elements (utilizes the number of nodes
-                                        per face obtained in
-                                        USERD_get_nfaced_nodes_per_face)
-
-
-USERD_get_border_availability         part border provided?
-USERD_get_border_elements_by_type     part border conn and parent info
-
-USERD_get_number_of_variables         number of variables
-USERD_get_gold_variable_info          variable type/descrip etc.
-USERD_get_var_by_component            part or block variable values
-USERD_get_constant_val                constant variable's value
-USERD_get_var_value_at_specific       node's or element's variable value over time
-USERD_stop_part_building              cleanup after part build routine
-
-USERD_get_number_of_material_sets     Gets the number of material sets
-USERD_get_matf_set_info               Gets the material set indices and names
-USERD_get_number_of_materials         Gets the number of materials
-USERD_get_matf_var_info               Gets the material indices and descriptions
-USERD_size_matf_data                  Gets the length of either the
-                                        material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-USERD_load_matf_data                  Gets the material ids list,
-                                        mixed-material ids list, or
-                                        mixed-material values list
-
-USERD_bkup                            archive routine
-
-USERD_exit_routine                    cleanup upon exit routine
-
-USERD_get_uns_failed_params           Gets thresholds/criteria for failure  
-
-USERD_rigidbody_existence             Returns whether rigid body transformation
-                                       data exists for the model.
-USERD_rigidbody_values                Returns the euler and location values for a
-                                       given part
-
-USERD_set_right_side                  Simply informs the reader when the time set
-                                      is for the right side of a time span during
-                                      variable interpolation between time steps.
-
-USERD_get_structured_reader_cinching  Tells if the reader will do structured
-                                        cinching
-USERD_set_block_range_and_stride      Sets the min, max, and stride of a block
-                                        if doing structured cinching
-
-
--------------------------
-Order Routines are called
--------------------------
-
-The various main operations are given basically in the order they will
-be performed.  Within each operation, the order the routines will be
-called is given.  
-
-1. Setting name in the gui, and specifying one or two input fields
-
-        USERD_get_name_of_reader
-        USERD_get_reader_descrip        (optional)
-        USERD_get_extra_gui_numbers     (optional)
-	USERD_get_extra_gui_defaults    (optional)
-
-2. Getting the reader version (also distinguishes between API's)
-
-        USERD_get_reader_version
-
-3. Setting filenames and getting timeset and time info
-
-        <USERD_set_extra_gui_data> (optional if reader has
-                                    USERD_get_extra_gui_defaults routine)
-        USERD_get_structured_reader_cinching
-        USERD_set_server_number
-	USERD_set_extra_gui_data        (optional)
-        USERD_set_filenames
-        USERD_get_number_of_timesets
-        USERD_get_geom_timeset_number
-
-        for each timeset:
-          USERD_get_timeset_description
-          USERD_get_num_of_time_steps
-          USERD_get_sol_times
-
-        USERD_set_time_set_and_step
-
-4. Gathering info for part builder
-
-        USERD_set_time_set_and_step
-        USERD_get_changing_geometry_status
-        USERD_get_node_label_status
-        USERD_get_element_label_status
-        USERD_get_number_of_files_in_dataset
-        USERD_get_dataset_query_file_info
-        USERD_get_descrip_lines                 (for geometry)
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_maxsize_info
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents     OR          (for model extents)
-             USERD_get_part_coords  AND/OR
-             <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-             USERD_get_block_coords_by_component
-
-5. Gathering Variable info
-
-        USERD_get_number_of_variables
-        USERD_get_gold_variable_info
-              
-6. Part building (per part created)
-
-        both unstructured and structured:
-        --------------------------------
-        USERD_set_time_set_and_step
-
-        if unstructured part:
-        --------------------
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-
-        If any nsided elements:
-
-          USERD_get_nsided_conn
-
-        If any nfaced elements:
-
-          USERD_get_nfaced_nodes_per_face
-          USERD_get_nfaced_conn
-
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-
-        else if structured part:
-        -----------------------
-        USERD_get_block_iblanking
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        both again:
-        ----------
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-        USERD_stop_part_building      (only once when part builder
-                                       dialog is closed)
-
-7. Loading Variables
-          
-        constants:
-        ---------
-        USERD_set_time_set_and_step
-        USERD_get_constant_val
-          
-        scalars/vectors/tensors:
-        ------------------------
-        USERD_get_descrip_lines
-        USERD_set_time_set_and_step
-         <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_var_by_component
-
-8. Changing geometry
-
-        changing coords only (per part):
-        --------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_part_coords
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-
-        changing connectivity (per part):
-        ---------------------
-        USERD_set_time_set_and_step
-        USERD_get_descrip_lines
-        USERD_get_number_of_model_parts
-        USERD_get_gold_part_build_info
-        USERD_get_ghosts_in_model_flag
-        USERD_get_get_ghosts_in_block_flag      (if any ghost cells in model)
-        USERD_get_model_extents   OR
-           USERD_get_part_coords  AND/OR
-           <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-           USERD_get_block_coords_by_component
-        USERD_get_part_element_ids_by_type
-        USERD_get_part_elements_by_type
-        USERD_get_part_coords
-        USERD_get_part_node_ids
-        USERD_get_block_iblanking
-        <USERD_set_block_range_and_stride>  (if doing structured reader cinching
-        USERD_get_block_coords_by_component
-        USERD_get_block_ghost_flags          (If ghost cells in part)
-        USERD_get_part_node_ids              (If node ids given)
-        USERD_get_part_element_ids_by_type   (If element ids given)
-
-        USERD_get_border_availability        (If border representation
-        USERD_get_border_elements_by_type     is selected)
-
-  
-9. Node or Element queries over time
-
-        USERD_get_var_value_at_specific
-
-10. To see if materials in the model
-
-        USERD_get_number_of_material_sets
-        USERD_get_matf_set_info
-
-        If any material sets in the model (calls these once per material set):
-          USERD_get_number_of_materials
-          USERD_get_matf_var_info
-
-        For each elment type of each part containing material ids, calls:
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-        If there are any elements with mixed materials, when a domain or
-        interface is created, calls these again per part:
-
-          USERD_size_matf_data
-          USERD_load_matf_data
-
-11. To modify the variable extraction parameters and have the variables
-    update accordingly.
-
-        USERD_get_var_extract_gui_numbers
-        USERD_get_var_extract_gui_defaults
-        USERD_set_var_extract_gui_data
-
-
-
------------------------
-Detailed Specifications
------------------------
-
-Include files:
---------------
-The following header file is required in any file containing these library
-routines. 
-
-       #include "global_extern.h"
-
-And it references:
-
-       #include "global_extern_proto.h"
-
-
-
-*******************************************************************************
-****************************** Special Note ***********************************
-*******************************************************************************
-
-Make sure you use the proper define in the global_extern.h header file, namely:
-#define USERD_API_204
-
-Also, Make sure the api version in the USERD_get_reader_version routine is set
-to "2.04" or larger.
-
-Make sure your reader has access to the global_extern_proto.h   This is a new
-file which is accessed from the new global_extern.h
-
-*******************************************************************************
-*******************************************************************************
-
-
-Basis of arrays:
----------------
-Unless explicitly stated otherwise, all arrays are zero based - in true C
-fashion.
-
-
-Global variables:
-----------------
-You will generally need to have a few global variables which are shared by
-the various library routines. The detailed specifications below have assumed
-the following are available.  (Their names describe their purpose, and they
-will be used in helping describe the details of the routines below).
-
-static int Numparts_available         = 0;
-static int Num_unstructured_parts     = 0;
-static int Num_structured_blocks      = 0;
-
-/* Note: Numparts_available = Num_unstructured_parts + Num_structured_blocks */
-
-static int Num_timesets               = 1;
-static int Current_timeset            = 1;
-static int Geom_timeset_number        = 1;
-
-static int Num_time_steps[Z_MAXSETS]  = 1;
-static int Current_time_step          = 0;
-static int Num_variables              = 0;
-static int Num_dataset_files          = 0;
-
-static int Server_Number              = 1;    Which server of
-static int Tot_Servers                = 1;    the total number of servers
-
-
-
-_________________________________________
------------------------------------------
-Library Routines (in alphabetical order):
-_________________________________________
------------------------------------------
-
---------------------------------------------------------------------
-USERD_bkup
-
-   Description:
-   -----------
-   This routine is called during the EnSight archive process.  You can
-   use it to save or restore info relating to your user defined reader.
-
-   Specification:
-   -------------
-   int USERD_bkup(FILE *archive_file,
-                  int backup_type)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  archive_file         = The archive file pointer
-
-   (IN)  backup_type          = Z_SAVE_ARCHIVE for saving archive
-                                Z_REST_ARCHIVE for restoring archive
-
-   Notes:
-   -----
-   * Since EnSight's archive file is saved in binary form, you should
-     also do any writing to it or reading from it in binary.
-
-   * You should archive any variables, which will be needed for
-     future operations, that will not be read or computed again
-     before they will be needed.  These are typically global
-     variables.
-
-   * Make sure that the number of bytes that you write on a save and
-     the number of bytes that you read on a restore are identical!!
-
-   * If any of the variables you save are allocated arrays, you must
-     do the allocations before restoring into them.
-
---------------------------------------------------------------------
-USERD_exit_routine
-
-   Description:
-   -----------
-   This routine is called as EnSight is exiting. It can be used to clean
-   up anything needed - such as removing temporary files, etc. - or can simply
-   be a dummy.
-
-   Specification:
-   -------------
-   void USERD_exit_routine( void )
-
-   Arguments:
-   ---------
-   none
-
---------------------------------------------------------------------
-USERD_get_block_coords_by_component
-
-   Description:
-   -----------
-   Get the coordinates of a given structured block, a component at a time.
-
-   Specification:
-   -------------
-   int USERD_get_block_coords_by_component(int block_number,
-                                           int which_component,
-                                           float *coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  which_component         = Z_COMPX if x component wanted
-                                 = Z_COMPY if y component wanted
-                                 = Z_COMPZ if z component wanted
-
-   (OUT) coord_array             = 1D array containing x,y, or z
-                                   coordinate component of each node
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_block_iblanking
-
-   Description:
-   -----------
-   Get the iblanking value at each node of a block (if the block is
-   iblanked).
-
-   Specification:
-   -------------
-   int USERD_get_block_iblanking(int block_number,
-                                 int *iblank_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) iblank_array            = 1D array containing iblank value
-                                   for each node.
-
-                                  (Array will have been allocated
-                                   i*j*k for the block long)
-
-          possible values are:   Z_EXT     = exterior
-                                 Z_INT     = interior
-                                 Z_BND     = boundary
-                                 Z_INTBND  = internal boundary
-                                 Z_SYM     = symmetry plane
-
-   Notes:
-   -----
-   * Not called unless Num_structured_blocks is > 0  and you have
-     some iblanked blocks
-
-   * Will be based on Current_time_step
-
-
-
-----------------------------------------------------------------------
-USERD_get_block_ghost_flags
-
-   Description:
-   -----------
-   Get the ghost_flags value at each element of a block containing ghost cells.
-
-   Specification:
-   -------------
-   int USERD_get_block_ghost_flags(int block_number,
-                                   int *ghost_flags)
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  block_number            = The block number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) ghost_flags             = 1D array containing ghost flag value
-                                     for each block cell.
-  
-                                    (Array will have been allocated
-                                     (i-1)*(j-1)*(k-1) for the block long)
-  
-            possible values are:    0  = non-ghost cell  (normal cell)
-                                   >0  = ghost cell
-  
-    Notes:
-    -----
-    * This routine is new in the 2.01 API
-
-    * This will be based on Current_time_step
-  
-    * Only called for structured "block" parts that have some ghost cells
-      as indicated by the USERD_get_ghost_in_block_flag.  The model must
-      of course also have been indicated to have some ghost cells in the
-      USERD_get_ghost_in_model_flag routine.
-  
-    * It is sufficient to set the value to be 1 to flag as a ghost cell,
-      but the value can be any non-zero value, so you could use it to
-      indicate which block or which server (for Server-of-server use) the
-      cell is actually in.
-
-
-
---------------------------------------------------------------------
-USERD_get_border_availability
-
-   Description:
-   -----------
-   Finds out if border elements are provided by the reader for the
-   desired part, or will need to be computed internally by EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_border_availability(int part_number,
-                                     int number_of_elements[Z_MAXTYPE])
-
-   Returns:
-   -------
-   Z_OK  if border elements will be provided by the reader.
-          (number_of_elements array will be loaded and
-           USERD_get_border_elements_by_type will be called)
-
-   Z_ERR if border elements are not available - thus EnSight must compute.
-          (USERD_get_border_elements_by_type will not be called)
-
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of border element in
-                                  the part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-
-   Notes:
-   -----
-   * Only called if border representation is used.
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_border_elements_by_type
-
-   Description:
-   -----------
-   Provides border element connectivity and parent information. 
-
-   Specification:
-   -------------
-   int USERD_get_border_elements_by_type(int part_number,
-                                         int element_type,
-                                         int **conn_array,
-                                         short *parent_element_type,
-                                         int *parent_element_num)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT    node point element
-                                 Z_BAR02    2 node bar
-                                 Z_BAR03    3 node bar
-                                 Z_TRI03    3 node triangle
-                                 Z_TRI06    6 node triangle
-                                 Z_QUA04    4 node quad
-                                 Z_QUA08    8 node quad
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each border element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_QUA08] = 30
-                           as obtained in:
-                            USERD_get_border_availability
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_QUA08
-
-   (OUT) parent_element_type   = 1D array containing element type of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   (OUT) parent_element_num   = 1D array containing element number of the
-                                 parent element (the one that the border
-                                 element is a face/edge of).
-
-                                (Array will have been allocated
-                                 num_of_elements of the type long)
-
-   
-   Notes:
-   -----
-   * Not called unless USERD_get_border_availability returned Z_OK
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_changing_geometry_status
-
-   Description:
-   -----------
-   Gets the changing geometry status for the model
-
-   Specification:
-   -------------
-   int USERD_get_changing_geometry_status( void )
-
-   Returns:
-   -------
-   Z_STATIC        if geometry does not change
-   Z_CHANGE_COORDS if changing coordinates only
-   Z_CHANGE_CONN   if changing connectivity
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * EnSight does not support changing number of parts.  But the
-     coords and/or the connectivity of the parts can change.  Note that
-     a part is allowed to be empty (number of nodes and elements equal
-     to zero).
-
-
---------------------------------------------------------------------
-USERD_get_constant_val
-
-   Description:
-   -----------
-   Get the value of a constant at a time step
-
-   Specification:
-   -------------
-   float USERD_get_constant_value(int which_var,
-                                  int imag_data)
-
-   Returns:
-   -------
-   Value of the requested constant variable
-
-   Arguments:
-   ---------
-   (IN)  which_var            = The variable number
-
-   (IN)  imag_data            = TRUE if want imaginary data value.
-                                FALSE if want real data value.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_dataset_query_file_info
-
-   Description:
-   -----------
-   Get the information about files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) qfiles   = Structure containing information about each file
-                    of the dataset. The Z_QFILES structure is defined
-                    in the global_extern.h file
-
-                   (The structure will have been allocated
-                    Num_dataset_files long, with 10 description
-                    lines per file).
-
-      qfiles[].name        = The name of the file
-                             (Z_MAXFILENP is the dimensioned length
-                              of the name)
-
-      qfiles[].sizeb       = The number of bytes in the file
-                             (Typically obtained with a call to the
-                              "stat" system routine) (Is a long)
-
-      qfiles[].timemod     = The time the file was last modified 
-                             (Z_MAXTIMLEN is the dimensioned length
-                              of this string)
-                             (Typically obtained with a call to the
-                              "stat" system routine)
-
-      qfiles[].num_d_lines = The number of description lines you
-                              are providing from the file. Max = 10
-
-      qfiles[].f_desc[]    = The description line(s) per file,
-                              qfiles[].num_d_lines of them
-                              (Z_MAXFILENP is the allocated length of
-                               each line)
-
-   Notes:
-   -----
-   * If Num_dataset_files is 0, this routine will not be called.
-     (See USERD_get_number_of_files_in_dataset)
-
-
---------------------------------------------------------------------
-USERD_get_descrip_lines
-
-   Description:
-   -----------
-   Get two description lines associated with geometry per time step,
-   or one description line associated with a variable per time step.
-
-   Specification:
-   -------------
-   int USERD_get_descrip_lines(int which_type,
-                               int which_var,
-                               int imag_data,
-                               char line1[Z_BUFL],
-                               char line2[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_type           = Z_GEOM for geometry (2 lines)
-                              = Z_VARI for variable (1 line)
-
-   (IN)  which_var            = If it is a variable, which one.
-                                Ignored if geometry type.
-
-   (IN)  imag_data            = TRUE if want imaginary data file.
-                                FALSE if want real data file.
-
-   (OUT) line1                = The 1st geometry description line,
-                                or the variable description line.
-
-   (OUT) line2                = The 2nd geometry description line
-                                Not used if variable type.
-
-   Notes:
-   -----
-   * Will be based on Current_time_step
-
-   * These are the lines EnSight can echo to the screen in
-     annotation mode.
-
-
-
---------------------------------------------------------------------
-USERD_get_element_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether element labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_element_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if element labels will be provided
-   FALSE       if element labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * element lables are needed in order to do any element querying, or
-     element labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.
-
-       API 1.0:
-         USERD_get_element_ids_for_part is used to obtain the ids,
-         on a part by part basis, if TRUE status is returned here.
-
-       API 2.0:
-         USERD_get_part_element_ids_by_type is used to obtain the ids,
-         on a per part, per type basis, if TRUE status is returned here.
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them youself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model (especially
-       if you are dealing with a decomposed dataset).
-
-       USERD_get_part_element_ids_by_type is used to obtain the ids,
-       on an element type by part basis, if TRUE status is returned here.
-
-   * Will call USERD_get_part_element_ids_by_type for each type of
-     of each part if this routine returns TRUE.
---------------------------------------------------------------------
-USERD_get_geom_timeset_number -
-
-   Description:
-   -----------
-    Gets the timeset number to be used for geometry
-
-   Specification:
-   -------------
-   int USERD_get_geom_timeset_number( void )
-
-   Returns:
-   -------
-   Geom_timeset_number = The timeset number that will be used for geometry.   
-                         For example, if USERD_get_number_of timesets
-                         returns 2, the valid timeset numbers would be
-                         1 or 2.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   *  If your model is static, which you indicated by returning a zero
-      in USERD_get_number_of_timesets, you can return a zero here as well.
-
-
-
---------------------------------------------------------------------
-USERD_get_gold_part_build_info
-
-   Description:
-   -----------
-   Gets the info needed for the part building process.
-
-   Specification:
-   -------------
-   int USERD_get_gold_part_build_info(int *part_id,
-                                      int *part_types,
-                                      char *part_description[Z_BUFL],
-                                      int *number_of_nodes,
-                                      int *number_of_elements[Z_MAXTYPE],
-                                      int *ijk_dimensions[9],
-                                      int *iblanking_options[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-    (OUT) part_id                = Array containing the external part
-                                   ids for each of the model parts.
-
-                                   IMPORTANT:
-                                    Parts numbers must be >= 1, because
-                                    of the way they are used in the GUI
-
-               *******************************************
-                The ids provided here are the numbers by
-                which the parts will be referred to in the
-                GUI (if possible). They are basically
-                labels as far as you are concerned.
-
-                Note: The part numbers you pass to routines
-                which receive a part_number or block_number
-                or which_part as an argument are the 1-based
-                table index of the parts!
-
-                example:  If Numparts_available = 3
-
-                          Table index        part_id
-                          -----------        -------
-                           1                  13
-                           2                  57
-                           3                  125
-
-                           ^                   ^
-                           |                   |
-                           |                    These are placed in:
-                           |                      part_id[0] = 13
-                           |                      part_id[1] = 57
-                           |                      part_id[2] = 125
-                           |                    for GUI labeling purposes.
-                           |
-                            These implied table indices are the part_number,
-                            block_number, or which_part numbers that you would
-                            pass to routines like:
-
-                           USERD_get_part_coords(int part_number,...
-                           USERD_get_part_node_ids(int part_number,...
-                           USERD_get_part_elements_by_type(int part_number,...
-                           USERD_get_part_element_ids_by_type(int part_number,...
-                           USERD_get_block_coords_by_component(int block_number,...
-                           USERD_get_block_iblanking(int block_number,...
-                           USERD_get_block_ghost_flags(int block_number,...
-                           USERD_get_ghosts_in_block_flag(int block_number)
-                           USERD_get_border_availability(int part_number,...
-                           USERD_get_border_elements_by_type(int part_number,...
-                           USERD_get_var_by_component(int which_variable,
-                                                      int which_part,...
-                           USERD_get_var_value_at_specific(int which_var,
-                                                           int which_node_or_elem,
-                                                           int which_part,...
-               ********************************************
-
-                                    (Array will have been allocated
-                                     Numparts_available long)
-
-   (OUT) part_types             = Array containing one of the
-                                  following for each model part:
-
-                                       Z_UNSTRUCTURED or
-                                       Z_STRUCTURED  or
-                                       Z_IBLANKED
-
-                                  (Array will have been allocated
-                                   Numparts_available long)
-
-   (OUT) part_description       = Array containing a description
-                                  for each of the model parts
-
-                                  (Array will have been allocated
-                                   Numparts_available by Z_BUFL
-                                   long)
-
-   (OUT) number_of_nodes        = Number of unstructured nodes in the part
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) number_of_elements     = 2D array containing number of
-                                  each type of element for each
-                                  unstructured model part.
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) ijk_dimensions         = 2D array containing ijk dimension info
-                                  for structured blocks
-
-                                  For Z_UNSTRUCTURED - is ignored
-
-                                  For Z_STRUCTURED or Z_IBLANKED
-
-        Prior to version 2.03:
-        ----------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 3 long)
-
-                              ijk_dimensions[][0] = I dimension
-                              ijk_dimensions[][1] = J dimension
-                              ijk_dimensions[][2] = K dimension
-
-
-        Starting at version 2.03:
-        ------------------------
-                                   (Array will have been allocated
-                                    Numparts_available by 9 long)
-
-                              There are two ways to do this:
-                              ------------------------------
-                              1. The simple one, without ranges.
-
-                                   This is good for all structured models
-                                   that will NOT be used in EnSight's
-                                   Server of Servers
-
-                                   Simply provide the ijk dimensions in the
-                                   first three slots and place a -1 in
-                                   the 4th slot.  (The remaining slots will
-                                   be ignored).
-
-                              Thus,
-                              ijk_dimensions[][0] = I dimension of block
-                              ijk_dimensions[][1] = J dimension of block
-                              ijk_dimensions[][2] = K dimension of block
-                              ijk_dimensions[][3] = -1
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][4] = -1
-                              |       |       |
-                              |       |       |
-                            2 *-------*-------*
-                              |       |       |
-                              |       |       |
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-
-                              2. Using ranges.
-
-                                  This one can be used anytime, but MUST
-                                  be used if EnSight's Server of Servers
-                                  is to be used!
-
-                                  The first 3 slots contain the ijk dimension
-                                  of the complete block (of which this may be
-                                  a portion).  The last 6 slots contain the
-                                  ijk min and max ranges within the complete.
-
-                              Thus,
-                              ijk_dimensions[][0] = I dim of complete block
-                              ijk_dimensions[][1] = J dim of complete block
-                              ijk_dimensions[][2] = K dim of complete block
-
-                              ijk_dimensions[][3] = Imin of portion (1-based)
-                              ijk_dimensions[][4] = Imax of portion (1-based)
-                              ijk_dimensions[][5] = Jmin of portion (1-based)
-                              ijk_dimensions[][6] = Jmax of portion (1-based)
-                              ijk_dimensions[][7] = Kmin of portion (1-based)
-                              ijk_dimensions[][8] = Kmax of portion (1-based)
-
-
-                              example1: (Model has one part, a simple 2D block,
-                                         and want whole thing)
-
-                        (J planes)
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[0][3] = 1
-                              |       |       |    ijk_dimension[0][4] = 3
-                              |       |       |    ijk_dimension[0][5] = 1
-                            2 *-------*-------*    ijk_dimension[0][6] = 4
-                              |       |       |    ijk_dimension[0][7] = 1
-                              |       |       |    ijk_dimension[0][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-                              example2: (Want to have the block represented
-                                         in two portions - 2 parts)
-
-                        (J planes)                 top portion
-                            4 *-------*-------*
-                              |       |       |    ijk_dimension[0][0] = 3
-                              |       |       |    ijk_dimension[0][1] = 4
-                              |       |       |    ijk_dimension[0][2] = 1
-                            3 *-------*-------*
-                              .       .       .    ijk_dimension[0][3] = 1
-                              .       .       .    ijk_dimension[0][4] = 3
-                              .       .       .    ijk_dimension[0][5] = 3
-                            2 .................    ijk_dimension[0][6] = 4
-                              .       .       .    ijk_dimension[0][7] = 1
-                              .       .       .    ijk_dimension[0][8] = 1
-                              .       .       .
-                            1 .................
-                              1       2       3  (I planes)
-
-
-                        (J planes)                 bottom portion
-                            4 .................
-                              .       .       .    ijk_dimension[1][0] = 3
-                              .       .       .    ijk_dimension[2][1] = 4
-                              .       .       .    ijk_dimension[3][2] = 1
-                            3 *-------*-------*
-                              |       |       |    ijk_dimension[1][3] = 1
-                              |       |       |    ijk_dimension[1][4] = 3
-                              |       |       |    ijk_dimension[1][5] = 1
-                            2 *-------*-------*    ijk_dimension[1][6] = 3
-                              |       |       |    ijk_dimension[1][7] = 1
-                              |       |       |    ijk_dimension[1][8] = 1
-                              |       |       |
-                            1 *-------*-------*
-                              1       2       3  (I planes)
-
-
-        And note that if you were partioning this block for
-        EnSight's Server of Servers, you would only have one part,
-        instead of two.  Each SOS server would return its appropriate
-        ranges in the last 6 slots. The first 3 slots would remain constant.
-
-
-   (OUT) iblanking_options      = 2D array containing iblanking
-                                  options possible for each
-                                  structured model part.
-                                  ----------
-                                  (Ignored unless Z_IBLANKED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by 6 long)
-
-      iblanking_options[][Z_EXT]     = TRUE if external (outside)
-                       [][Z_INT]     = TRUE if internal (inside)
-                       [][Z_BND]     = TRUE if boundary
-                       [][Z_INTBND]  = TRUE if internal boundary
-                       [][Z_SYM]     = TRUE if symmetry surface
-
-
-   Notes:
-   -----
-   * If you haven't built a table of pointers to the different parts,
-     you might want to do so here as you gather the needed info.
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_gold_variable_info
-
-   Description:
-   -----------
-   Get the variable descriptions, types and filenames
-
-   Specification:
-   -------------
-   int USERD_get_gold_variable_info(char **var_description,
-                                    char **var_filename,
-                                    int *var_type,
-                                    int *var_classify,
-                                    int *var_complex,
-                                    char **var_ifilename,
-                                    float *var_freq,
-                                    int *var_contran,
-                                    int *var_timeset)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) var_description      = Variable descriptions
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-           variable description restrictions:
-           ----------------------------------
-           1. Only first 19 characters used in EnSight.
-           2. Leading and trailing whitespace will be removed by EnSight.
-           3. Illegal characters will be replaced by underscores.
-           4. Thay may not start with a numeric digit.
-           4. No two variables may have the same description.
-
-
-   (OUT) var_filename         = Variable real filenames
-
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_type             = Variable type
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_CONSTANT
-                                            Z_SCALAR
-                                            Z_VECTOR
-                                            Z_TENSOR
-                                            Z_TENSOR9
-
-   (OUT) var_classify         = Variable classification
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                types are:  Z_PER_NODE
-                                            Z_PER_ELEM
-
-   (OUT) var_complex          = TRUE if complex, FALSE otherwise
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_ifilename        = Variable imaginary filenames (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables by Z_BUFL long)
-
-   (OUT) var_freq             = complex frequency  (if complex)
- 
-                                (Array will have been allocated
-                                 Num_variables long)
- 
-   (OUT) var_contran          = TRUE if constant changes per time step
-                                FALSE if constant truly same at all time steps
- 
-                                (Array will have been allocated
-                                 Num_variables long)
-
-   (OUT) var_timeset          = Timeset the variable will use (1 based).
-                                (For static models, set it to 1)
-
-                                (Array will have been allocated
-                                 Num_variables long)
-
-                                 For example:  If USERD_get_number_of_timesets
-                                               returns 2, the valid
-                                               timeset_number's would be 1 or 2
-
-
-   Notes:
-   -----
-   * The implied variable numbers apply, but be aware that the
-     arrays are zero based.
-     So for variable 1, will need to provide   var_description[0]
-                                               var_filename[0]
-                                               var_type[0]
-                                               var_classify[0]
-                                               var_complex[0]
-                                               var_ifilename[0]
-                                               var_freq[0]
-                                               var_contran[0]
-                                               var_timeset[0]
-
-
-        for variable 2, will need to provide   var_description[1]
-                                               var_filename[1]
-                                               var_type[1]
-                                               var_classify[1]
-                                               var_complex[1]
-                                               var_ifilename[1]
-                                               var_freq[1]
-                                               var_contran[1]
-                                               var_timeset[1]
-              etc.
-
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_block_flag
-
-   Description:
-   -----------
-   Gets whether ghost cells present in block or not
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_block_flag(int block_number)
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in this structured part
-   FALSE if no ghost cells in this structured part
-
-   Arguments:
-   ---------
-   (IN) block_number      = The block part number
-                              (1-based index of part table, namely:
-
-                                1 ... Numparts_available.
-
-                              It is NOT the part_id that
-                              is loaded in USERD_get_gold_part_build_info)
-
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-    * This will be based on Current_time_step
-  
-    * Intended for structured parts only, value will be ignored for
-      unstructured parts
-
-
-
---------------------------------------------------------------------
-USERD_get_ghosts_in_model_flag
-
-   Description:
-   -----------
-   Answers the question as to whether any ghost cells in the model.
-
-   Specification:
-   -------------
-  int USERD_get_ghosts_in_model_flag( void )
-
-   Returns:
-   -------
-   TRUE  if any ghost cells in the model
-   FALSE if no ghost cells in the model
-
-   Arguments:
-   ---------
-  
-   Notes:
-   -----
-    * This routine is new in the 2.01 API
-
--------------------------------------------------------------------------
-USERD_get_matf_set_info
-
-   Description:
-   -----------
-   Get the material set ids and names
-
-   Specification:
-   -------------
-   int USERD_get_matf_set_info(int *mat_set_ids,
-                               char **mat_set_name)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) mat_set_ids  = 1D material set ids array
-
-                               (Array will have been allocated
-                                Num_material_sets long)
-
-   (OUT) mat_set_name = 2D material set name array
-
-                               (Array will have been allocated
-                                Num_material_sets by Z_BUFL long)
-
-   Notes:
-   -----
-   * Will not be called if Num_material_sets is zero
-   * See USERD_get_number_of_material_sets header for explanatory example
-
-
---------------------------------------------------------------------
-USERD_get_matf_var_info
-
-   Description:
-   -----------
-   Gets the material ids and descriptions for the material set
-
-   Specification:
-   -------------
-   int USERD_get_matf_var_info(int set_index,
-                               int *mat_ids,
-                               char **mat_desc)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  set_index               = the material set index (zero based)
-
-   (OUT) mat_ids[set_index]      = 1D integer array containing the material
-                                   ids to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] long)
-
-   (OUT) mat_desc[set_index]     = 2D char array containing the material
-                                   descriptions to associated with each material
-
-                                    (Array will have been allocated
-                                     Num_materials[set_index] by Z_BUFL long)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_get_maxsize_info
-
-   Description:
-   -----------
-   Gets maximum part sizes for efficient memory allocation.
-
-   Transient models (especially those that increase in size) can cause
-   reallocations, at time step changes, to keep chewing up more and
-   more memory.   The way to avoid this is to know what the maximum
-   size of such memory will be, and allocate for this maximum initially.
-
-   Accordingly, if you choose to provide this information (it is optional),
-   EnSight will take advantage of it.
-
-
-   Specification:
-   -------------
-   int USERD_get_maxsize_info(int *max_number_of_nodes,
-                              int *max_number_of_elements[Z_MAXTYPE],
-                              int *max_ijk_dimensions[3])
-
-   Returns:
-   -------
-   Z_OK  if supplying maximum data
-   Z_ERR if not supplying maximum data, or some error occurred
-           while trying to obtain it.
-
-   Arguments:
-   ---------
-   (OUT) max_number_of_nodes    = Maximum number of unstructured nodes
-                                  in the part (over all time).
- 
-                                   (Array will have been allocated
-                                    Numparts_available long)
-
-   (OUT) max_number_of_elements = 2D array containing maximum number of
-                                  each type of element for each
-                                  unstructured model part (over all time).
-                                  ------------
-                                  Possible types are:
-
-                                Z_POINT   =  point
-                                Z_BAR02   =  2-noded bar
-                                Z_BAR03   =  3-noded bar
-                                Z_TRI03   =  3-noded triangle
-                                Z_TRI06   =  6-noded triangle
-                                Z_QUA04   =  4-noded quadrilateral
-                                Z_QUA08   =  8-noded quadrilateral
-                                Z_TET04   =  4-noded tetrahedron
-                                Z_TET10   = 10-noded tetrahedron
-                                Z_PYR05   =  5-noded pyramid
-                                Z_PYR13   = 13-noded pyramid
-                                Z_PEN06   =  6-noded pentahedron
-                                Z_PEN15   = 15-noded pentahedron
-                                Z_HEX08   =  8-noded hexahedron
-                                Z_HEX20   = 20-noded hexahedron
-
-                                Z_G_POINT =  ghost node point element
-                                Z_G_BAR02 =  2 node ghost bar
-                                Z_G_BAR03 =  3 node ghost bar
-                                Z_G_TRI03 =  3 node ghost triangle
-                                Z_G_TRI06 =  6 node ghost triangle
-                                Z_G_QUA04 =  4 node ghost quad
-                                Z_G_QUA08 =  8 node ghost quad
-                                Z_G_TET04 =  4 node ghost tetrahedron
-                                Z_G_TET10 = 10 node ghost tetrahedron
-                                Z_G_PYR05 =  5 node ghost pyramid
-                                Z_G_PYR13 = 13 node ghost pyramid
-                                Z_G_PEN06 =  6 node ghost pentahedron
-                                Z_G_PEN15 = 15 node ghost pentahedron
-                                Z_G_HEX08 =  8 node ghost hexahedron
-                                Z_G_HEX20 = 20 node ghost hexahedron
-
-                               (Ignored unless Z_UNSTRUCTURED type)
-
-                                  (Array will have been allocated
-                                   Numparts_available by
-                                   Z_MAXTYPE long)
-
-   (OUT) max_ijk_dimensions  = 2D array containing maximum ijk dimensions
-                               for each structured model part (over all time).
-                                           ----------
-                                (Ignored if Z_UNSTRUCTURED type)
-
-                                (Array will have been allocated
-                                 Numparts_available by 3 long)
-
-                             max_ijk_dimensions[][0] = maximum I dimension
-                             max_ijk_dimensions[][1] = maximum J dimension
-                             max_ijk_dimensions[][2] = maximum K dimension
-
-   Notes:
-   -----
-   * You need to have first called USERD_get_number_of_model_parts and
-     USERD_get_gold_part_build_info, so Numparts_available is known and
-     so EnSight will know what the type is (Z_UNSTRUCTURED, Z_STRUCTURED,
-     or Z_IBLANKED) of each part.
-
-   * This will NOT be based on Current_time_step - it is to be the maximum
-     values over all time!!
-
-   * This information is optional.  If you return Z_ERR, Ensight will still
-     process things fine, reallocating as needed, etc.  However, for
-     large transient models you will likely use considerably more memory
-     and take more processing time for the memory reallocations. So, if it
-     is possible to provide this information "up front", it is recommended
-     to do so.
-
-
---------------------------------------------------------------------
-USERD_get_model_extents
-
-   Description:
-   -----------
-   Gets the model bounding box extents.  If this routine supplys them
-   EnSight will not have to spend time doing so.  If this routine
-   returns Z_ERR, EnSight will have to take the time to touch all the
-   nodes and gather the extent info.
-
-   Specification:
-   -------------
-   int USERD_get_model_extents(float extents[6])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful  (whereupon EnSight will determine by reading
-                             all coords of all parts)
-
-   Arguments:
-   ---------
-   (OUT) extents[0]   = min x
-                [1]   = max x
-                [2]   = min y
-                [3]   = max y
-                [4]   = min z
-                [5]   = max z
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_name_of_reader
-
-   Description:
-   -----------
-   Gets the name of your user defined reader.  The user interface will
-   ask for this and include it in the available reader list.
-
-   Specification:
-   -------------
-   int USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-				int *two_fields)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) reader_name          = the name of the your reader or data format.
-                              (max length is Z_MAX_USERD_NAME, which is 20)
-
-   (OUT) two_fields          = FALSE if only one data field is      
-                                      required.                      
-                                TRUE if two data fields required     
- 
-                                -1   if one field (Geom) required 
-                                     and one field (Param) is optional
-                                     Param field can contain any text
-                                     for example a file name, modifiers,
-                                     etc. that can be used to modify the
-                                     reader's behavior.
- 
-
-   Notes:
-   -----
-   * Always called.  Please be sure to provide a name for your custom
-     reader format.
-
---------------------------------------------------------------------
-USERD_get_nfaced_conn
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided faces of nfaced elements
-
-   Specification:
-   -------------int
-   int USERD_get_nfaced_conn(int part_number,
-                             int *nfaced_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number        = the part number
-
-   (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of nfaced
-                              elements
-
-                              (int array will have been allocated long enough to
-                               hold all the nsided face connectivities. Which is
-                               the sum of all the nodes per face values in the
-                               nfaced_npf_array of USERD_get_nfaced_nodes_per_face)
-
-   Notes:
-   -----
- * Will not be called unless there are some nfaced elements in the part
-
- * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In USERD_get_faced_nodes_per_face:     |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In this function:                            |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
---------------------------------------------------------------------
-USERD_get_nfaced_nodes_per_face -
-
-   Description:
-   -----------
-   Gets the array containing the number of nodes per face for each face
-   of the nfaced elements.
-
-   Specification:
-   -------------
-   int USERD_get_nfaced_nodes_per_face(int part_number,
-                                       int *nfaced_npf_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number       = the part number
-
-   (OUT) nfaced_npf_array  = 1D array of nodes per face for all faces of
-                             nfaced elements
-
-                             (int array will have been allocated long enough
-                              to hold all the nodes_per_face values. Which is
-                              the sum of all the number of faces per element
-                              values in the conn_array of
-                              USERD_get_part_elements_by_type)
-
-   Notes:
-   -----
-   * Will not be called unless there are some nfaced elements in the
-     the part
-
-   * Providing nfaced information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nfaced
-        polyhedral elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of faces per nfaced element. (as if connectivity
-        length of an nfaced element is one)
-
-     3. In this routine, provide the streamed number of nodes per face
-        for each of the faces of the nfaced elements.
-
-
-     Simple example:         11        10   12
-                            +--------+-----+
-     2 nfaced elements:    /|        |\   /|
-     (1 7-faced           / |        | \ / |
-      1 5-sided)         /  |        |  +9 |
-                        /   |        | /|  |
-                       /7   |      8 /  |  |
-                      +-----------+/ |  |  |
-                      |     |5    |  |4 |  |6
-                      |     +-----|--+--|--+
-                      |    /      |   \ | /
-                      |   /       |    \|/3
-                      |  /        |     +
-                      | /         |    /
-                      |/1         |2 /
-                      +-----------+/
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NFACED] = 2
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      2 x 1
-          for element_type of Z_NFACED:
-              conn_array[0][0] = 7           (for the 7-faced element)
-              conn_array[1][0] = 5           (for the 5-faced element)
-
-                                ==
-                           Sum  12    <---------+
-                                                |
-      3. In this routine:                       |
-           length of nfaced_npf_array will be:  12
-
-            nfaced_npf_array[0]  = 5  (5-noded top face of 7-faced element)
-            nfaced_npf_array[1]  = 5  (5-noded bot face of 7-faced element)
-            nfaced_npf_array[2]  = 4  (4-noded front face of 7-faced element)
-            nfaced_npf_array[3]  = 4  (4-noded left face of 7-faced element)
-            nfaced_npf_array[4]  = 4  (4-noded back face of 7-faced element)
-            nfaced_npf_array[5]  = 4  (4-noded right front face of 7-faced element)
-            nfaced_npf_array[6]  = 4  (4-noded right back face of 7-faced element)
-
-            nfaced_npf_array[7]  = 3  (3-noded top face of 5-faced element)
-            nfaced_npf_array[8]  = 3  (3-noded bot face of 5-faced element)
-            nfaced_npf_array[9]  = 4  (4-noded back face of 5-faced element)
-            nfaced_npf_array[10] = 4  (4-noded right face of 5-faced element)
-            nfaced_npf_array[11] = 4  (4-noded left front face of 5-faced element)
-
-                                   ==
-                             Sum   48   <-------------+
-                                                      |
-      4. In USERD_get_nfaced_conn:                    |
-            length of the nfaced_conn_array will be:  48
-
-            nsided_conn_array[0] = 7   (conn of 5-noded top face of 7-faced elem)
-            nsided_conn_array[1] = 8
-            nsided_conn_array[2] = 9
-            nsided_conn_array[3] = 10
-            nsided_conn_array[4] = 11
-
-            nsided_conn_array[5] = 1   (conn of 5-noded bot face of 7-faced elem)
-            nsided_conn_array[6] = 5
-            nsided_conn_array[7] = 4
-            nsided_conn_array[8] = 3
-            nsided_conn_array[9] = 2
-
-            nsided_conn_array[10] = 1  (conn of 4-noded front face of 7-faced elem)
-            nsided_conn_array[11] = 2
-            nsided_conn_array[12] = 8
-            nsided_conn_array[13] = 7
-
-            nsided_conn_array[14] = 5  (conn of 4-noded left face of 7-faced elem)
-            nsided_conn_array[15] = 1
-            nsided_conn_array[16] = 7
-            nsided_conn_array[17] = 11
-
-            nsided_conn_array[18] = 4  (conn of 4-noded back face of 7-faced elem)
-            nsided_conn_array[19] = 5
-            nsided_conn_array[20] = 11
-            nsided_conn_array[21] = 10
-
-            nsided_conn_array[22] = 2  (conn of 4-noded right front face of 7-faced)
-            nsided_conn_array[23] = 3
-            nsided_conn_array[24] = 9
-            nsided_conn_array[25] = 8
-
-            nsided_conn_array[26] = 3  (conn of 4-noded right back face of 7-faced)
-            nsided_conn_array[27] = 4
-            nsided_conn_array[28] = 10
-            nsided_conn_array[29] = 9
-
-            nsided_conn_array[30] = 9  (conn of 3-noded top face of 5-faced elem)
-            nsided_conn_array[32] = 12
-            nsided_conn_array[32] = 10
-
-            nsided_conn_array[33] = 3  (conn of 3-noded bot face of 5-faced elem)
-            nsided_conn_array[34] = 4
-            nsided_conn_array[35] = 6
-
-            nsided_conn_array[36] = 6  (conn of 4-noded back face of 5-faced elem)
-            nsided_conn_array[37] = 4
-            nsided_conn_array[38] = 10
-            nsided_conn_array[39] = 12
-
-            nsided_conn_array[40] = 3  (conn of 4-noded right face of 5-faced elem)
-            nsided_conn_array[41] = 6
-            nsided_conn_array[42] = 12
-            nsided_conn_array[43] = 9
-
-            nsided_conn_array[44] = 4  (conn of 4-noded left front face of 5-faced)
-            nsided_conn_array[45] = 3
-            nsided_conn_array[46] = 9
-            nsided_conn_array[47] = 10
-
-
-
-
---------------------------------------------------------------------
-USERD_get_node_label_status
-
-   Description:
-   -----------
-   Answers the question as to whether node labels will be provided.
-
-   Specification:
-   -------------
-   int USERD_get_node_label_status( void )
-
-   Returns:
-   -------
-   TRUE        if node labels will be provided
-   FALSE       if node labels will NOT be provided
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Node ids are needed in order to do any node querying, or node
-     labeling on-screen within EnSight.
-
-   * Prior to API 2.01:
-     -----------------
-       For unstructured parts, you can read them from your file if
-       available, or can assign them, etc. They need to be unique
-       per part, and are often unique per model.  They must also be
-       positive numbers greater than zero.
-
-         USERD_get_part_node_ids is used to obtain the ids, if the
-         status returned here is TRUE.
-
-         (Unlike API 1.0, where the connectivity of elements had to be
-          according to the node ids - API 2.0's element connectivities
-          are not affected either way by the status here.)
-
-       For structured parts, EnSight will assign ids if you return a
-         status of TRUE here.  You cannot assign them yourself!!
-
-   * Starting at API 2.01:
-     --------------------
-       For both unstructured and structured parts, you can read them
-       from your file if available, or can assign them, etc. They need
-       to be unique per part, and are often unique per model. They must
-       also be positive numbers greater than zero.
-
-       USERD_get_part_node_ids is used to obtain the ids, if the
-       status returned here is TRUE.
-
-   * Will call USERD_get_part_node_ids for each part if this routine
-     returns TRUE.
-
---------------------------------------------------------------------
-USERD_get_nsided_conn -
-
-   Description:
-   -----------
-   Gets the array containing the connectivity of nsided elements
-
-   Specification:
-   -------------
-   int USERD_get_nsided_conn(int part_number,
-                             int *nsided_conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number         = the part number
-
-   (OUT) nsided_conn_array   = 1D array of nsided connectivies
-
-                               (int array will have been allocated long enough
-                                to hold all the nsided connectivities. Which is
-                                the sum of all the nodes_per_element values in
-                                the conn_array of USERD_get_part_elements_by_type)
-
-
-   Notes:
-   -----
-   * Will not be called unless there are some nsided elements in the the part.
-
-   * Providing nsided information to Ensight:
-
-     1. In USERD_get_gold_part_build_info, provide the number of nsided
-        elements in the part.
-
-     2. In USERD_get_part_elements_by_type, provide (in the conn_array),
-        the number of nodes per nsided element. (as if connectivity
-        length of an nsided element is one)
-
-     3. In this routine, provide the streamed connectivities for each of the
-        nsided elements.
-
-
-     Simple example:         5        6
-                            +--------+
-     3 nsided elements:    /|         \
-     (1 4-sided           / |          \
-      1 3-sided          /  |           \
-      1 7-sided)        /   |            \ 7
-                       /3   |4            +
-                      +-----+             |
-                      |     |             |
-                      |     |             |8
-                      |     |             +
-                      |     |            /
-                      |     |           /
-                      |     |          /
-                      |1    |2        /9
-                      +-----+--------+
-
-      1. In USERD_get_gold_part_build_info:
-              number_of_elements[Z_NSIDED] = 3
-                                             .
-                                            /|\
-                                             |
-      2. In USERD_get_part_elements_by_type:
-          length of conn_array will be:      3 x 1
-
-          for element_type of Z_NSIDED:
-              conn_array[0][0] = 4           (for the 4-sided element)
-              conn_array[1][0] = 3           (for the 3-sided element)
-              conn_array[2][0] = 7           (for the 7-sided element)
-
-                           Sum  ===
-                                 14    <---------+
-                                                 |
-      3. In this routine:                        |
-           length of nsided_conn_array will be:  14
-
-              nsided_conn_array[0]  = 1      (connectivity of 4-sided element)
-              nsided_conn_array[1]  = 2
-              nsided_conn_array[2]  = 4
-              nsided_conn_array[3]  = 3
-
-              nsided_conn_array[4]  = 3      (connectivity of 3-sided element)
-              nsided_conn_array[5]  = 4
-              nsided_conn_array[6]  = 5
-
-              nsided_conn_array[7]  = 2      (connectivity of 7-sided element)
-              nsided_conn_array[8]  = 9
-              nsided_conn_array[9]  = 8
-              nsided_conn_array[10] = 7
-              nsided_conn_array[11] = 6
-              nsided_conn_array[12] = 5
-              nsided_conn_array[13] = 4
-
-
-
-
---------------------------------------------------------------------
-USERD_get_num_of_time_steps
-
-   Description:
-   -----------
-   Gets the number of time steps of data available for desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_num_of_time_steps( int timeset_number )
-
-   Returns:
-   -------
-   Number of time steps in timeset  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   (IN) timeset number = the timeset number
-
-                         For example: If USERD_get_number_of_timesets
-                                      returns 2, the valid
-                                      timeset_number's would be 1 and 2
-
-   Notes:
-   -----
-   * This should be >= 1       1 indicates a static model
-                              >1 indicates a transient model
-
-   * Num_time_steps[timeset_number] would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_files_in_dataset
-
-   Description:
-   -----------
-   Get the total number of files in the dataset.  Used for the
-   dataset query option within EnSight.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_files_in_dataset( void )
-
-   Returns:
-   -------
-   The total number of files in the dataset.
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * You can be as complete as you want about this.  If you don't
-     care about the dataset query option, return a value of 0
-     If you only want certain files, you can just include them. But,
-     you will need to supply the info in USERD_get_dataset_query_file_info
-     for each file you include here.
-
-   * Num_dataset_files would be set here
-
-
---------------------------------------------------------------------
-USERD_get_number_of_material_sets -
-
-   Description:
-   -----------
-   Get the number of material sets in the model
-
-   Specification:
-   -------------
-   int USERD_get_number_of_material_sets( void )
-
-
-   Returns:
-   -------
-   Num_material_sets = number of material sets
-                       (Zero would indicate that you have no materials
-                        to deal with in the model)
-
-                       or
-
-                       -1 if an error condition
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-  * You may want to keep this as a global for use in other routines.
-
-   ###############################################################
-   NOTE:  For EnSight 7.6, only one material set is supported
-          within EnSight.
-          Thus the only valid returns here are:
-               0 (no materials)
-               1 (for the one material set allowed)
-          or  -1 (if an error)
-
-          If the casefile has more than this, this reader will
-          read them, but EnSight will issue an error message and
-          choke on them!
-   ###############################################################
-
-  ================================================================
-  A very simple explanatory example, to use as a reference for the
-  materials routines:
-
-  Given a 2D mesh composed of 9 quad (Z_QUA04) elements, with two materials.
-  Most of the model is material 1, but the top left corner is material 9 -
-  basically as shown:
-
-
-        *--------*--------*--------*
-        |        |   /    |        |
-        |     Mat 9 /     |        |
-        |        | /      |        |
-        |        |/       |        |
-        |  e7    /   e8   |   e9   |
-        |       /|        |        |
-        |      / |        |        |
-        |     /  |        |        |
-        *----/---*--------*--------*
-        |   /    |        |        |
-        |  /     |        |        |
-        | /      |      Mat 1      |
-        |/       |        |        |
-        |   e4   |   e5   |   e6   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        |   e1   |   e2   |   e3   |
-        |        |        |        |
-        |        |        |        |
-        |        |        |        |
-        *--------*--------*--------*
-
-
-  Thus, in this routine, set:
-    Num_material_sets = 1
-
-  In USERD_get_matf_set_info, set:
-    mat_set_ids[0]    = 1
-    mat_set_name[0]   = "Material Set 1"  (or whatever name desired)
-
-  In USERD_get_number_of_materials, input would be set_index = 0, and
-  would need to set:
-    Num_materials[0] = 2
-
-  For simplicity, the ids and descriptions that would be returned in
-  USERD_get_matf_var_info could be:
-    mat_ids[0] = 1
-    mat_ids[1] = 9
-    mat_desc[0] = "mat 1"   (or whatever desired)
-    mat_desc[2] = "mat 9"
-
-  The per element material ids list would need to be:
-
-     material ids:
-     -------------
-     ids_list[0] = 1  (material id 1, for elem e1)
-     ids_list[1] = 1  (     "                  e2)
-     ids_list[2] = 1  (     "                  e3)
-     ids_list[3] = -1 (negative of index into mixed-material id list, for elem e4)
-     ids_list[5] = 1  (material id 1, for elem e5)
-     ids_list[5] = 1  (     "                  e6)
-     ids_list[5] = -5 (negative of index into mixed-material id list, for elem e7)
-     ids_list[5] = -9 (     "                  e8)
-     ids_list[5] = 1  (material id 1, for elem e9)
-
-  Finally we need the mixed material ids list and the mixed materials values list,
-  which would need to be:
-
-       mixed-material ids:
-       -------------------
-   ==> 1  ids_list[0]  =  2  (the -1 in the material variable points here,
-                                      2 indicates that two materials are present)
-       2  ids_list[1]  =  1  (1st material is 1)
-       3  ids_list[2]  =  9  (2nd material is 9)
-       4  ids_list[3]  = -1  (negative of index into mixed-material val_list)
-   ==> 5  ids_list[4]  =  2  (the -5 in the material variable points here,
-                                      2 indicates that two materials are present)
-       6  ids_list[5]  =  1  (1st material is 1)
-       7  ids_list[6]  =  9  (2nd material is 9)
-       8  ids_list[7]  = -3  (negative of index into mixed-material val_list)
-   ==> 9  ids_list[8]  =  2     etc.
-       10 ids_list[9]  =  1
-       11 ids_list[10] =  9
-       12 ids_list[11] = -5
-
-       mixed-material values:
-       ----------------------
-   ==> 1 val_list[0] = 0.875 (the -1 in the  mixed-material ids_list points here,
-                                       and this is the value for material 1)
-       2 val_list[1] = 0.125 (the value for material 9)
-   ==> 3 val_list[2] = 0.125 (the -3 in the mixed-materials ids_list points here)
-       4 val_list[3] = 0.875
-   ==> 5 val_list[4] = 0.875 (the -5 in the mixed-materials ids_list points here)
-       6 val_list[5] = 0.125
-
-  So, USERD_size_matf_data would need to return
-       matf_size = 8, when called with set_id    = 1
-                                       part_id   = 1
-                                       wtyp      = Z_QUA04
-                                       mat_type  = Z_MAT_INDEX
-
-       matf_size = 12, when called with set_id   = 1
-                                        part_id  = 1
-                                        mat_type = Z_MIX_INDEX
-
-                 = 6, when called with set_id   = 1
-                                       part_id  = 1
-                                       mat_type = Z_MIX_VALUE
-
-  And, USERD_load_matf_data would need to return:
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       wtyp     = Z_QUA04
-       mat_type = Z_MAT_INDEX (indicating id list).
-
-    the int array ids_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_INDEX (indicating id list).
-
-    the float array val_list as shown above when called with:
-       set_id   = 1
-       part_id  = 1
-       mat_type = Z_MIX_VALUE (indicating val list).
-
-
--------------------------------------------------------------------------
-USERD_get_number_of_materials
-
-   Description:
-   -----------
-   Gets the number of materials in the material set
-
-   Specification:
-   -------------
-   int USERD_get_number_of_materials( int set_index )
-
-   Returns:
-   -------
-   Num_materials[set_index]   = Number of materials in the set
-                                 0 indicates no materials information present
-                                -1 indicates an error
-   Arguments:
-   ---------
-   (IN) set_index             = the material set index (zero based)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero
-  * You may want to keep this as a global for use in other routines.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_model_parts
-
-   Description:
-   -----------
-   Gets the total number of unstructured and structured parts
-   in the model, for which you can supply information.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_model_parts( void )
-
-   Returns:
-   -------
-   Number of parts  (>0 if okay, <=0 if problems).
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * If going to have to read down through the parts in order to
-     know how many, you may want to build a table of pointers to
-     the various parts, so you can easily get to particular parts in
-     later processes.  If you can simply read the number of parts
-     at the head of the file, then you would probably not build the
-     table at this time.
-
-   * This routine would set Numparts_available, which is equal to
-     Num_unstructured_parts + Num_structured_blocks.
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_timesets
-
-   Description:
-   -----------
-    Gets the number of timesets used in the model.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_timesets( void )
-
-   Returns:
-   -------
-   Number of timesets in the model
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Num_timesets would be set here
-
-   * If you have a static model, both geometry and variables, you should
-     return a value of zero.
- 
-   * If you have a transient model, then you should return one or more.
- 
-   For example:
- 
-      Geometry    Variables                                 No. of timesets
-      ---------   ------------------------------            ---------------
-      static      static                                      0
-      static      transient, all using same timeset           1
- 
-      transient   transient, all using same timeset as geom   1
- 
-      static      transient, using 3 different timesets       3
- 
-      transient   transient, using 3 different timesets and
-                             none of them the same as the
-                             geometry timeset                 4
-          etc.
- 
-   NOTE: ALL GEOMETRY MUST USE THE SAME TIMESET!!! You will have to provide
-                                                   the timeset number to use
-                                                   for geometry in:
-                                               USERD_get_geom_timeset_number
- 
-         Variables can use the same timeset as the geometry, or can use
-         other timesets. More than one variable can use the same timeset.
- 
-   example:  changing geometry at 5 steps, 0.0, 1.0, 2.0, 3.0, 4.0
-             variable 1 provided at these same five steps
-             variable 2 provided at 3 steps, 0.5, 1.25, 3.33
- 
-        This routine should return a value of 2, because only
-        two different timesets are needed. Timeset 1 would be for the
-        geometry and variable 1 (they both use it). Timeset 2 would
-        be for variable 2, which needs its own in this case.
-
-
-
-
-
---------------------------------------------------------------------
-USERD_get_number_of_variables
-
-   Description:
-   -----------
-   Get the number of variables for which you will be providing info.
-
-   Specification:
-   -------------
-   int USERD_get_number_of_variables( void )
-
-   Returns:
-   -------
-   Number of variables (includes constant, scalar, vector and tensor types)
-                       (>=0 if okay, <0 if problem)
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-    *****************************************************************
-   * Variable numbers, by which references will be made, are implied
-     here. If you say there are 3 variables, the variable numbers
-     will be 1, 2, and 3.
-    *****************************************************************
-
-   * Num_variables would be set here
-
-
-
---------------------------------------------------------------------
-USERD_get_part_coords
-
-   Description:
-   -----------
-   Gets the coordinates for an unstructured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_coords(int part_number, float **coord_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) coord_array             = 2D float array which contains,
-                                   x,y,z coordinates of each node
-                                   in the part.
-
-       (IMPORTANT: The second dimension of this aray is 1-based!!!)
-
-                                (Array will have been allocated
-                                 3 by (number_of_nodes + 1) for the part
-                                 long - see USERD_get_gold_part_build_info)
-
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             coord_array[3][101]
-
-                           Ignore the coord_array[0][0]
-                                      coord_array[1][0]
-                                      coord_array[2][0] locations and start
-                           the node coordinates at:
-                             coord_array[0][1]
-                             coord_array[1][1]
-                             coord_array[2][1]
-
-                             coord_array[0][2]
-                             coord_array[1][2]
-                             coord_array[2][2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_element_ids_by_type
-
-   Description:
-   -----------
-   Gets the ids for the elements of a particular type for an unstructured
-   or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_element_ids_by_type(int part_number,
-                                          int element_type,
-                                          int *elemid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type            = One of the following (See global_extern.h)
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (OUT) elemid_array            = 1D array containing id of each
-                                   element of the type.
-
-                                  (Array will have been allocated
-                                   number_of_elements of the type long)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25]   when called with Z_TRI03
-
-                              conn_array[100]  when called with Z_QUA04
-
-                              conn_array[30]  when called with Z_HEX08
-
-   Notes:
-   -----
-   * Not called unless element label status is set to TRUE in
-     USERD_get_element_label_status
-
-   * Will be based on Current_time_step
-
-
-
---------------------------------------------------------------------
-USERD_get_part_elements_by_type
-
-   Description:
-   -----------
-   Gets the connectivities for the elements of a particular type in an
-   unstructured part
-
-   Specification:
-   -------------
-   int USERD_get_part_elements_by_type(int part_number,
-                                       int element_type,
-                                       int **conn_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number           = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (IN)  element_type          = One of the following (See global_extern.h)
-                                 Z_POINT      node point element
-                                 Z_BAR02      2 node bar
-                                 Z_BAR03      3 node bar
-                                 Z_TRI03      3 node triangle
-                                 Z_TRI06      6 node triangle
-                                 Z_QUA04      4 node quad
-                                 Z_QUA08      8 node quad
-                                 Z_TET04      4 node tetrahedron
-                                 Z_TET10     10 node tetrahedron
-                                 Z_PYR05      5 node pyramid
-                                 Z_PYR13     13 node pyramid
-                                 Z_PEN06      6 node pentahedron
-                                 Z_PEN15     15 node pentahedron
-                                 Z_HEX08      8 node hexahedron
-                                 Z_HEX20     20 node hexahedron
-
-                                 Z_G_POINT    ghost node point element
-                                 Z_G_BAR02    2 node ghost bar
-                                 Z_G_BAR03    3 node ghost bar
-                                 Z_G_TRI03    3 node ghost triangle
-                                 Z_G_TRI06    6 node ghost triangle
-                                 Z_G_QUA04    4 node ghost quad
-                                 Z_G_QUA08    8 node ghost quad
-                                 Z_G_TET04    4 node ghost tetrahedron
-                                 Z_G_TET10   10 node ghost tetrahedron
-                                 Z_G_PYR05    5 node ghost pyramid
-                                 Z_G_PYR13   13 node ghost pyramid
-                                 Z_G_PEN06    6 node ghost pentahedron
-                                 Z_G_PEN15   15 node ghost pentahedron
-                                 Z_G_HEX08    8 node ghost hexahedron
-                                 Z_G_HEX20   20 node ghost hexahedron
-
-
-   (OUT) conn_array            = 2D array containing connectivity
-                                 of each element of the type.
-
-                                (Array will have been allocated
-                                 num_of_elements of the type by
-                                 connectivity length of the type)
-
-                       ex) If number_of_elements[Z_TRI03] = 25
-                              number_of_elements[Z_QUA04] = 100
-                              number_of_elements[Z_HEX08] = 30
-                           as obtained in:
-                            USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions available
-                           for this routine will be:
-                              conn_array[25][3]   when called with Z_TRI03
-
-                              conn_array[100][4]  when called with Z_QUA04
-
-                              conn_array[30][8]   when called with Z_HEX08
-   
-   Notes:
-   -----
-   * Not called unless Num_unstructured_parts is > 0
-
-   * Will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_get_part_node_ids
-
-   Description:
-   -----------
-   Gets the node ids of an unstructured or structured part.
-
-   Specification:
-   -------------
-   int USERD_get_part_node_ids(int part_number, int *nodeid_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  part_number             = The part number
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-   (OUT) nodeid_array            = 1D array containing node ids of
-                                    each node in the part.
-
-           (IMPORTANT: This array is 1-based!!!)
-
-                                   (Array will have been allocated
-                                    (number_of_nodes + 1) for the part long
-                                    see USERD_get_gold_part_build_info)
-
-                       ex) If number_of_nodes = 100
-                           as obtained in:
-                             USERD_get_gold_part_build_info
-
-                           Then the allocated dimensions of the
-                           pointer sent to this routine will be:
-                             nodeid_array[101]
-
-                           Ignore the nodeid_array[0] location and start
-                           the node ids at:
-                             nodeid_array[1]
-
-                             nodeid_array[2]
-
-                                   etc.
-
-   Notes:
-   -----
-   * Not called unless node label status is TRUE, as returned from
-     USERD_get_node_label_status
-
-   * Will be based on Current_time_step
-
-   * The ids are purely labels, used when displaying or querying node ids.
-     However, any node id < 0 will never be displayed
-
-
---------------------------------------------------------------------
-USERD_get_reader_descrip
-
-   Description:
-   -----------
-   Gets the description of the reader, so gui can give more info
-
-   Specification:
-   -------------
-   int USERD_get_reader_descrip(char descrip[Z_MAXFILENP])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) descrip  = the description of the reader (max length is MAXFILENP,
-                                                   which is 255)
-
-   Notes:
-   -----
-   * OPTIONAL ROUTINE!   You can have it or not.
-
-
-
---------------------------------------------------------------------
-USERD_get_reader_version
-
-   Description:
-   -----------
-   Gets the version number of the user defined reader
-
-   Specification:
-   -------------
-   int USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful (and will assume is version 1.0)
-
-   Arguments:
-   ---------
-   (OUT) version_number       = the version number of the reader
-                                (max length is Z_MAX_USERD_NAME, which
-                                 is 20)
-
-   Notes:
-   -----
-   * This needs to be "2.000" or greater. Otherwise EnSight will assume
-     this reader is API 1.0
-
-   * should set it to "2.010" for this version of the API
-
-
-
-
---------------------------------------------------------------------
-USERD_get_sol_times
-
-   Description:
-   -----------
-   Get the solution times associated with each time step for 
-   desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_sol_times(int timeset_number,
-                           float *solution_times)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) solution_times       = 1D array of solution times per time step
-
-                                  (Array will have been allocated
-                                   Num_time_steps[timeset_number] long)
-
-   Notes:
-   -----
-   * The solution times must be non-negative and increasing.
-
-
-
---------------------------------------------------------------------
-USERD_get_timeset_description -
-
-   Description:
-   -----------
-   Get the description to associate with the desired timeset.
-
-   Specification:
-   -------------
-   int USERD_get_timeset_description(int timeset_number,
-                                     char timeset_description[Z_BUFL])
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  timeset_number     = the timeset number
- 
-                              For example: If USERD_get_number_of_timesets
-                                           returns 2, the valid
-                                           timeset_number's would be 1 and 2
-
-   (OUT) timeset_description  = timeset description string
-
-
-   Notes:
-   -----
-   * A string of NULLs is valid for timeset_description
-
-
-
-
---------------------------------------------------------------------
-USERD_get_var_by_component
-
-   Description:
-   -----------
-   Gets the values of a variable component.  Both unstructured and structured
-   parts use this routine.
-
-   if Z_PER_NODE:
-     Get the component value at each node for a given variable in the part.
-
-   or if Z_PER_ELEM:
-     Get the component value at each element of a specific part and type
-     for a given variable.
-
-   Specification:
-   -------------
-   int USERD_get_var_by_component(int which_variable,
-                                  int which_part,
-                                  int var_type,
-                                  int which_type,
-                                  int imag_data,
-                                  int component,
-                                  float *var_array)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   or:  Z_UNDEF, in which case you need not load any values into var_array
-
-
-   Arguments:
-   ---------
-   (IN)  which_variable          = The variable number
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-   (IN)  var_type                = Z_SCALAR
-                                   Z_VECTOR
-                                   Z_TENSOR   (symmetric tensor)
-                                   Z_TENSOR9  (asymmetric tensor)
-
-   (IN)  which_type
-
-            if Z_PER_NODE:         Not used
-
-            if Z_PER_ELEM:       = The element type
-                                   Z_POINT      node point element
-                                   Z_BAR02      2 node bar
-                                   Z_BAR03      3 node bar
-                                   Z_TRI03      3 node triangle
-                                   Z_TRI06      6 node triangle
-                                   Z_QUA04      4 node quad
-                                   Z_QUA08      8 node quad
-                                   Z_TET04      4 node tetrahedron
-                                   Z_TET10     10 node tetrahedron
-                                   Z_PYR05      5 node pyramid
-                                   Z_PYR13     13 node pyramid
-                                   Z_PEN06      6 node pentahedron
-                                   Z_PEN15     15 node pentahedron
-                                   Z_HEX08      8 node hexahedron
-                                   Z_HEX20     20 node hexahedron
-
-                                   Z_G_POINT    ghost node point element
-                                   Z_G_BAR02    2 node ghost bar
-                                   Z_G_BAR03    3 node ghost bar
-                                   Z_G_TRI03    3 node ghost triangle
-                                   Z_G_TRI06    6 node ghost triangle
-                                   Z_G_QUA04    4 node ghost quad
-                                   Z_G_QUA08    8 node ghost quad
-                                   Z_G_TET04    4 node ghost tetrahedron
-                                   Z_G_TET10   10 node ghost tetrahedron
-                                   Z_G_PYR05    5 node ghost pyramid
-                                   Z_G_PYR13   13 node ghost pyramid
-                                   Z_G_PEN06    6 node ghost pentahedron
-                                   Z_G_PEN15   15 node ghost pentahedron
-                                   Z_G_HEX08    8 node ghost hexahedron
-                                   Z_G_HEX20   20 node ghost hexahedron
-
-   (IN)  imag_data               = TRUE if imag component
-                                   FALSE if real component
- 
-   (IN)  component               = The component: (0       if Z_SCALAR)
-                                                  (0 - 2   if Z_VECTOR)
-                                                  (0 - 5   if Z_TENSOR)
-                                                  (0 - 8   if Z_TENSOR9)
- 
-                                 * 6 Symmetric Indicies, 0:5    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = |    22 23 | = |   1 5 | *
-                                 *     |          |   |       | *
-                                 *     |       33 |   |     2 | *
- 
-
-                                 * 9 General   Indicies, 0:8    *
-                                 * ---------------------------- *
-                                 *     | 11 12 13 |   | 0 3 4 | *
-                                 *     |          |   |       | *
-                                 * T = | 21 22 23 | = | 6 1 5 | *
-                                 *     |          |   |       | *
-                                 *     | 31 32 33 |   | 7 8 2 | *
-
-   (OUT) var_array 
-
-      -----------------------------------------------------------------------
-      (IMPORTANT: this array is 1-based for both Z_PER_NODE and Z_PER_ELEM!!!)
-      -----------------------------------------------------------------------
-
-            if Z_PER_NODE:    = 1D array containing variable component value
-                                for each node.
-
-                                (Array will have been allocated
-                                 (number_of_nodes + 1) long)
-
-                      Info stored in this fashion:
-                            var_array[0] = not used
-                            var_array[1] = var component for node 1 of part
-                            var_array[2] = var_component for node 2 of part
-                            var_array[3] = var_component for node 3 of part
-                            etc.
-
-            if Z_PER_ELEM:    = 1D array containing variable component
-                                value for each element of a particular
-                                part and type.
-                                    
-                              (Array will have been allocated
-                               (number_of_elements[which_part][which_type] + 1)
-                                long.  See USERD_get_gold_part_build_info)
-
-                  Info stored in this fashion:
-                    var_array[1] = var component for elem 1 (of part and type)
-                    var_array[2] = var component for elem 2 (of part and type)
-                    var_array[3] = var component for elem 3 (of part and type)
-                    etc.
-
-   Notes:
-   -----
-   * Not called unless Num_variables is > 0
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * Will be based on Current_time_step
-
-   * If the variable is not defined for this part, simply return with a
-     value of Z_UNDEF.  EnSight will treat the variable as undefined for
-     this part.
-
-
---------------------------------------------------------------------
-USERD_get_var_value_at_specific
-
-   Description:
-   -----------
-   if Z_PER_NODE:
-     Get the value of a particular variable at a particular node in a
-     particular part at a particular time.
-
-   or if Z_PER_ELEM:
-     Get the value of a particular variable at a particular element of
-     a particular type in a particular part at a particular time.
-
-
-   Specification:
-   -------------
-   int USERD_get_var_value_at_specific(int which_var,
-                                       int which_node_or_elem,
-                                       int which_part,
-                                       int which_elem_type,
-                                       int time_step,
-                                       float values[3],
-                                       int imag_data)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN)  which_var   = The variable number
-
-   (IN)  which_node_or_elem
-
-              If Z_PER_NODE:
-                = The node number.  This is not the id, but is
-                                    the index of the global node 
-                                    list (1 based), or the block's
-                                    node list (1 based).
-
-                  Thus,  coord_array[1]
-                         coord_array[2]
-                         coord_array[3]
-                              .      |
-                              .      |which_node_or_elem index
-                              .             ----
-
-
-              If Z_PER_ELEM:
-                = The element number.  This is not the id, but is
-                                       the element number index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info),
-                                        or the block's element list (1 based).
-
-                  Thus,  for which_part:
-                         conn_array[which_elem_type][0]
-                         conn_array[which_elem_type][1]
-                         conn_array[which_elem_type][2]
-                              .                      |
-                              .          which_node_or_elem index
-                              .                        ----
-
-
-   (IN)  which_part                 Since EnSight Version 7.4
-                                    -------------------------
-                                  = The part number
-
-                                    (1-based index of part table, namely:
-
-                                       1 ... Numparts_available.
-
-                                     It is NOT the part_id that
-                                     is loaded in USERD_get_gold_part_build_info)
-
-                                    Prior to EnSight Version 7.4
-                                    ----------------------------
-                                  = The part id   This is the part_id label loaded
-                                                  in USERD_get_gold_part_build_info.
-                                                  It is NOT the part table index.
-
-
-   (IN)  which_elem_type
-
-              If Z_PER_NODE, or block part:
-                = Not used
-
-              If Z_PER_ELEM:
-                = The element type.    This is the element type index
-                                       of the number_of_element array
-                                       (see USERD_get_gold_part_build_info)
-
-   (IN)  time_step   = The time step
-
-   (IN)  imag_data   = TRUE if want imaginary value.
-                       FALSE if want real value.
-
-   (OUT) values      = scalar or vector component value(s)
-                        values[0] = scalar or vector[0]
-                        values[1] = vector[1]
-                        values[2] = vector[2]
-
-
-   Notes:
-   -----
-   * This routine is used in node querys over time (or element querys over
-     time for Z_PER_ELEM variables).  If these operations are not critical
-     to you, this can be a dummy routine.
-
-   * The per_node or per_elem classification must be obtainable from the
-     variable number (a var_classify array needs to be retained)
-
-   * The time step given is for the proper variable timeset.
-
-
-----------------------------------------------------------------------
-USERD_load_matf_data
-
-   Description:
-   -----------
-   Get the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_load_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *ids_list,
-                             float *val_list)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) ids_list          = If mat_type is Z_MAT_INDEX:
-                            ---------------------------
-                             1D material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MAT_INDEX)
-
-                            If mat_type is Z_MIX_INDEX:
-                            ---------------------------
-                             1D mixed-material id list
-                               (Int array will have been allocated
-                                the appropriate size, as returned in
-                                 USERD_size_matf_data for mat_type Z_MIX_INDEX)
-
-  (OUT) val_list          = 1D mixed-materials values list
-                            (only used if mat_type is Z_MIX_VALUE)
-
-                               (Float array will have been allocated
-                                the appropriate size, as returned in
-                                USERD_size_matf_data for mat_type Z_MIX_VALUE)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero,
-     or Num_materials[set_index] is zero,
-     or the appropriate size from USERD_size_matf_data is zero
-
-
-
---------------------------------------------------------------------
-USERD_set_filenames
-
-   Description:
-   -----------
-   Receives the geometry and result filenames entered in the data
-   dialog.  The user written code will have to store and use these
-   as needed. The user written code must manage its own files!!
-
-   Specification:
-   -------------
-   int USERD_set_filenames(char filename_1[],
-                           char filename_2[],
-                           char the_path[],
-                           int swapbytes)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (IN) filename_1   = the filename entered into the geometry
-                         field of the data dialog.
-
-   (IN) param_2      = The usage of this string depends on
-                       'two_fields' in USERD_get_name_of_reader.
- 
-                       If two_fields is FALSE then it's empty.
- 
-                       If two_fields is TRUE, this is the 
-                       manditory results file entered 
-                       into the result field of the data dialog.
- 
-                       If two_fields is -1, then this contains
-                       optional text (filenames, modifiers, etc.)
-                       that can be parsed and used to modify 
-                       reader 
-
-   (IN) the_path     = the path info from the data dialog.
-                       Note: filename_1 and filename_2 have already
-                            had the path prepended to them.  This
-                            is provided in case it is needed for
-                            filenames contained in one of the files
-
-   (IN) swapbytes    = TRUE if should swap bytes when reading data.
-                     = FALSE normally.
-
-   Notes:
-   -----
-   * Since you must manage everything from the input that is entered in
-     these data dialog fields, this is an important routine!
-
-   * It may be that you will need to have an executive type file that contains
-     info and other filenames within it, like EnSight6's case file.
-
-
---------------------------------------------------------------------
-USERD_set_server_number
-
-   Description:
-   -----------
-   Receives the server number of how many total servers.
-
-   Specification:
-   -------------
-   int USERD_set_server_number(int cur_serv,
-                               int tot_servs)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) cur_serv    = the current server.
-
-   (IN) tot_servs   = the total number of servers.
-
-   Notes:
-   -----
-   * Only useful if your user defined reader is being used with EnSight's
-     Server-of-Server capability.  And even then, it may or may not be
-     something that you can take advantage of.  If your data is already
-     partitioned in some manner, such that you can access the proper
-     portions using this information.
- 
-     For all non-SOS uses, this will simply be 1 of 1
-
-
-
---------------------------------------------------------------------
-USERD_set_time_set_and_step
-
-   Description:
-   -----------
-   Set the current time step in the desired timeset.  All functions that
-   need time, and that do not explicitly pass it in, will use the timeset
-   and step set by this routine, if needed.
-
-   Specification:
-   -------------
-   void USERD_set_time_set_and_step(int timeset_number,
-                                    int time_step)
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   (IN) timeset_number  = the timeset number (1 based).
- 
-                          For example:  If USERD_get_number_of_timesets
-                                        returns 2, the valid timeset_number's
-                                        would be 1 and 2.
-
-   (IN) time_step       = The current time step to set
-
-   Notes:
-   -----
-   * Current_time_step and Current_timeset would be set here
-
-
---------------------------------------------------------------------
-USERD_size_matf_data
-
-   Description:
-   -----------
-   Get the length of the material id list, mixed-material id list, or
-   mixed-material values list for the given material set and part (and
-   element type if material id list)
-
-   Specification:
-   -------------
-   int USERD_size_matf_data( int set_index,
-                             int part_id,
-                             int wtyp,
-                             int mat_type,
-                             int *matf_size)
-
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-  (IN)  set_index         = the material set index (zero based)
-
-  (IN)  part_id           = the part number desired
-
-  (IN)  wtyp              = the element type        (used for Z_MAT_INDEX only)
-
-                                  Z_POINT    node point element
-                                  Z_BAR02    2 node bar
-                                  Z_BAR03    3 node bar
-                                  Z_TRI03    3 node triangle
-                                  Z_TRI06    6 node triangle
-                                  Z_QUA04    4 node quad
-                                  Z_QUA08    8 node quad
-                                  Z_TET04    4 node tetrahedron
-                                  Z_TET10   10 node tetrahedron
-                                  Z_PYR05    5 node pyramid
-                                  Z_PYR13   13 node pyramid
-                                  Z_PEN06    6 node pentahedron
-                                  Z_PEN15   15 node pentahedron
-                                  Z_HEX08    8 node hexahedron
-                                  Z_HEX20   20 node hexahedron
-                                  Z_NSIDED  nsided polygon
-                                  Z_NFACED  nfaced polyhedron
-
-                                  Z_G_POINT    ghost node point element
-                                  Z_G_BAR02    2 node ghost bar
-                                  Z_G_BAR03    3 node ghost bar
-                                  Z_G_TRI03    3 node ghost triangle
-                                  Z_G_TRI06    6 node ghost triangle
-                                  Z_G_QUA04    4 node ghost quad
-                                  Z_G_QUA08    8 node ghost quad
-                                  Z_G_TET04    4 node ghost tetrahedron
-                                  Z_G_TET10   10 node ghost tetrahedron
-                                  Z_G_PYR05    5 node ghost pyramid
-                                  Z_G_PYR13   13 node ghost pyramid
-                                  Z_G_PEN06    6 node ghost pentahedron
-                                  Z_G_PEN15   15 node ghost pentahedron
-                                  Z_G_HEX08    8 node ghost hexahedron
-                                  Z_G_HEX20   20 node ghost hexahedron
-                                  Z_G_NSIDED  ghost nsided polygon
-                                  Z_G_NFACED  ghost nfaced polyhedron
-
-  (IN)  mat_type          = Z_MAT_INDEX for material ids list
-                            Z_MIX_INDEX for mixed-material ids list
-                            Z_MIX_VALUE for mixed-material values list
-
-  (OUT) matf_size         = the length of the material id list, or
-                            mixed-material id list, or
-                            mixed-material values list
-                            for the given material set and part number
-                            (and element type if Z_MAT_INDEX)
-
-   Notes:
-   -----
-  * See USERD_get_number_of_material_sets header for explanatory example
-  * Will not be called if Num_material_sets is zero, or
-     Num_materials[set_index] is zero
-
-
-
-
---------------------------------------------------------------------
-USERD_stop_part_building
-
-   Description:
-   -----------
-   This routine called when the part building dialog is closed.  It is
-   provided in case you desire to release memory, etc. that was only needed
-   during the part building process.
-
-   Specification:
-   -------------
-   void USERD_stop_part_building( void )
-
-   Returns:
-   -------
-   nothing
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-
---------------------------------------------------------------------
-USERD_rigidbody_existence
-
-   Description:
-   -----------
-   Gets the existence of rigid body values or not in the model
-
-   Specification:
-   -------------
-   int USERD_rigidbody_existence( void )
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-
-
---------------------------------------------------------------------
-USERD_rigidbody_values
-
-   Description:
-   -----------
-   Gets the rigid body values for each part
-
-   Specification:
-   -------------
-   int USERD_rigidbody_values(int part_number,
-                              float values[14])
-
-   Returns:
-   -------
-   Z_OK    if rigid body values exist for the model
-   Z_UNDEF if no rigid body values exist
-   Z_ERR   if an error
-
-   Arguments:
-   ---------
-   (IN)  part_number        = The part number
- 
-                              (1-based index of part table, namely:
- 
-                                 1 ... Numparts_available.
- 
-                               It is NOT the part_id that
-                               is loaded in USERD_get_gold_part_build_info)
- 
-   (OUT) values             values[0]  = IX   (x location)
-                            values[1]  = IY   (y location)
-                            values[2]  = IZ   (z location)
-                            values[3]  = E0   (e0 euler value)
-                            values[4]  = E1   (e1 euler value)
-                            values[5]  = E2   (e2 euler value)
-                            values[6]  = E3   (e3 euler value)
-
-                            The next 3 are for an optional cg offset. If none is
-                            needed or desired (namely the first 7 values above
-                            contain all that is needed), then these should be
-                            set to 0.0
-
-                            values[7]  = xoff   (initial cg x offset)
-                            values[8]  = yoff   (initial cg y offset)
-                            values[9]  = z0ff   (initial cg z offset)
-
-                            The next 4 values are for and optional initial yaw, pitch, roll
-                            operation.  This is useful to get parts from one
-                            standard layout to a different standard layout.
-                            (example, flex body parts computed in an axis system
-                            different than that of rigid body parts manipulation) 
-                            If not needed or desired, set these to 0.0
-
-                            values[10] = rot_order  (order the roations are applied
-                                                     0.0  = no rotations
-                                                     1.0  = xyz order
-                                                     2.0  = xzy order
-                                                     3.0  = yxz order
-                                                     4.0  = yzx order
-                                                     5.0  = zxy order
-                                                     6.0  = zyx order)
-                            values[11] = xrot   (initial x rotation - degrees)
-                            values[12] = yrot   (initial y rotation - degrees)
-                            values[13] = zrot   (initial z rotation - degrees)
-
-   Notes:
-   -----
-   * This will be based on Current_time_step
-   * It will not be called unless USERD_rigidbody_existence indicates
-       that there are some values in the model by returning Z_OK.
-   * Order that transformations will be applied is:
-           1. The yaw,pitch,roll rotations, if present  (values[11] through values[13]
-                                              in the order specified in rot_order, values[10])
-           2. The cg offsets, if present     (values[7] through values[9])
-           3. The euler parameter rotations  (values[3] through values[6])
-           4. The translations               (values[0] through values[2])
-
---------------------------------------------------------------------
-USERD_set_right_side
-
-   Description:
-   -----------
-   Informs the reader that the time currently set is the right side of a time
-   span used for variable interpolation between time steps
-
-   Specification:
-   -------------
-   void USERD_set_right_side( void )
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   none
-
-   Notes:
-   -----
-   * Applies to Current_time_step
-
-
-
-
-
-------------------------------------------------------------------
-	ENHANCED GUI ROUTINES
-
---------------------------------------------------------------------
-USERD_get_extra_gui_numbers
-
-   Description:
-   -----------
-   The Enhanced GUI routines are added to allow
-   the user to customize a portion of the Data
-   Reader dialog to pass in options to their
-   user defined reader.
-
-   Specification:
-   -------------
-   void USERD__get_extra_gui_numbers(int *num_Toggles,
-                                     int *num_pulldowns,
-                                     int *num_fields)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_extra_gui_numbers
-     USERD_get_extra_gui_defaults
-     USERD_set_extra_gui_data
-
-     The existence of these routine indicates that
-     you wish to add customize entries to the
-     Data Reader dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_extra_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_extra_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_extra_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_extra_gui_defaults(char **toggle_Title,
-                                    int *toggle_default_status,
-                                    char **pulldown_Title,
-                                    int *pulldown_number_in_list,
-                                    int *pulldown_default_selection,
-                                    char ***pulldown_item_strings,
-                                    char **field_Title,
-                                    char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_extra_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_extra_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_numbers
-
-   Description:
-   -----------
-   The Var_Extract_GUI routines are added to allow
-   the user to customize a extraction parameters
-   for variables "after" the file has been read.
-   These things can be modified and the variables will
-   be update/refreshed according to the new parameters set
-
-   Specification:
-   -------------
-   void USERD_get_var_extract_gui_numbers(int *num_Toggles,
-                                          int *num_pulldowns,
-                                          int *num_fields)
-
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (OUT) num_Toggles    = number of toggles that will be provided
-   
-         num_pulldowns  = number of pulldowns that will be provided
-
-         num_fields     = number of fields that will be provided
-
-   Notes:
-   -----
-     There are three routines that work together:
-     USERD_get_var_extract_gui_numbers
-     USERD_get_var_extract_gui_defaults (this one)
-     USERD_set_var_extract_gui_data
-
-     The existence of these routine indicates that
-     you wish to have the Var Extract Parameters dialog.
-
-     If you don't want the extra GUI features,
-     simply delete these routines, or change their
-     names to something such as
-     USERD_DISABLED_get_var_extract_gui_defaults
- 
-     The presence of these routines
-     will ensure that EnSight will call them and
-     use their data to modify the extraction parameters set
-     with some or all of the following:
-     toggles, pulldown menu and fields.
- 
-     The user can then interact with the enhanced
-     GUI and then send their choices to
-     USERD_set_extra_gui_data
-  
-     Therefore if USERD_get_var_extract_gui_numbers
-     exists then the other two must exist.
- 
-     If none exist, then the GUI will be unchanged.
- 
-     Toggle data will return an integer
-                               TRUE if checked
-                               FALSE if unchecked
- 
-     Pulldown menu will return an integer representing
-                               the menu item selected
- 
-     Field will return a string Z_LEN_GUI_FIELD_STR long.
- 
-     If all the enhanced GUI features are enabled it
-     might look something like this
-
-    ===================================================
-    [] Title 1  [X] Title 3
-    [X]Title 2  [X] Title 4
- 
-    Pulldown Menu ->
-        Menu Choice 1
-        Menu Choice 2
-        Menu Choice 3
- 
-    Data Field Title 1 ____________________________
- 
-    Data Field Title 2 ____________________________
-    =====================================================
-
-    This routine defines the numbers of toggles, pulldowns & fields
- 
-    The following are defined in the global_extern.h
-           Z_MAX_NUM_GUI_PULL_ITEMS max num GUI pulldowns
-           Z_LEN_GUI_PULL_STR  max length of GUI pulldown string
-           Z_LEN_GUI_FIELD_STR  max length of field string
-           Z_LEN_GUI_TITLE_STR   max length of title string
- 
-    The library is loaded, this routine is
-     called, then the library is unloaded.
- 
-    Do not define globals in this routine
-     as when the library is unloaded, you'll
-     lose them.
- 
-
---------------------------------------------------------------------
-USERD_get_var_extract_gui_defaults
-
-   Description:
-   -----------
-   This routine defines the Titles, status,
-   List choices, strings, etc that are fed
-   up to the GUI.
-
-   Specification:
-   -------------
-   int USERD_get_var_extract_gui_defaults(char **toggle_Title,
-                                          int *toggle_default_status,
-                                          char **pulldown_Title,
-                                          int *pulldown_number_in_list,
-                                          int *pulldown_default_selection,
-                                          char ***pulldown_item_strings,
-                                          char **field_Title,
-                                          char **field_user_string)
-
-   Returns:
-   -------
-   Z_OK  if successful
-   Z_ERR if not successful
-
-   Arguments:
-   ---------
-   (OUT) toggle_Title               = title for each toggle
-                                      array dimension is [num_toggles] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         toggle_default_status      = Setting for each toggle (TRUE or FALSE)
-                                      array dimension is [num_toggles] long 
-
-         pulldown_Title             = title for each pulldown
-                                      array dimension is [num_pulldowns] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         pulldown_number_in_list    = number of items in each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_default_selection = pulldown item selection for each pulldown
-                                      array dimension is [num_pulldowns] long 
-
-         pulldown_item_strings      = pulldown item strings
-                                      array is [num_pulldowns] by
-                                               [Z_MAX_NUM_GUI_PULL_ITEMS] by
-                                               [Z_LEN_GUI_PULL_STR] long
-
-         field_Title                = title for each field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-         field_user_string          = content of the field
-                                      array dimension is [num_fields] by
-                                                         [Z_LEN_GUI_TITLE_STR] long
-
-
-
-   Notes:
-   -----
-   * The library is loaded, this routine is called, then the library is unloaded.
- 
-   * Do not define globals in this routine as when the library is unloaded, you'll
-     lose them.
-
-
-
---------------------------------------------------------------------
-USERD_set_var_extract_gui_data
-
-   Description:
-   -----------
-   This routine sets the new values for the toggles, pulldowns, and fields.
-
-   Specification:
-   -------------
-   void USERD_set_var_extract_gui_data(
-               int *toggle,       /* [num_toggle] */
-               int *pulldown,     /* [num_pulldown] */
-               char **field_text  /* [num_fields][Z_LEN_GUI_FIELD_STR]*/)
-
-   Returns:
-   -------
-
-   Arguments:
-   ---------
-   (IN) toggle               = setting for each toggle.  TRUE or FALSE
-                               array dimension is [num_toggles] long
-
-        pulldown             = item chosen in each pulldown. (0 based)
-                               array dimension is [num_pulldowns] long
-
-        field_text           = content of the field
-                               array dimension is [num_fields] by
-                                                  [Z_LEN_GUI_TITLE_STR] long
-
-
-   Notes:
-   -----
-   * This routine is called when the library is permanently
-     loaded to the EnSight session, so define your globals
-     in this and later routines.
- 
-   * It's up to you to change your reader behavior according to
-     user entries!
-
-
-
-
-
------------------------------------------------------------------------------------
-/* ----------------------------------------------------------
- *  New in EnSight 8 is the capability to remove (fail) elements
- *   based on variable threshold values.  Basically the variable
- *   name, a couple of thresholds, a couple of values and a logic 
- *   criteria are read in from this routine.  Every element that
- *   satisfies the failure criteria is removed and not used in
- *   EnSight calculations.
- *   
- *  Example Failure criteria 
- *     Let fail_var_name = "fail_flag"
- *         threshold_val1 = 0
- *         threshold_operator1 = Z_EQUAL_TO  
- *         logic_criteria2 not used
- *         threshold_val2 not used
- *         threshold_operator2 not used
- *     For each value of "fail_flag" at each element, 
- *         if fail flag == threshold_val1 (0.0) then element fails
- *   Return (Z_ERR) if this is not used.
- *   Return (Z_OK) if failed element feature should be used
- *
- *  threshold_operator1 & 2 can be one of the following
- *    Z_ELE_FAILED_NONE,           - disables checking
- *     Z_ELE_FAILED_GREATER,        - greater than
- *     Z_ELE_FAILED_LESS,           - less than
- *     Z_ELE_FAILED_EQUAL,          - equal
- *     Z_ELE_FAILED_NOT_EQUAL,      - not equal
- *     Z_ELE_FAILED_MANY            - not used
- *
- * logic_criteria2
- *      Z_ELE_FAILED_LOGIC_NONE,
- *      Z_ELE_FAILED_LOGIC_AND,
- *      Z_ELE_FAILED_LOGIC_OR,
- *      Z_ELE_FAILED_LOGIC_MANY
- *
- * ---------------------------------------------------------- */
-int USERD_get_uns_failed_params(
-                char *fail_var_name,           /* variable name to be used in failure
-                                             must be scalar, per elem      */
-                float *threshold_val1,     /* number to compare for failure */
-                float *threshold_val2,     /* number to compare for failure */
-                int *threshold_operator1,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *threshold_operator2,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-		int *logic_criteria2
-
-
-/*--------------------------------------------------------------------
- * USERD_get_structured_reader_cinching -
- *--------------------------------------------------------------------
- *
- *  Gets whether this reader will do structured cinching for block data
- *  This means that it will handle the min, max, and step values for a
- *  given block and return the coordinate components or variable components
- *  in their "cinched" state when partial extraction or striding is used.
- *  This is as opposed to returning the entire component (ignoring min, max
- *  and stride) and letting Ensight pick out the values actually used.
- *
- *  returns: Z_OK    if the reader will handle the
- *                   min, max, and stride and return
- *                   the cinched values only.
- *
- *           Z_UNDEF or Z_ERR if will return entire component
- *                            and rely on EnSight to cinch.
- *
- * Notes:
- *  Unless you can actually pull out the desired min, max, and stride
- *  without using a full component of memory, don't enable this feature.
- *--------------------------------------------------------------------*/
-int
-USERD_get_structured_reader_cinching( void )
-
-
-
-/*--------------------------------------------------------------------
- * USERD_set_block_range_and_stride -
- *--------------------------------------------------------------------
- *
- *  Sets the min, max, and step values in each of the i, j, and k, directions
- *  for the given part.
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in
- *                                               USERD_get_gold_part_build_info)
- *
- *  (IN) mini        = min i plane desired  (zero based)
- *       maxi        = max i plane desired  (zero based)
- *       stepi       = i stride
- *       minj        = min j plane desired  (zero based)
- *       maxj        = max j plane desired  (zero based)
- *       stepj       = j stride
- *       mink        = min k plane desired  (zero based)
- *       maxk        = max k plane desired  (zero based)
- *       stepk       = k stride
- *
- *
- *  returns: Z_OK    if no problems
- *           Z_ERR   if an error
- *
- *  Notes:
- *  * It will not be called unless USERD_get_structured_reader_cinching
- *    indicates that this reader does structured cinching by returning
- *    a Z_OK.
- *
- *  * It will actually be called before each geom component and before
- *    each part variable - so if you are storing things locally, you should
- *    make this routine be able to quickly check whether anything needs
- *    updated or not.
- *
- *  * If the stride (step) does not hit right on the max, the last element
- *    in each direction will be shortened appropriately.
- *    For example, if a block had 0 to 12 in the i direction,
- *                 and the user specified min = 1
- *                                        max = 8
- *                                        step = 3
- *
- *             0   1   2   3   4   5   6   7   8   9   10  11  12
- *             |   |   |   |   |   |   |   |   |   |   |   |   |
- *
- *                 |           |           |   |
- *
- *      Namely, the coarser cell boundaries in this direction would be at 1, 4,
-7, and 8
- *
- *--------------------------------------------------------------------*/
-int
-USERD_set_block_range_and_stride(int part_number,
-                                 int mini, int maxi, int stepi,
-                                 int minj, int maxj, int stepj,
-                                 int mink, int maxk, int stepk)
-
-
-
----- end of document ----
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_IN_BUFFERS b/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_IN_BUFFERS
deleted file mode 100644
index 8b80e6a645dbc3ec0d14e7c2bcf5da86881f0827..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/README_USERD_IN_BUFFERS
+++ /dev/null
@@ -1,1447 +0,0 @@
-README_USERD_IN_BUFFERS
-========================
-Five optional routines for normal elements,
-
-  USERD_get_part_coords_in_buffers               |
-  USERD_get_part_node_ids_in_buffers             |
-  USERD_get_part_elements_by_type_in_buffers     |If any of these are implemented,
-  USERD_get_part_element_ids_by_type_in_buffers  |all 5 of them must be implemented
-  USERD_get_var_by_component_in_buffers          |
-
-
-
-one optional routine for nsided elements,
-
-  USERD_get_nsided_conn_in_buffers
-
-
-
-and one optional routine for nfaced elements,
-
-  USERD_get_nfaced_conn_in_buffers
-
-
-can be added into any API 2.* reader to be used by the 
-Unstructured Auto Distribute capability in EnSight 8.2 and later.
-
-Unstructured Auto Distribute is a capability requiring Server of Servers (SOS)
-that will partition an unstructured model for you automatically across a set of
-servers.
-
-If you do not implement the routines listed above (and described below) in your
-reader, EnSight can still perform this operation but will require much more memory on
-each server to read in the data (somewhat like each server having to read the
-whole model). You will however, get the execution advantage of having your model
-partitioned across multiple servers.
-
-If you do implement these routines in your reader (in a proper manner), you
-should be able to not only get the execution advantages, but also memory usage
-on each server which is proportional to the subset that it is assigned to deal with. 
-
-
-Note that the optional routines are functionally quite similar
-to the following functions. And thus their implementation should
-not be too difficult to add to any existing reader that has already
-implemented these:
-------------------------------------------
-USERD_get_part_coords
-USERD_get_part_node_ids
-USERD_get_part_elements_by_type
-USERD_get_part_element_ids_by_type
-USERD_get_var_by_component
-
-USERD_get_nsided_conn
-
-USERD_get_nfaced_conn
-
-
-
-Routine Details:
-================
-
-/*--------------------------------------------------------------------
- * USERD_get_part_coords_in_buffers -
- *--------------------------------------------------------------------
- *
- *   Get the coordinates for an unstructured part in buffers.
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in USERD_get_gold_part_build_info)
- *
- *  (IN)  first                   = TRUE if first invocation of a buffered set.
- *                                  Will be FALSE for all subsequent invocations
- *                                  of the set.  This is so you can open files, get to
- *                                  the correct starting spot, initialize, etc.
- *
- *  (IN) n_beg                    = Zero based, first node index
- *                                  of the buffered set
- *
- *  (IN) n_end                    = Zero based, last node index
- *                                  of the buffered set
- *                                      
- *                     Thus, for first five nodes:
- *                       n_beg = 0
- *                       n_end = 4
- *                       total_number = (n_end - n_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five nodes, would be:      
- *                       n_beg = 5
- *                       n_end = 9
- *                       total_number = (n_end - n_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all nodes of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_nodes - 1
- *
- *  (IN)  buffer_size             = The size of the buffer.
- *                                  Namely:   coord_array[3][buffer_size]
- *
- *  (OUT) coord_array             = 2D float buffer array which is set up to hold
- *                                  x,y,z coordinates of nodes.
- *
- *       (IMPORTANT: the second dimension of of this array is 0-based!!!)
- *
- *       (IMPORTANT: in the sister routine (USERD_get_part_coords) - which
- *                   does not use buffers. This array is 1-based.  So pay attention.)
- *
- *                                  (Array will have been allocated
- *                                   3 by buffer_size long
- *
- * Example, if we had a part with 645 nodes and the buffer size was set to 200
- *
- *          first invocation:
- *            first = TRUE            Will be TRUE the first time! 
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            coord_array[3][200]     fill with values for nodes 1 - 200   (zero-based)
- *            *num_returned = 200     set this
- *            return(0)               return this (indicates more to do)
- *
- *          second invocation:        which occurs because we returned a 0 last time
- *            first = FALSE           will now be FALSE
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            coord_array[3][200]     fill with values for nodes 201 - 400 (zero-based)
- *            *num_returned = 200     set this
- *            return(0)               return this (indicates more to do)
- *
- *          third invocation:         which occurs because we returned a 0 last time
- *            first = FALSE           will still be FALSE
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            coord_array[3][200]     fill with values for nodes 401 - 600 (zero-based)
- *            *num_returned = 200     set this
- *            return(0)               return this (indicates more to do)
- *
- *          fourth invocation:        which occurs because we returned a 0 last time
- *            first = FALSE           will still be FALSE
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            coord_array[3][200]     fill with values for nodes 601 - 645 (zero-based)
- *            *num_returned = 45      set this
- *            return(1)               return this (indicates done!)
- *
- *  (OUT)  *num_returned          = The number of nodes whose coordinates are returned
- *                                  in the buffer. This will normally be equal to
- *                                  buffer_size except for that last buffer -
- *                                  which could be less than a full buffer. 
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Not called unless number_of_nodes for the part > 0
- *
- *  * Again, make sure each buffer is zero based. For our example above:
- *
- *                                                 Invocation:
- *                                     1          2          3           4
- *                                  -------    -------    --------    -------
- *      coord_array[0][0]    x  for node 1     node 201   node 401    node 601   
- *      coord_array[1][0]    y  for    "          "          "           " 
- *      coord_array[2][0]    z  for    "          "          "           " 
- *
- *      coord_array[0][1]    x  for node 2     node 202   node 402    node 602
- *      coord_array[1][1]    y  for    "          "          "           "
- *      coord_array[2][1]    z  for    "          "          "           "
- * 
- *      ...
- *
- *      coord_array[0][199]  x  for node 200   node 400   node 600    node 645
- *      coord_array[1][199]  y  for    "          "          "           "
- *      coord_array[2][199]  z  for    "          "          "           "
- *--------------------------------------------------------------------*/
-int
-USERD_get_part_coords_in_buffers(int part_number,
-                                 float **coord_array,
-                                 int first,
-                                 int n_beg,
-                                 int n_end,
-                                 int buffer_size,
-                                 int *num_returned)
-
-
-
-
-
-/*--------------------------------------------------------------------
- * USERD_get_part_node_ids_in_buffers -
- *--------------------------------------------------------------------
- *
- *   Get the node ids for an unstructured part in buffers.
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in USERD_get_gold_part_build_info)
- *
- *  (IN)  first                   = TRUE if first invocation of a buffered set.
- *                                  Will be FALSE for all subsequent invocations
- *                                  of the set.  This is so you can open files, get to
- *                                  the correct starting spot, initialize, etc.
- *
- *  (IN) n_beg                    = Zero based, first node index
- *                                  of the buffered set
- *
- *  (IN) n_end                    = Zero based, last node index
- *                                  of the buffered set
- *                                      
- *                     Thus, for first five nodes:
- *                       n_beg = 0
- *                       n_end = 4
- *                       total_number = (n_end - n_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five nodes, would be:      
- *                       n_beg = 5
- *                       n_end = 9
- *                       total_number = (n_end - n_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all nodes of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_nodes - 1
- *
- *  (IN)  buffer_size             = The size of the buffer.
- *                                  Namely:   nodeid_array[buffer_size]
- *
- *  (OUT) nodeid_array            = 1D buffer array which is set up to hold
- *                                  node ids of nodes
- *
- *       (IMPORTANT: this array is 0-based!!!)
- *
- *       (IMPORTANT: in the sister routine (USERD_get_part_node_ids) - which
- *                   does not use buffers. This array is 1-based.  So pay attention.)
- *
- *                                  (Array will have been allocated
- *                                   buffer_size long)
- *
- * Example, if we had a part with 645 nodes and the buffer size was set to 200
- *
- *          first invocation:
- *            first = TRUE            Will be TRUE the first time! 
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            nodeid_array[200]       fill with values for nodes 1 - 200   (zero-based)
- *            *num_returned = 200     set this
- *            return(0)               return this (indicates more to do)
- *
- *          second invocation:        which occurs because we returned a 0 last time
- *            first = FALSE           will now be FALSE
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            nodeid_array[200]       fill with values for nodes 201 - 400 (zero-based)
- *            *num_returned = 200     set this
- *            return(0)               return this (indicates more to do)
- *
- *          third invocation:         which occurs because we returned a 0 last time
- *            first = FALSE           will still be FALSE
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            nodeid_array[200]       fill with values for nodes 401 - 600 (zero-based)
- *            *num_returned = 200     set this
- *            return(0)               return this (indicates more to do)
- *
- *          fourth invocation:        which occurs because we returned a 0 last time
- *            first = FALSE           will still be FALSE
- *            n_beg = 0
- *            n_end = 644
- *            buffer_size = 200
- *            nodeid_array[200]       fill with values for nodes 601 - 645 (zero-based)
- *            *num_returned = 45      set this
- *            return(1)               return this (indicates done!)
- *
- *
- *  (OUT)  *num_returned          = The number of nodes whose ids are returned
- *                                  in the buffer. This will normally be equal
- *                                  to buffer_size except for that last buffer
- *                                  - which could be less than a full buffer. 
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Not called unless number_of_nodes for the part > 0
- *
- *  * Again, make sure each buffer is zero based. For our example above:
- *
- *                                                 Invocation:
- *                                     1          2          3           4
- *                                  -------    -------    --------    -------
- *      nodeid_array[0]    id   for node 1     node 201   node 401    node 601   
- *
- *      nodeid_array[1]    id   for node 2     node 202   node 402    node 602
- *
- *      ...
- *
- *      nodeid_array[199]  id   for node 200   node 400   node 600    node 645
- *--------------------------------------------------------------------*/
-int
-USERD_get_part_node_ids_in_buffers(int part_number,
-                                   int *nodeid_array,
-                                   int first,
-                                   int n_beg,
-                                   int n_end,
-                                   int buffer_size,
-                                   int *num_returned)
-
-
-
-
-/*--------------------------------------------------------------------
- * USERD_get_part_elements_by_type_in_buffers -
- *--------------------------------------------------------------------
- *
- *   Gets the connectivities for the elements of a particular type
- *   in an unstructured part in buffers
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in USERD_get_gold_part_build_info)
- *
- *  (IN)  element_type            = One of the following (See global_extern.h)
- *                                  Z_POINT    node point element
- *                                  Z_BAR02    2 node bar
- *                                  Z_BAR03    3 node bar
- *                                  Z_TRI03    3 node triangle
- *                                  Z_TRI06    6 node triangle
- *                                  Z_QUA04    4 node quad
- *                                  Z_QUA08    8 node quad
- *                                  Z_TET04    4 node tetrahedron
- *                                  Z_TET10   10 node tetrahedron
- *                                  Z_PYR05    5 node pyramid
- *                                  Z_PYR13   13 node pyramid
- *                                  Z_PEN06    6 node pentahedron
- *                                  Z_PEN15   15 node pentahedron
- *                                  Z_HEX08    8 node hexahedron
- *                                  Z_HEX20   20 node hexahedron
- *
- *   Starting at API 2.01:
- *   ====================
- *                                  Z_G_POINT    ghost node point element
- *                                  Z_G_BAR02    2 node ghost bar
- *                                  Z_G_BAR03    3 node ghost bar
- *                                  Z_G_TRI03    3 node ghost triangle
- *                                  Z_G_TRI06    6 node ghost triangle
- *                                  Z_G_QUA04    4 node ghost quad
- *                                  Z_G_QUA08    8 node ghost quad
- *                                  Z_G_TET04    4 node ghost tetrahedron
- *                                  Z_G_TET10   10 node ghost tetrahedron
- *                                  Z_G_PYR05    5 node ghost pyramid
- *                                  Z_G_PYR13   13 node ghost pyramid
- *                                  Z_G_PEN06    6 node ghost pentahedron
- *                                  Z_G_PEN15   15 node ghost pentahedron
- *                                  Z_G_HEX08    8 node ghost hexahedron
- *                                  Z_G_HEX20   20 node ghost hexahedron
- *                                  Z_NSIDED     n node ghost nsided polygon
- *                                  Z_NFACED     n face ghost nfaced polyhedron
- *
- *   Starting at API 2.02:
- *   ====================
- *                                  Z_NSIDED     n node nsided polygon
- *                                  Z_NFACED     n face nfaced polyhedron
- *                                  Z_G_NSIDED   n node ghost nsided polygon
- *                                  Z_G_NFACED   n face ghost nfaced polyhedron
- *
- *  (IN)  first                   = TRUE if first invocation of a buffered set.
- *                                  Will be FALSE for all subsequent invocations
- *                                  of the set.  This is so you can open files, get to
- *                                  the correct starting spot, initialize, etc.
- *
- *  (IN) e_beg                    = Zero based, first element number
- *                                  of the buffered set
- *
- *  (IN) e_end                    = Zero based, last element number
- *                                  of the buffered set
- *
- *                     Thus, for first five elements of a type:
- *                       e_beg = 0
- *                       e_end = 4
- *                       total_number = (e_end - e_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five elements of a type, would be:
- *                       e_beg = 5
- *                       e_end = 9
- *                       total_number = (e_end - e_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all elements of the type of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_elements_of_type - 1
- *
- *  (IN) buffer_size              = The size of the buffer.
- *                                  Namely:  conn_array[buffer_size][element_size]
- *
- *  (OUT) conn_array              = 2D buffer array which is set up to hold
- *                                  connectivity of elements of the type.
- *
- *                                  (Array will have been allocated
- *                                   buffer_size of
- *                                   the type by connectivity length
- *                                   of the type)
- *
- *                       ex) The allocated dimensions available
- *                           for this routine will be:
- *                              conn_array[buffer_size][3]   when called with Z_TRI03
- *
- *                              conn_array[buffer_size][4]   when called with Z_QUA04
- *
- *                              conn_array[buffer_size][8]   when called with Z_HEX08
- *
- *                              etc.
- *
- *   * Example, (if 158 quad elements, and buffer size is 200)
- *
- *       (get all 158 quad4s in one invocation)
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0                 (zero based, first element index)
- *          e_end  = 157               (zero based, last element index)
- *          buffer_size = 200
- *          conn_array[200][4]         Use first 158 locations of the array
- *          *num_returned = 158        set this
- *          return(1)                  return this (indicates no more to do)
- *
- *   * Example, (if 158 quad elements, and buffer size is 75)
- *
- *        first invocation:
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0
- *          e_end  = 157
- *          buffer_size = 75
- *          conn_array[75][4]          load in conn for elements 1 - 75
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *        second invocation:
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0
- *          e_end  = 157
- *          buffer_size = 75
- *          conn_array[75][4]          load in conn for elements 76 - 150
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *        third invocation:
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0
- *          e_end  = 157
- *          buffer_size = 75
- *          conn_array[75][4]          load in conn for elements 151 - 158
- *          *num_returned = 8          set this
- *          return(1)                  return this (indicates no more to do)
- *
- *
- *  (OUT)  *num_returned          = The number of elements whose connectivities
- *                                  are returned in the buffer. This will
- *                                  normally be equal to buffer_size except for
- *                                  that last buffer - which could be less than
- *                                  a full buffer.
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Again, make sure each buffer is zero based. For our example using buffers above:
- *
- *                                                        Invocation:
- *                                                  1          2          3    
- *                                               -------    -------    --------
- *      conn_array[0][0]       node 1 in conn for quad 1    quad 76     quad 151
- *      conn_array[0][1]       node 2 in conn for quad 1    quad 76     quad 151
- *      conn_array[0][2]       node 3 in conn for quad 1    quad 76     quad 151
- *      conn_array[0][3]       node 4 in conn for quad 1    quad 76     quad 151
- *
- *      conn_array[1][0]       node 1 in conn for quad 2    quad 77     quad 152
- *      conn_array[1][1]       node 2 in conn for quad 2    quad 77     quad 152
- *      conn_array[1][2]       node 3 in conn for quad 2    quad 77     quad 152
- *      conn_array[1][3]       node 4 in conn for quad 2    quad 77     quad 152
- *
- *      ...
- *
- *      conn_array[74][0]      node 1 in conn for quad 75    quad 150   quad 158
- *      conn_array[74][1]      node 2 in conn for quad 75    quad 150   quad 158
- *      conn_array[74][2]      node 3 in conn for quad 75    quad 150   quad 158
- *      conn_array[74][3]      node 4 in conn for quad 75    quad 150   quad 158
- *--------------------------------------------------------------------*/
-int
-USERD_get_part_elements_by_type_in_buffers(int part_number,
-                                           int element_type,
-                                           int **conn_array,
-                                           int first,
-                                           int e_beg,
-                                           int e_end,
-                                           int buffer_size,
-                                           int *num_returned)
-
-
-
-
-
-/*--------------------------------------------------------------------
- * USERD_get_part_element_ids_by_type_in_buffers -
- *--------------------------------------------------------------------
- *
- *   Gets the ids for the elements of a particular type
- *   in an unstructured part in buffers
- *
- *  (IN)  part_number             = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in USERD_get_gold_part_build_info)
- *
- *  (IN)  element_type            = One of the following (See global_extern.h)
- *                                  Z_POINT    node point element
- *                                  Z_BAR02    2 node bar
- *                                  Z_BAR03    3 node bar
- *                                  Z_TRI03    3 node triangle
- *                                  Z_TRI06    6 node triangle
- *                                  Z_QUA04    4 node quad
- *                                  Z_QUA08    8 node quad
- *                                  Z_TET04    4 node tetrahedron
- *                                  Z_TET10   10 node tetrahedron
- *                                  Z_PYR05    5 node pyramid
- *                                  Z_PYR13   13 node pyramid
- *                                  Z_PEN06    6 node pentahedron
- *                                  Z_PEN15   15 node pentahedron
- *                                  Z_HEX08    8 node hexahedron
- *                                  Z_HEX20   20 node hexahedron
- *
- *   Starting at API 2.01:
- *   ====================
- *                                  Z_G_POINT    ghost node point element
- *                                  Z_G_BAR02    2 node ghost bar
- *                                  Z_G_BAR03    3 node ghost bar
- *                                  Z_G_TRI03    3 node ghost triangle
- *                                  Z_G_TRI06    6 node ghost triangle
- *                                  Z_G_QUA04    4 node ghost quad
- *                                  Z_G_QUA08    8 node ghost quad
- *                                  Z_G_TET04    4 node ghost tetrahedron
- *                                  Z_G_TET10   10 node ghost tetrahedron
- *                                  Z_G_PYR05    5 node ghost pyramid
- *                                  Z_G_PYR13   13 node ghost pyramid
- *                                  Z_G_PEN06    6 node ghost pentahedron
- *                                  Z_G_PEN15   15 node ghost pentahedron
- *                                  Z_G_HEX08    8 node ghost hexahedron
- *                                  Z_G_HEX20   20 node ghost hexahedron
- *                                  Z_NSIDED     n node ghost nsided polygon
- *                                  Z_NFACED     n face ghost nfaced polyhedron
- *
- *   Starting at API 2.02:
- *   ====================
- *                                  Z_NSIDED     n node nsided polygon
- *                                  Z_NFACED     n face nfaced polyhedron
- *                                  Z_G_NSIDED   n node ghost nsided polygon
- *                                  Z_G_NFACED   n face ghost nfaced polyhedron
- *
- *  (IN)  first                   = TRUE if first invocation of a buffered set.
- *                                  Will be FALSE for all subsequent invocations
- *                                  of the set.  This is so you can open files, get to
- *                                  the correct starting spot, initialize, etc.
- *
- *  (IN) e_beg                    = Zero based, first element number
- *                                  of the buffered set
- *
- *  (IN) e_end                    = Zero based, last element number
- *                                  of the buffered set
- *
- *                     Thus, for first five elements of a type:
- *                       e_beg = 0
- *                       e_end = 4
- *                       total_number = (e_end - e_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five elements of a type, would be:
- *                       e_beg = 5
- *                       e_end = 9
- *                       total_number = (e_end - e_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all elements of the type of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_elements_of_type - 1
- *
- *  (IN) buffer_size              = The size of the buffer.
- *                                  Namely:  elemid_array[buffer_size]
- *
- *  (OUT) elemid_array            = 1D buffer array which is set up to hold ids
- *                                  of elements of the type.
- *
- *                                  (Array will have been allocated
- *                                   buffer_size long)
- *
- *   * Example, (if 158 quad elements, and buffer size is 200)
- *
- *       (get all 158 quad4 ids in one invocation)
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0                 (zero based, first element index)
- *          e_end  = 157               (zero based, last element index)
- *          buffer_size = 200
- *          elemeid_array[200]         Use first 158 locations of the array
- *          *num_returned = 158        set this
- *          return(1)                  return this (indicates no more to do)
- *
- *   * Example, (if 158 quad elements, and buffer size is 75)
- *
- *        first invocation:
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0
- *          e_end  = 157
- *          buffer_size = 75
- *          elemid_array[75]           load in ids for elements 1 - 75
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *        second invocation:
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0
- *          e_end  = 157
- *          buffer_size = 75
- *          elemid_array[75]           load in ids for elements 76 - 150
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *        third invocation:
- *          element_type = Z_QUA04
- *          first = TRUE               Will be TRUE the first time!
- *          e_beg  = 0
- *          e_end  = 157
- *          buffer_size = 75
- *          elemid_array[75]           load in ids for elements 151 - 158
- *          *num_returned = 8          set this
- *          return(1)                  return this (indicates no more to do)
- *
- *
- *  (OUT)  *num_returned          = The number of elements whose ids are returned
- *                                  in the buffer. This will normally be equal
- *                                  to buffer_size except for that last buffer
- *                                  - which could be less than a full buffer.
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Again, make sure each buffer is zero based. For our example using buffers above:
- *
- *                                                  Invocation:
- *                                           1          2          3    
- *                                        -------    -------    --------
- *      elemid_array[0]       elem id  for quad 1    quad 76     quad 151
- *
- *      elemid_array[1]       elem id  for quad 2    quad 77     quad 152
- *
- *      ...
- *
- *      elemid_array[74]      elem id  for quad 75   quad 150    quad 158
- *--------------------------------------------------------------------*/
-int
-USERD_get_part_element_ids_by_type_in_buffers(int part_number,
-                                              int element_type,
-                                              int *elemid_array,
-                                              int first,
-                                              int e_beg,
-                                              int e_end,
-                                              int buffer_size,
-                                              int *num_returned)
-
-
-
-
-
-
-/*--------------------------------------------------------------------
- * USERD_get_var_by_component_in_buffers -  used by unstructured parts
- *--------------------------------------------------------------------
- *
- *  if Z_PER_NODE:
- *    Get the component value at each node for a given variable in the part
- *    in buffers.
- *
- *  or if Z_PER_ELEM:
- *    Get the component value at each element of a specific part and type for
- *    a given variable in buffers.
- *
- *  (IN)  which_variable          = The variable number
- *
- *  (IN)  which_part                Since EnSight Version 7.4
- *                                  -------------------------
- *                                = The part number
- *
- *                                  (1-based index of part table, namely:
- *
- *                                     1 ... Numparts_available.
- *
- *                                   It is NOT the part_id that
- *                                   is loaded in USERD_get_gold_part_build_info)
- *
- *                                  Prior to EnSight Version 7.4
- *                                  ----------------------------
- *                                = The part id   This is the part_id label loaded
- *                                                in USERD_get_gold_part_build_inf\o.
- *                                                It is NOT the part table index.
- *
- *  (IN)  var_type                = Z_SCALAR
- *                                  Z_VECTOR
- *                                  Z_TENSOR     ( symmetric tensor)
- *                                  Z_TENSOR9    (asymmetric tensor)
- *
- *  (IN)  which_type
- *
- *           if Z_PER_NODE:         Not used
- *
- *           if Z_PER_ELEM:       = The element type
- *                                  Z_POINT    node point element
- *                                  Z_BAR02    2 node bar
- *                                  Z_BAR03    3 node bar
- *                                  Z_TRI03    3 node triangle
- *                                  Z_TRI06    6 node triangle
- *                                  Z_QUA04    4 node quad
- *                                  Z_QUA08    8 node quad
- *                                  Z_TET04    4 node tetrahedron
- *                                  Z_TET10   10 node tetrahedron
- *                                  Z_PYR05    5 node pyramid
- *                                  Z_PYR13   13 node pyramid
- *                                  Z_PEN06    6 node pentahedron
- *                                  Z_PEN15   15 node pentahedron
- *                                  Z_HEX08    8 node hexahedron
- *                                  Z_HEX20   20 node hexahedron
- *
- *   Starting at API 2.01:
- *   ====================
- *                                  Z_G_POINT    ghost node point element
- *                                  Z_G_BAR02    2 node ghost bar
- *                                  Z_G_BAR03    3 node ghost bar
- *                                  Z_G_TRI03    3 node ghost triangle
- *                                  Z_G_TRI06    6 node ghost triangle
- *                                  Z_G_QUA04    4 node ghost quad
- *                                  Z_G_QUA08    8 node ghost quad
- *                                  Z_G_TET04    4 node ghost tetrahedron
- *                                  Z_G_TET10   10 node ghost tetrahedron
- *                                  Z_G_PYR05    5 node ghost pyramid
- *                                  Z_G_PYR13   13 node ghost pyramid
- *                                  Z_G_PEN06    6 node ghost pentahedron
- *                                  Z_G_PEN15   15 node ghost pentahedron
- *                                  Z_G_HEX08    8 node ghost hexahedron
- *                                  Z_G_HEX20   20 node ghost hexahedron
- *   Starting at API 2.02:
- *   ====================
- *                                  Z_NSIDED     n node nsided polygon
- *                                  Z_NFACED     n face nfaced polyhedron
- *                                  Z_G_NSIDED   n node ghost nsided polygon
- *                                  Z_G_NFACED   n face ghost nfaced polyhedron
- *
- *
- *
- *  (IN)  imag_data               = TRUE if imag component
- *                                  FALSE if real component
- *
- *  (IN)  component               = The component: (0       if Z_SCALAR)
- *                                                 (0 - 2   if Z_VECTOR)
- *                                                 (0 - 5   if Z_TENSOR)
- *                                                 (0 - 8   if Z_TENSOR9)
- *
- *                                * 6 Symmetric Indicies, 0:5    *
- *                                * ---------------------------- *
- *                                *     | 11 12 13 |   | 0 3 4 | *
- *                                *     |          |   |       | *
- *                                * T = |    22 23 | = |   1 5 | *
- *                                *     |          |   |       | *
- *                                *     |       33 |   |     2 | *
- *
- *                                * 9 General   Indicies, 0:8    *
- *                                * ---------------------------- *
- *                                *     | 11 12 13 |   | 0 1 2 | *
- *                                *     |          |   |       | *
- *                                * T = | 21 22 23 | = | 3 4 5 | *
- *                                *     |          |   |       | *
- *                                *     | 31 32 33 |   | 6 7 8 | *
- *
- *  (IN) ne_beg
- *          if Z_PER_NODE:   = Zero based, first node index of the buffered set
- *          if Z_PER_ELEM:   = Zero based, first element index of the buffered set
- *
- *  (IN) ne_end
- *          if Z_PER_NODE:   = Zero based, last node index of the buffered set
- *          if Z_PER_ELEM:   = Zero based, last element index of the buffered set
- *
- *                     Thus, for first five elements or nodes:
- *                       e_beg = 0
- *                       e_end = 4
- *                       total_number = (e_end - e_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five elements or nodes, would be:
- *                       e_beg = 5
- *                       e_end = 9
- *                       total_number = (e_end - e_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all elements or nodes of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_elements_or_nodes - 1
- *
- * (IN) first                    = TRUE if first invocation of a buffered set.
- *                                  Will be FALSE for all subsequent invocations
- *                                  of the set.  This is so you can open files, get to
- *                                  the correct starting spot, initialize, etc.
- *
- * (IN) buffer_size              = The size of the buffer.
- *                                  Namely:  var_array[buffer_size]
- *
- * (IN) leftside                 = TRUE if current time is at a timestep or
- *                                      when getting the left side of a time
- *                                      span that encloses the current time.
- *                               = FALSE when getting the right side of a time
- *                                       span that encloses the current time.
- *
- *  Timeline:
- *   step1         step2          step3
- *     |-------------|--------------|-------...  requires no interpolation
- *                   ^                           get values at step2 (leftside = TRUE)
- *                   current time                   (leftside = TRUE)
- *
- *
- *  Timeline:
- *   step1         step2          step3
- *     |-------------|--------------|-------...  requires interpolation
- *              ^                                get values at step2 (leftside = TRUE)
- *              current time                 and get values at step3 (leftside = FALSE)
- *
- *    Note that it would generally be easier for this routine if EnSight got all
- *         of the left side, then all of the right side, and then did its
- *         interpolation. But, in the spirit of doing things in buffers (to save
- *         memory) it gets a left side buffer (and the corresponding right side
- *         buffer and interpolates these), if needed, before going to the next
- *         buffer of the set.  Thus, you need to be able to handle that situation.
- *
- *    Note also that EnSight will have called the routine to change the current
- *         time step between the two invocations when interpolation is required.
- *         And Ensight does the interpolating.  This variable is provided so
- *         that you can deal with two different files or pointers between the
- *         corresponding invocations for the two times
- *
- * (OUT) var_array
- *
- *     -----------------------------------------------------------------------
- *     (IMPORTANT: this array is 0-based for both Z_PER_NODE and Z_PER_ELEM!!!
- *     -----------------------------------------------------------------------
- *
- *          if Z_PER_NODE:       = 1D buffer array set up to hold a variable
- *                                 component value for nodes.
- *
- *          if Z_PER_ELEM:       = 1D buffer array set up to hold a variable
- *                                 component value for elements.
- *
- *                                 (Array will have been allocated
- *                                  buffer_size long)
- *
- *              Info stored in this fashion:
- *                   var_array[0] = var component for node or element 1 of part
- *                   var_array[1] = var component for node or element 2 of part
- *                   var_array[2] = var component for node or element 3 of part
- *                   etc.
- *
- *   * Example, (if 158 quad elements with a real Z_PER_ELEM scalar,
- *               current time is between steps, and buffer size is 75)
- *
- *        first invocation:            (for left side of time span)
- *          var_type = Z_SCALAR
- *          which_type = Z_PER_ELEM
- *          imag_data = FALSE
- *          component = 0
- *          ne_beg = 0
- *          ne_end = 157
- *          first = TRUE               Will be TRUE the first time!
- *          buffer_size = 75
- *          leftside = TRUE            <==
- *          var_array[75]              load in scalar value for elements 1 - 75
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *        second invocation:           (for right side of time span)
- *          var_type = Z_SCALAR
- *          which_type = Z_PER_ELEM
- *          imag_data = FALSE
- *          component = 0
- *          ne_beg = 0
- *          ne_end = 157
- *          first = TRUE               Note: Will still be TRUE (because is right side)
- *          buffer_size = 75
- *          leftside = FALSE           <==
- *          var_array[75]              load in scalar value for elements 1 - 75
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- * -------------------------------
- *        third invocation:            (for left side of time span)
- *          var_type = Z_SCALAR
- *          which_type = Z_PER_ELEM
- *          imag_data = FALSE
- *          component = 0
- *          ne_beg = 0
- *          ne_end = 157
- *          first = FALSE              Will be FALSE now
- *          buffer_size = 75
- *          leftside = TRUE            <==
- *          var_array[75]              load in scalar value for elements 76 - 150
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *        fourth invocation:           (for right side of time span)
- *          var_type = Z_SCALAR
- *          which_type = Z_PER_ELEM
- *          imag_data = FALSE
- *          component = 0
- *          ne_beg = 0
- *          ne_end = 157
- *          first = FALSE             
- *          buffer_size = 75
- *          leftside = FALSE           <==
- *          var_array[75]              load in scalar value for elements 76 - 150
- *          *num_returned = 75         set this
- *          return(0)                  return this (indicates more to do)
- *
- *------------------------------------
- *        fifth invocation:            (for left side of time span)
- *          var_type = Z_SCALAR
- *          which_type = Z_PER_ELEM
- *          imag_data = FALSE
- *          component = 0
- *          ne_beg = 0
- *          ne_end = 157
- *          first = FALSE              Will still be FALSE
- *          buffer_size = 75
- *          leftside = TRUE            <==
- *          var_array[75]              load in scalar value for elements 151 - 158
- *          *num_returned = 8          set this
- *          return(1)                  return this (indicates no more to do)
- *
- *        sixth invocation:           (for right side of time span)
- *          var_type = Z_SCALAR
- *          which_type = Z_PER_ELEM
- *          imag_data = FALSE
- *          component = 0
- *          ne_beg = 0
- *          ne_end = 157
- *          first = FALSE            
- *          buffer_size = 75
- *          leftside = FALSE           <==
- *          var_array[75]              load in scalar value for elements 151 - 158
- *          *num_returned = 8          set this
- *          return(1)                  return this (indicates no more to do)
- *
- *
- *  (OUT)  *num_returned          = The number of nodes or elements whose variable
- *                                  values are returned in the buffer. This will
- *                                  normally be equal to buffer_size except for
- *                                  that last buffer - which could be less than
- *                                  a full buffer.
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Again, make sure each buffer is zero based. For our example using buffers above:
- *
- *                                                  Invocation:
- *                         ----------------   ------------------   ------------------- 
- *                            1        2         3          4          5          6
- *                         -------  -------   --------  --------   ---------  ---------
- * var_array[0]  scalar of quad 1L  quad 1R   quad 76L  quad 76R   quad 151L  quad 151R
- *
- * var_array[1]  scalar of quad 2L  quad 2R   quad 77L  quad 77R   quad 152L  quad 152R
- *
- * ...
- *
- * var_array[74] scalar of quad 75L quad 75R  quad 150L quad 150R  quad 158L  quad 158R
- *
- *   Where:   L indicates left time step
- *            R indicates right time step
- *--------------------------------------------------------------------*/
-int
-USERD_get_var_by_component_in_buffers(int which_variable,
-                                      int which_part,
-                                      int var_type,
-                                      int which_type,
-                                      int imag_data,
-                                      int component,
-                                      float *var_array,
-                                      int first,
-                                      int ne_beg,
-                                      int ne_end,
-                                      int buffer_size,
-                                      int leftside,
-                                      int *num_returned)
-
-
-
-
-/*--------------------------------------------------------------------
- * USERD_get_nsided_conn_in_buffers -
- *--------------------------------------------------------------------
- *
- *   Gets the two arrays containing the connectivity information
- *   of nsided elements in buffers
- *
- *  (IN)  part_number      = The part number
- *
- *                           (1-based index of part table, namely:
- *
- *                              1 ... Numparts_available.
- *
- *                            It is NOT the part_id that
- *                            is loaded in USERD_get_gold_part_build_info)
- *
- *  (IN)  first            = TRUE if first invocation of a buffered set.
- *                           Will be FALSE for all subsequent invocations
- *                           of the set.  This is so you can open files,
- *                           get to the correct starting spot,
- *                           initialize, etc.
- *
- *  (IN) e_beg             = Zero based, first element number
- *                           of the buffered set
- *
- *  (IN) e_end             = Zero based, last element number
- *                           of the buffered set
- *
- *                     Thus, for first five elements of a type:
- *                       e_beg = 0
- *                       e_end = 4
- *                       total_number = (e_end - e_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five elements of a type, would be:
- *                       e_beg = 5
- *                       e_end = 9
- *                       total_number = (e_end - e_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all elements of the type of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_elements_of_type - 1
- *
- *  (IN) buffer_size         = The size of the num_nodes_per_elem_array buffer.
- *                             Namely: num_nodes_per_elem_array[buffer_size]
- *
- *  (OUT) num_nodes_per_elem_array = 1D buffer array of the number of nodes
- *                                   per nsided element.
- *
- *  (OUT) nsided_conn_array  = 1D buffer array of nsided connectivies
- *
- *                             (int array will have been allocated
- *                              long enough to hold all the nsided
- *                              connectivities in the buffered chunk)
- *
- *  (OUT) *num_returned      = The number of elements whose connectivities
- *                             are returned in the buffer. This will
- *                             normally be equal to buffer_size except for
- *                             that last buffer - which could be less than
- *                             a full buffer.
- *
- *   Providing nsided information to Ensight:
- *
- *   NOTE: for other nsided operations you need these first two, but we
- *         don't actually use them in this routine.
- *
- *   1. In USERD_get_gold_part_build_info, provide the number of nsided
- *      elements in the part.
- *
- *   2. In USERD_get_part_elements_by_type, provide (in the conn_array),
- *      the number of nodes per nsided element. (as if connectivity
- *      length of an nsided element is one)
- *
- *   We do use the following:
- *   3. In this routine, provide the corresponding num_nodes_per_element and
- *      streamed connectivities for each of the nsided elements in this
- *      buffered portion.
- *
- *
- *   Simple example:         5        6
- *                          +--------+
- *   3 nsided elements:    /|         \
- *   (1 4-sided           / |          \
- *    1 3-sided          /  |           \
- *    1 7-sided)        /   |            \ 7
- *                     /3   |4            +
- *                    +-----+             |
- *                    |     |             |
- *                    |     |             |8
- *                    |     |             +
- *                    |     |            /
- *                    |     |           /
- *                    |     |          /
- *                    |1    |2        /9
- *                    +-----+--------+
- *
- *    NOTE, don't really use these first two here  (See USERD_get_nsided_conn)
- *
- *    1. In USERD_get_gold_part_build_info:
- *            number_of_elements[Z_NSIDED] = 3
- *                                           .
- *                                          /|\
- *                                           |
- *    2. In USERD_get_part_elements_by_type:
- *        length of conn_array will be:      3 x 1
- *
- *        for element_type of Z_NSIDED:
- *            conn_array[0][0] = 4           (for the 4-sided element)
- *            conn_array[1][0] = 3           (for the 3-sided element)
- *            conn_array[2][0] = 7           (for the 7-sided element)
- *
- *                         Sum  ===
- *                               14
- *
- *    But for our example, lets assume that that our buffer is just 2
- *                                                   ================
- *    3. In this routine:
- *
- *       first invocation:
- *         first = TRUE
- *         e_beg = 0
- *         e_end = 2
- *         buffer_size = 2
- *         num_nodes_per_elem_array[2]    load it: num_nodes_per_elem_array[0] = 4
- *                                                 num_nodes_per_elem_array[1] = 3
- *
- *         nsided_conn_array[at least 7]  load it:   nsided_conn_array[0] = 1
- *                                                   nsided_conn_array[1] = 2
- *                                                   nsided_conn_array[2] = 4
- *                                                   nsided_conn_array[3] = 3
- *
- *                                                   nsided_conn_array[4] = 3
- *                                                   nsided_conn_array[5] = 4
- *                                                   nsided_conn_array[6] = 5
- *         *num_returned = 2
- *         return(0)                       return this (indicates more to do)
- *
- *       second invocation:
- *         first = FALSE
- *         e_beg = 0
- *         e_end = 2
- *         buffer_size = 2
- *         num_nodes_per_elem_array[2]    load it: num_nodes_per_elem_array[0] = 7
- *
- *         nsided_conn_array[at least 7]  load it:   nsided_conn_array[0] = 2
- *                                                   nsided_conn_array[1] = 9
- *                                                   nsided_conn_array[2] = 8
- *                                                   nsided_conn_array[3] = 7
- *                                                   nsided_conn_array[4] = 6
- *                                                   nsided_conn_array[5] = 5
- *                                                   nsided_conn_array[6] = 4
- *         *num_returned = 1
- *         return(1)                       return this (indicates no more to do)
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Will not be called unless there are some nsided elements in the
- *    the part
- *--------------------------------------------------------------------*/
-int
-USERD_get_nsided_conn_in_buffers(int part_number,
-                                 int *num_nodes_per_elem_array,
-                                 int *nsided_conn_array,
-                                 int first,
-                                 int e_beg,
-                                 int e_end,
-                                 int buffer_size,
-                                 int *num_returned)
-
-
-
-
-/*--------------------------------------------------------------------
- * USERD_get_nfaced_conn_in_buffers -
- *--------------------------------------------------------------------
- *
- *   Gets three arrays containing the number of faces per element,
- *   number of nodes per face, and connectivity per face of nfaced
- *   elements in buffers
- *
- *  (IN)  part_number      = The part number
- *
- *                           (1-based index of part table, namely:
- *
- *                              1 ... Numparts_available.
- *
- *                            It is NOT the part_id that
- *                            is loaded in USERD_get_gold_part_build_info)
- *
- *  (IN)  first            = TRUE if first invocation of a buffered set.
- *                           Will be FALSE for all subsequent invocations
- *                           of the set.  This is so you can open files,
- *                           get to the correct starting spot,
- *                           initialize, etc.
- *
- *  (IN) e_beg             = Zero based, first element number
- *                           of the buffered set
- *
- *  (IN) e_end             = Zero based, last element number
- *                           of the buffered set
- *
- *                     Thus, for first five elements of a type:
- *                       e_beg = 0
- *                       e_end = 4
- *                       total_number = (e_end - e_beg) + 1 = (4 - 0) + 1 = 5
- *
- *                     for second five elements of a type, would be:
- *                       e_beg = 5
- *                       e_end = 9
- *                       total_number = (e_end - e_beg) + 1 = (9 - 5) + 1 = 5
- *
- *                     for all elements of the type of a part, would be:
- *                       n_beg = 0
- *                       n_end = num_elements_of_type - 1
- *
- *  (IN) buffer_size         = The size of the num_nodes_per_elem_array buffer.
- *                             Namely: num_nodes_per_elem_array[buffer_size]
- *
- *  (OUT) nfaced_fpe_array   = 1D buffer array of the number of faces per nfaced
- *                             element.
- *
- *                                (int array will have been allocated
- *                                 buffer_size long)
- *
- *  (OUT) nfaced_npf_array   = 1D buffer array of the number of nodes per face
- *                             for nfaced elements.
- *
- *                                (int array will have been allocated long
- *                                 enough to hold a buffer's size of values)
- *
- *  (OUT) nfaced_conn_array  = 1D array of nsided face connectivies of
- *                             nfaced elements
- *
- *                             (int array will have been allocated
- *                              long enough to hold a buffer's worth of values)
- *
- *   Providing nfaced information to Ensight:
- *
- *   NOTE: for other nfaced operations you need these first two, but we
- *         don't actually use them in this routine.
- *
- *   1. In USERD_get_gold_part_build_info, provide the number of nfaced
- *      polyhedral elements in the part.
- *
- *   2. In USERD_get_part_elements_by_type, provide (in the conn_array),
- *      the number of faces per nfaced element. (as if connectivity
- *      length of an nfaced element is one)
- *
- *   We do use the following:
- *   3. In this routine, provide the corresponding number of faces per nfaced
- *      element, streamed number of nodes per face, and streamed face
- *      connectivities for each of the faces of the nfaced elements in the
- *      bufferred portion.
- *
- *
- *   Simple example:         11        10   12
- *                          +--------+-----+
- *   2 nfaced elements:    /|        |\   /|
- *   (1 7-faced           / |        | \ / |
- *    1 5-sided)         /  |        |  +9 |
- *                      /   |        | /|  |
- *                     /7   |      8 /  |  |
- *                    +-----------+/ |  |  |
- *                    |     |5    |  |4 |  |6
- *                    |     +-----|--+--|--+
- *                    |    /      |   \ | /
- *                    |   /       |    \|/3
- *                    |  /        |     +
- *                    | /         |    /
- *                    |/1         |2 /
- *                    +-----------+/
- *
- *    Note, don't really use these first two here (See USERD_get_nfaced_conn)
- *
- *    1. In USERD_get_gold_part_build_info:
- *            number_of_elements[Z_NFACED] = 2
- *                                           .
- *                                          /|\
- *                                           |
- *    2. In USERD_get_part_elements_by_type:
- *        length of conn_array will be:      2 x 1
- *        for element_type of Z_NFACED:
- *            conn_array[0][0] = 7           (for the 7-faced element)
- *            conn_array[1][0] = 5           (for the 5-faced element)
- *                              ==
- *                         Sum  12
- *
- *
- *    But for our simple example, lets assume that that our buffer is just 1
- *      so that we have multiple invocations.               ================
- *
- *    3. In this routine:
- *
- *       first invocation:
- *         first = TRUE
- *         e_beg = 0
- *         e_end = 1
- *         buffer_size = 1
- *         nfaced_fpe_array[1]            load it: nfaced_fpe_array[0] = 7
- *
- *         nfaced_npf_array[at least 7]   load it: nfaced_npf_array[0] = 5
- *                                                 nfaced_npf_array[1] = 5
- *                                                 nfaced_npf_array[2] = 4
- *                                                 nfaced_npf_array[3] = 4
- *                                                 nfaced_npf_array[4] = 4
- *                                                 nfaced_npf_array[5] = 4
- *                                                 nfaced_npf_array[6] = 4
- *
- *         nsided_conn_array[at least 30] load it: nsided_conn_array[0] = 7
- *                                                 nsided_conn_array[1] = 8
- *                                                 nsided_conn_array[2] = 9
- *                                                 nsided_conn_array[3] = 10
- *                                                 nsided_conn_array[4] = 11
- *
- *                                                 nsided_conn_array[5] = 1
- *                                                 nsided_conn_array[6] = 5
- *                                                 nsided_conn_array[7] = 4
- *                                                 nsided_conn_array[8] = 3
- *                                                 nsided_conn_array[9] = 2
- *
- *                                                 nsided_conn_array[10] = 1
- *                                                 nsided_conn_array[11] = 2
- *                                                 nsided_conn_array[12] = 8
- *                                                 nsided_conn_array[13] = 7
- *
- *                                                 nsided_conn_array[14] = 5
- *                                                 nsided_conn_array[15] = 1
- *                                                 nsided_conn_array[16] = 7
- *                                                 nsided_conn_array[17] = 11
- *
- *                                                 nsided_conn_array[18] = 4
- *                                                 nsided_conn_array[19] = 5
- *                                                 nsided_conn_array[20] = 11
- *                                                 nsided_conn_array[21] = 10
- *
- *                                                 nsided_conn_array[22] = 2
- *                                                 nsided_conn_array[23] = 3
- *                                                 nsided_conn_array[24] = 9
- *                                                 nsided_conn_array[25] = 8
- *
- *                                                 nsided_conn_array[26] = 3
- *                                                 nsided_conn_array[27] = 4
- *                                                 nsided_conn_array[28] = 10
- *                                                 nsided_conn_array[29] = 9
- *         *num_returned = 1;
- *         return(0)
- *
- *       second invocation:
- *         first = FALSE
- *         e_beg = 0
- *         e_end = 1
- *         buffer_size = 1
- *         nfaced_fpe_array[1]            load it: nfaced_fpe_array[0] = 5
- *
- *         nfaced_npf_array[at least 7]   load it: nfaced_npf_array[0] = 3
- *                                                 nfaced_npf_array[1] = 3
- *                                                 nfaced_npf_array[2] = 4
- *                                                 nfaced_npf_array[3] = 4
- *                                                 nfaced_npf_array[4] = 4
- *
- *         nsided_conn_array[at least 18] load it: nsided_conn_array[0] = 9
- *                                                 nsided_conn_array[1] = 12
- *                                                 nsided_conn_array[2] = 10
- *
- *                                                 nsided_conn_array[3] = 3
- *                                                 nsided_conn_array[4] = 4
- *                                                 nsided_conn_array[5] = 6
- *
- *                                                 nsided_conn_array[6] = 6
- *                                                 nsided_conn_array[7] = 4
- *                                                 nsided_conn_array[8] = 10
- *                                                 nsided_conn_array[9] = 12
- *
- *                                                 nsided_conn_array[10] = 3
- *                                                 nsided_conn_array[11] = 6
- *                                                 nsided_conn_array[12] = 12
- *                                                 nsided_conn_array[13] = 9
- *
- *                                                 nsided_conn_array[14] = 4
- *                                                 nsided_conn_array[15] = 3
- *                                                 nsided_conn_array[16] = 9
- *                                                 nsided_conn_array[17] = 10
- *         *num_returned = 1;
- *         return(1)
- *
- * returns  0  if got some, more to do
- *          1  if got some, done
- *         -1  if an error
- *
- *  Notes:
- *  * This will be based on Current_time_step
- *
- *  * Will not be called unless there are some nfaced elements in the
- *    the part
- *--------------------------------------------------------------------*/
-int
-USERD_get_nfaced_conn_in_buffers(int part_number,
-                                 int *nfaced_fpe_array,
-                                 int *nfaced_npf_array,
-                                 int *nfaced_conn_array,
-                                 int first,
-                                 int e_beg,
-                                 int e_end,
-                                 int buffer_size,
-                                 int *num_returned)
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_API.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_API.H
deleted file mode 100644
index 0a76de23339e746baa82f90e2acdaf39a0887f48..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_API.H
+++ /dev/null
@@ -1,2 +0,0 @@
-#define DO_READER
-#define USERD_API_203
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_bkup.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_bkup.H
deleted file mode 100644
index 6a47c6ecf29900449c93411bc0f236a43398b257..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_bkup.H
+++ /dev/null
@@ -1,14 +0,0 @@
-//======================================================================
-//    backup is not implemented
-//======================================================================
-int USERD_bkup
-(
-    FILE *archive_file,
-    int backup_type)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_bkup" << endl
-        << flush;
-#endif
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_exit_routine.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_exit_routine.H
deleted file mode 100644
index 277450fc47fae33c5dd30707d6d3191ae7a43f0d..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_exit_routine.H
+++ /dev/null
@@ -1,11 +0,0 @@
-void USERD_exit_routine
-(
-    void
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_exit_routine" << endl
-        << flush;
-#endif
-
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_border_availability.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_border_availability.H
deleted file mode 100644
index 5ea3202b8ce5d8b72b850148527a927c6b89eb5d..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_border_availability.H
+++ /dev/null
@@ -1,17 +0,0 @@
-
-// Not used
-
-int USERD_get_border_availability
-(
-    int part_number,
-    int number_of_elements[Z_MAXTYPE]
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_border_availability for part_number "
-        << part_number << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_border_elements_by_type.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_border_elements_by_type.H
deleted file mode 100644
index 29536014be42f741099ed1a634a8716cdb7c68f1..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_border_elements_by_type.H
+++ /dev/null
@@ -1,19 +0,0 @@
-
-// Not called if USERD_border_availability returns Z_ERR
-
-int USERD_get_border_elements_by_type
-(
-    int part_number,
-    int element_type,
-    int **conn_array,
-    short *parent_element_type,
-    int *parnet_element_type
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_border_elements_by_type" << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_changing_geometry_status.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_changing_geometry_status.H
deleted file mode 100644
index f346f338bf8fc16e87291101255f729e9e3d0523..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_changing_geometry_status.H
+++ /dev/null
@@ -1,10 +0,0 @@
-//======================================================================
-int USERD_get_changing_geometry_status(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_changing_geometry_status" << endl << flush;
-#endif
-
-    // Choose the most general option
-    return Z_CHANGE_CONN;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_constant_val.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_constant_val.H
deleted file mode 100644
index d14dc7a17a5bad0871280153e66098d3feafda9e..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_constant_val.H
+++ /dev/null
@@ -1,15 +0,0 @@
-
-//======================================================================
-// Not in use
-//======================================================================
-float USERD_get_constant_val
-(
-    int which_var,
-    int imag_data
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_constant_val" << endl << flush;
-#endif
-    return 0.0;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_dataset_query_file_info.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_dataset_query_file_info.H
deleted file mode 100644
index 03e7e2fe0faf56a04654ea7793c169d4868479fe..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_dataset_query_file_info.H
+++ /dev/null
@@ -1,8 +0,0 @@
-//======================================================================
-// NOT SUPPORTED... yet, if ever!
-//======================================================================
-int USERD_get_dataset_query_file_info(Z_QFILES *qfiles)
-{
-    // just return OK
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_descrip_lines.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_descrip_lines.H
deleted file mode 100644
index d10346eb940296cd81fa7c85a3a05d1f42710204..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_descrip_lines.H
+++ /dev/null
@@ -1,31 +0,0 @@
-//======================================================================
-int USERD_get_descrip_lines
-(
-    int which_type,
-    int which_var,
-    int imag_data,
-    char line1[Z_BUFL],
-    char line2[Z_BUFL]
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_descrip_lines" << endl
-        << flush;
-#endif
-
-    if (which_type == Z_GEOM)
-    {
-        strncpy(line1, meshName, Z_BUFL);
-        strncpy(line2, "", Z_BUFL);
-    }
-    else
-    {
-        strncpy(line1, "WHERE IS THIS LINE USED I WONDER???", Z_BUFL);
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_descrip_lines" << endl
-        << flush;
-#endif
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_element_label_status.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_element_label_status.H
deleted file mode 100644
index 99b0ba28e1834cca22f394074eb2fe2a2c9158bb..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_element_label_status.H
+++ /dev/null
@@ -1,10 +0,0 @@
-//======================================================================
-//  if TRUE: set in USERD_get_element_ids_for_part
-//======================================================================
-int USERD_get_element_label_status(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_element_label_status" << endl << flush;
-#endif
-    return TRUE;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_geom_timeset_number.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_geom_timeset_number.H
deleted file mode 100644
index 9b0df36a20d98efcf6ed9ec24d812ef9f5a44f7d..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_geom_timeset_number.H
+++ /dev/null
@@ -1,14 +0,0 @@
-int USERD_get_geom_timeset_number
-(
-    void
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_geom_timeset_number" << endl
-        << flush;
-#endif
-
-    Geom_timeset_number = 1;
-
-    return Geom_timeset_number;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_gold_part_build_info.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_gold_part_build_info.H
deleted file mode 100644
index 299ec5a67d0f3cc78c692260691ee760bcc66c11..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_gold_part_build_info.H
+++ /dev/null
@@ -1,153 +0,0 @@
-//======================================================================
-// this is based on the current time step.
-//======================================================================
-int USERD_get_gold_part_build_info
-(
-    int *part_numbers,
-    int *part_types,
-    char *part_descriptions[Z_BUFL],
-    int *number_of_nodes,
-    int *number_of_elements[Z_MAXTYPE],
-    int *ijk_dimensions[3],
-    int *iblanking_options[6]
-)
-{
-    #ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_gold_part_build_info" << endl << flush;
-    #endif
-
-    const cellShapeList& cellShapes = meshPtr->cellShapes();
-    const cellList& cells = meshPtr->cells();
-
-    label nCells = cells.size();
-
-    // all parts are unstructured
-    for (label n = 0; n<Numparts_available; n++)
-    {
-        part_numbers[n] = n + 1;
-        part_types[n]   = Z_UNSTRUCTURED;
-    }
-
-    strncpy(part_descriptions[0], meshName, Z_BUFL);
-
-    for (label i=0; i<nPatches; i++)
-    {
-        word patchName(meshPtr->boundary()[i].name());
-        strncpy(part_descriptions[i+1], patchName.c_str(), Z_BUFL);
-    }
-
-    label nHex08 = 0;
-    label nPen06 = 0;
-    label nPyr05 = 0;
-    label nTet04 = 0;
-    label nFaced = 0;
-
-    for (label n=0; n<nCells; n++)
-    {
-        label nFacesInCell = cells[n].size();
-        labelList points = cellShapes[n];
-
-        if ((nFacesInCell == 6) && (points.size() == 8))
-        {
-            nHex08++;
-        }
-        else if ((nFacesInCell == 4) && (points.size() == 4))
-        {
-            nTet04++;
-        }
-        else if (nFacesInCell == 5)
-        {
-            if (points.size() == 6)
-            {
-                nPen06++;
-            }
-            else if (points.size() == 5)
-            {
-                nPyr05++;
-            }
-            else
-            {
-                nFaced++;
-            }
-        }
-        else
-        {
-            nFaced++;
-        }
-    }
-
-    for (label n=0; n < Z_MAXTYPE; n++)
-    {
-        for (label i=0; i<Numparts_available; i++)
-        {
-            number_of_elements[i][n] = 0;
-        }
-    }
-
-    number_of_elements[0][Z_TET04] = nTet04;
-    number_of_elements[0][Z_PYR05] = nPyr05;
-    number_of_elements[0][Z_HEX08] = nHex08;
-    number_of_elements[0][Z_PEN06] = nPen06;
-    number_of_elements[0][Z_NFACED] = nFaced;
-
-    /*
-    Info<< "nTet04 = " << nTet04 << endl;
-    Info<< "nPyr05 = " << nPyr05 << endl;
-    Info<< "nHex08 = " << nHex08 << endl;
-    Info<< "nPen06 = " << nPen06 << endl;
-    Info<< "nFaced = " << nFaced << endl;
-        */
-
-    number_of_nodes[0] = meshPtr->nPoints();
-
-    const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-
-    for (label i=0; i<nPatches; i++)
-    {
-        label nTri03 = 0;
-        label nQuad04 = 0;
-        label nPoly = 0;
-
-        forAll(bMesh[i], n)
-        {
-            label nPoints = bMesh[i][n].size();
-
-            if (nPoints == 3)
-            {
-                nTri03++;
-            }
-            else  if (nPoints == 4)
-            {
-                nQuad04++;
-            }
-            else
-            {
-                nPoly++;
-            }
-        }
-
-        number_of_elements[i+1][Z_TRI03] = nTri03;
-        number_of_elements[i+1][Z_QUA04] = nQuad04;
-        number_of_elements[i+1][Z_NSIDED] = nPoly;
-
-        number_of_nodes[i+1] = bMesh[i].points().size();
-    }
-
-    if (Numparts_available > nPatches+1)
-    {
-        strncpy
-        (
-            part_descriptions[nPatches+1],
-            cloud::prefix.c_str(),
-            Z_BUFL
-        );
-        number_of_elements[nPatches+1][Z_POINT] = sprayPtr->size();
-        number_of_nodes[nPatches+1] = sprayPtr->size();
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_gold_part_build_info" << endl << flush;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_gold_variable_info.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_gold_variable_info.H
deleted file mode 100644
index 40c181015b1cc9d281bd647a62e70c2a32973a36..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_gold_variable_info.H
+++ /dev/null
@@ -1,120 +0,0 @@
-//======================================================================
-//  variable 1 - var[0] , i.e variables are zero based
-//======================================================================
-int USERD_get_gold_variable_info
-(
-    char **var_description,
-    char **var_filename,
-    int *var_type,
-    int *var_classify,
-    int *var_complex,
-    char **var_ifilename,
-    float *var_freq,
-    int *var_contran,
-    int *var_timeset
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_gold_variable_info" << endl
-        << flush;
-#endif
-
-    label offset = Num_variables - nSprayVariables;
-
-    // scalars first ...
-    for (label n=0; n<offset; n++)
-    {
-        if (isScalar[var2field[n]])
-        {
-            var_type[n]     = Z_SCALAR;
-            var_classify[n] = Z_PER_ELEM;
-            var_complex[n]  = FALSE;
-            var_timeset[n]  = 1;
-            strncpy
-            (
-                var_description[n],
-                fieldNames[var2field[n]].c_str(),
-                Z_BUFL
-            );
-        }
-    }
-
-    // ... and then vectors
-    for (label n=0; n<offset; n++)
-    {
-        if (isVector[var2field[n]])
-        {
-            var_type[n]     = Z_VECTOR;
-            var_classify[n] = Z_PER_ELEM;
-            var_complex[n]  = FALSE;
-            var_timeset[n]  = 1;
-            strncpy
-            (
-                var_description[n],
-                fieldNames[var2field[n]].c_str(),
-                Z_BUFL
-            );
-        }
-    }
-
-    // ... and tensors (NB! all tensors are treated as asymmetric)
-    for (label n=0; n<offset; n++)
-    {
-        if (isTensor[var2field[n]])
-        {
-            var_type[n]     = Z_TENSOR9;
-            var_classify[n] = Z_PER_ELEM;
-            var_complex[n]  = FALSE;
-            var_timeset[n]  = 1;
-            strncpy
-            (
-                var_description[n],
-                fieldNames[var2field[n]].c_str(),
-                Z_BUFL
-            );
-        }
-    }
-
-    if (Numparts_available > nPatches+1)
-    {
-
-        label Ns = lagrangianScalarNames.size();
-
-        for (label n=0; n<Ns; n++)
-        {
-            var_type[offset + n] = Z_SCALAR;
-            var_classify[offset + n] = Z_PER_ELEM;
-            var_complex[offset + n] = FALSE;
-            var_timeset[offset + n] = 1;
-            word name = parcelPrepend + lagrangianScalarNames[n];
-            strncpy
-            (
-                var_description[offset + n],
-                name.c_str(),
-                Z_BUFL
-            );
-        }
-
-        forAll(lagrangianVectorNames, n)
-        {
-            var_type[offset + Ns + n] = Z_VECTOR;
-            var_classify[offset + Ns + n] = Z_PER_ELEM;
-            var_complex[offset + Ns + n] = FALSE;
-            var_timeset[offset + Ns  + n] = 1;
-            word name = parcelPrepend + lagrangianVectorNames[n];
-            strncpy
-            (
-                var_description[offset + Ns + n],
-                name.c_str(),
-                Z_BUFL
-            );
-        }
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_gold_variable_info" << endl
-        << flush;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_matf_set_info.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_matf_set_info.H
deleted file mode 100644
index 8f1b417ee473d348ca5cf9d76d231422a667cc66..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_matf_set_info.H
+++ /dev/null
@@ -1,14 +0,0 @@
-
-int USERD_get_matf_set_info
-(
-    int *mat_set_ids,
-    char **mat_set_name
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_matf_set_info" << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_matf_var_info.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_matf_var_info.H
deleted file mode 100644
index 9f4bf9c8cd0296cb75339c571b2ff83e02afc877..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_matf_var_info.H
+++ /dev/null
@@ -1,15 +0,0 @@
-
-int USERD_get_matf_var_info
-(
-    int set_index,
-    int *mat_ids,
-    char **mat_desc
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_matf_var_info" << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_maxsize_info.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_maxsize_info.H
deleted file mode 100644
index aab4c0c90345adea610aa9e5e83059a4c1cb0f38..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_maxsize_info.H
+++ /dev/null
@@ -1,102 +0,0 @@
-int USERD_get_maxsize_info
-(
-    int *max_number_of_nodes,
-    int *max_number_of_elements[Z_MAXTYPE],
-    int *max_ijk_dimensions[3]
-)
-{
-    return Z_ERR;
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_maxsize_info" << endl;
-#endif
-
-    label maxNPoints = 0;
-    label maxNParcels = 0;
-
-    label nPen06Max = 0;
-    label nHex08Max = 0;
-    label nPyr05Max = 0;
-    label nTet04Max = 0;
-
-    Info<< "Checking all time steps for EnSight memory allocation purpose. "
-        << "This can take some time." << endl;
-
-    for (label timeI=1; timeI < timeDirs.size(); ++timeI)
-    {
-
-        label nPen06 = 0;
-        label nHex08 = 0;
-        label nPyr05 = 0;
-        label nTet04 = 0;
-
-        runTimePtr->setTime(timeDirs[timeI], timeI);
-
-        Info<< "Checking time = " << runTimePtr->timeName() << endl;
-
-        const cellShapeList& cells = meshPtr->cellShapes();
-
-        const label nPoints = meshPtr->nPoints();
-        const label nCells  = cells.size();
-
-        maxNPoints = max(maxNPoints, nPoints);
-
-        for (label n=0; n<nCells;n++)
-        {
-            label nFaces = cells[n].nFaces();
-            const labelList& points = cells[n];
-
-            if ((nFaces == 6) && (points.size() == 8))
-            {
-                nHex08++;
-            }
-            else if ((nFaces == 5) && (points.size() == 6))
-            {
-                nPen06++;
-            }
-            else if ((nFaces == 5) && (points.size() == 5))
-            {
-                nPyr05++;
-            }
-            else if ((nFaces == 4) && (points.size() == 4))
-            {
-                nTet04++;
-            }
-        }
-
-        nPen06Max = max(nPen06Max, nPen06);
-        nHex08Max = max(nHex08Max, nHex08);
-        nPyr05Max = max(nPyr05Max, nPyr05);
-        nTet04Max = max(nTet04Max, nTet04);
-
-        if (Numparts_available > 1)
-        {
-            // Get the maximum number of spray parcels
-            // and store it
-            Cloud<passiveParticle> lagrangian(*meshPtr, cloud::defaultName);
-
-            if (lagrangian.size() > nMaxParcels)
-            {
-                nMaxParcels = lagrangian.size();
-            }
-        }
-    }
-
-    max_number_of_nodes[0] = maxNPoints;
-    max_number_of_elements[0][Z_HEX08] = nHex08Max;
-    max_number_of_elements[0][Z_PEN06] = nPen06Max;
-    max_number_of_elements[0][Z_PYR05] = nPyr05Max;
-    max_number_of_elements[0][Z_TET04] = nTet04Max;
-
-    if (Numparts_available > 1)
-    {
-        max_number_of_nodes[1] = maxNParcels;
-        max_number_of_elements[1][Z_POINT] = maxNParcels;
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_maxsize_info" << endl;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_model_extents.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_model_extents.H
deleted file mode 100644
index b78438ae7d70e36a5b18e2dd3c9b56dcc7c93379..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_model_extents.H
+++ /dev/null
@@ -1,15 +0,0 @@
-
-// Not used. Let EnSight do the job.
-
-int USERD_get_model_extents
-(
-    float extents[6]
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_model_extents" << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_name_of_reader.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_name_of_reader.H
deleted file mode 100644
index c055407b534cabf180ba87d09a85db9228d63ca8..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_name_of_reader.H
+++ /dev/null
@@ -1,18 +0,0 @@
-//======================================================================
-//  Setting name in the gui, and specifying one or two input fields
-//======================================================================
-int USERD_get_name_of_reader
-(
-    char reader_name[Z_MAX_USERD_NAME],
-    int *two_fields
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_name_of_reader" << endl << flush;
-#endif
-
-    strncpy(reader_name, readerName, Z_MAX_USERD_NAME);
-    *two_fields = FALSE;
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nfaced_conn.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nfaced_conn.H
deleted file mode 100644
index 436d68d2591796cf55892afdc489faf3f8f97cd4..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nfaced_conn.H
+++ /dev/null
@@ -1,79 +0,0 @@
-
-int USERD_get_nfaced_conn
-(
-    int part_number,
-    int *nfaced_conn_array
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_nfaced_conn"
-        << ", part_number = " << part_number
-        << endl
-        << flush;
-#endif
-
-    if (part_number == 1)
-    {
-        label nPoint = 0;
-        const cellShapeList& cellShapes = meshPtr->cellShapes();
-        const cellList& cells = meshPtr->cells();
-        const faceList& faces = meshPtr->faces();
-        label nCells = cellShapes.size();
-
-        for (label n=0; n<nCells; n++)
-        {
-            label nFacesInCell = cells[n].size();
-            labelList points = cellShapes[n];
-            if ((nFacesInCell == 6) && (points.size() == 8))
-            {}
-            else if ((nFacesInCell == 4) && (points.size() == 4))
-            {}
-            else if (nFacesInCell == 5)
-            {
-                if (points.size() == 6)
-                {}
-                else if (points.size() == 5)
-                {}
-                else
-                {
-                    for (label i=0; i<nFacesInCell; i++)
-                    {
-                        label facei = cells[n][i];
-                        label nPoints = faces[facei].size();
-                        for (label j=0; j<nPoints; j++)
-                        {
-                            nfaced_conn_array[nPoint++] = faces[facei][j] + 1;
-                        }
-                    }
-                }
-            }
-            else
-            {
-                for (label i=0; i<nFacesInCell; i++)
-                {
-                    label facei = cells[n][i];
-                    label nPoints = faces[facei].size();
-                    for (label j=0; j<nPoints; j++)
-                    {
-                        nfaced_conn_array[nPoint++] = faces[facei][j] + 1;
-                    }
-                }
-            }
-        }
-
-    }
-    else if (part_number < nPatches+2)
-    {
-
-    }
-    else
-    {
-        return Z_ERR;
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Exiting: USERD_get_nfaced_conn" << endl
-        << flush;
-#endif
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nfaced_nodes_per_face.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nfaced_nodes_per_face.H
deleted file mode 100644
index 335f928516a0f92fc2aa0b0f7f2df0fc5aaa151f..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nfaced_nodes_per_face.H
+++ /dev/null
@@ -1,74 +0,0 @@
-
-int USERD_get_nfaced_nodes_per_face
-(
-    int part_number,
-    int *nfaced_npf_array
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_nfaced_nodes_per_face"
-        << ", part_number = " << part_number
-        << endl
-        << flush;
-#endif
-
-    if (part_number == 1)
-    {
-        const cellShapeList& cellShapes = meshPtr->cellShapes();
-        const cellList& cells = meshPtr->cells();
-        const faceList& faces = meshPtr->faces();
-
-        label nCells = cellShapes.size();
-        label nFaced = 0;
-        for (label n=0; n<nCells; n++)
-        {
-            label nFacesInCell = cells[n].size();
-            labelList points = cellShapes[n];
-            label nPoints = points.size();
-
-            if ((nFacesInCell == 6) && (nPoints == 8))
-            {}
-            else if ((nFacesInCell == 4) && (nPoints == 4))
-            {}
-            else if (nFacesInCell == 5)
-            {
-                if (nPoints == 6)
-                {}
-                else if (nPoints == 5)
-                {}
-                else
-                {
-                    for (label i=0; i<nFacesInCell; i++)
-                    {
-                        label facei = cells[n][i];
-                        label nFacePoints = faces[facei].size();
-                        nfaced_npf_array[nFaced++] = nFacePoints;
-                    }
-                }
-            }
-            else
-            {
-                for (label i=0; i<nFacesInCell; i++)
-                {
-                    label facei = cells[n][i];
-                    label nFacePoints = faces[facei].size();
-                    nfaced_npf_array[nFaced++] = nFacePoints;
-                }
-            }
-        }
-
-    }
-    else if (part_number < nPatches+2)
-    {
-        return Z_ERR;
-    }
-    else
-    {
-        return Z_ERR;
-    }
-#ifdef ENSIGHTDEBUG
-    Info<< "Exiting: USERD_get_nfaced_nodes_per_face" << endl
-        << flush;
-#endif
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_node_label_status.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_node_label_status.H
deleted file mode 100644
index bd0d977c76b7e9f6706d64b51bb816703d703a7e..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_node_label_status.H
+++ /dev/null
@@ -1,11 +0,0 @@
-//======================================================================
-// if TRUE: set in USERD_get_global_node_ids
-//======================================================================
-int USERD_get_node_label_status(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_node_label_status" << endl << flush;
-#endif
-
-    return TRUE;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nsided_conn.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nsided_conn.H
deleted file mode 100644
index 9557b5ae532f445f9d8ea599ec423df24aa4e775..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_nsided_conn.H
+++ /dev/null
@@ -1,49 +0,0 @@
-int USERD_get_nsided_conn
-(
-    int part_number,
-    int *nsided_conn_array
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_nsided_conn"
-        << ", part_number = " << part_number
-        << endl
-        << flush;
-#endif
-    if (part_number == 1)
-    {
-        Info<< "************* EEEEEEEEERRRRRRRRRRRRRRRRRR *************** "
-            << endl << flush;
-
-    }
-    else if (part_number < nPatches+2)
-    {
-        //const cellList& cells = meshPtr->cells();
-        //const faceList& faces = meshPtr->faces();
-
-        label patchi = part_number - 2;
-        const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-
-        label np = 0;
-        forAll(bMesh[patchi], facei)
-        {
-            label nPoints = bMesh[patchi][facei].size();
-            if ((nPoints != 3) && (nPoints != 4))
-            {
-                for (label i=0; i<nPoints; i++)
-                {
-                    nsided_conn_array[np++] = bMesh[patchi][facei][i] + 1;
-                }
-            }
-        }
-    }
-    else if (part_number == nPatches+2)
-    {
-        return Z_ERR;
-    }
-#ifdef ENSIGHTDEBUG
-    Info<< "Exiting: USERD_get_nsided_conn" << endl
-        << flush;
-#endif
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_num_of_time_steps.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_num_of_time_steps.H
deleted file mode 100644
index 37a1a5c06e00f54e94f085332cdc59def3702e3c..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_num_of_time_steps.H
+++ /dev/null
@@ -1,15 +0,0 @@
-//======================================================================
-// don't use multiple time sets...NN
-//======================================================================
-int USERD_get_num_of_time_steps
-(
-    int timeset_number
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_num_of_time_steps" << endl
-        << flush;
-#endif
-
-    return Num_time_steps;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_files_in_dataset.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_files_in_dataset.H
deleted file mode 100644
index ed936ee082ac5bc8b63f8259e8932f63d184f27f..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_files_in_dataset.H
+++ /dev/null
@@ -1,13 +0,0 @@
-//======================================================================
-//
-//======================================================================
-int USERD_get_number_of_files_in_dataset(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_number_of_files_in_dataset" << endl << flush;
-#endif
-
-    // use 1 insted of 0 which gives an un-necessary warning.
-    Num_dataset_files = 1;
-    return Num_dataset_files;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_material_sets.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_material_sets.H
deleted file mode 100644
index f8a0477645515bcae9742a5c772a4556df075bce..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_material_sets.H
+++ /dev/null
@@ -1,14 +0,0 @@
-
-int USERD_get_number_of_material_sets
-(
-    void
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_number_of_material_sets" << endl
-        << flush;
-#endif
-
-    // No materials
-    return 0;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_materials.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_materials.H
deleted file mode 100644
index 98162b2e11f45d727fd6d6cd4d2d0a0bb67d019c..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_materials.H
+++ /dev/null
@@ -1,14 +0,0 @@
-
-int USERD_get_number_of_materials
-(
-    int set_index
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_number_of_materials" << endl
-        << flush;
-#endif
-
-    // No materials
-    return 0;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_model_parts.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_model_parts.H
deleted file mode 100644
index cef0a64b1cd10403128440ccdecf6d8d0a51a275..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_model_parts.H
+++ /dev/null
@@ -1,9 +0,0 @@
-
-int USERD_get_number_of_model_parts(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_number_of_model_parts" << endl << flush;
-#endif
-
-    return Numparts_available;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_variables.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_variables.H
deleted file mode 100644
index acb342135714809739f7724dc0f1dab0a55bae88..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_of_variables.H
+++ /dev/null
@@ -1,9 +0,0 @@
-//======================================================================
-int USERD_get_number_of_variables(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_number_of_variables" << endl << flush;
-#endif
-
-    return Num_variables;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_timesets.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_timesets.H
deleted file mode 100644
index e4fc922fbd5d6a088a31a10fa58a4a896097d6f1..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_number_timesets.H
+++ /dev/null
@@ -1,13 +0,0 @@
-int USERD_get_number_of_timesets
-(
-    void
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_number_of_timesets" << endl
-        << flush;
-#endif
-
-    Num_timesets = 1;
-    return  Num_timesets;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_coords.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_coords.H
deleted file mode 100644
index 9cc17a1ec6f00d9061101f72d6dd199f02a8b57f..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_coords.H
+++ /dev/null
@@ -1,64 +0,0 @@
-// Note: coord_array is 1-based.
-
-int USERD_get_part_coords
-(
-    int part_number,
-    float **coord_array
-)
-{
-    #ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_part_coords" << endl <<
-        "part_number = " << part_number << endl << flush;
-    #endif
-
-    if (part_number == 1)
-    {
-        const vectorField& points = meshPtr->points();
-        label nPoints = points.size();
-
-        for (label indx=0; indx<nPoints; indx++)
-        {
-            coord_array[0][indx+1] = float(points[indx].x());
-            coord_array[1][indx+1] = float(points[indx].y());
-            coord_array[2][indx+1] = float(points[indx].z());
-        }
-    }
-    else if (part_number < nPatches+2)
-    {
-        label patchi = part_number-2;
-        const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-        const vectorField& points = bMesh[patchi].points();
-        label nPoints = points.size();
-
-        for (label indx=0; indx<nPoints; indx++)
-        {
-            coord_array[0][indx+1] = float(points[indx].x());
-            coord_array[1][indx+1] = float(points[indx].y());
-            coord_array[2][indx+1] = float(points[indx].z());
-        }
-
-    }
-    else if (part_number == nPatches+2)
-    {
-        label indx = 1;
-
-        forAllConstIter(Cloud<passiveParticle>, *sprayPtr, iter)
-        {
-            coord_array[0][indx] = float(iter().position().x());
-            coord_array[1][indx] = float(iter().position().y());
-            coord_array[2][indx] = float(iter().position().z());
-            indx++;
-        }
-
-    }
-    else
-    {
-        return Z_ERR;
-    }
-
-    #ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_part_coords" << endl << flush;
-    #endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_element_ids_by_type.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_element_ids_by_type.H
deleted file mode 100644
index 06759502390d76dd6fe4d5f8bc6a9db33b145cf9..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_element_ids_by_type.H
+++ /dev/null
@@ -1,162 +0,0 @@
-int USERD_get_part_element_ids_by_type
-(
-    int part_number,
-    int element_type,
-    int *elemid_array
-)
-{
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_part_element_ids_by_type" << endl
-        << "part_number = " << part_number << endl
-        << "element_type = " << element_type << endl << flush;
-#endif
-
-    if (part_number == 1)
-    {
-        const cellShapeList& cellShapes = meshPtr->cellShapes();
-        const cellList& cells = meshPtr->cells();
-
-        label nCells = cells.size();
-
-        label nPen06 = 0;
-        label nHex08 = 0;
-        label nPyr05 = 0;
-        label nTet04 = 0;
-        label nFaced = 0;
-
-        if (element_type == Z_HEX08)
-        {
-            for (label n=0; n<nCells; n++)
-            {
-                label nFaces = cells[n].size();
-                labelList points = cellShapes[n];
-
-                if ((nFaces == 6) && (points.size() == 8))
-                {
-                    elemid_array[nHex08++] = n + 1;
-                }
-            }
-        }
-        else if (element_type == Z_PEN06)
-        {
-            for (label n=0; n<nCells; n++)
-            {
-                label nFaces = cells[n].size();
-                labelList points = cellShapes[n];
-
-                if ((nFaces == 5) && (points.size() == 6))
-                {
-                    elemid_array[nPen06++] = n + 1;
-                }
-            }
-        }
-        else if (element_type == Z_PYR05)
-        {
-            for (label n=0; n<nCells; n++)
-            {
-                label nFaces = cells[n].size();
-                labelList points = cellShapes[n];
-
-                if ((nFaces == 5) && (points.size() == 5))
-                {
-                    elemid_array[nPyr05++] = n + 1;
-                }
-            }
-        }
-        else if (element_type == Z_TET04)
-        {
-            for (label n=0; n<nCells; n++)
-            {
-                label nFaces = cells[n].size();
-                labelList points = cellShapes[n];
-
-                if ((nFaces == 4) && (points.size() == 4))
-                {
-                    elemid_array[nTet04++] = n + 1;
-                }
-            }
-        }
-        else if (element_type == Z_NFACED)
-        {
-            for (label n=0; n<nCells; n++)
-            {
-                label nFaces = cells[n].size();
-                labelList points = cellShapes[n];
-                if ((nFaces == 6) && (points.size() == 8))
-                {}
-                else if ((nFaces == 5) && (points.size() == 6))
-                {}
-                else if ((nFaces == 5) && (points.size() == 5))
-                {}
-                else if ((nFaces == 4) && (points.size() == 4))
-                {}
-                else
-                {
-                    elemid_array[nFaced++] = n + 1;
-                }
-
-            }
-        }
-    }
-    else if (part_number < nPatches+2)
-    {
-
-        const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-        label patchi = part_number - 2;
-
-        label nTri03 = 0;
-        label nQuad04 = 0;
-        label nPoly = 0;
-
-        if (element_type == Z_TRI03)
-        {
-            forAll(bMesh[patchi], facei)
-            {
-                if (bMesh[patchi][facei].size() == 3)
-                {
-                    elemid_array[nTri03++] = facei + 1;
-                }
-            }
-        }
-        else if (element_type == Z_QUA04)
-        {
-            forAll(bMesh[patchi], facei)
-            {
-                if (bMesh[patchi][facei].size() == 4)
-                {
-                    elemid_array[nQuad04++] = facei + 1;
-                }
-            }
-        }
-        else if (element_type == Z_NSIDED)
-        {
-            forAll(bMesh[patchi], facei)
-            {
-                label nPoints = bMesh[patchi][facei].size();
-                if ((nPoints != 3) && (nPoints != 4))
-                {
-                    elemid_array[nPoly++] = facei + 1;
-                }
-            }
-        }
-
-    }
-    else if (part_number == nPatches+2)
-    {
-        forAll(*sprayPtr, n)
-        {
-            elemid_array[n] = n + 1;
-        }
-    }
-    else
-    {
-        return Z_ERR;
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_part_element_ids_by_type" << endl << flush;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_elements_by_type.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_elements_by_type.H
deleted file mode 100644
index 0fafe21207f49ab490d806f7fd0479dc7fb65c14..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_elements_by_type.H
+++ /dev/null
@@ -1,252 +0,0 @@
-int USERD_get_part_elements_by_type
-(
-    int part_number,
-    int element_type,
-    int **conn_array
-)
-{
-    #ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_part_elements_by_type" << nl
-        << "part_number = " << part_number << nl
-        << "element_type = " << element_type;
-    if (element_type == Z_HEX08)
-    {
-        Info<< " Z_HEX08";
-    }
-    else if (element_type == Z_PEN06)
-    {
-        Info<< " Z_PEN06";
-    }
-    else if (element_type == Z_PYR05)
-    {
-        Info<< " Z_PYR05";
-    }
-    else if (element_type == Z_TET04)
-    {
-        Info<< " Z_TET04";
-    }
-    else if (element_type == Z_TRI03)
-    {
-        Info<< " Z_TRI03";
-    }
-    else if (element_type == Z_QUA04)
-    {
-        Info<< " Z_QUA04";
-    }
-    else if (element_type == Z_NFACED)
-    {
-        Info<< " Z_NFACED";
-    }
-    else if (element_type == Z_NSIDED)
-    {
-        Info<< " Z_NSIDED";
-    }
-    else
-    {
-        Info<< " unknown";
-    }
-    Info<< endl << flush;
-    #endif
-
-    if (part_number == 1)
-    {
-        const cellShapeList& cellShapes = meshPtr->cellShapes();
-
-        //================================
-        // hexahedron
-        //================================
-        if (element_type == Z_HEX08)
-        {
-            const cellModel& hex = cellModel::ref(cellModel::HEX);
-
-            label nHex08 = 0;
-            forAll(cellShapes, celli)
-            {
-                const cellShape& cellShape = cellShapes[celli];
-                const cellModel& cellModel = cellShape.model();
-
-                if (cellModel == hex)
-                {
-                    forAll(cellShape, ip)
-                    {
-                        conn_array[nHex08][ip] = cellShape[ip] + 1;
-                    }
-                    nHex08++;
-                }
-            }
-        }
-        //================================
-        // pentahedron
-        //================================
-        else if (element_type == Z_PEN06)
-        {
-            const cellModel& prism = cellModel::ref(cellModel::PRISM);
-
-            label nPen06 = 0;
-            forAll(cellShapes, celli)
-            {
-                const cellShape& cellShape = cellShapes[celli];
-                const cellModel& cellModel = cellShape.model();
-
-                if (cellModel == prism)
-                {
-                    forAll(cellShape, ip)
-                    {
-                        conn_array[nPen06][ip] = cellShape[ip] + 1;
-                    }
-                    nPen06++;
-                }
-            }
-        }
-        //================================
-        // pyramid
-        //================================
-        else if (element_type == Z_PYR05)
-        {
-            const cellModel& pyr = cellModel::ref(cellModel::PYR);
-
-            label nPyr05 = 0;
-            forAll(cellShapes, celli)
-            {
-                const cellShape& cellShape = cellShapes[celli];
-                const cellModel& cellModel = cellShape.model();
-
-                if (cellModel == pyr)
-                {
-                    forAll(cellShape, ip)
-                    {
-                        conn_array[nPyr05][ip] = cellShape[ip] + 1;
-                    }
-                    nPyr05++;
-                }
-            }
-        }
-        //================================
-        // tetrahedron
-        //================================
-        else if (element_type == Z_TET04)
-        {
-            const cellModel& tet = cellModel::ref(cellModel::TET);
-
-            label nTet04 = 0;
-            forAll(cellShapes, celli)
-            {
-                const cellShape& cellShape = cellShapes[celli];
-                const cellModel& cellModel = cellShape.model();
-
-                if (cellModel == tet)
-                {
-                    forAll(cellShape, ip)
-                    {
-                        conn_array[nTet04][ip] = cellShape[ip] + 1;
-                    }
-                    nTet04++;
-                }
-            }
-        }
-        //================================
-        // polyhedra
-        //================================
-        else
-        {
-            label nCells = cellShapes.size();
-            label nFaced = 0;
-            const cellList cells = meshPtr->cells();
-
-            for (label n=0; n<nCells; n++)
-            {
-                label nFacesInCell = cells[n].size();
-                labelList points = cellShapes[n];
-                if ((nFacesInCell == 6) && (points.size() == 8))
-                {}
-                else if ((nFacesInCell == 4) && (points.size() == 4))
-                {}
-                else if (nFacesInCell == 5)
-                {
-                    if (points.size() == 6)
-                    {}
-                    else if (points.size() == 5)
-                    {}
-                    else
-                    {
-                        conn_array[nFaced++][0] = nFacesInCell;
-                    }
-                }
-                else
-                {
-                    conn_array[nFaced++][0] = nFacesInCell;
-                }
-            }
-        }
-    }
-    else if (part_number < nPatches+2)
-    {
-        label patchi = part_number - 2;
-        const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-
-        label nTri03 = 0;
-        label nQuad04 = 0;
-        if (element_type == Z_TRI03)
-        {
-            forAll(bMesh[patchi], n)
-            {
-                label nPoints = bMesh[patchi][n].size();
-                if (nPoints == 3)
-                {
-                    for (label i=0; i<nPoints; i++)
-                    {
-                        label ip = bMesh[patchi][n][i];
-                        conn_array[nTri03][i] = ip + 1;
-                    }
-                    nTri03++;
-                }
-            }
-        }
-        else if (element_type == Z_QUA04)
-        {
-            forAll(bMesh[patchi], n)
-            {
-                label nPoints = bMesh[patchi][n].size();
-                if (nPoints == 4)
-                {
-                    for (label i=0; i<nPoints; i++)
-                    {
-                        label ip = bMesh[patchi][n][i];
-                        conn_array[nQuad04][i] = ip + 1;
-                    }
-                    nQuad04++;
-                }
-            }
-
-        }
-        else if (element_type == Z_NSIDED)
-        {
-            label nPoly = 0;
-            forAll(bMesh[patchi], n)
-            {
-                label nPoints = bMesh[patchi][n].size();
-                if ((nPoints != 3) && (nPoints != 4))
-                {
-                    conn_array[nPoly++][0] = nPoints;
-                }
-            }
-        }
-    }
-    else if (part_number == nPatches+2)
-    {
-        forAll(*sprayPtr, n)
-        {
-            conn_array[n][0] = n + 1;
-        }
-    }
-    else
-    {
-        return Z_ERR;
-    }
-
-    #ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_part_elements_by_type" << endl;
-    #endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_node_ids.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_node_ids.H
deleted file mode 100644
index b270a1b57b0658ebb3208c7277f90d5fc1724890..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_part_node_ids.H
+++ /dev/null
@@ -1,56 +0,0 @@
-int USERD_get_part_node_ids
-(
-    int part_number,
-    int *nodeid_array
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_part_node_ids" << endl
-        << "part_number = " << part_number << endl
-        << flush;
-#endif
-
-    if (part_number == 1)
-    {
-        for (label indx=0; indx<Num_global_nodes; indx++)
-        {
-            nodeid_array[indx] = indx + 1;
-        }
-    }
-    else if (part_number < nPatches+2)
-    {
-
-        label patchi = part_number-2;
-        const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-        const vectorField& points = bMesh[patchi].points();
-
-        label nPoints = points.size();
-
-        for (label indx=0; indx<nPoints; indx++)
-        {
-            nodeid_array[indx] = indx + 1;
-        }
-
-    }
-    else if (part_number == nPatches+2)
-    {
-        label indx = 0;
-
-        forAllConstIter(Cloud<passiveParticle>, *sprayPtr, iter)
-        {
-            nodeid_array[indx] = indx + 1;
-            indx++;
-        }
-    }
-    else
-    {
-        return Z_ERR;
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_part_node_ids" << endl
-        << flush;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_reader_release.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_reader_release.H
deleted file mode 100644
index 13c43b1b66ea60726e5cb646eaa5ec07f1035ad3..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_reader_release.H
+++ /dev/null
@@ -1,27 +0,0 @@
-int USERD_get_reader_release
-(
-    char release_number[Z_MAX_USERD_NAME]
-)
-{
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_reader_release" << endl;
-#endif
-
-    strncpy
-    (
-        release_number,
-        #if OPENFOAM
-        ("OpenFOAM-" + std::to_string(OPENFOAM)).c_str(),
-        #else
-        "OpenFOAM-unknown",
-        #endif
-        Z_MAX_USERD_NAME
-    );
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_reader_release" << endl;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_reader_version.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_reader_version.H
deleted file mode 100644
index a8fd102fe3b6fc380123b6fc20c00618c0622673..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_reader_version.H
+++ /dev/null
@@ -1,18 +0,0 @@
-int USERD_get_reader_version
-(
-    char version_number[Z_MAX_USERD_NAME]
-)
-{
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_reader_version" << endl;
-#endif
-
-    strncpy(version_number, readerVersion, Z_MAX_USERD_NAME);
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_reader_version" << endl;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_sol_times.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_sol_times.H
deleted file mode 100644
index 8c71ca3b9abd7069f4d2dc5a25d827a186c30157..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_sol_times.H
+++ /dev/null
@@ -1,43 +0,0 @@
-//======================================================================
-// Negative values of the time is not allowed in EnSight.
-// So for engines, where the time is CAD's we need to correct
-// this so that all CAD's are positive. NN
-//======================================================================
-int USERD_get_sol_times
-(
-    int timeset_number,
-    float *solution_times
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_sol_times\n" << timeDirs << endl;
-#endif
-
-    for (label n=0; n<Num_time_steps;n++)
-    {
-        solution_times[n] = timeDirs[n+1].value();
-    }
-
-    if (timeDirs[1].value() < 0)
-    {
-        scalar addCAD = 360.0;
-        while (timeDirs[1].value() + addCAD < 0.0)
-        {
-            addCAD += 360.0;
-        }
-        for (label n=0; n<Num_time_steps;n++)
-        {
-            solution_times[n] += addCAD;
-
-            Info<< "Time[" << n << "] = " << timeDirs[n+1].value()
-                << " was corrected to " << solution_times[n]  << endl;
-        }
-
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_sol_times" << endl;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_timeset_description.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_timeset_description.H
deleted file mode 100644
index e3c98ba240127ba9047968c11c5a162113632bc9..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_timeset_description.H
+++ /dev/null
@@ -1,26 +0,0 @@
-int USERD_get_timeset_description
-(
-    int timeset_number,
-    char timeset_description[Z_BUFL]
-)
-{
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_timeset_description" << endl;
-#endif
-
-    if (timeDirs[1].value() < 0)
-    {
-        strncpy(timeset_description, "CAD", Z_BUFL);
-    }
-    else
-    {
-        strncpy(timeset_description, "seconds", Z_BUFL);
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_timeset_description" << endl;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_var_by_component.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_var_by_component.H
deleted file mode 100644
index f6c437450f123ea6adad49f3ac9f8dd755c9c356..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_var_by_component.H
+++ /dev/null
@@ -1,103 +0,0 @@
-int USERD_get_var_by_component
-(
-    int which_variable,
-    int which_part,
-    int var_type,
-    int which_type,
-    int imag_data,
-    int component,
-    float *var_array
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_var_by_component" << endl
-        << "which_variable = " << which_variable << endl
-        << "which_part = " << which_part << endl
-        << "var_type = " << var_type << endl
-        << "which_type = " << which_type << endl
-        << "component = " << component << endl
-        << flush;
-#endif
-
-    label nVar = which_variable - 1;
-
-    Time& runTime = *runTimePtr;
-
-    fvMesh& mesh = *meshPtr;
-    const cellShapeList& cells = mesh.cellShapes();
-
-    label nCells = cells.size();
-
-    if (var_type == Z_SCALAR)
-    {
-        if (which_part == 1)
-        {
-            #include "getFieldScalar.H"
-        }
-        else if (which_part < nPatches+2)
-        {
-            #include "getPatchFieldScalar.H"
-        }
-        else if (which_part == nPatches+2)
-        {
-            #include "getLagrangianScalar.H"
-        }
-        else
-        {
-            return Z_ERR;
-        }
-    }
-    else if (var_type == Z_VECTOR)
-    {
-        if (which_part == 1)
-        {
-            #include "getFieldVector.H"
-        }
-        else if (which_part < nPatches+2)
-        {
-            #include "getPatchFieldVector.H"
-        }
-        else if (which_part == nPatches+2)
-        {
-            #include "getLagrangianVector.H"
-        }
-        else
-        {
-            return Z_ERR;
-        }
-
-    }
-    else if (var_type == Z_TENSOR9)
-    {
-        // all tensor are treated as asymmetric tensors here
-
-        if (which_part == 1)
-        {
-            #include "getFieldTensor.H"
-        }
-        else if (which_part < nPatches+2)
-        {
-            #include "getPatchFieldTensor.H"
-        }
-        else if (which_part == nPatches+2)
-        {
-            return Z_UNDEF;
-        }
-        else
-        {
-            return Z_ERR;
-        }
-
-    }
-    else
-    {
-        return Z_UNDEF;
-    }
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_var_by_component" << endl
-        << flush;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_var_value_at_specific.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_var_value_at_specific.H
deleted file mode 100644
index c7b5a92ae66e2222301aac6303546a65c5d998d2..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_get_var_value_at_specific.H
+++ /dev/null
@@ -1,70 +0,0 @@
-//======================================================================
-int USERD_get_var_value_at_specific
-(
-    int which_var,
-    int which_node_or_elem,
-    int which_part,
-    int which_elem_type,
-    int time_step,
-    float values[3],
-    int imag_data
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_get_var_value_at_specific" << endl
-        << flush;
-#endif
-    // Not sure if it is 0 or 1 based
-
-    label nNode = which_node_or_elem;
-    label nVar = which_var - 1;
-
-    fvMesh& mesh = *meshPtr;
-
-    if (nVar < Num_variables - nSprayVariables)
-    {
-        Time& runTime = *runTimePtr;
-
-        IOobject fieldObject
-        (
-            fieldNames[var2field[nVar]],
-            runTime.timeName(),
-            mesh,
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE
-        );
-
-        if (isScalar[nVar])
-        {
-            volScalarField scalarField(fieldObject,mesh);
-            values[0] = scalarField[nNode];
-        }
-        else if (isVector[nVar])
-        {
-            volVectorField vectorField(fieldObject,mesh);
-            values[0] = vectorField[nNode].x();
-            values[1] = vectorField[nNode].y();
-            values[2] = vectorField[nNode].z();
-        }
-        else
-        {
-            Info<< "ERROR in USERD_get_variable_value_at_specific. "
-                << "No available variable???"
-                << endl;
-            return Z_ERR;
-        }
-    }
-    else
-    {
-        Info<< "This functionality is not implemented yet."
-            << endl;
-        return Z_ERR;
-    }
-
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_get_var_value_at_specific" << endl
-        << flush;
-#endif
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_load_matf_data.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_load_matf_data.H
deleted file mode 100644
index c89cc5f253cfcce257f3740029d5eaf176c21780..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_load_matf_data.H
+++ /dev/null
@@ -1,18 +0,0 @@
-
-int USERD_load_matf_data
-(
-    int set_index,
-    int part_id,
-    int wtyp,
-    int mat_type,
-    int *ids_list,
-    float *val_list
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_load_matf_data" << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_filenames.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_filenames.H
deleted file mode 100644
index a5d8986a7508104dd9ff612005afb9e351d41359..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_filenames.H
+++ /dev/null
@@ -1,222 +0,0 @@
-//======================================================================
-//  Setting filenames
-//======================================================================
-int USERD_set_filenames
-(
-    char filename_1[],
-    char filename_2[],
-    char the_path[],
-    int swapbytes
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_set_filenames" << endl << flush;
-#endif
-
-    char tmp[100];
-
-    label lRoot = strlen(the_path);
-    label lCase = strlen(filename_1);
-
-    bool cleared = false;
-
-    while (!cleared)
-    {
-        lRoot = strlen(the_path);
-        lCase = strlen(filename_1);
-
-        // remove the last '/' from rootDir
-        if (the_path[lRoot-1] == '/')
-        {
-            the_path[lRoot-1] = '\0';
-        }
-        else
-        {
-            cleared = true;
-        }
-    }
-
-    rootDir = the_path;
-
-    // the path is pre-pended to filename_1
-    // 1 is the 'Geometry' : 2 the 'Result' which is null here
-    // since two_field is FALSE
-    for (label i=0; i<lCase-lRoot;i++)
-    {
-        tmp[i] = filename_1[i+1+lRoot];
-    }
-    caseDir = tmp;
-
-    if (!isDir(rootDir/caseDir))
-    {
-       Info<< rootDir/caseDir << " is not a valid directory."
-           << endl;
-       return Z_ERR;
-    }
-
-    // construct the global pointers to the database and mesh
-
-    delete meshPtr;
-    delete runTimePtr;
-
-    runTimePtr = new Time
-    (
-        Time::controlDictName,
-        rootDir,
-        caseDir
-    );
-
-    Time& runTime = *runTimePtr;
-
-    meshPtr = new fvMesh
-    (
-        IOobject
-        (
-            fvMesh::defaultRegion,
-            runTime.timeName(),
-            runTime
-        )
-    );
-
-    // set the available number of time-steps
-    timeDirs = Foam::Time::findTimes(rootDir/caseDir);
-
-    Num_time_steps = timeDirs.size() - 1;
-
-    nPatches = meshPtr->boundaryMesh().size();
-
-    // set the number of fields and store their names
-    // a valid field must exist for all time-steps
-    runTime.setTime(timeDirs.last(), timeDirs.size()-1);
-    IOobjectList objects(*meshPtr, runTime.timeName());
-
-    fieldNames = objects.names();
-
-    // because of the spray being a 'field' ...
-    // get the availabe number of variables and
-    // check for type (scalar/vector/tensor)
-
-    label nVar = 0;
-    wordList scalars = objects.names(scalarName);
-
-    forAll(fieldNames, n)
-    {
-        bool isitScalar = false;
-        forAll(scalars,i)
-        {
-            if (fieldNames[n] == scalars[i])
-            {
-                isitScalar = true;
-                var2field[nVar++] = n;
-            }
-        }
-        isScalar[n] = isitScalar;
-    }
-
-    wordList vectors = objects.names(vectorName);
-
-    forAll(fieldNames, n)
-    {
-        bool isitVector = false;
-        forAll(vectors,i)
-        {
-            if (fieldNames[n] == vectors[i])
-            {
-                isitVector = true;
-                var2field[nVar++] = n;
-            }
-        }
-        isVector[n] = isitVector;
-    }
-
-    wordList tensors = objects.names(tensorName);
-
-    forAll(fieldNames, n)
-    {
-        bool isitTensor = false;
-        forAll(tensors,i)
-        {
-            if (fieldNames[n] == tensors[i])
-            {
-                isitTensor = true;
-                var2field[nVar++] = n;
-            }
-        }
-        isTensor[n] = isitTensor;
-    }
-
-    bool lagrangianNamesFound = false;
-    label n = 0;
-    while (!lagrangianNamesFound && n < Num_time_steps)
-    {
-        runTime.setTime(timeDirs[n+1], n+1);
-
-        Cloud<passiveParticle> lagrangian(*meshPtr, cloud::defaultName);
-
-        n++;
-        if (lagrangian.size())
-        {
-            lagrangianNamesFound = true;
-        }
-    }
-
-    IOobject positionsHeader
-    (
-        "positions",
-        runTime.timeName(),
-        cloud::prefix,
-        runTime,
-        IOobject::NO_READ,
-        IOobject::NO_WRITE,
-        false
-    );
-
-    IOobject coordinatesHeader
-    (
-        "coordinates",
-        runTime.timeName(),
-        cloud::prefix,
-        runTime,
-        IOobject::NO_READ,
-        IOobject::NO_WRITE,
-        false
-    );
-
-    if
-    (
-        positionsHeader.typeHeaderOk<Cloud<passiveParticle>>(false)
-     || coordinatesHeader.typeHeaderOk<Cloud<passiveParticle>>(false)
-    )
-    {
-        Info<< "[Found lagrangian]" << endl;
-
-        delete sprayPtr;
-
-        sprayPtr = new Cloud<passiveParticle>(*meshPtr, cloud::defaultName);
-
-        IOobjectList objects(*meshPtr, runTime.timeName(), cloud::prefix);
-
-        lagrangianScalarNames = objects.names(sprayScalarFieldName);
-        lagrangianVectorNames = objects.names(sprayVectorFieldName);
-
-        isSpray[fieldNames.size()] = true;
-
-        nSprayVariables += lagrangianScalarNames.size();
-        nSprayVariables += lagrangianVectorNames.size();
-
-        Num_unstructured_parts++;
-    }
-
-    Current_time_step = Num_time_steps;
-    runTime.setTime(timeDirs[Current_time_step], Current_time_step);
-
-    Num_variables = nVar + nSprayVariables;
-    Numparts_available =
-        Num_unstructured_parts + Num_structured_parts + nPatches;
-
-#ifdef ENSIGHTDEBUG
-    Info<< "Leaving: USERD_set_filenames" << endl << flush;
-#endif
-
-    return Z_OK;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_server_number.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_server_number.H
deleted file mode 100644
index f0ff4b24fceb4c348f479f20316d597b318e8660..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_server_number.H
+++ /dev/null
@@ -1,12 +0,0 @@
-void USERD_set_server_number
-(
-    int cur_serv,
-    int tot_serv
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_set_server_number" << endl
-        << flush;
-#endif
-
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_time_set_and_step.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_time_set_and_step.H
deleted file mode 100644
index 7bc4ba1c5c4bb6175b9ad8aade7af247111bfde8..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_set_time_set_and_step.H
+++ /dev/null
@@ -1,55 +0,0 @@
-//======================================================================
-void USERD_set_time_set_and_step
-(
-    int timeset_number,
-    int time_step
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_set_time_set_and_step" << endl << flush;
-#endif
-    // update the global pointers and variables
-    // to the current time-step
-
-    // at exit time_step < 0
-    if (time_step >= 0)
-    {
-        Time& runTime = *runTimePtr;
-        Current_time_step = time_step;
-        // add 1, since the first timestep is 'constant'
-
-        if (time_step == 0)
-        {
-            runTime.setTime
-            (
-                timeDirs[Current_time_step],
-                Current_time_step
-            );
-        }
-        else
-        {
-            runTime.setTime
-            (
-                timeDirs[Current_time_step + 1],
-                Current_time_step + 1
-            );
-        }
-
-        meshPtr->readUpdate();
-
-        if (time_step == 0)
-        {
-            runTime.setTime
-            (
-                timeDirs[Current_time_step + 1],
-                Current_time_step + 1
-            );
-        }
-
-        if (Numparts_available > nPatches+1)
-        {
-            delete sprayPtr;
-            sprayPtr = new Cloud<passiveParticle>(*meshPtr, cloud::defaultName);
-        }
-    }
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_size_matf_data.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_size_matf_data.H
deleted file mode 100644
index c48fa13bfb85f1ddfdb3c9c453b17876abe7415a..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_size_matf_data.H
+++ /dev/null
@@ -1,17 +0,0 @@
-
-int USERD_size_matf_data
-(
-    int set_index,
-    int part_id,
-    int wtyp,
-    int mat_type,
-    int *matf_size
-)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_size_matf_data" << endl
-        << flush;
-#endif
-
-    return Z_ERR;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_stop_part_building.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_stop_part_building.H
deleted file mode 100644
index c6262b8ee1375a8aafd31981ac67ba5b758cedfd..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_stop_part_building.H
+++ /dev/null
@@ -1,8 +0,0 @@
-// Not in use
-void USERD_stop_part_building(void)
-{
-#ifdef ENSIGHTDEBUG
-    Info<< "Entering: USERD_stop_part_building" << endl << flush;
-#endif
-
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_structured_data.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_structured_data.H
deleted file mode 100644
index d8a4c90a19fe3d88d6fc2e88e86cee5dcee6c158..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/USERD_structured_data.H
+++ /dev/null
@@ -1,61 +0,0 @@
-int USERD_get_block_vector_values_by_component
-(
-    int block_number,
-    int which_vector,
-    int which_component,
-    float *vector_array
-)
-{
-  return(Z_OK);
-}
-
-int USERD_get_block_coords_by_component
-(
-    int block_number,
-    int which_component,
-    float *coord_array
-)
-{
-  return(Z_OK);
-}
-
-
-int USERD_get_block_iblanking
-(
-    int block_number,
-    int *iblank_array
-)
-{
-  return(Z_OK);
-}
-
-int USERD_get_block_scalar_values
-(
-    int block_number,
-    int which_scalar,
-    float *scalar_array
-)
-{
-  return(Z_OK);
-}
-int USERD_get_ghosts_in_model_flag( void )
-{
-  return(Z_OK);
-}
-
-int USERD_get_ghosts_in_block_flag
-(
-    int block_number
-)
-{
-  return(Z_OK);
-}
-
-int USERD_get_block_ghost_flags
-(
-    int block_number,
-    int *ghost_flags
-)
-{
-  return(Z_OK);
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldScalar.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldScalar.H
deleted file mode 100644
index 06cf1d8c122d44a5a6a697182b0ec8e30d2419ec..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldScalar.H
+++ /dev/null
@@ -1,141 +0,0 @@
-
-if (nVar >= Num_variables - nSprayVariables)
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObjectPtr
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::NO_READ
-);
-
-if (!fieldObjectPtr.typeHeaderOk<volScalarField>(true))
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObject
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::MUST_READ,
-    IOobject::NO_WRITE
-);
-
-volScalarField scalarField
-(
-    fieldObject,
-    mesh
-);
-
-const cellShapeList& cellShapes = meshPtr->cellShapes();
-
-// hexa's
-if (which_type == Z_HEX08)
-{
-    const cellModel& hex = cellModel::ref(cellModel::HEX);
-    //const cellModel& wedge = cellModel::ref(cellModel::WEDGE);
-
-    label counter = 1;
-    for (label celli=0; celli<nCells; celli++)
-    {
-        const cellShape& cellShape = cellShapes[celli];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == hex) // || (cellModel == wedge))
-        {
-            var_array[counter++] = scalarField[celli];
-        }
-    }
-}
-
-// penta's
-if (which_type == Z_PEN06)
-{
-    const cellModel& prism = cellModel::ref(cellModel::PRISM);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == prism)
-        {
-            var_array[counter++] = scalarField[n];
-        }
-    }
-}
-
-// pyramids's
-if (which_type == Z_PYR05)
-{
-    const cellModel& pyr = cellModel::ref(cellModel::PYR);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == pyr)
-        {
-            var_array[counter++] = scalarField[n];
-        }
-    }
-}
-
-// tet's
-if (which_type == Z_TET04)
-{
-    const cellModel& tet = cellModel::ref(cellModel::TET);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == tet)
-        {
-            var_array[counter++] = scalarField[n];
-        }
-    }
-}
-
-if (which_type == Z_NFACED)
-{
-    const cellList& cells = meshPtr->cells();
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const labelList& points = cellShapes[n];
-        label nFacesInCell = cells[n].size();
-
-        if ((nFacesInCell == 6) && (points.size() == 8))
-        {}
-        else if ((nFacesInCell == 4) && (points.size() == 4))
-        {}
-        else if (nFacesInCell == 5)
-        {
-            if (points.size() == 6)
-            {}
-            else if (points.size() == 5)
-            {}
-            else
-            {
-                var_array[counter++] = scalarField[n];
-            }
-        }
-        else
-        {
-            var_array[counter++] = scalarField[n];
-        }
-    }
-
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldTensor.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldTensor.H
deleted file mode 100644
index 6c800168a455ed18bc442795fbef21b9c2a6e5ce..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldTensor.H
+++ /dev/null
@@ -1,142 +0,0 @@
-if (nVar >= Num_variables - nSprayVariables)
-{
-    return Z_UNDEF;
-}
-
-
-IOobject fieldObjectPtr
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::NO_READ
-);
-
-if (!fieldObjectPtr.typeHeaderOk<volTensorField>(true))
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObject
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::MUST_READ,
-    IOobject::NO_WRITE
-);
-
-volTensorField tf
-(
-    fieldObject,
-    mesh
-);
-
-const cellShapeList& cellShapes = meshPtr->cellShapes();
-
-// hexa's
-if (which_type == Z_HEX08)
-{
-    const cellModel& hex = cellModel::ref(cellModel::HEX);
-    //const cellModel& wedge = cellModel::ref(cellModel::WEDGE);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == hex) // || (cellModel == wedge))
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
-
-// penta's
-if (which_type == Z_PEN06)
-{
-    const cellModel& prism = cellModel::ref(cellModel::PRISM);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == prism)
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
-
-// pyramids's
-if (which_type == Z_PYR05)
-{
-    const cellModel& pyr = cellModel::ref(cellModel::PYR);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == pyr)
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
-
-
-// penta's
-if (which_type == Z_TET04)
-{
-    const cellModel& tet = cellModel::ref(cellModel::TET);
-
-    label counter = 1;
-
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == tet)
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
-
-if (which_type == Z_NFACED)
-{
-    const cellList& cells = meshPtr->cells();
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const labelList& points = cellShapes[n];
-        label nFacesInCell = cells[n].size();
-
-        if ((nFacesInCell == 6) && (points.size() == 8))
-        {}
-        else if ((nFacesInCell == 4) && (points.size() == 4))
-        {}
-        else if (nFacesInCell == 5)
-        {
-            if (points.size() == 6)
-            {}
-            else if (points.size() == 5)
-            {}
-            else
-            {
-                #include "tensorConversion.H"
-            }
-        }
-        else
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldVector.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldVector.H
deleted file mode 100644
index 8f1f0f97da11efdbe37a4d4a8a8f89c792d6ac83..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getFieldVector.H
+++ /dev/null
@@ -1,141 +0,0 @@
-if (nVar >= Num_variables - nSprayVariables)
-{
-    return Z_UNDEF;
-}
-
-
-IOobject fieldObjectPtr
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::NO_READ
-);
-
-if (!fieldObjectPtr.typeHeaderOk<volVectorField>(true))
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObject
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::MUST_READ,
-    IOobject::NO_WRITE
-);
-
-volVectorField vectorField
-(
-    fieldObject,
-    mesh
-);
-
-const cellShapeList& cellShapes = meshPtr->cellShapes();
-
-// hexa's
-if (which_type == Z_HEX08)
-{
-    const cellModel& hex = cellModel::ref(cellModel::HEX);
-    //const cellModel& wedge = cellModel::ref(cellModel::WEDGE);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == hex) // || (cellModel == wedge))
-        {
-            var_array[counter++] = vectorField[n][component];
-        }
-    }
-}
-
-// penta's
-if (which_type == Z_PEN06)
-{
-    const cellModel& prism = cellModel::ref(cellModel::PRISM);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == prism)
-        {
-            var_array[counter++] = vectorField[n][component];
-        }
-    }
-}
-
-// pyramids's
-if (which_type == Z_PYR05)
-{
-    const cellModel& pyr = cellModel::ref(cellModel::PYR);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == pyr)
-        {
-            var_array[counter++] = vectorField[n][component];
-        }
-    }
-}
-
-
-// tet's
-if (which_type == Z_TET04)
-{
-    const cellModel& tet = cellModel::ref(cellModel::TET);
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const cellShape& cellShape = cellShapes[n];
-        const cellModel& cellModel = cellShape.model();
-
-        if (cellModel == tet)
-        {
-            var_array[counter++] = vectorField[n][component];
-        }
-    }
-}
-
-if (which_type == Z_NFACED)
-{
-    const cellList& cells = meshPtr->cells();
-
-    label counter = 1;
-    for (label n=0; n<nCells; n++)
-    {
-        const labelList& points = cellShapes[n];
-        label nFacesInCell = cells[n].size();
-
-        if ((nFacesInCell == 6) && (points.size() == 8))
-        {}
-        else if ((nFacesInCell == 4) && (points.size() == 4))
-        {}
-        else if (nFacesInCell == 5)
-        {
-            if (points.size() == 6)
-            {}
-            else if (points.size() == 5)
-            {}
-            else
-            {
-                var_array[counter++] = vectorField[n][component];
-            }
-        }
-        else
-        {
-            var_array[counter++] = vectorField[n][component];
-        }
-    }
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getLagrangianScalar.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getLagrangianScalar.H
deleted file mode 100644
index b853ac7147bc70b3b404173f7cafe6f8983b9bac..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getLagrangianScalar.H
+++ /dev/null
@@ -1,34 +0,0 @@
-
-// Not sure if this is necessary anymore
-nVar -= Num_variables - nSprayVariables;
-
-if (nVar >= 0)
-{
-    word name = lagrangianScalarNames[nVar];
-
-    IOField<scalar> s
-    (
-        IOobject
-        (
-            name,
-            runTime.timeName(),
-            cloud::prefix,
-            mesh,
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE
-        )
-    );
-
-    if (s.size())
-    {
-        forAll(s, n)
-        {
-            var_array[n+1] = s[n];
-        }
-    }
-}
-else
-{
-    // Info<< "getLagrangianScalar: nVar = " << nVar << endl;
-    return Z_UNDEF;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getLagrangianVector.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getLagrangianVector.H
deleted file mode 100644
index de1d12aa376b51b1fbd67e4470b5fd1c517b10d4..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getLagrangianVector.H
+++ /dev/null
@@ -1,46 +0,0 @@
-
-// Not sure if this is necessary anymore
-
-nVar -= Num_variables - nSprayVariables + lagrangianScalarNames.size();
-
-if (nVar >= 0)
-{
-    word name = lagrangianVectorNames[nVar];
-
-    IOField<vector> v
-    (
-        IOobject
-        (
-            name,
-            runTime.timeName(),
-            cloud::prefix,
-            mesh,
-            IOobject::MUST_READ,
-            IOobject::NO_WRITE
-        )
-    );
-
-    if (v.size())
-    {
-        forAll(v, n)
-        {
-            if (component == 0)
-            {
-                var_array[n+1] = v[n].x();
-            }
-            else if (component == 1)
-            {
-                var_array[n+1] = v[n].y();
-            }
-            else if (component == 2)
-            {
-                var_array[n+1] = v[n].z();
-            }
-        }
-    }
-}
-else
-{
-    // Info<< "getLagrangianVector: nVar = " << nVar << endl;
-    return Z_UNDEF;
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldScalar.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldScalar.H
deleted file mode 100644
index 549a80f64f122520d45ac413f98956a6f727cef5..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldScalar.H
+++ /dev/null
@@ -1,76 +0,0 @@
-label patchi = which_part - 2;
-
-if (nVar >= Num_variables - nSprayVariables)
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObjectPtr
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::NO_READ
-);
-
-if (!fieldObjectPtr.typeHeaderOk<volScalarField>(true))
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObject
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::MUST_READ,
-    IOobject::NO_WRITE
-);
-
-volScalarField sf
-(
-    fieldObject,
-    mesh
-);
-
-const scalarField& sfb = sf.boundaryField()[patchi];
-const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-
-if (which_type == Z_TRI03)
-{
-    label counter = 1;
-    forAll(sfb, facei)
-    {
-        label nPoints = bMesh[patchi][facei].size();
-        if (nPoints == 3)
-        {
-            var_array[counter++] = sfb[facei];
-        }
-    }
-}
-
-if (which_type == Z_QUA04)
-{
-    label counter = 1;
-    forAll(sfb, facei)
-    {
-        label nPoints = bMesh[patchi][facei].size();
-        if (nPoints == 4)
-        {
-            var_array[counter++] = sfb[facei];
-        }
-    }
-}
-
-if (which_type == Z_NSIDED)
-{
-    label counter = 1;
-    forAll(sfb, facei)
-    {
-        label nPoints = bMesh[patchi][facei].size();
-        if (nPoints != 3 && nPoints != 4)
-        {
-            var_array[counter++] = sfb[facei];
-        }
-    }
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldTensor.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldTensor.H
deleted file mode 100644
index 0aed2ac26ebca7ae060ea9020de77e879d71db86..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldTensor.H
+++ /dev/null
@@ -1,76 +0,0 @@
-label patchi = which_part - 2;
-
-if (nVar >= Num_variables - nSprayVariables)
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObjectPtr
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::NO_READ
-);
-
-if (!fieldObjectPtr.typeHeaderOk<volTensorField>(true))
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObject
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::MUST_READ,
-    IOobject::NO_WRITE
-);
-
-volTensorField sf
-(
-    fieldObject,
-    mesh
-);
-
-const tensorField& tf = sf.boundaryField()[patchi];
-const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-
-if (which_type == Z_TRI03)
-{
-    label counter = 1;
-    forAll(tf, n)
-    {
-        label nPoints = bMesh[patchi][n].size();
-        if (nPoints == 3)
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
-
-if (which_type == Z_QUA04)
-{
-    label counter = 1;
-    forAll(tf, n)
-    {
-        label nPoints = bMesh[patchi][n].size();
-        if (nPoints == 4)
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
-
-if (which_type == Z_NSIDED)
-{
-    label counter = 1;
-    forAll(tf, n)
-    {
-        label nPoints = bMesh[patchi][n].size();
-        if ((nPoints != 3) && (nPoints != 4))
-        {
-            #include "tensorConversion.H"
-        }
-    }
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldVector.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldVector.H
deleted file mode 100644
index 4c6fe3832f9e97442822610287a00a640d818cbb..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/getPatchFieldVector.H
+++ /dev/null
@@ -1,76 +0,0 @@
-label patchi = which_part - 2;
-
-if (nVar >= Num_variables - nSprayVariables)
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObjectPtr
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::NO_READ
-);
-
-if (!fieldObjectPtr.typeHeaderOk<volVectorField>(true))
-{
-    return Z_UNDEF;
-}
-
-IOobject fieldObject
-(
-    fieldNames[var2field[nVar]],
-    runTime.timeName(),
-    mesh,
-    IOobject::MUST_READ,
-    IOobject::NO_WRITE
-);
-
-volVectorField sf
-(
-    fieldObject,
-    mesh
-);
-
-const vectorField& sfb = sf.boundaryField()[patchi];
-const polyBoundaryMesh& bMesh = meshPtr->boundaryMesh();
-
-if (which_type == Z_TRI03)
-{
-    label counter = 1;
-    forAll(sfb, facei)
-    {
-        label nPoints = bMesh[patchi][facei].size();
-        if (nPoints == 3)
-        {
-            var_array[counter++] = sfb[facei][component];
-        }
-    }
-}
-
-if (which_type == Z_QUA04)
-{
-    label counter = 1;
-    forAll(sfb, facei)
-    {
-        label nPoints = bMesh[patchi][facei].size();
-        if (nPoints == 4)
-        {
-            var_array[counter++] = sfb[facei][component];
-        }
-    }
-}
-
-if (which_type == Z_NSIDED)
-{
-    label counter = 1;
-    forAll(sfb, facei)
-    {
-        label nPoints = bMesh[patchi][facei].size();
-        if ((nPoints != 3) && (nPoints != 4))
-        {
-            var_array[counter++] = sfb[facei][component];
-        }
-    }
-}
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/globalFoam.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/globalFoam.H
deleted file mode 100644
index 40fb28d94929f62b25f16cf41516dbbff432174a..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/globalFoam.H
+++ /dev/null
@@ -1,53 +0,0 @@
-//======================================================================
-// Global variables
-const int maxNames = 1000;
-
-// define the name to be displayed in the window.
-static char readerName[]           = "OpenFOAM";
-static char meshName[]             = "cells";
-static char readerVersion[]        = "2.03";
-
-// everything is one part in OpenFOAM, except the spray
-static int Num_unstructured_parts  = 1;
-static int Num_structured_parts    = 0;
-static int Numparts_available      = 1;
-static int nPatches                = 0;
-
-static int Num_timesets            = 1;
-static int Geom_timeset_number     = 1;
-static int Num_time_steps          = 1;
-static int Num_global_nodes        = 0;
-static int Num_variables           = 0;
-static int Num_dataset_files       = 0;
-static int Current_time_step       = 0;
-
-static label nSprayVariables       = 0;
-static label nMaxParcels           = 0;
-
-static bool isScalar[maxNames];
-static bool isVector[maxNames];
-static bool isTensor[maxNames];
-static bool isSpray[maxNames];
-
-static word scalarName             = "volScalarField";
-static word vectorName             = "volVectorField";
-static word tensorName             = "volTensorField";
-static word sprayScalarFieldName   = "scalarField";
-static word sprayVectorFieldName   = "vectorField";
-static word sprayTensorFieldName   = "tensorField";
-static word parcelPrepend          = "parcel_";
-static word pointPrepend           = "point_";
-
-static fileName rootDir;
-static fileName caseDir;
-
-static instantList timeDirs;
-
-static List<word> fieldNames;
-static List<word> lagrangianScalarNames;
-static List<word> lagrangianVectorNames;
-static label var2field[maxNames];
-
-static Time *runTimePtr = 0;
-static fvMesh *meshPtr = 0;
-static Cloud<passiveParticle> *sprayPtr = 0;
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/global_extern.h b/applications/utilities/postProcessing/graphics/ensightFoamReader/global_extern.h
deleted file mode 100644
index e67fd4197ef9a98e0d1f5edb38052ea880429ca3..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/global_extern.h
+++ /dev/null
@@ -1,412 +0,0 @@
-/*--------------------------------------------------------------*/
-/* Header file for EnSight External Reader DSO Library Routines */
-/*--------------------------------------------------------------*/
-/*  *************************************************************
- *   Copyright 1998 Computational Engineering International, Inc.
- *   All Rights Reserved.
- *
- *        Restricted Rights Legend
- *
- *   Use, duplication, or disclosure of this
- *   software and its documentation by the
- *   Government is subject to restrictions as
- *   set forth in subdivision [(b)(3)(ii)] of
- *   the Rights in Technical Data and Computer
- *   Software clause at 52.227-7013.
- *  *************************************************************
- */
-#ifndef GLOBAL_EXTERN_H
-#define GLOBAL_EXTERN_H
-
-#ifdef  __cplusplus
-extern "C" {
-#endif
-
-/*--------------------------------
- * Set the reader version define
- * (only one can be set at a time)
- *--------------------------------*/
-#if 0
-#define USERD_API_100
-#define USERD_API_200
-#define USERD_API_201
-#define USERD_API_202
-#define USERD_API_203
-#define USERD_API_204
-#define USERD_API_205
-#define USERD_API_206
-#define USERD_API_207
-#define USERD_API_208
-#define USERD_API_209
-#define USERD_API_210
-#endif
-
-/*---------------------------------------*/
-/* True/False and Error conditions, etc. */
-/*---------------------------------------*/
-#define Z_ERR                  (-1)          /*Error return value.*/
-#define Z_OK                    (1)          /*Success return value.*/
-#define Z_UNDEF                 (2)          /*Undefined return value.*/
-
-#define Z_NOT_IMPLEMENTED       (3)          /*Routine not implemented*/
-                                             /*(currently only checked for */
-                                             /* get_var_value_at_specific */
-                                             /* routine)*/
-#ifndef TRUE
-# define TRUE                   (1)
-# define FALSE                  (0)
-#endif
-
-#define Z_BUFL                 (80)          /* Typical string length */
-
-#define Z_COMPX                 (0)          /* x component */
-#define Z_COMPY                 (1)          /* y component */
-#define Z_COMPZ                 (2)          /* z component */
-
-#define Z_STATIC                (0)          /* static geometry          */
-#define Z_CHANGE_COORDS         (1)          /* coordinate changing only */
-#define Z_CHANGE_CONN           (2)          /* conectivity changing     */
-
-#define Z_GEOM                  (0)          /* Geometry type */
-#define Z_VARI                  (1)          /* Variable type */
-
-#define Z_SAVE_ARCHIVE          (0)          /* Save archive    */
-#define Z_REST_ARCHIVE          (1)          /* Restore archive */
-
-#define Z_MAX_USERD_NAME        (20)         /* max length of reader name */
-
-#define Z_PER_NODE              (4)          /* At Nodes Variable classif.   */
-#define Z_PER_ELEM              (1)          /* At Elements Variable classif.*/
-
-#define Z_MAX_SETS              (300)
-
-#define Z_MX_MATERIALS          (60)
-
-#define Z_MXVARIABLEDESC  20 /*Interface Variables Max Name.*/
-
-/* Useful macros for handling IEEE floats */
-#define FLT_SGN_MASK 0x80000000U
-#define FLT_EXP_MASK 0x7F800000U
-#define FLT_MAN_MASK 0x007FFFFFU
-#define FLT_EXP_BIAS 127
-#define FLT_EXP_SHIFT 23
-
-#define FLT_IS_FINITE(v) \
-    (((*((unsigned int*)&(v))) & FLT_EXP_MASK) != FLT_EXP_MASK)
-
-#define FLT_IS_NAN(v) \
-    ((((*((unsigned int*)&(v))) & FLT_EXP_MASK) == FLT_EXP_MASK) && \
-    ((((*((unsigned int*)&(v))) & FLT_MAN_MASK) != 0U)
-
-#define FLT_IS_INF(v) \
-    ((((*((unsigned int*)&(v))) & FLT_EXP_MASK) == FLT_EXP_MASK) && \
-    ((((*((unsigned int*)&(v))) & FLT_MAN_MASK) == 0U)
-
-#ifndef GLOBALDEFS_H
-/*-----------------------------------*/
-/* Unstructured coordinate structure */
-/*-----------------------------------*/
-typedef struct {
-  float xyz[3];
-}CRD;
-/*-----------------------------------*/
-/* Unstructured double coordinate structure */
-/*-----------------------------------*/
-typedef struct {
-  double xyz[3];
-}DBLCRD;
-#endif
-
-/*----------------*/
-/* Variable Types */
-/*----------------*/
-enum z_var_type
-{
-  Z_CONSTANT,
-  Z_SCALAR,
-  Z_VECTOR,
-  Z_TENSOR,
-  Z_TENSOR9,
-  MAX_Z_VAR_TYPES
-};
-
-/*-------------------
- * Vector Glyph enums
- *-------------------*/
-enum vg_time {
-  VG_STATIC,
-  VG_TRANSIENT,
-  VG_UNDEF,
-  VG_NEAREST,
-  VG_INTERPOLATE
-};
-
-enum vg_type {
-  VG_FORCE,
-  VG_MOMENT
-};
-
-
-/*---------------
- * Element Types
- *---------------
- * If you mess with these, you must also
- * change the get_z_maxtype
- *            to_z_elem_type
- *            to_int_elem_type routines
- * in userd_read.c
- *----------------------------------------*/
-#if (defined USERD_API_100 || defined USERD_API_200)
-enum z_elem_types {
-  Z_POINT,         /* 00:  1 node point element */
-  Z_BAR02,         /* 01:  2 node bar           */
-  Z_BAR03,         /* 02:  3 node bar           */
-  Z_TRI03,         /* 03:  3 node triangle      */
-  Z_TRI06,         /* 04:  6 node triangle      */
-  Z_QUA04,         /* 05:  4 node quad          */
-  Z_QUA08,         /* 06:  8 node quad          */
-  Z_TET04,         /* 07:  4 node tetrahedron   */
-  Z_TET10,         /* 08: 10 node tetrahedron   */
-  Z_PYR05,         /* 09:  5 node pyramid       */
-  Z_PYR13,         /* 10: 13 node pyramid       */
-  Z_PEN06,         /* 11:  6 node pentahedron   */
-  Z_PEN15,         /* 12: 15 node pentahedron   */
-  Z_HEX08,         /* 13:  8 node hexahedron    */
-  Z_HEX20,         /* 14: 20 node hexahedron    */
-  Z_MAXTYPE
-};
-
-#elif defined USERD_API_201
-enum z_elem_types {
-  Z_POINT,         /* 00:  1 node point element              */
-  Z_G_POINT,       /* 01:  1 node point element (ghost call) */
-  Z_BAR02,         /* 02:  2 node bar                        */
-  Z_G_BAR02,       /* 03:  2 node bar           (ghost cell) */
-  Z_BAR03,         /* 04:  3 node bar                        */
-  Z_G_BAR03,       /* 05:  3 node bar           (ghost cell) */
-  Z_TRI03,         /* 06:  3 node triangle                   */
-  Z_G_TRI03,       /* 07:  3 node triangle      (ghost cell) */
-  Z_TRI06,         /* 08:  6 node triangle                   */
-  Z_G_TRI06,       /* 09:  6 node triangle      (ghost cell) */
-  Z_QUA04,         /* 10:  4 node quad                       */
-  Z_G_QUA04,       /* 11:  4 node quad          (ghost cell) */
-  Z_QUA08,         /* 12:  8 node quad                       */
-  Z_G_QUA08,       /* 13:  8 node quad          (ghost cell) */
-  Z_TET04,         /* 14:  4 node tetrahedron                */
-  Z_G_TET04,       /* 15:  4 node tetrahedron   (ghost cell) */
-  Z_TET10,         /* 16: 10 node tetrahedron                */
-  Z_G_TET10,       /* 17: 10 node tetrahedron   (ghost cell) */
-  Z_PYR05,         /* 18:  5 node pyramid                    */
-  Z_G_PYR05,       /* 19:  5 node pyramid       (ghost cell) */
-  Z_PYR13,         /* 20: 13 node pyramid                    */
-  Z_G_PYR13,       /* 21: 13 node pyramid       (ghost cell) */
-  Z_PEN06,         /* 22:  6 node pentahedron                */
-  Z_G_PEN06,       /* 23:  6 node pentahedron   (ghost cell) */
-  Z_PEN15,         /* 24: 15 node pentahedron                */
-  Z_G_PEN15,       /* 25: 15 node pentahedron   (ghost cell) */
-  Z_HEX08,         /* 26:  8 node hexahedron                 */
-  Z_G_HEX08,       /* 27:  8 node hexahedron    (ghost cell) */
-  Z_HEX20,         /* 28: 20 node hexahedron                 */
-  Z_G_HEX20,       /* 29: 20 node hexahedron    (ghost cell) */
-  Z_MAXTYPE
-};
-
-#else
-enum z_elem_types {
-  Z_POINT,         /* 00:  1 node point element              */
-  Z_G_POINT,       /* 01:  1 node point element (ghost call) */
-  Z_BAR02,         /* 02:  2 node bar                        */
-  Z_G_BAR02,       /* 03:  2 node bar           (ghost cell) */
-  Z_BAR03,         /* 04:  3 node bar                        */
-  Z_G_BAR03,       /* 05:  3 node bar           (ghost cell) */
-  Z_TRI03,         /* 06:  3 node triangle                   */
-  Z_G_TRI03,       /* 07:  3 node triangle      (ghost cell) */
-  Z_TRI06,         /* 08:  6 node triangle                   */
-  Z_G_TRI06,       /* 09:  6 node triangle      (ghost cell) */
-  Z_QUA04,         /* 10:  4 node quad                       */
-  Z_G_QUA04,       /* 11:  4 node quad          (ghost cell) */
-  Z_QUA08,         /* 12:  8 node quad                       */
-  Z_G_QUA08,       /* 13:  8 node quad          (ghost cell) */
-  Z_TET04,         /* 14:  4 node tetrahedron                */
-  Z_G_TET04,       /* 15:  4 node tetrahedron   (ghost cell) */
-  Z_TET10,         /* 16: 10 node tetrahedron                */
-  Z_G_TET10,       /* 17: 10 node tetrahedron   (ghost cell) */
-  Z_PYR05,         /* 18:  5 node pyramid                    */
-  Z_G_PYR05,       /* 19:  5 node pyramid       (ghost cell) */
-  Z_PYR13,         /* 20: 13 node pyramid                    */
-  Z_G_PYR13,       /* 21: 13 node pyramid       (ghost cell) */
-  Z_PEN06,         /* 22:  6 node pentahedron                */
-  Z_G_PEN06,       /* 23:  6 node pentahedron   (ghost cell) */
-  Z_PEN15,         /* 24: 15 node pentahedron                */
-  Z_G_PEN15,       /* 25: 15 node pentahedron   (ghost cell) */
-  Z_HEX08,         /* 26:  8 node hexahedron                 */
-  Z_G_HEX08,       /* 27:  8 node hexahedron    (ghost cell) */
-  Z_HEX20,         /* 28: 20 node hexahedron                 */
-  Z_G_HEX20,       /* 29: 20 node hexahedron    (ghost cell) */
-  Z_NSIDED,        /* 30:  n node polygon                    */
-  Z_G_NSIDED,      /* 31:  n node polygon       (ghost cell) */
-  Z_NFACED,        /* 32:  n faced polyhedron                */
-  Z_G_NFACED,      /* 33:  n faced polyhedron   (ghost cell) */
-  Z_MAXTYPE
-};
-
-#endif
-
-enum z_node_ids_opt
-{
-  Z_NO_NODE_IDS,
-  Z_ASSIGN_NODE_IDS,
-  Z_GIVEN_NODE_IDS
-};
-
-enum z_element_ids_opt
-{
-  Z_NO_ELEMENT_IDS,
-  Z_ASSIGN_ELEMENT_IDS,
-  Z_GIVEN_ELEMENT_IDS
-};
-
-
-/*-------------------------------*/
-/* Unstructured/Structured types */
-/*-------------------------------*/
-enum z_structured_defs
-{
-  Z_UNSTRUCTURED,         /* for unstructured part */
-  Z_STRUCTURED,           /* for structured (non-iblanked) part */
-  Z_IBLANKED,             /* for structured iblanked part */
-  Z_MAXMESHTYPES
-};
-
-/*----------------------------*/
-/* Structured Iblanking types */
-/*----------------------------*/
-enum z_iblank_domain
-{
-  Z_EXT,                  /* Exterior */
-  Z_INT,                  /* Interior */
-  Z_BND,                  /* Boundary */
-  Z_INTBND,               /* Internal boundary/baffle */
-  Z_SYM,                  /* Symmetry surface */
-  Z_NO_OF_IBLANK_DOMAIN_ITEMS
-};
-
-
-/*-----------------------------------*/
-/* Dataset Query file info Structure */
-/*-----------------------------------*/
-#define Z_MAXFILENP    255  /* Max file name and path.*/
-#define Z_MAXTIMLEN     40  /* Max time str length */
-#define Z_BUFLEN        82  /* Allocated length of the f_desc strings */
-typedef struct {
-    char name[Z_MAXFILENP];
-    long sizeb;
-    char timemod[Z_MAXTIMLEN];
-    int num_d_lines;
-    char **f_desc;
-} Z_QFILES;
-
-/*-------------------------------------------
- * Mixed Material enum
- *
- * (Must be comparable to material_file_index
- *  in mat_defs.h of EnSight server)
- *--------------------------------------------*/
-enum  z_material_file_index
-{
-  Z_MAT_INDEX,
-  Z_MIX_INDEX,
-  Z_MIX_VALUE,
-  Z_SPE_VALUE,
-  Z_NUM_MAT_FILES
-};
-
-/*-------------------------------------------
- *  Material type enum
- *
- * (Must be comparable to matset_via_file_type
- *  in mat_defs.h of EnSight server)
- *--------------------------------------------*/
-enum  z_matset_via_file_type
-{
-  Z_MISET_VIA_SPARSE_MIX,  /* Original method prior to 07Feb07:mel*/
-  Z_MISET_VIA_ESCAL_VARS,  /* Materials via element scalar variables*/
-  Z_MISET_VIA_MAX_FTYPES
-};
-
-
-/* ---------------------------------------
- *  Extra GUI size stuff
- *  _EGS
- *  This is the maximum number of
- *  Extra GUI items that you are
- *  allowed of each type.
- *
- *  Don't change these values!
- * ------------------------------------- */
-#define Z_MAX_NUM_GUI_PULL_ITEMS 20 /* max num GUI pulldowns */
-#define Z_LEN_GUI_PULL_STR    80    /* max length of GUI pulldown string */
-#define Z_LEN_GUI_FIELD_STR  256    /* max length of field string */
-#define Z_LEN_GUI_TITLE_STR   40    /* max length of title string */
-
-/* ---------------------------------------
- *  Extra data function defines (for "target")
- *
- *  Don't change these values!
- * ------------------------------------- */
-#define DATA_TARGET_NONE               0
-#define DATA_TARGET_SERVER             1
-#define DATA_TARGET_SOS                2
-#define DATA_TARGET_CLIENT             3
-#define DATA_TARGET_PYTHON    0x10000000
-#define DATA_TARGET_CMDLANG   0x20000000
-#define DATA_TARGET_UNDEF_VAL 0x40000000
-#define DATA_TARGET_OTHER     0x00000000
-#define DATA_TARGET_MASK      0x0000000f
-
-/* ---------------------------------------
- *  Failed elemenet enums
- * --------------------------------------- */
-
-enum z_element_failure_criteria
-{
-  Z_ELE_FAILED_NONE,
-  Z_ELE_FAILED_GREATER,
-  Z_ELE_FAILED_LESS,
-  Z_ELE_FAILED_EQUAL,
-  Z_ELE_FAILED_NOT_EQUAL,
-  Z_ELE_FAILED_MANY
-};
-
-
-enum z_element_failure_logic
-{
-  Z_ELE_FAILED_LOGIC_NONE,
-  Z_ELE_FAILED_LOGIC_AND,
-  Z_ELE_FAILED_LOGIC_OR,
-  Z_ELE_FAILED_LOGIC_MANY
-};
-
-/*----------------------------------------------------------
- * We include the prototype header file
- *----------------------------------------------------------*/
-#include "global_extern_proto.h"
-
-/* ---------------------
- * export the file pointer  if windows
- *   because windows can't open a file in the
- *   server and pass the FILE * pointer properly.
- * --------------------- */
-#ifdef WIN32
-typedef struct _USERD_globals_struct {
-   char arch_filename[256];
-   unsigned long arch_fileptr;
-} _USERD_globals;
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-/*--------------------------------------------------------------------*/
-#endif /*GLOBAL_EXTERN_H*/
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/global_extern_proto.h b/applications/utilities/postProcessing/graphics/ensightFoamReader/global_extern_proto.h
deleted file mode 100644
index 272261c7988b757ebc16fcbac48c726f29989f1e..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/global_extern_proto.h
+++ /dev/null
@@ -1,734 +0,0 @@
-/*--------------------------------------------------------------*/
-/* Prototype Header file for EnSight External Reader            */
-/* DSO Library Routines                                         */
-/*                                                              */
-/* intended to be included from global_extern.h only            */
-/*--------------------------------------------------------------*/
-/*  *************************************************************
- *   Copyright 1998 Computational Engineering International, Inc.
- *   All Rights Reserved.
- *
- *        Restricted Rights Legend
- *
- *   Use, duplication, or disclosure of this
- *   software and its documentation by the
- *   Government is subject to restrictions as
- *   set forth in subdivision [(b)(3)(ii)] of
- *   the Rights in Technical Data and Computer
- *   Software clause at 52.227-7013.
- *  *************************************************************
- */
-#ifndef GLOBAL_EXTERN_PROTO_H
-#define GLOBAL_EXTERN_PROTO_H
-
-#include <stdio.h>
-
-#ifdef WIN32
-#define W32IMPORT __declspec( dllimport )
-#define W32EXPORT __declspec( dllexport )
-#else
-#define W32IMPORT extern
-#define W32EXPORT extern
-#endif
-
-/*----------------------
- * Same in All Versions
- *----------------------*/
-W32EXPORT int
-USERD_get_number_of_model_parts( void );
-
-W32EXPORT int
-USERD_get_block_coords_by_component(int block_number,
-                                    int which_component,
-                                    float *coord_array);
-
-W32EXPORT int
-USERD_get_block_iblanking(int block_number,
-                          int *iblank_array);
-
-W32EXPORT int
-USERD_get_block_scalar_values(int block_number,
-                              int which_scalar,
-                              float *scalar_array);
-
-W32EXPORT int
-USERD_get_block_vector_values_by_component(int block_number,
-                                           int which_vector,
-                                           int which_component,
-                                           float *vector_array);
-
-W32EXPORT int
-USERD_get_name_of_reader(char reader_name[Z_MAX_USERD_NAME],
-                         int *two_fields);
-
-/*
- * This mechanism is used to mark the fact that a given
- * reader cannot be unloaded.  We set this by default for
- * C++ based readers as there are known issues with unloading
- * a C++ DLL on certain platforms (Linux).
- */
-W32EXPORT int
-USERD_reader_unloadable(void);
-
-#ifdef __cplusplus
-/*
- * Define a macro that defines the cpp function as part of the
- * USERD_get_name_of_reader declaration
- */
-#ifndef NO_AUTO_UNLOADABLE_CODE
-
-#if defined(LINUX) || defined(SGI)
-
-#define USERD_get_name_of_reader \
-  USERD_reader_unloadable(void) { return(0); } \
-int USERD_get_name_of_reader
-
-#endif
-
-#endif
-
-#endif
-
-W32EXPORT int
-USERD_get_reader_descrip(char descrip[Z_MAXFILENP]);
-
-W32EXPORT int
-USERD_set_filenames(char filename_1[],
-                    char filename_2[],
-                    char the_path[],
-                    int swapbytes);
-
-W32EXPORT int
-USERD_get_number_of_files_in_dataset( void );
-
-W32EXPORT int
-USERD_get_dataset_query_file_info(Z_QFILES *qfiles);
-
-W32EXPORT int
-USERD_get_changing_geometry_status( void );
-
-W32EXPORT int
-USERD_get_node_label_status( void );
-
-W32EXPORT int
-USERD_get_element_label_status( void );
-
-W32EXPORT int
-USERD_get_number_of_variables( void );
-
-W32EXPORT void
-USERD_stop_part_building( void );
-
-W32EXPORT int
-USERD_bkup(FILE *archive_file,
-           int backup_type);
-
-/* -----------------------------------
- *   Optional routine allows getting data
- *      from the reader to modify server/client behavior
- * ------------------------------------ */
-W32EXPORT int
-USERD_get_extra_data(int *target,
-      int *nints, int *nflts, int *nchrs,
-      int *pints, float *pflts, char *pchrs);
-
-/* ----------------------------
- *  Extra "Before" GUI stuff available for all versions of API
- *  Note: this API suite is entirely optional...
- * --------------------------- */
-W32EXPORT void USERD_get_extra_gui_numbers(
-         int *num_Toggles,
-         int *num_pulldowns,
-         int *num_fields
-);
-
-W32EXPORT int USERD_get_extra_gui_defaults(
-         char **toggle_Title,             /* [num_toggles][Z_LEN_GUI_TITLE_STR] */
-         int *toggle_default_status,      /* [num_toggles] */
-         char **pulldown_Title,           /* [num_pulldowns][Z_LEN_GUI_TITLE_STR] */
-         int *pulldown_number_in_list,    /* [num_pulldowns] */
-         int *pulldown_default_selection, /* [num_pulldowns] */
-         char ***pulldown_item_strings,   /* [num_pulldowns][Z_MAX_NUM_GUI_PULL_ITEMS][Z_LEN_GUI_PULL_STR] */
-         char **field_Title,              /* [num_fields][Z_LEN_GUI_TITLE_STR] */
-         char **field_user_string         /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-);
-
-W32EXPORT void USERD_set_extra_gui_data(
-                  int *toggle,            /* [num_toggle] */
-                  int *pulldown,          /* [num_pulldown] */
-                  char **field_text       /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-);
-
-/* ----------------------------
- *  Extra "After" GUI stuff available for all versions of API
- *  Note: this API suite is entirely optional...
- * --------------------------- */
-W32EXPORT void USERD_get_var_extract_gui_numbers(
-         int *num_Toggles,
-         int *num_pulldowns,
-         int *num_fields
-);
-
-W32EXPORT int USERD_get_var_extract_gui_defaults(
-         char **toggle_Title,             /* [num_toggles][Z_LEN_GUI_TITLE_STR] */
-         int *toggle_default_status,      /* [num_toggles] */
-         char **pulldown_Title,           /* [num_pulldowns][Z_LEN_GUI_TITLE_STR] */
-         int *pulldown_number_in_list,    /* [num_pulldowns] */
-         int *pulldown_default_selection, /* [num_pulldowns] */
-         char ***pulldown_item_strings,   /* [num_pulldowns][Z_MAX_NUM_GUI_PULL_ITEMS][Z_LEN_GUI_PULL_STR] */
-         char **field_Title,              /* [num_fields][Z_LEN_GUI_TITLE_STR] */
-         char **field_user_string         /* [num_fields][Z_LEN_GUI_FIELD_STR] */
-);
-
-W32EXPORT void USERD_set_var_extract_gui_data(
-                  int *toggle,            /* [num_toggle] */
-                  int *pulldown,          /* [num_pulldown] */
-                  char **field_text       /* [num_fields][Z_LEN_GUI_FIELD_STR] */ );
-
-/* --------------------
- * xy-query data routines
- * -------------------- */
-W32EXPORT int USERD_get_num_xy_queries(void);
-
-W32EXPORT int USERD_get_xy_query_info(
-        int query_num,
-        char *query_name,
-        char *query_xtitle,
-        char *query_ytitle,
-        int *query_num_pairs);
-
-W32EXPORT int USERD_get_xy_query_data(
-        int query_num,
-        int num_vals,
-        float *x_vals,
-        float *y_vals);
-
-
-/* This routine added so the reader can know if we are at the "right" side of
- * an interval - namely, interpolation between steps is being done in EnSight
- * (It can be in any version of EnSight)
- *----------------------------------------------------------------------------*/
-W32EXPORT void
-USERD_set_right_side( void );
-
-/*---------------------------------------------
- * Routines that get the geometry in buffers,
- * used for Unstructured Auto Distribute
- * (Optional)
- *---------------------------------------------*/
-W32EXPORT int
-USERD_get_part_coords_in_buffers(int part_number,
-                                 float **coord_array,
-                                 int first,
-                                 int n_beg,
-                                 int n_end,
-                                 int buffer_size,
-                                 int *num_returned);
-
-W32EXPORT int
-USERD_get_part_node_ids_in_buffers(int part_number,
-                                   int *nodeid_array,
-                                   int first,
-                                   int n_beg,
-                                   int n_end,
-                                   int buffer_size,
-                                   int *num_returned);
-
-W32EXPORT int
-USERD_get_part_elements_by_type_in_buffers(int part_number,
-                                           int element_type,
-                                           int **conn_array,
-                                           int first,
-                                           int e_beg,
-                                           int e_end,
-                                           int buffer_size,
-                                           int *num_returned);
-
-W32EXPORT int
-USERD_get_part_element_ids_by_type_in_buffers(int part_number,
-                                              int element_type,
-                                              int *elemid_array,
-                                              int first,
-                                              int e_beg,
-                                              int e_end,
-                                              int buffer_size,
-                                              int *num_returned);
-W32EXPORT int
-USERD_get_var_by_component_in_buffers(int which_variable,
-                                      int which_part,
-                                      int var_type,
-                                      int which_type,
-                                      int imag_data,
-                                      int component,
-                                      float *var_array,
-                                      int first,
-                                      int ne_beg,
-                                      int ne_end,
-                                      int buffer_size,
-                                      int leftside,
-                                      int *num_returned);
-
-W32EXPORT int
-USERD_get_nsided_conn_in_buffers(int part_number,
-                                 int *num_nodes_per_elem_array,
-                                 int *nsided_conn_array,
-                                 int first,
-                                 int e_beg,
-                                 int e_end,
-                                 int buffer_size,
-                                 int *num_returned);
-
-W32EXPORT int
-USERD_get_nfaced_conn_in_buffers(int part_number,
-                                 int *nfaced_fpe_arrray,
-                                 int *nfaced_npf_arrray,
-                                 int *nfaced_conn_array,
-                                 int first,
-                                 int e_beg,
-                                 int e_end,
-                                 int buffer_size,
-                                 int *num_returned);
-
-
-/*-----------------------
- * For Version 1.000 Only
- *-----------------------*/
-#if defined USERD_API_100
-
-W32EXPORT int
-USERD_get_number_of_global_nodes( void );
-
-W32EXPORT int
-USERD_get_global_coords(CRD *coord_array);
-
-W32EXPORT int
-USERD_get_global_node_ids(int *nodeid_array);
-
-W32EXPORT int
-USERD_get_element_connectivities_for_part(int part_number,
-                                          int **conn_array[Z_MAXTYPE]);
-
-W32EXPORT int
-USERD_get_element_ids_for_part(int part_number,
-                               int *elemid_array[Z_MAXTYPE]);
-
-W32EXPORT int
-USERD_get_vector_values(int which_vector,
-                        int which_part,
-                        int which_type,
-                        float *vector_array);
-
-W32EXPORT int
-USERD_get_part_build_info(int *part_id,
-                          int *part_types,
-                          char *part_descriptions[Z_BUFL],
-                          int *number_of_elements[Z_MAXTYPE],
-                          int *ijk_dimensions[3],
-                          int *iblanking_options[6]);
-
-W32EXPORT int
-USERD_get_scalar_values(int which_scalar,
-                        int which_part,
-                        int which_type,
-                        float *scalar_array);
-
-W32EXPORT int
-USERD_get_variable_info(char **var_description,
-                        char **var_filename,
-                        int *var_type,
-                        int *var_classify);
-
-W32EXPORT int
-USERD_get_description_lines(int which_type,
-                            int which_var,
-                            char line1[Z_BUFL],
-                            char line2[Z_BUFL]);
-
-W32EXPORT int
-USERD_get_variable_value_at_specific(int which_var,
-                                     int which_node_or_elem,
-                                     int which_part,
-                                     int which_elem_type,
-                                     int time_step,
-                                     float values[3]);
-
-W32EXPORT float
-USERD_get_constant_value(int which_var);
-
-W32EXPORT int
-USERD_get_solution_times(float *solution_times);
-W32EXPORT void
-USERD_set_time_step(int time_step);
-
-W32EXPORT int
-USERD_get_number_of_time_steps(void);
-
-#endif
-
-
-/*----------------------
- * New For Version 2.000
- *----------------------*/
-#if !defined USERD_API_100
-
-W32EXPORT int
-USERD_get_part_coords(int part_number,
-                      float **coord_array);
-
-W32EXPORT int
-USERD_get_part_node_ids(int part_number,
-                        int *nodeid_array);
-
-W32EXPORT int
-USERD_get_part_elements_by_type(int part_number,
-                                int element_type,
-                                int **conn_array);
-W32EXPORT int
-USERD_get_part_element_ids_by_type(int part_number,
-                                   int element_type,
-                                   int *elemid_array);
-
-W32EXPORT int
-USERD_get_reader_version(char version_number[Z_MAX_USERD_NAME]);
-
-W32EXPORT int
-USERD_get_reader_release(char version_number[Z_MAX_USERD_NAME]);
-
-W32EXPORT int
-USERD_get_var_by_component(int which_variable,
-                           int which_part,
-                           int var_type,
-                           int which_type,
-                           int complex,
-                           int component,
-                           float *var_array);
-
-W32EXPORT int
-USERD_get_maxsize_info(int *max_number_of_nodes,
-                       int *max_number_of_elements[Z_MAXTYPE],
-                       int *max_ijk_dimensions[3]);
-
-W32EXPORT void
-USERD_exit_routine( void );
-
-W32EXPORT int
-USERD_get_gold_variable_info(char **var_description,
-                             char **var_filename,
-                             int *var_type,
-                             int *var_classify,
-                             int *var_complex,
-                             char **var_ifilename,
-                             float *var_freq,
-                             int *var_contran,
-                             int *var_timeset);
-W32EXPORT int
-USERD_get_model_extents( float extents[6] );
-
-W32EXPORT int
-USERD_get_descrip_lines(int which_type,
-                        int which_var,
-                        int imag_data,
-                        char line1[Z_BUFL],
-                        char line2[Z_BUFL]);
-
-W32EXPORT int
-USERD_get_var_value_at_specific(int which_var,
-                                int which_node_or_elem,
-                                int which_part,
-                                int which_elem_type,
-                                int time_step,
-                                float values[3],
-                                int imag_data);
-
-W32EXPORT float
-USERD_get_constant_val(int which_var, int imag_data);
-
-W32EXPORT int
-USERD_get_geom_timeset_number(void);
-
-W32EXPORT int
-USERD_get_number_of_timesets(void);
-
-W32EXPORT int
-USERD_get_timeset_description(int timeset_number,
-                              char timeset_description[Z_BUFL]);
-
-W32EXPORT int
-USERD_get_sol_times(int timeset_number,
-                    float *solution_times);
-W32EXPORT void
-USERD_set_time_set_and_step(int timeset_number,
-                            int time_step);
-W32EXPORT int
-USERD_get_num_of_time_steps(int timeset_number);
-
-W32EXPORT int
-USERD_get_border_availability(int part_number,
-                              int number_of_elements[Z_MAXTYPE]);
-
-W32EXPORT int
-USERD_get_border_elements_by_type(int part_number,
-                                  int element_type,
-                                  int **conn_array,
-                                  short *parent_element_type,
-                                  int *parent_element_num);
-
-W32EXPORT void
-USERD_set_server_number(int serv_num,
-                        int tot_servs);
-
-#endif
-
-
-/*----------------------
- * New For Version 2.010
- *----------------------*/
-#if defined USERD_API_201 || defined USERD_API_202 || defined USERD_API_203 || defined USERD_API_204 || defined USERD_API_205 || defined USERD_API_206 || defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-W32EXPORT int
-USERD_get_ghosts_in_model_flag( void );
-
-W32EXPORT int
-USERD_get_ghosts_in_block_flag(int block_number);
-
-W32EXPORT int
-USERD_get_block_ghost_flags(int block_number,
-                            int *ghost_flags);
-#endif
-
-/*--------------------------
- * Modified at Version 2.030
- *--------------------------*/
-#if defined USERD_API_200 || defined USERD_API_201 || defined USERD_API_202
-
-W32EXPORT int
-USERD_get_gold_part_build_info(int *part_id,
-                               int *part_types,
-                               char *part_descriptions[Z_BUFL],
-                               int *number_of_nodes,
-                               int *number_of_elements[Z_MAXTYPE],
-                               int *ijk_dimensions[3],
-                               int *iblanking_options[6]);
-#endif
-
-#if defined USERD_API_203 || defined USERD_API_204 || defined USERD_API_205 || defined USERD_API_206 || defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-W32EXPORT int
-USERD_get_gold_part_build_info(int *part_id,
-                               int *part_types,
-                               char *part_descriptions[Z_BUFL],
-                               int *number_of_nodes,
-                               int *number_of_elements[Z_MAXTYPE],
-                               int *ijk_dimensions[9],
-                               int *iblanking_options[6]);
-#endif
-
-
-/*----------------------
- * New For Version 2.030
- *----------------------*/
-#if defined USERD_API_203 || defined USERD_API_204 || defined USERD_API_205 || defined USERD_API_206 || defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-W32EXPORT int
-USERD_get_number_of_material_sets( void );
-
-W32EXPORT int
-USERD_get_matf_set_info(int *mat_set_ids,
-                        char **mat_set_name);
-
-W32EXPORT int
-USERD_get_number_of_materials( int set_index );
-
-W32EXPORT int
-USERD_get_matf_var_info(int set_index,
-                        int *mat_ids,
-                        char **mat_desc);
-
-W32EXPORT int
-USERD_size_matf_data(int set_index,
-                     int part_id,
-                     int wtyp,
-                     int mat_type,
-                     int *matf_size );
-
-W32EXPORT int
-USERD_load_matf_data( int set_index,
-                      int part_id,
-                      int wtyp,
-                      int mat_type,
-                      int *ids_list,
-                      float *val_list );
-
-W32EXPORT int
-USERD_get_nsided_conn( int part_number,
-                       int *nsided_conn_array );
-
-W32EXPORT int
-USERD_get_nfaced_nodes_per_face( int part_number,
-                                 int *nfaced_npf_array );
-
-W32EXPORT int
-USERD_get_nfaced_conn( int part_number,
-                       int *nfaced_conn_array );
-
-#endif
-
-/*----------------------
- * New For Version 2.040
- *----------------------*/
-#if defined USERD_API_204 || defined USERD_API_205 || defined USERD_API_206 || defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-
-W32EXPORT int
-USERD_get_uns_failed_params(
-                char *fail_var_name,           /* variable name to be used in failure
-                                            must be scalar, per elem      */
-                float *threshold_val1,     /* number to compare for failure */
-                float *threshold_val2,     /* number to compare for failure */
-                int *threshold_operator1,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *threshold_operator2,   /* Z_GREATER_THAN, Z_LESS_THAN,
-                                            Z_EQUAL_TO */
-                int *logic_criteria2
-
-                );
-
-#endif
-
-/*----------------------
-** New For Version 2.050
-**----------------------*/
-#if defined USERD_API_205 || defined USERD_API_206 || defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-
-W32EXPORT int
-USERD_get_number_of_species( int set_index );
-
-W32EXPORT int
-USERD_get_matsp_info(int    set_index,
-                      int   *sp_ids,
-                      char **sp_desc,
-                      int   *sppermatcnt,
-                      int   *sppermatlis);
-
-W32EXPORT int
-USERD_rigidbody_existence( void );
-
-#endif
-
-/*--------------------------------------------
- * New at 2.05, but modified for Version 2.080
- *-------------------------------------------- */
-#if defined USERD_API_205 || defined USERD_API_206 || defined USERD_API_207
-W32EXPORT int
-USERD_rigidbody_values(int part_number,
-                       float values[10]);
-#endif
-
-#if defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-W32EXPORT int
-USERD_rigidbody_values(int part_number,
-                       float values[14]);
-#endif
-
-
-
-
-/*----------------------
-** New For Version 2.060
-**----------------------*/
-#if defined USERD_API_206 || defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-
-W32EXPORT int
-USERD_get_structured_reader_cinching( void );
-
-W32EXPORT int
-USERD_set_block_range_and_stride(int file_pn,
-                                 int mini, int maxi, int stepi,
-                                 int minj, int maxj, int stepj,
-                                 int mink, int maxk, int stepk);
-#endif
-
-/*----------------------
-** New For Version 2.070
-**----------------------*/
-#if defined USERD_API_207 || defined USERD_API_208 || defined USERD_API_209 || defined USERD_API_210
-
-/* non-optional functions go here */
-
-#endif
-
-/* This is optional; defaults to 'Set file' and 'Set results' if not
- * defined.  If 'two_fields' is true, then both labels must have a
- * non-NULL string otherwise the defaults will be used.
- */
-W32EXPORT void
-USERD_set_filename_button_labels(char filename_label_1[Z_MAX_USERD_NAME],
-                                 char filename_label_2[Z_MAX_USERD_NAME]);
-
-/* This is optional; defaults to TRUE if not defined. */
-W32EXPORT int
-USERD_prefer_auto_distribute(void);
-
-
-
-/*----------------------
-** New For Version 2.090
-**----------------------*/
-#if defined USERD_API_209 || defined USERD_API_210
-
-/* non-optional functions go here */
-
-#endif
-
-/* These are optional */
-W32EXPORT int
-USERD_get_vglyph_counts(int *num_vglyph_vectors,
-                        int *num_vglyph_timelines);
-
-W32EXPORT int
-USERD_get_vglyph_timeline_info(int vtl,
-                               int *id,
-                               int *numtimes,
-                               int *before,
-                               int *amidst,
-                               int *after);
-
-W32EXPORT int
-USERD_get_vglyph_timeline_times(int vtl,
-                                float *times);
-
-W32EXPORT int
-USERD_get_vglyph_vector_info(int vg,
-                             int *id,
-                             char *description,
-                             int *type,
-                             int *time_condition,
-                             int *time_line,
-                             int *part,
-                             int *nidloc,
-                             int *eidloc);
-
-W32EXPORT int
-USERD_get_vglyph_vector_values(int vg,
-                               float **values);
-
-W32EXPORT int
-USERD_get_vglyph_vector_xyzloc(int vg,
-                               float **xyzloc);
-
-/*----------------------
-** New For Version 2.100
-**----------------------*/
-#if defined USERD_API_210
-
-W32EXPORT int
-USERD_get_mat_scalars_desc(int set_index,
-                           char **mesv_desc);
-#endif
-
-/* These are optional */
-W32EXPORT int
-USERD_get_matf_set_type(int set_index);
-
-/* special, optional functions */
-W32EXPORT void
-USERD_reset_routine(void);
-
-/*--------------------------------------------------------------------*/
-#endif /*GLOBAL_EXTERN_PROTO_H*/
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/libuserd.C b/applications/utilities/postProcessing/graphics/ensightFoamReader/libuserd.C
deleted file mode 100644
index 3da1b648d28bc8cb8515eab72e99d9fa0a61bca9..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/libuserd.C
+++ /dev/null
@@ -1,142 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-Application
-    libuserd-foam
-
-Description
-    EnSight library module to read OpenFOAM data directly without translation
-
-    It can currently handle most cell types.
-
-    See also: README_USERD_2.0
-    24 Sep 2001: NN - Added support for Ensight API 2.0
-    02 Sep 2002: NN - Added support for ghost cells
-    14 Mar 2004: NN - Added patches to the parts
-
-\*---------------------------------------------------------------------------*/
-
-#include <cstdio>
-
-#include "fvCFD.H"
-#include "IOobjectList.H"
-#include "Cloud.H"
-#include "passiveParticle.H"
-#include "fvMesh.H"
-#include "cellModel.H"
-#include "globalFoam.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-extern "C"
-{
-
-#include "USERD_API.H"
-#include "global_extern.h"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-// same API as in 1.0
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "USERD_bkup.H"
-#include "USERD_get_name_of_reader.H"
-#include "USERD_set_filenames.H"
-#include "USERD_get_number_of_model_parts.H"
-#include "USERD_get_changing_geometry_status.H"
-#include "USERD_get_dataset_query_file_info.H"
-#include "USERD_get_element_label_status.H"
-#include "USERD_get_node_label_status.H"
-#include "USERD_get_number_of_files_in_dataset.H"
-#include "USERD_get_number_of_variables.H"
-#include "USERD_stop_part_building.H"
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-// slightly changed with 2.0 from 1.0
-// (to handle complex variables - not used by OpenFOAM anyway)
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "USERD_get_constant_val.H"
-#include "USERD_get_descrip_lines.H"
-#include "USERD_get_var_value_at_specific.H"
-#include "USERD_get_gold_variable_info.H"
-
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-// critical changes with 2.0 from 1.0
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "USERD_get_gold_part_build_info.H"
-#include "USERD_get_num_of_time_steps.H"
-#include "USERD_get_sol_times.H"
-#include "USERD_set_time_set_and_step.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-// new additions with 2.0 from 1.0
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "USERD_get_var_by_component.H"
-#include "USERD_get_part_coords.H"
-#include "USERD_get_part_node_ids.H"
-#include "USERD_get_part_elements_by_type.H"
-#include "USERD_get_part_element_ids_by_type.H"
-
-#include "USERD_exit_routine.H"
-#include "USERD_get_model_extents.H"
-#include "USERD_get_reader_version.H"
-#include "USERD_get_reader_release.H"
-#include "USERD_get_number_timesets.H"
-#include "USERD_get_timeset_description.H"
-#include "USERD_get_geom_timeset_number.H"
-
-#include "USERD_get_border_availability.H"
-#include "USERD_get_border_elements_by_type.H"
-
-#include "USERD_get_maxsize_info.H"
-#include "USERD_set_server_number.H"
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-// new additions with 2.03 from 2.02
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
-#include "USERD_get_number_of_material_sets.H"
-#include "USERD_get_matf_set_info.H"
-#include "USERD_get_number_of_materials.H"
-#include "USERD_get_matf_var_info.H"
-#include "USERD_size_matf_data.H"
-#include "USERD_load_matf_data.H"
-#include "USERD_get_nsided_conn.H"
-#include "USERD_get_nfaced_nodes_per_face.H"
-#include "USERD_get_nfaced_conn.H"
-
-//**********************************************************************
-//======================================================================
-// STRUCTURED DATA STUFF - not used in OpenFOAM
-//======================================================================
-//**********************************************************************
-
-#include "USERD_structured_data.H"
-
-}
-
-// ************************************************************************ //
diff --git a/applications/utilities/postProcessing/graphics/ensightFoamReader/tensorConversion.H b/applications/utilities/postProcessing/graphics/ensightFoamReader/tensorConversion.H
deleted file mode 100644
index 9f2b1bc6c53a6fce9ec5a8ed0c220eccf65b9221..0000000000000000000000000000000000000000
--- a/applications/utilities/postProcessing/graphics/ensightFoamReader/tensorConversion.H
+++ /dev/null
@@ -1,36 +0,0 @@
-if (component == 0)
-{
-    var_array[counter++] = tf[n].xx();
-}
-else if (component == 1)
-{
-    var_array[counter++] = tf[n].yy();
-}
-else if (component == 2)
-{
-    var_array[counter++] = tf[n].zz();
-}
-else if (component == 3)
-{
-    var_array[counter++] = tf[n].xy();
-}
-else if (component == 4)
-{
-    var_array[counter++] = tf[n].xz();
-}
-else if (component == 5)
-{
-    var_array[counter++] = tf[n].yz();
-}
-else if (component == 6)
-{
-    var_array[counter++] = tf[n].yx();
-}
-else if (component == 7)
-{
-    var_array[counter++] = tf[n].zx();
-}
-else if (component == 8)
-{
-    var_array[counter++] = tf[n].zy();
-}
diff --git a/bin/foamLog b/bin/foamLog
index 260383230944da60f51bfd66ea21df954548009a..cd68971205e9d313a2fed2bd9fb046027ab955d0 100755
--- a/bin/foamLog
+++ b/bin/foamLog
@@ -29,7 +29,7 @@
 #     Extract data for each time-step from a log file for graphing.
 #
 # Environment
-#     WM_PROJECT_API
+#     FOAM_API
 #     WM_PROJECT_DIR
 #     WM_PROJECT_SITE
 #
@@ -90,9 +90,9 @@ cat <<HELP
 
     The database ($Script.db) will taken from these locations:
         .
-        $userDir/$WM_PROJECT_API/
+        $userDir/$FOAM_API/
         $userDir/
-        $groupDir/$WM_PROJECT_API/etc/
+        $groupDir/$FOAM_API/etc/
         $groupDir/etc/
         $WM_PROJECT_DIR/etc/
         $toolsDir
diff --git a/bin/foamNewCase b/bin/foamNewCase
index 9565606a1b429c959c0e06e936fd231f1075aca2..ca9c2c1b1b85d22d22b4f2b2a70bcb9d595f5438 100755
--- a/bin/foamNewCase
+++ b/bin/foamNewCase
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2018-2019 OpenCFD Ltd.
 #-------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -30,14 +30,14 @@
 #     - requires rsync
 #
 # Environment
-#     WM_PROJECT_API
+#     FOAM_API
 #     WM_PROJECT_DIR
 #     WM_PROJECT_SITE
 #
 #------------------------------------------------------------------------------
 groupDir="${WM_PROJECT_SITE:-${WM_PROJECT_DIR:-<unknown>}/site}"
 userDir="$HOME/.OpenFOAM"
-projectApi="${WM_PROJECT_API:-unknown}"
+projectApi="${FOAM_API:-unknown}"
 
 templateDir="appTemplates"
 
@@ -52,7 +52,7 @@ options:
   -app NAME         specify the application to use
   -case DIR         specify alternative case directory, default is the cwd
   -list             list the applications available
-  -with-api=NUM     specify alternative api to use (default: \$WM_PROJECT_API)
+  -with-api=NUM     specify alternative api to use (default: \$FOAM_API)
   -version VER      [obsolete]
   -help             Print the usage
 
diff --git a/bin/foamUpdateCaseFileHeader b/bin/foamUpdateCaseFileHeader
index 11f110a045d0679e96f799ad4f6b13540cafc480..c77fa4305c444b3f3d71b99a2ccb27eaeb4fce15 100755
--- a/bin/foamUpdateCaseFileHeader
+++ b/bin/foamUpdateCaseFileHeader
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2018-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -74,9 +74,9 @@ do
     esac
 done
 
-# Constant width for version - default to WM_PROJECT_API
+# Constant width for version - default to FOAM_API
 
-: ${version:=$WM_PROJECT_API}
+: ${version:=$FOAM_API}
 : ${version:=$WM_PROJECT_VERSION}
 
 version=$(printf %-36s ${version:-OPENFOAM})
diff --git a/bin/mpirunDebug b/bin/mpirunDebug
index 61d2f212d850f8ff162aaf1b0ca764042de23cbb..d672bf14ea6a50aff7d387b94e256ff13dd2403d 100755
--- a/bin/mpirunDebug
+++ b/bin/mpirunDebug
@@ -196,13 +196,13 @@ sourceFoam=false    # Fallback command
 
 # Same as foamEtcFile -mode=uo bashrc
 #
-# check ~/.$WM_PROJECT/$WM_PROJECT_API/
+# check ~/.$WM_PROJECT/$FOAM_API/
 # check ~/.$WM_PROJECT/
-# check <installedProject>/etc/
-if [ -n "$WM_PROJECT" ]
+# check projectDir/etc/
+if [ -n "$WM_PROJECT_DIR" ]
 then
     for i in \
-        "$HOME/.$WM_PROJECT/$WM_PROJECT_API" \
+        "$HOME/.$WM_PROJECT/$FOAM_API" \
         "$HOME/.$WM_PROJECT" \
         "$WM_PROJECT_DIR/etc" \
         ;
diff --git a/bin/tools/change-sitedir.sh b/bin/tools/change-sitedir.sh
index f66504a2255ea2424f732a60c738d52f35a2d378..da9824088304d6bc78f5890b47f52906fab3fb95 100644
--- a/bin/tools/change-sitedir.sh
+++ b/bin/tools/change-sitedir.sh
@@ -2,7 +2,7 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+#   \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 # License
@@ -46,7 +46,7 @@
 #
 #   corresponds to the standard site location:
 #
-#     $WM_PROJECT_DIR/site{/$WM_PROJECT_API/platforms/$WM_OPTIONS}
+#     $WM_PROJECT_DIR/site{/$FOAM_API/platforms/$WM_OPTIONS}
 #
 #------------------------------------------------------------------------------
 
diff --git a/bin/tools/foamCreateModuleInclude b/bin/tools/foamCreateModuleInclude
index 661b94dfa9fe7772a92c19f04bb540ebcd4a02f5..7074ad5c965366207cda165c385a240f2ddff765 100755
--- a/bin/tools/foamCreateModuleInclude
+++ b/bin/tools/foamCreateModuleInclude
@@ -3,7 +3,7 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+#   \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
 #    \\/     M anipulation  | Copyright (C) 2016-2017 CINECA
 #------------------------------------------------------------------------------
 # License
@@ -27,8 +27,10 @@
 #
 # Description
 #     Script to create module settings.
+#
 #     This is still incomplete, but can be a useful basis when using a module
 #     system.
+#
 #------------------------------------------------------------------------------
 usage() {
     exec 1>&2
@@ -38,7 +40,8 @@ usage() {
 usage: ${0##*/} [OPTION] projectDir
 options:
   -output=file      The output name (default: ModuleInclude.tcl)
-  -preload=file     Specify (module) file to preload. Can use multiple times
+  -prefs=file       A preferences file (OpenFOAM) to load.
+  -preload=file     Specify a shell file to preload. Can use multiple times
   -tmpdir=file      The tmp directory to use.
   -help             Print the usage
 
@@ -63,7 +66,7 @@ die()
 
 #------------------------------------------------------------------------------
 
-unset optBackend optDebug preload projectDir
+unset optBackend optDebug optPrefs preloads projectDir
 unset moduleOutput moduleTmpDir
 
 # Parse some options
@@ -79,8 +82,11 @@ do
     -debug)
         optDebug=true
         ;;
+    -prefs=*)
+        optPrefs="${1#*=}"
+        ;;
     -preload=*)
-        preload="$preload${preload:+ }${1#*=}"
+        preloads="$preloads${preloads:+ }${1#*=}"
         ;;
     --recursive-backend--)
         optBackend=true
@@ -130,7 +136,7 @@ then
         die "Incorrect projectDir? $projectDir"
 
     # Check preloads
-    for file in $preloads
+    for file in "$preloads"
     do
         [ -f "$file" ] || echo "No such file to preload: $file" 1>&2
     done
@@ -146,7 +152,8 @@ then
         $0 \
         --recursive-backend-- \
         "${optDebug:+-debug}" \
-        "${output:+-output=$moduleOutput}" \
+        "${optPrefs:+-prefs=$optPrefs}" \
+        "${moduleOutput:+-output=$moduleOutput}" \
         "${preloads:+-preload=$preloads}" \
         "${moduleTmpDir:+-tmpdir=$moduleTmpDir}" \
         $projectDir
@@ -164,7 +171,7 @@ fi
 : ${moduleTmpDir:=${TMPDIR:-/tmp}}
 
 # Preload any/all modules
-for file in $preloads
+for file in "$preloads"
 do
     [ -f "$file" ] && . "$file" ''
 done
@@ -213,7 +220,7 @@ printEnv   > $tmpFiles.env.pre.log
 printAlias > $tmpFiles.alias.pre.log
 
 # OpenFOAM settings
-. $projectDir/etc/bashrc ''
+. $projectDir/etc/bashrc "$optPrefs"
 
 echo "Using openfoam: $WM_PROJECT_DIR" 1>&2
 echo "==> $moduleOutput" 1>&2
@@ -227,7 +234,9 @@ unset SCOTCH_VERSION
 
 # Also remove user directories as being unreliable
 
-foamOldDirs="$CEI_HOME $BOOST_ARCH_PATH $CGAL_ARCH_PATH $FFTW_ARCH_PATH $MPI_ARCH_PATH $SCOTCH_ARCH_PATH \
+foamOldDirs="$BOOST_ARCH_PATH $CGAL_ARCH_PATH $FFTW_ARCH_PATH \
+$MESA_ARCH_PATH $LLVM_ARCH_PATH \
+$MPI_ARCH_PATH $SCOTCH_ARCH_PATH \
 $FOAM_SITE_APPBIN $FOAM_SITE_LIBBIN $WM_PROJECT_SITE \
 $FOAM_USER_APPBIN $FOAM_USER_LIBBIN"
 foamClean=$WM_PROJECT_DIR/bin/foamCleanPath
@@ -245,9 +254,6 @@ then
         unset FOAM_EXT_LIBBIN
     fi
 fi
-unset CEI_HOME
-unset ENSIGHT9_INPUT  ENSIGHT9_READER
-unset ENSIGHT10_INPUT ENSIGHT10_READER
 
 # Always consider site to be bogus. If needed, should be done elsewhere.
 unset FOAM_SITE_APPBIN FOAM_SITE_LIBBIN WM_PROJECT_SITE
diff --git a/etc/README.md b/etc/README.md
index d638115c48f8007315ff0a9d7b86087b42fa1fe4..f12e3f2d6b324e7b295f80a831996a259a8c233b 100644
--- a/etc/README.md
+++ b/etc/README.md
@@ -14,7 +14,6 @@ These source the following files in the `config.sh/` or
 * `aliases` : aliases for interactive shells
 * `unset` : sourced to clear as many OpenFOAM environment settings as possible
 * `mpi` : MPI communications library settings
-* `ensight` : application settings for EnSight
 * `paraview` : application settings for ParaView
 * `scotch` : application settings for compiling against scotch
 * `metis` : application settings for compiling against metis
diff --git a/etc/bashrc b/etc/bashrc
index 6deffbdf4d0236146ae52a7563c20ecf14435564..89ecd7eb823602dd1e52ca0d11f69bc45564b197 100644
--- a/etc/bashrc
+++ b/etc/bashrc
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -22,9 +22,9 @@
 #         -  $WM_PROJECT_DIR/etc/prefs.sh
 #
 #       - User or group values (first file found):
-#         -  ~/.OpenFOAM/$WM_PROJECT_API/prefs.sh
+#         -  ~/.OpenFOAM/$FOAM_API/prefs.sh
 #         -  ~/.OpenFOAM/prefs.sh
-#         -  $WM_PROJECT_SITE/$WM_PROJECT_API/etc/prefs.sh
+#         -  $WM_PROJECT_SITE/$FOAM_API/etc/prefs.sh
 #         -  $WM_PROJECT_SITE/etc/prefs.sh
 #
 # Environment
@@ -93,6 +93,7 @@ export WM_COMPILE_OPTION=Opt
 # [WM_MPLIB] - MPI implementation:
 # = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPI | MPICH | MPICH-GM |
 #   HPMPI | CRAY-MPICH | FJMPI | QSMPI | SGIMPI | INTELMPI | USERMPI
+# Also possible to use INTELMPI-xyz etc and define your own wmake rule
 export WM_MPLIB=SYSTEMOPENMPI
 
 
diff --git a/etc/caseDicts/postProcessing/pressure/pressureDifference.cfg b/etc/caseDicts/postProcessing/pressure/pressureDifference.cfg
index 9ac24c7073313befaddae56b5d85b7425bbc2928..4f652d2ab623fb7990e8f87ea63c88aad86fb95f 100644
--- a/etc/caseDicts/postProcessing/pressure/pressureDifference.cfg
+++ b/etc/caseDicts/postProcessing/pressure/pressureDifference.cfg
@@ -12,7 +12,7 @@ libs            ("libfieldFunctionObjects.so");
 operation       subtract;
 
 writeControl    timeStep;
-writeInterval   1
+writeInterval   1;
 log             false;
 
 region1
diff --git a/etc/config.csh/ensight b/etc/config.csh/ensight
deleted file mode 100644
index a840cbda12e1f82b1f0af36d05935cae19569d4c..0000000000000000000000000000000000000000
--- a/etc/config.csh/ensight
+++ /dev/null
@@ -1,40 +0,0 @@
-#----------------------------------*-sh-*--------------------------------------
-# =========                 |
-# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-#  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  |
-#-------------------------------------------------------------------------------
-# License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
-#
-# File
-#     etc/config.csh/ensight
-#     - sourced by OpenFOAM-*/etc/cshrc
-#
-# Description
-#     Setup for ENSIGHT
-#
-#------------------------------------------------------------------------------
-
-# Fallback value
-if (! $?CEI_HOME ) then
-    setenv CEI_HOME /usr/local/ensight/CEI
-endif
-
-if ( -r $CEI_HOME ) then
-
-    # Special treatment for 32bit OpenFOAM and 64bit Ensight
-    if ($WM_ARCH-`uname -m` == linux-x86_64) setenv CEI_ARCH linux_2.6_32
-
-    # Add to path
-    setenv PATH ${CEI_HOME}/bin:${PATH}
-
-    setenv ENSIGHT9_INPUT dummy
-    setenv ENSIGHT9_READER $FOAM_LIBBIN
-else
-    unsetenv CEI_HOME
-endif
-
-#------------------------------------------------------------------------------
diff --git a/etc/config.csh/mpi b/etc/config.csh/mpi
index 0dcad59332c0c9aa528be2304a2ddc843b385373..8ee7a44b12d1e676ca68e40572362baf3146480d 100644
--- a/etc/config.csh/mpi
+++ b/etc/config.csh/mpi
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2017-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -33,7 +33,7 @@ unsetenv MPI_ARCH_PATH MPI_HOME
 setenv FOAM_MPI dummy  # Fallback value
 
 switch ("$WM_MPLIB")
-case SYSTEMOPENMPI:
+case SYSTEMOPENMPI*:
     # The system installed openmpi, locations discovery via mpicc.
     setenv FOAM_MPI openmpi-system
     _foamEtc -config openmpi-system             # <- Adjustments (optional)
@@ -52,7 +52,7 @@ case SYSTEMOPENMPI:
     endif
     breaksw
 
-case OPENMPI:
+case OPENMPI*:
     setenv FOAM_MPI openmpi-1.10.4
     _foamEtc -config openmpi                    # <- Adjustments (optional)
 
@@ -243,7 +243,7 @@ case SGIMPI:
     _foamAddLib     $MPI_ARCH_PATH/lib
     breaksw
 
-case INTELMPI:
+case INTELMPI*:
     if ( $?I_MPI_ROOT ) then
         # I_MPI_ROOT: The Intel MPI Library installation directory
 
@@ -300,8 +300,8 @@ case INTELMPI:
         echo "    Currently using '$MPI_ARCH_PATH'"
     endif
 
-    _foamAddPath    $MPI_ARCH_PATH/bin64
-    _foamAddLib     $MPI_ARCH_PATH/lib64
+    _foamAddPath    "$MPI_ARCH_PATH/intel64/bin"
+    _foamAddLib     "$MPI_ARCH_PATH/intel64/lib"
     breaksw
 endsw
 
diff --git a/etc/config.csh/paraview b/etc/config.csh/paraview
index a0fb0c6351e686e8e0ac038cc7dafed035947570..29d1914d02badf138faf40616fcff3eef8fbd04f 100644
--- a/etc/config.csh/paraview
+++ b/etc/config.csh/paraview
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -29,7 +29,7 @@
 #         ParaView_DIR
 #         PV_PLUGIN_PATH
 #     The OpenFOAM plugin must be the first in PV_PLUGIN_PATH and have
-#     paraview-major.minor version encoded in its name.
+#     paraview-major.minor encoded in its name.
 #
 #     For central installations not located under ThirdParty, the environment
 #     values must be set manually. For example,
@@ -66,16 +66,10 @@ set archDir="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER"
 eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=PATH "$ParaView_DIR $archDir/ParaView- $archDir/qt- $archDir/cmake-"`
 eval `$WM_PROJECT_DIR/bin/foamCleanPath -csh-env=LD_LIBRARY_PATH "$ParaView_DIR $archDir/ParaView- $archDir/qt-"`
 
-# ThirdParty cmake
-set cmake="$archDir/$cmake_version"
-if ( -r "$cmake/bin/cmake" ) then
-    # _foamAddPath not available when foamPV alias is used
-    setenv PATH "$cmake/bin:${PATH}"
-endif
-
-# Evaluate command-line parameters for ParaView
+# Evaluate command-line parameters for ParaView and cmake
 while ( $#argv > 0 )
     switch ($argv[1])
+    case cmake*=*:
     case ParaView*=*:
         # name=value  -> set name=value
         eval "set $argv[1]"
@@ -84,6 +78,13 @@ while ( $#argv > 0 )
     shift
 end
 
+# ThirdParty cmake
+set cmake="$archDir/$cmake_version"
+if ( -r "$cmake/bin/cmake" ) then
+    # _foamAddPath not available when foamPV alias is used
+    setenv PATH "$cmake/bin:${PATH}"
+endif
+
 if ($?ParaView_VERSION) then
 switch ("$ParaView_VERSION")
 case "":
diff --git a/etc/config.csh/settings b/etc/config.csh/settings
index ac09ece5bd33628bbe388e3cff45a50bf9f50cc1..f2592aab1f04c2c4dd70913be307b103cb4ff0ec 100644
--- a/etc/config.csh/settings
+++ b/etc/config.csh/settings
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -160,8 +160,8 @@ else
 endif
 
 # Shared site (group) executables/libraries
-setenv FOAM_SITE_APPBIN "$siteDir/$WM_PROJECT_VERSION/platforms/$WM_OPTIONS/bin"
-setenv FOAM_SITE_LIBBIN "$siteDir/$WM_PROJECT_VERSION/platforms/$WM_OPTIONS/lib"
+setenv FOAM_SITE_APPBIN "$siteDir/$FOAM_API/platforms/$WM_OPTIONS/bin"
+setenv FOAM_SITE_LIBBIN "$siteDir/$FOAM_API/platforms/$WM_OPTIONS/lib"
 
 # User executables/libraries
 setenv FOAM_USER_APPBIN "$WM_PROJECT_USER_DIR/platforms/$WM_OPTIONS/bin"
@@ -183,11 +183,11 @@ endif
 setenv PATH "${WM_PROJECT_DIR}/bin:${PATH}"
 
 # Prepend site-specific scripts to path - only if they exist
-if ( -d "$siteDir/bin" ) then                   # Generic
+if ( -d "$siteDir/bin" ) then               # Generic
     _foamAddPath "$siteDir/bin"
 endif
-if ( -d "$siteDir/$WM_PROJECT_API/bin" ) then   # API-specific
-    _foamAddPath "$siteDir/$WM_PROJECT_API/bin"
+if ( -d "$siteDir/$FOAM_API/bin" ) then     # API-specific
+    _foamAddPath "$siteDir/$FOAM_API/bin"
 endif
 
 # OpenFOAM executables (user, group, standard)
diff --git a/etc/config.csh/setup b/etc/config.csh/setup
index a1152d8a74da3d6822e31d211882560e467056f0..8d2833c8c91bcb389b76301238e703deaf61396f 100644
--- a/etc/config.csh/setup
+++ b/etc/config.csh/setup
@@ -2,7 +2,7 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+#   \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 # License
@@ -24,8 +24,8 @@
 #
 #------------------------------------------------------------------------------
 
-# [WM_PROJECT_API] - The API level for the project
-setenv WM_PROJECT_API `$WM_PROJECT_DIR/bin/foamEtcFile -show-api`
+# [FOAM_API] - The API level for the project
+setenv FOAM_API `$WM_PROJECT_DIR/bin/foamEtcFile -show-api`
 
 # The installation parent directory
 set prefixDir="${WM_PROJECT_DIR:h}"
@@ -51,8 +51,8 @@ _foamEcho "Locating ThirdParty directory"
 foreach foamDir (\
     "$WM_PROJECT_DIR/ThirdParty" \
     "$prefixDir/ThirdParty-$WM_PROJECT_VERSION" \
-    "$prefixDir/ThirdParty-v$WM_PROJECT_API" \
-    "$prefixDir/ThirdParty-$WM_PROJECT_API" \
+    "$prefixDir/ThirdParty-v$FOAM_API" \
+    "$prefixDir/ThirdParty-$FOAM_API" \
     "$prefixDir/ThirdParty-common" \
 )
     _foamEcho "... $foamDir"
@@ -139,7 +139,6 @@ _foamEtc -config  settings
 _foamEtc -config  mpi
 _foamEtc -config  paraview -- "$FOAM_SETTINGS"  # Pass through for evaluation
 _foamEtc -config  vtk
-_foamEtc -config  ensight
 ## _foamEtc -config  ADIOS
 ## _foamEtc -config  ADIOS2
 _foamEtc -config  CGAL
diff --git a/etc/config.csh/unset b/etc/config.csh/unset
index 3041f8931a973ced95b85f6e66432900d2c04263..8a453c36891b46025b889e7032025202742206e6 100644
--- a/etc/config.csh/unset
+++ b/etc/config.csh/unset
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2017 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -73,6 +73,7 @@ unsetenv WM_THIRD_PARTY_DIR
 #------------------------------------------------------------------------------
 # Unset FOAM_* environment variables
 
+unsetenv FOAM_API
 unsetenv FOAM_APPBIN
 unsetenv FOAM_APP
 unsetenv FOAM_CODE_TEMPLATES
diff --git a/etc/config.csh/vtk b/etc/config.csh/vtk
index aaeccc386159b48d9ddbf93c19276e84b734eadb..dbd5edf90c60a6c958c697bcbd7479d20be3796f 100644
--- a/etc/config.csh/vtk
+++ b/etc/config.csh/vtk
@@ -2,7 +2,7 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+#   \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 # License
@@ -32,31 +32,37 @@
 
 set vtk_version=VTK-8.2.0
 set mesa_version=mesa-17.1.1
+set mesa_llvm=none
 
-setenv VTK_DIR $WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$vtk_version
-setenv MESA_ARCH_PATH $WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$mesa_version
+setenv VTK_DIR "$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$vtk_version"
+setenv MESA_ARCH_PATH "$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$mesa_version"
+setenv LLVM_ARCH_PATH "$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH/$mesa_llvm"
 
 # END OF (NORMAL) USER EDITABLE PART
 #------------------------------------------------------------------------------
 if ($?FOAM_VERBOSE && $?prompt) then
-    echo "Using vtk  ($vtk_version)  ->  $VTK_DIR"
-    echo "Using mesa ($mesa_version)  ->  $MESA_ARCH_PATH"
+    echo "Using vtk"
+    echo "    vtk  ($vtk_version) $VTK_DIR"
+    echo "    mesa ($mesa_version) $MESA_ARCH_PATH"
+    echo "    llvm ($mesa_llvm) $LLVM_ARCH_PATH"
 endif
 
 # Set paths if binaries are present
-if ( -r $VTK_DIR ) then
+if ( -d "$VTK_DIR" ) then
     # Uses lib/ and not lib64/
-    _foamAddLib $VTK_DIR/lib
+    _foamAddLib "$VTK_DIR/lib"
 else
     unset VTK_DIR
 endif
 
-if ( -r $MESA_ARCH_PATH ) then
-    _foamAddLib $MESA_ARCH_PATH/lib$WM_COMPILER_LIB_ARCH
+if ( -d "$MESA_ARCH_PATH" ) then
+    _foamAddLibAuto "$LLVM_ARCH_PATH"
+    _foamAddLibAuto "$MESA_ARCH_PATH"
 else
+    unset LLVM_ARCH_PATH
     unset MESA_ARCH_PATH
 endif
 
-unset vtk_version mesa_version
+unset vtk_version mesa_version mesa_llvm
 
 #------------------------------------------------------------------------------
diff --git a/etc/config.sh/ensight b/etc/config.sh/ensight
deleted file mode 100644
index 933aa6c9df2d03396de201e5879b93ad00dbeddd..0000000000000000000000000000000000000000
--- a/etc/config.sh/ensight
+++ /dev/null
@@ -1,42 +0,0 @@
-#----------------------------------*-sh-*--------------------------------------
-# =========                 |
-# \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-#  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  |
-#------------------------------------------------------------------------------
-# License
-#     This file is part of OpenFOAM, licensed under GNU General Public License
-#     <http://www.gnu.org/licenses/>.
-#
-# File
-#     etc/config.sh/ensight
-#     - sourced by OpenFOAM-*/etc/bashrc
-#
-# Description
-#     Setup for ENSIGHT
-#
-#------------------------------------------------------------------------------
-
-# Fallback value
-[ -d "$CEI_HOME" ] || export CEI_HOME=/usr/local/ensight/CEI
-
-if [ -r $CEI_HOME ]
-then
-
-    # Special treatment for 32bit OpenFOAM and 64bit Ensight
-    [ "$WM_ARCH-$(uname -m)" = linux-x86_64 ] && export CEI_ARCH=linux_2.6_32
-
-    # Add to path if required
-    if [ "$CEI_HOME/bin/ensight" != "$(command -v ensight)" ]
-    then
-        export PATH=$CEI_HOME/bin:$PATH
-    fi
-
-    export ENSIGHT9_INPUT=dummy
-    export ENSIGHT9_READER=$FOAM_LIBBIN
-else
-    unset CEI_HOME
-fi
-
-#------------------------------------------------------------------------------
diff --git a/etc/config.sh/mpi b/etc/config.sh/mpi
index 28b95885d329b5efd587ab7765b9c61ab5983fb4..014bd7bf38274edd5490cefbb852ce4cd4eb8ac8 100644
--- a/etc/config.sh/mpi
+++ b/etc/config.sh/mpi
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2017-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -33,7 +33,7 @@ unset MPI_ARCH_PATH MPI_HOME
 export FOAM_MPI=dummy  # Fallback value
 
 case "$WM_MPLIB" in
-SYSTEMOPENMPI)
+SYSTEMOPENMPI*)
     # The system installed openmpi, locations discovery via mpicc.
     export FOAM_MPI=openmpi-system
 
@@ -58,7 +58,7 @@ SYSTEMOPENMPI)
     fi
     ;;
 
-OPENMPI)
+OPENMPI*)
     export FOAM_MPI=openmpi-1.10.4
     _foamEtc -config  openmpi                   # <- Adjustments (optional)
 
@@ -261,7 +261,7 @@ SGIMPI)
     _foamAddLib     $MPI_ARCH_PATH/lib
     ;;
 
-INTELMPI)
+INTELMPI*)
     if [ -n "$I_MPI_ROOT" ]
     then
         # I_MPI_ROOT: The Intel MPI Library installation directory
@@ -303,8 +303,8 @@ INTELMPI)
 
     export FOAM_MPI MPI_ARCH_PATH
 
-    _foamAddPath    $MPI_ARCH_PATH/bin64
-    _foamAddLib     $MPI_ARCH_PATH/lib64
+    _foamAddPath    "$MPI_ARCH_PATH/intel64/bin"
+    _foamAddLib     "$MPI_ARCH_PATH/intel64/lib"
     ;;
 esac
 
diff --git a/etc/config.sh/paraview b/etc/config.sh/paraview
index 87ba79beb9e69f15d25b841cde5ed5cebcfe5cd2..7538f3ca472ff7f3b15dc842e06726a36de9f739 100644
--- a/etc/config.sh/paraview
+++ b/etc/config.sh/paraview
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -71,25 +71,25 @@ eval \
     "$($WM_PROJECT_DIR/bin/foamCleanPath -sh-env=LD_LIBRARY_PATH \
     $ParaView_DIR $archDir/ParaView- $archDir/qt-)"
 
-# ThirdParty cmake
-cmake="$archDir/$cmake_version"
-if [ -r "$cmake/bin/cmake" ]
-then
-    # _foamAddPath not available when foamPV function is used
-    PATH="$cmake/bin:$PATH"
-fi
-
-# Evaluate command-line parameters for ParaView
+# Evaluate command-line parameters for ParaView and cmake
 for i
 do
     case "$i" in
-    (ParaView*=*)
+    (cmake*=* | ParaView*=*)
         # name=value  -> export name=value
         eval "export $i"
         ;;
     esac
 done
 
+# ThirdParty cmake
+cmake="$archDir/$cmake_version"
+if [ -r "$cmake/bin/cmake" ]
+then
+    # _foamAddPath not available when foamPV function is used
+    PATH="$cmake/bin:$PATH"
+fi
+
 case "$ParaView_VERSION" in
 ('')
     # empty - do nothing
diff --git a/etc/config.sh/settings b/etc/config.sh/settings
index c0ea5654aa78c8252c6006e5fdbbfb42ece2c09f..55e2f1829e09035008ec5c157ff7e140a03d2ea2 100644
--- a/etc/config.sh/settings
+++ b/etc/config.sh/settings
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -155,8 +155,8 @@ else
 fi
 
 # Shared site (group) executables/libraries
-export FOAM_SITE_APPBIN="$siteDir/$WM_PROJECT_VERSION/platforms/$WM_OPTIONS/bin"
-export FOAM_SITE_LIBBIN="$siteDir/$WM_PROJECT_VERSION/platforms/$WM_OPTIONS/lib"
+export FOAM_SITE_APPBIN="$siteDir/$FOAM_API/platforms/$WM_OPTIONS/bin"
+export FOAM_SITE_LIBBIN="$siteDir/$FOAM_API/platforms/$WM_OPTIONS/lib"
 
 # User executables/libraries
 export FOAM_USER_APPBIN="$WM_PROJECT_USER_DIR/platforms/$WM_OPTIONS/bin"
@@ -180,13 +180,13 @@ fi
 export PATH="$WM_PROJECT_DIR/bin:$PATH"
 
 # Prepend site-specific scripts to path - only if they exist
-if [ -d "$siteDir/bin" ]                        # Generic
+if [ -d "$siteDir/bin" ]                # Generic
 then
     _foamAddPath "$siteDir/bin"
 fi
-if [ -d "$siteDir/$WM_PROJECT_API/bin" ]        # API-specific
+if [ -d "$siteDir/$FOAM_API/bin" ]      # API-specific
 then
-    _foamAddPath "$siteDir/$WM_PROJECT_API/bin"
+    _foamAddPath "$siteDir/$FOAM_API/bin"
 fi
 
 # OpenFOAM executables (user, group, standard)
diff --git a/etc/config.sh/setup b/etc/config.sh/setup
index 40ab0012f72129d64fbcd3b46d491f62869ae529..ed692ec25956fce78970bca1a91ed96490bf42a6 100644
--- a/etc/config.sh/setup
+++ b/etc/config.sh/setup
@@ -24,8 +24,8 @@
 #
 #------------------------------------------------------------------------------
 
-# [WM_PROJECT_API] - The API level for the project
-export WM_PROJECT_API="$($WM_PROJECT_DIR/bin/foamEtcFile -show-api)"
+# [FOAM_API] - The API level for the project
+export FOAM_API="$($WM_PROJECT_DIR/bin/foamEtcFile -show-api)"
 
 # The installation parent directory
 prefixDir="${WM_PROJECT_DIR%/*}"
@@ -52,8 +52,8 @@ _foamEcho "Locating ThirdParty directory"
 for WM_THIRD_PARTY_DIR in \
     "$WM_PROJECT_DIR/ThirdParty" \
     "$prefixDir/ThirdParty-$WM_PROJECT_VERSION" \
-    "$prefixDir/ThirdParty-v$WM_PROJECT_API" \
-    "$prefixDir/ThirdParty-$WM_PROJECT_API" \
+    "$prefixDir/ThirdParty-v$FOAM_API" \
+    "$prefixDir/ThirdParty-$FOAM_API" \
     "$prefixDir/ThirdParty-common" \
     ;
 do
@@ -119,7 +119,6 @@ _foamEtc -config  settings
 _foamEtc -config  mpi
 _foamEtc -config  paraview -- "$@"  # Pass through for evaluation
 _foamEtc -config  vtk
-_foamEtc -config  ensight
 _foamEtc -config  gperftools
 ## _foamEtc -config  ADIOS
 ## _foamEtc -config  ADIOS2
diff --git a/etc/config.sh/unset b/etc/config.sh/unset
index 4d3c5fd0e410a089790bedaeee7d73d3f891a2d4..2153e87f94cd6ce9701985513b65dd69892c44f9 100644
--- a/etc/config.sh/unset
+++ b/etc/config.sh/unset
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -63,6 +63,7 @@ unset WM_THIRD_PARTY_DIR
 #------------------------------------------------------------------------------
 # Unset FOAM_* environment variables
 
+unset FOAM_API
 unset FOAM_APPBIN
 unset FOAM_APP
 unset FOAM_CODE_TEMPLATES
diff --git a/etc/config.sh/vtk b/etc/config.sh/vtk
index 782fcc43e40dd5081b14cf9a55fbf7f8a1580604..4815da2435c7d6ee079b75042249661d290424e7 100644
--- a/etc/config.sh/vtk
+++ b/etc/config.sh/vtk
@@ -2,7 +2,7 @@
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2016-2017 OpenCFD Ltd.
+#   \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
 #    \\/     M anipulation  |
 #------------------------------------------------------------------------------
 # License
@@ -33,38 +33,44 @@
 
 vtk_version=VTK-8.2.0
 mesa_version=mesa-17.1.1
+mesa_llvm=none
 
-export VTK_DIR=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$vtk_version
-export MESA_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$mesa_version
+export VTK_DIR="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$vtk_version"
+export MESA_ARCH_PATH="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$mesa_version"
+export LLVM_ARCH_PATH="$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH/$mesa_llvm"
 
 # END OF (NORMAL) USER EDITABLE PART
 #------------------------------------------------------------------------------
 if [ -n "$FOAM_VERBOSE" ] && [ -n "$PS1" ]
 then
-    echo "Using vtk  ($vtk_version)  ->  $VTK_DIR" 1>&2
-    echo "Using mesa ($mesa_version)  ->  $MESA_ARCH_PATH" 1>&2
+    echo "Using vtk" 1>&2
+    echo "    vtk  ($vtk_version) $VTK_DIR" 1>&2
+    echo "    mesa ($mesa_version) $MESA_ARCH_PATH" 1>&2
+    echo "    llvm ($mesa_llvm) $LLVM_ARCH_PATH" 1>&2
 fi
 
 if command -v _foamAddLib > /dev/null 2>&1  # normal sourcing
 then
 
     # Set paths if binaries are present
-    if [ -r $VTK_DIR ]
+    if [ -d "$VTK_DIR" ]
     then
         # Uses lib/ and not lib64/
-        _foamAddLib $VTK_DIR/lib
+        _foamAddLib "$VTK_DIR/lib"
     else
         unset VTK_DIR
     fi
 
-    if [ -r $MESA_ARCH_PATH ]
+    if [ -d "$MESA_ARCH_PATH" ]
     then
-        _foamAddLib $MESA_ARCH_PATH/lib$WM_COMPILER_LIB_ARCH
+        _foamAddLibAuto "$LLVM_ARCH_PATH"
+        _foamAddLibAuto "$MESA_ARCH_PATH"
     else
+        unset LLVM_ARCH_PATH
         unset MESA_ARCH_PATH
     fi
 
-    unset vtk_version mesa_version
+    unset vtk_version mesa_version mesa_llvm
 fi
 
 #------------------------------------------------------------------------------
diff --git a/etc/cshrc b/etc/cshrc
index 5fabac3903fbe3327a61fadb98666f1fce84d814..60f61fbcb0ad7ad474574599a1d592adb95ebb51 100644
--- a/etc/cshrc
+++ b/etc/cshrc
@@ -3,7 +3,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 #------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM, licensed under GNU General Public License
@@ -22,9 +22,9 @@
 #         -  $WM_PROJECT_DIR/etc/prefs.csh
 #
 #       - User or group values (first file found):
-#         -  ~/.OpenFOAM/$WM_PROJECT_API/prefs.csh
+#         -  ~/.OpenFOAM/$FOAM_API/prefs.csh
 #         -  ~/.OpenFOAM/prefs.csh
-#         -  $WM_PROJECT_SITE/$WM_PROJECT_API/etc/prefs.csh
+#         -  $WM_PROJECT_SITE/$FOAM_API/etc/prefs.csh
 #         -  $WM_PROJECT_SITE/prefs.csh
 #
 # Environment
@@ -95,6 +95,7 @@ setenv WM_COMPILE_OPTION Opt
 # [WM_MPLIB] - MPI implementation:
 # = SYSTEMOPENMPI | OPENMPI | SYSTEMMPI | MPI | MPICH | MPICH-GM |
 #   HPMPI | CRAY-MPICH | FJMPI | QSMPI | SGIMPI | INTELMPI | USERMPI
+# Also possible to use INTELMPI-xyz etc and define your own wmake rule
 setenv WM_MPLIB SYSTEMOPENMPI
 
 
diff --git a/modules/avalanche b/modules/avalanche
index a83eb8c203ada545580a621b02b63782f2518d96..6106b0f8f4fd02a920f5bf46e3909fcb755b8805 160000
--- a/modules/avalanche
+++ b/modules/avalanche
@@ -1 +1 @@
-Subproject commit a83eb8c203ada545580a621b02b63782f2518d96
+Subproject commit 6106b0f8f4fd02a920f5bf46e3909fcb755b8805
diff --git a/modules/catalyst b/modules/catalyst
index f0c9f44bcb94a2bdb195fb60ccf32a9615f05ff1..22a67b4d48436563896c5d7df1ba63c3f93ba07a 160000
--- a/modules/catalyst
+++ b/modules/catalyst
@@ -1 +1 @@
-Subproject commit f0c9f44bcb94a2bdb195fb60ccf32a9615f05ff1
+Subproject commit 22a67b4d48436563896c5d7df1ba63c3f93ba07a
diff --git a/modules/cfmesh b/modules/cfmesh
index 768075fbef083b2b66e8c79cfaf5fc97e6d18187..33033ed94e36eb7506146ad573005e4c866be88f 160000
--- a/modules/cfmesh
+++ b/modules/cfmesh
@@ -1 +1 @@
-Subproject commit 768075fbef083b2b66e8c79cfaf5fc97e6d18187
+Subproject commit 33033ed94e36eb7506146ad573005e4c866be88f
diff --git a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H
index 159068a43d5d0180320a0a049ef32ff0b5b3eeff..82d9466c85688bf002b1a95263731fd1d2634ad1 100644
--- a/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H
+++ b/src/OpenFOAM/containers/PtrLists/PtrDynList/PtrDynListI.H
@@ -272,7 +272,7 @@ inline Foam::autoPtr<T> Foam::PtrDynList<T, SizeMin>::set
     const autoPtr<T>& aptr
 )
 {
-    this->set(i, const_cast<autoPtr<T>&>(aptr).release());
+    return this->set(i, const_cast<autoPtr<T>&>(aptr).release());
 }
 
 
@@ -283,7 +283,7 @@ inline Foam::autoPtr<T> Foam::PtrDynList<T, SizeMin>::set
     const tmp<T>& tptr
 )
 {
-    this->set(i, tptr.ptr());
+    return this->set(i, tptr.ptr());
 }
 
 
diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C
index 1669a43174b4fed6656d85356b72026d813a9aa2..d7aca3a4e9f09adbc935c3841755cda945eb53e1 100644
--- a/src/OpenFOAM/db/regIOobject/regIOobject.C
+++ b/src/OpenFOAM/db/regIOobject/regIOobject.C
@@ -96,9 +96,12 @@ Foam::regIOobject::regIOobject(const regIOobject& rio, bool registerCopy)
     eventNo_(db().getEvent()),
     isPtr_(nullptr)
 {
-    if (registerCopy && rio.registered_)
+    if (registerCopy)
     {
-        const_cast<regIOobject&>(rio).checkOut();
+        if (rio.registered_)
+        {
+            const_cast<regIOobject&>(rio).checkOut();
+        }
         checkIn();
     }
 }
diff --git a/src/OpenFOAM/global/argList/argList.C b/src/OpenFOAM/global/argList/argList.C
index f7c622e746b4d68748bd08f7228def6815957556..51fc94869d065dd9e6ab7b51d9b5d042cfac5f2e 100644
--- a/src/OpenFOAM/global/argList/argList.C
+++ b/src/OpenFOAM/global/argList/argList.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015-2018 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -672,6 +672,9 @@ void Foam::argList::setCasePaths()
     globalCase_ = caseDir.name();
     case_       = globalCase_;  // The (processor) local case name
 
+    // OPENFOAM API
+    setEnv("FOAM_API", std::to_string(foamVersion::api), true);
+
     // Global case (directory) and case-name as environment variables
     setEnv("FOAM_CASE", caseDir, true);
     setEnv("FOAM_CASENAME", globalCase_, true);
diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H
index e569e02e5256b78141c58c1cdf881a869f089831..a33bfda34317693ac5de5b824fdd0c285683c342 100644
--- a/src/OpenFOAM/global/argList/argList.H
+++ b/src/OpenFOAM/global/argList/argList.H
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2016-2018 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2016-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -57,6 +57,8 @@ Description
     may be present for some solvers or utilities.
 
     Environment variables set by argList or by Time:
+      - \par FOAM_API
+        The value of foamVersion::api
       - \par FOAM_CASE
         The path of the global case.
         It is the same for serial and parallel jobs.
diff --git a/src/OpenFOAM/matrices/lduMatrix/solvers/PBiCGStab/PBiCGStab.C b/src/OpenFOAM/matrices/lduMatrix/solvers/PBiCGStab/PBiCGStab.C
index b7c1098afe88959ad833636704ad4b8b4df7b20b..e68a20760449020f72794a8d4b4f3f067f5e11ba 100644
--- a/src/OpenFOAM/matrices/lduMatrix/solvers/PBiCGStab/PBiCGStab.C
+++ b/src/OpenFOAM/matrices/lduMatrix/solvers/PBiCGStab/PBiCGStab.C
@@ -206,7 +206,11 @@ Foam::solverPerformance Foam::PBiCGStab::solve
             solverPerf.finalResidual() =
                 gSumMag(sA, matrix().mesh().comm())/normFactor;
 
-            if (solverPerf.checkConvergence(tolerance_, relTol_))
+            if
+            (
+                solverPerf.nIterations() >= minIter_
+             && solverPerf.checkConvergence(tolerance_, relTol_)
+            )
             {
                 for (label cell=0; cell<nCells; cell++)
                 {
diff --git a/src/OpenFOAM/meshes/boundBox/boundBoxI.H b/src/OpenFOAM/meshes/boundBox/boundBoxI.H
index aa95e05411783622bf5534eaa11adc064f42edab..0379a93ee8a446ec12f9901680715cafed0a821e 100644
--- a/src/OpenFOAM/meshes/boundBox/boundBoxI.H
+++ b/src/OpenFOAM/meshes/boundBox/boundBoxI.H
@@ -143,7 +143,7 @@ inline Foam::scalar Foam::boundBox::avgDim() const
 }
 
 
-Foam::label Foam::boundBox::nDim() const
+inline Foam::label Foam::boundBox::nDim() const
 {
     label ngood = 0;
 
diff --git a/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C b/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C
index 77ede96916ecd0d24736f52f58496d89759e6f51..49f64b43e126ddea06b96fff9aff56a970d2ce8b 100644
--- a/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C
+++ b/src/conversion/vtk/adaptor/foamVtkToolsTemplates.C
@@ -224,7 +224,15 @@ Foam::vtk::Tools::zeroField
     data->SetNumberOfComponents(static_cast<int>(pTraits<Type>::nComponents));
     data->SetNumberOfTuples(size);
 
+    // Fill() was not available before VTK-8
+    #if (VTK_MAJOR_VERSION < 8)
+    for (int i = 0; i < data->GetNumberOfComponents(); ++i)
+    {
+        data->FillComponent(i, 0);
+    }
+    #else
     data->Fill(0);
+    #endif
 
     return data;
 }
diff --git a/src/conversion/vtk/output/foamVtkInternalWriter.C b/src/conversion/vtk/output/foamVtkInternalWriter.C
index 1179b8971fe310923523e38d35350cfab922a951..6e0769ee686d815b5db0786d26c6f0f0f0bed22d 100644
--- a/src/conversion/vtk/output/foamVtkInternalWriter.C
+++ b/src/conversion/vtk/output/foamVtkInternalWriter.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2017-2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2017-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -665,9 +665,9 @@ void Foam::vtk::internalWriter::writeCellIDs()
 
 bool Foam::vtk::internalWriter::writeProcIDs()
 {
-    if (!Pstream::parRun())
+    if (!parallel_)
     {
-        // Skip serial output (meaningless)
+        // Disabled in serial output (meaningless)
         return false;
     }
 
diff --git a/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C b/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C
index 50e10cf9997a891c9d27a1fe85848d22d65b0c18..1472633a48c0194289c42465e60e14e0f0c4a404 100644
--- a/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C
+++ b/src/dynamicMesh/polyTopoChange/polyTopoChange/addPatchCellLayer.C
@@ -171,10 +171,30 @@ Foam::labelPair Foam::addPatchCellLayer::getEdgeString
             // - which hasn't been handled yet
             // - with same neighbour
             // - that needs extrusion
+
+            const label initFp = startFp;
             while (true)
             {
                 label prevFp = fEdges.rcIndex(startFp);
 
+                if (prevFp == initFp)
+                {
+                    const edge& e = pp.edges()[fEdges[initFp]];
+                    const face& localF = pp.localFaces()[patchFacei];
+
+                    FatalErrorInFunction
+                        << "On face:" << patchFacei
+                        << " fc:" << pp.faceCentres()[patchFacei]
+                        << " vertices:" << localF
+                        << " points:"
+                        << UIndirectList<point>(pp.points(), pp[patchFacei])
+                        << " edges:" << fEdges
+                        << " All edges of face seem to have same neighbour "
+                        << nbrGlobalFacei
+                        << " starting walking from edge " << e
+                        << exit(FatalError);
+                }
+
                 if
                 (
                     !sameEdgeNeighbour
diff --git a/src/finiteArea/faMesh/faBoundaryMesh/faBoundaryMesh.C b/src/finiteArea/faMesh/faBoundaryMesh/faBoundaryMesh.C
index bc904e8e27c5e668982ca883606d399fa91e532f..53dda11eacb2ce5d976c1e9388ac2add88c76d87 100644
--- a/src/finiteArea/faMesh/faBoundaryMesh/faBoundaryMesh.C
+++ b/src/finiteArea/faMesh/faBoundaryMesh/faBoundaryMesh.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
                             | Copyright (C) 2016-2017 Wikki Ltd
@@ -173,6 +173,12 @@ Foam::faBoundaryMesh::faBoundaryMesh
 
 void Foam::faBoundaryMesh::calcGeometry()
 {
+    // processorFaPatch geometry triggers calculation of pointNormals.
+    // This uses parallel comms and hence will not be trigggered
+    // on processors that do not have a processorFaPatch so instead
+    // force construction.
+    (void)mesh_.pointAreaNormals();
+
     forAll(*this, patchi)
     {
         operator[](patchi).initGeometry();
@@ -377,6 +383,12 @@ bool Foam::faBoundaryMesh::checkDefinition(const bool report) const
 
 void Foam::faBoundaryMesh::movePoints(const pointField& p)
 {
+    // processorFaPatch geometry triggers calculation of pointNormals.
+    // This uses parallel comms and hence will not be trigggered
+    // on processors that do not have a processorFaPatch so instead
+    // force construction.
+    (void)mesh_.pointAreaNormals();
+
     faPatchList& patches = *this;
 
     forAll(patches, patchi)
diff --git a/src/finiteArea/faMesh/faMesh.C b/src/finiteArea/faMesh/faMesh.C
index fb90fe17f6fb06d6a3541d0d9bf6d82cf3ce78fd..85873a4743731f906e47a049bffcbe128a1ccc7b 100644
--- a/src/finiteArea/faMesh/faMesh.C
+++ b/src/finiteArea/faMesh/faMesh.C
@@ -235,7 +235,7 @@ Foam::faMesh::faMesh(const polyMesh& pMesh)
     // Calculate the geometry for the patches (transformation tensors etc.)
     boundary_.calcGeometry();
 
-    if (isFile(pMesh.time().timePath()/"S0"))
+    if (isFile(pMesh.time().timePath()/mesh().dbDir()/"S0"))
     {
         S0Ptr_ = new DimensionedField<scalar, areaMesh>
         (
diff --git a/src/functionObjects/Allwmake b/src/functionObjects/Allwmake
index be5bc411709eb44e7835cbb42473b0a148f44c49..fa4da4d414e623807096d0a3512b392ca84059cf 100755
--- a/src/functionObjects/Allwmake
+++ b/src/functionObjects/Allwmake
@@ -12,4 +12,6 @@ wmake $targetType solvers
 
 ./graphics/Allwmake $targetType
 
+./randomProcesses/Allwmake $targetType
+
 #------------------------------------------------------------------------------
diff --git a/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.C b/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.C
index 7c19426a6e998906e4f62f40f96cc99f05bce937..23da6e0e6457bca9ac3cc7230069467ff619b2e9 100644
--- a/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.C
+++ b/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.C
@@ -62,7 +62,7 @@ void Foam::functionObjects::energySpectrum::calcAndWriteSpectrum
     const vectorField& C,
     const vector& c0,
     const vector& deltaC,
-    const Vector<label>& N,
+    const Vector<int>& N,
     const scalar kappaNorm
 )
 {
@@ -72,7 +72,7 @@ void Foam::functionObjects::energySpectrum::calcAndWriteSpectrum
         fft::forwardTransform
         (
             ReComplexField(U),
-            List<label>({N.x(), N.y(), N.z()})
+            List<int>({N.x(), N.y(), N.z()})
         )
        /scalar(cmptProduct(N))
     );
@@ -159,7 +159,7 @@ bool Foam::functionObjects::energySpectrum::read(const dictionary& dict)
     const vector L(meshBb.max() - meshBb.min());
     const vector nCellXYZ(cmptDivide(L, cellBb.max() - cellBb.min()));
 
-    N_ = Vector<label>
+    N_ = Vector<int>
     (
         round(nCellXYZ.x()),
         round(nCellXYZ.z()),
diff --git a/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.H b/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.H
index 9958d6edbe7f412a74defc63adb2a9bcba0a8f7d..9af3cefe045a708c695c327335f3e9e7573ed5ee 100644
--- a/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.H
+++ b/src/functionObjects/randomProcesses/energySpectrum/energySpectrum.H
@@ -96,7 +96,7 @@ protected:
         word UName_;
 
         //- Number of cells in I-J-K directions
-        Vector<label> N_;
+        Vector<int> N_;
 
         //- Reference point
         vector c0_;
@@ -121,7 +121,7 @@ protected:
             const vectorField& C,
             const vector& c0,
             const vector& deltaC,
-            const Vector<label>& N,
+            const Vector<int>& N,
             const scalar kappaNorm
         );
 
diff --git a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C
index 87bb6389d4cf01ed41999182bae4986c80d1f0ed..dee5f277075d4008182efd076b27e300a729232b 100644
--- a/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C
+++ b/src/mesh/snappyHexMesh/snappyHexMeshDriver/snappyLayerDriver.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2011-2015 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2015-2017 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2015-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -674,6 +674,71 @@ void Foam::snappyLayerDriver::handleNonManifolds
 
     Info<< "Set displacement to zero for all " << nNonManif
         << " non-manifold points" << endl;
+
+
+
+    // 4. Check for extrusion of baffles i.e. all edges of a face having the
+    //    same two neighbouring faces (one of which is the current face).
+    //    Note: this is detected locally already before - this test is for the
+    //          extremely rare occurence where the baffle faces are on different
+    //          processors.
+    {
+        label nBaffleFaces = 0;
+
+        const labelListList& faceEdges = pp.faceEdges();
+        forAll(pp, facei)
+        {
+            const labelList& fEdges = faceEdges[facei];
+
+            const labelList& globFaces0 = edgeGlobalFaces[fEdges[0]];
+            if (globFaces0.size() == 2)
+            {
+                const edge e0(globFaces0[0], globFaces0[1]);
+                bool isBaffle = true;
+                for (label fp = 1; fp < fEdges.size(); fp++)
+                {
+                    const labelList& globFaces = edgeGlobalFaces[fEdges[fp]];
+                    if
+                    (
+                        (globFaces.size() != 2)
+                     || (edge(globFaces[0], globFaces[1]) != e0)
+                    )
+                    {
+                        isBaffle = false;
+                        break;
+                    }
+                }
+
+                if (isBaffle)
+                {
+                    bool unextrude = unmarkExtrusion
+                    (
+                        pp.localFaces()[facei],
+                        patchDisp,
+                        patchNLayers,
+                        extrudeStatus
+                    );
+                    if (unextrude)
+                    {
+                        //Pout<< "Detected extrusion of baffle face "
+                        //    << pp.faceCentres()[facei]
+                        //    << " since all edges have the same neighbours "
+                        //    << e0 << endl;
+
+                        nBaffleFaces++;
+                    }
+                }
+            }
+        }
+
+        reduce(nBaffleFaces, sumOp<label>());
+
+        if (nBaffleFaces)
+        {
+            Info<< "Set displacement to zero for all points on " << nBaffleFaces
+                << " baffle faces" << endl;
+        }
+    }
 }
 
 
diff --git a/src/regionModels/thermalBaffleModels/thermalBaffleModel/thermalBaffleModelNew.C b/src/regionModels/thermalBaffleModels/thermalBaffleModel/thermalBaffleModelNew.C
index ee6831c9ee4fcc6d8235a4de43371856b38628e0..90ed6065e2e14bec5360b77063d93df08da40888 100644
--- a/src/regionModels/thermalBaffleModels/thermalBaffleModel/thermalBaffleModelNew.C
+++ b/src/regionModels/thermalBaffleModels/thermalBaffleModel/thermalBaffleModelNew.C
@@ -38,9 +38,8 @@ namespace thermalBaffleModels
 
 autoPtr<thermalBaffleModel> thermalBaffleModel::New(const fvMesh& mesh)
 {
-    word modelType;
-    {
-        IOdictionary thermalBafflePropertiesDict
+    const word modelType =
+        IOdictionary
         (
             IOobject
             (
@@ -51,15 +50,7 @@ autoPtr<thermalBaffleModel> thermalBaffleModel::New(const fvMesh& mesh)
                 IOobject::NO_WRITE,
                 false
             )
-        );
-
-        word modelType =
-            thermalBafflePropertiesDict.lookupOrDefault<word>
-            (
-                "thermalBaffleModel",
-                "thermalBaffle"
-            );
-    }
+        ).lookupOrDefault<word>("thermalBaffleModel", "thermalBaffle");
 
     auto cstrIter = meshConstructorTablePtr_->cfind(modelType);
 
@@ -84,7 +75,7 @@ autoPtr<thermalBaffleModel> thermalBaffleModel::New
     const dictionary& dict
 )
 {
-    word modelType =
+    const word modelType =
         dict.lookupOrDefault<word>("thermalBaffleModel", "thermalBaffle");
 
     auto cstrIter = dictionaryConstructorTablePtr_->cfind(modelType);
diff --git a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterImpl.C b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterImpl.C
index cb040ff965fbb65ed9024d229d570ed124191403..b78edb71785267204f73a046887fd240445b80bf 100644
--- a/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterImpl.C
+++ b/src/sampling/sampledSurface/writers/ensight/ensightSurfaceWriterImpl.C
@@ -193,7 +193,7 @@ Foam::fileName Foam::ensightSurfaceWriter::writeCollated
     scalar timeValue = 0.0;
     readScalar(timeDir, timeValue);
 
-    scalar meshValue = 0;
+    scalar meshValue = timeValue;
 
     if (!isDir(baseDir))
     {
diff --git a/src/thermophysicalModels/radiation/radiationModels/solarLoad/faceShading/faceShading.C b/src/thermophysicalModels/radiation/radiationModels/solarLoad/faceShading/faceShading.C
index 4c0785eb1185498c38a1ef2b8f4af7935712dbb2..da762b641de47118091f3668e64769b8d0100d37 100644
--- a/src/thermophysicalModels/radiation/radiationModels/solarLoad/faceShading/faceShading.C
+++ b/src/thermophysicalModels/radiation/radiationModels/solarLoad/faceShading/faceShading.C
@@ -3,7 +3,7 @@
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
     \\  /    A nd           | Copyright (C) 2015 OpenFOAM Foundation
-     \\/     M anipulation  | Copyright (C) 2017-2018 OpenCFD Ltd.
+     \\/     M anipulation  | Copyright (C) 2017-2019 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -26,11 +26,10 @@ License
 #include "faceShading.H"
 #include "fvMesh.H"
 #include "boundaryRadiationProperties.H"
-#include "OFstream.H"
 #include "cyclicAMIPolyPatch.H"
 #include "volFields.H"
 #include "distributedTriSurfaceMesh.H"
-
+#include "OBJstream.H"
 
 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
 
@@ -49,25 +48,14 @@ void Foam::faceShading::writeRays
     const pointField& myFc
 )
 {
-    OFstream str(fName);
-    label vertI = 0;
+    OBJstream os(fName);
 
-    Pout<< "Dumping rays to " << str.name() << endl;
+    Pout<< "Dumping rays to " << os.name() << endl;
 
     forAll(myFc, faceI)
     {
-        meshTools::writeOBJ(str, myFc[faceI]);
-        vertI++;
-        meshTools::writeOBJ(str, endCf[faceI]);
-        vertI++;
-        str << "l " << vertI-1 << ' ' << vertI << nl;
+        os.write(linePointRef(myFc[faceI], endCf[faceI]));
     }
-    str.flush();
-
-    Pout<< "cmd: objToVTK " << fName.c_str() << endl;
-
-    stringList cmd({"objToVTK", fName, fName.lessExt().ext("vtk")});
-    Foam::system(cmd);
 }
 
 
diff --git a/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allclean b/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allclean
index 9e53e2850bd3a22ece2b0d3df4fff63f6795dd65..d4a9953c5116d9aff95672ff9f7541de5fb9ea56 100755
--- a/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allclean
+++ b/tutorials/heatTransfer/chtMultiRegionFoam/externalSolarLoad/Allclean
@@ -4,7 +4,6 @@ cd ${0%/*} || exit 1                        # Run from this directory
 
 cleanCase0
 
-rm -rf VTK
 rm -rf constant/cellToRegion
 rm -rf constant/*/polyMesh  # region meshes
 
diff --git a/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict b/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict
index b8096e514db550d8b434919d21e63a6b6d19a639..283724bc2d63c640a67f1d991628970012e79e35 100644
--- a/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict
+++ b/tutorials/incompressible/pisoFoam/LES/motorBike/lesFiles/controlDict
@@ -49,7 +49,7 @@ runTimeModifiable true;
 
 functions
 {
-    #include "cuttingPlane"
+    #include "samples"
     #include "streamLines"
     #include "forceCoeffs"
 }
diff --git a/wmake/rules/linux64Clang/mplibINTELMPI b/wmake/rules/linux64Clang/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linux64Clang/mplibINTELMPI
+++ b/wmake/rules/linux64Clang/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/rules/linux64Cray/mplibINTELMPI b/wmake/rules/linux64Cray/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linux64Cray/mplibINTELMPI
+++ b/wmake/rules/linux64Cray/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/rules/linux64Gcc/mplibINTELMPI b/wmake/rules/linux64Gcc/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linux64Gcc/mplibINTELMPI
+++ b/wmake/rules/linux64Gcc/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/rules/linux64GccKNL/mplibINTELMPI b/wmake/rules/linux64GccKNL/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linux64GccKNL/mplibINTELMPI
+++ b/wmake/rules/linux64GccKNL/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/rules/linux64Icc/mplibINTELMPI b/wmake/rules/linux64Icc/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linux64Icc/mplibINTELMPI
+++ b/wmake/rules/linux64Icc/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/rules/linux64IccKNL/mplibINTELMPI b/wmake/rules/linux64IccKNL/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linux64IccKNL/mplibINTELMPI
+++ b/wmake/rules/linux64IccKNL/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/rules/linuxARM64Arm/c b/wmake/rules/linuxARM64Arm/c
index 91a1e739afdfc1596b33a83a8d6a17d281d8beca..06b574e59f6b2430fdc3b8198d037a87f7c8dde7 100644
--- a/wmake/rules/linuxARM64Arm/c
+++ b/wmake/rules/linuxARM64Arm/c
@@ -1,6 +1,6 @@
 SUFFIXES += .c
 
-cc          = armclang
+cc          = armclang -mcpu=native
 
 cWARN       = -Wall
 
@@ -12,5 +12,5 @@ ctoo        = $(WM_SCHEDULER) $(cc) $(cFLAGS) -c $< -o $@
 
 LINK_LIBS   = $(cDBUG)
 
-LINKLIBSO   = $(cc) -shared
-LINKEXE     = $(cc) -Xlinker --add-needed -Xlinker -z -Xlinker nodefs
+LINKLIBSO   = $(cc) -shared -armpl
+LINKEXE     = $(cc) -Xlinker --add-needed -Xlinker -z -Xlinker nodefs -armpl
diff --git a/wmake/rules/linuxARM64Arm/c++ b/wmake/rules/linuxARM64Arm/c++
index 5704e839a9b9edbeeaf92675661b79b937716c72..4bbc646aecb34986641e41a5a6b7d5a3ddd0d1ed 100644
--- a/wmake/rules/linuxARM64Arm/c++
+++ b/wmake/rules/linuxARM64Arm/c++
@@ -1,6 +1,6 @@
 include $(GENERAL_RULES)/Clang/c++
 
-CC          = armclang++ -std=c++11
+CC          = armclang++ -std=c++11 -mcpu=native
 
 include $(DEFAULT_RULES)/c++$(WM_COMPILE_OPTION)
 
@@ -13,5 +13,5 @@ cpptoo      = $(Ctoo)
 
 LINK_LIBS   = $(c++DBUG)
 
-LINKLIBSO   = $(CC) $(c++FLAGS) -shared
-LINKEXE     = $(CC) $(c++FLAGS) -Xlinker --add-needed
+LINKLIBSO   = $(CC) $(c++FLAGS) -shared -armpl
+LINKEXE     = $(CC) $(c++FLAGS) -Xlinker --add-needed -armpl
diff --git a/wmake/rules/linuxARM64Arm/c++Opt b/wmake/rules/linuxARM64Arm/c++Opt
index c427c3d08b8d71d05db3ceb32b020fb460f55fa3..7a4e09d9f42d00521d445af644e434507fd7ce20 100644
--- a/wmake/rules/linuxARM64Arm/c++Opt
+++ b/wmake/rules/linuxARM64Arm/c++Opt
@@ -1,2 +1,2 @@
 c++DBUG     =
-c++OPT      = -mcpu=thunderx2t99 -ffp-contract=fast -ffast-math -O3 -funsafe-math-optimizations
+c++OPT      = -ffp-contract=fast -ffast-math -O3 -funsafe-math-optimizations -fsimdmath -armpl
diff --git a/wmake/rules/linuxARM64Arm/cOpt b/wmake/rules/linuxARM64Arm/cOpt
index 0086d1849ebac2a560442be4d2032d7c73774e9d..10aa6fc610f154f7a49156a92d54824800811532 100644
--- a/wmake/rules/linuxARM64Arm/cOpt
+++ b/wmake/rules/linuxARM64Arm/cOpt
@@ -1,2 +1,2 @@
 cDBUG       =
-cOPT        = -mcpu=thunderx2t99 -ffp-contract=fast -ffast-math -O3
+cOPT        = -ffp-contract=fast -ffast-math -O3 -armpl
diff --git a/wmake/rules/linuxARM7Gcc/c b/wmake/rules/linuxARM7Gcc/c
index 6845d94483ae7de89f1106267bb220ca500a24a1..2cff6a24d77d33d95700c6eb1275c31b152bd226 100644
--- a/wmake/rules/linuxARM7Gcc/c
+++ b/wmake/rules/linuxARM7Gcc/c
@@ -1,6 +1,6 @@
 SUFFIXES += .c
 
-cc          = gcc
+cc          = gcc -mcpu=cortex-a9
 
 cWARN       = -Wall
 
diff --git a/wmake/rules/linuxARM7Gcc/c++ b/wmake/rules/linuxARM7Gcc/c++
index 00a88b07a16c4ec1856fd30302d542fa7ba2404c..a1cf1ad6cf12041797c1a86eca9eca296c87281e 100644
--- a/wmake/rules/linuxARM7Gcc/c++
+++ b/wmake/rules/linuxARM7Gcc/c++
@@ -1,6 +1,6 @@
 include $(GENERAL_RULES)/Gcc/c++
 
-CC          = g++ -std=c++11
+CC          = g++ -std=c++11 -mcpu=cortex-a9
 
 include $(DEFAULT_RULES)/c++$(WM_COMPILE_OPTION)
 
diff --git a/wmake/rules/linuxARM7Gcc/c++Opt b/wmake/rules/linuxARM7Gcc/c++Opt
index fe7b457de7b83c21a980701a223eb319e4ca3112..ab2bfabcd0804e8686593f81507cf546a48992d9 100644
--- a/wmake/rules/linuxARM7Gcc/c++Opt
+++ b/wmake/rules/linuxARM7Gcc/c++Opt
@@ -1,5 +1,5 @@
 c++DBUG     =
-#c++OPT     = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mcpu=cortex-a9 -mfpu=vfpv3-d16 -mfloat-abi=hard
-c++OPT      = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mcpu=cortex-a9 -mfpu=vfpv3-d16 -mfloat-abi=softfp
+#c++OPT     = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mfpu=vfpv3-d16 -mfloat-abi=hard
+c++OPT      = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mfpu=vfpv3-d16 -mfloat-abi=softfp
 
 ROUNDING_MATH = -frounding-math
diff --git a/wmake/rules/linuxARM7Gcc/cOpt b/wmake/rules/linuxARM7Gcc/cOpt
index c80aa2b5c137b05847b4cb684b3bf4c70cb68550..6efb6d39bf73f9068f94f953012ae2b229eebeec 100644
--- a/wmake/rules/linuxARM7Gcc/cOpt
+++ b/wmake/rules/linuxARM7Gcc/cOpt
@@ -1,3 +1,3 @@
 cDBUG       =
-#cOPT       = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mcpu=cortex-a9 -mfpu=vfpv3-d16 -mfloat-abi=hard
-cOPT        = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mcpu=cortex-a9 -mfpu=vfpv3-d16 -mfloat-abi=softfp
+#cOPT       = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mfpu=vfpv3-d16 -mfloat-abi=hard
+cOPT        = -O3 -floop-optimize -falign-loops -falign-labels -falign-functions -falign-jumps -fprefetch-loop-arrays -mfpu=vfpv3-d16 -mfloat-abi=softfp
diff --git a/wmake/rules/linuxIA64Icc/mplibINTELMPI b/wmake/rules/linuxIA64Icc/mplibINTELMPI
index 278e0b0f22c7c7d6fafc3334cddccb237afe232e..e5f0d01163d87759eb1b90d317fd8a61058ccb74 100644
--- a/wmake/rules/linuxIA64Icc/mplibINTELMPI
+++ b/wmake/rules/linuxIA64Icc/mplibINTELMPI
@@ -1,3 +1,3 @@
 PFLAGS     = -DMPICH_SKIP_MPICXX
-PINC       = -isystem $(MPI_ARCH_PATH)/include64
-PLIBS      = -L$(MPI_ARCH_PATH)/lib64 -lmpi
+PINC       = -isystem $(MPI_ARCH_PATH)/intel64/include
+PLIBS      = -L$(MPI_ARCH_PATH)/intel64/lib -lmpi
diff --git a/wmake/wmakeBuildInfo b/wmake/wmakeBuildInfo
index 5914b310735c874160cd6280e4c6478523ddb90c..cb86b267d049023dbe33d004162fa428aa00c492 100755
--- a/wmake/wmakeBuildInfo
+++ b/wmake/wmakeBuildInfo
@@ -1,9 +1,9 @@
-#!/bin/bash
+#!/bin/sh
 #------------------------------------------------------------------------------
 # =========                 |
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
-#   \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+#   \\  /    A nd           | Copyright (C) 2018-2019 OpenCFD Ltd.
 #    \\/     M anipulation  |
 #-------------------------------------------------------------------------------
 # License
@@ -26,7 +26,7 @@
 #     wmakeBuildInfo
 #
 # Description
-#     Print the version used when building the project
+#     Print the api/version and other build information for the project.
 #
 # Environment
 #     - WM_PROJECT_DIR
@@ -51,7 +51,7 @@ usage() {
 Usage: ${0##*/} [OPTION]
        ${0##*/} [-update] -filter FILE
 options:
-  -check        Compare make and meta information (exit 0 for no changes)
+  -cmp, -check  Compare make and meta information (exit 0 for no changes)
   -diff         Display differences between make and meta information
                 (exit code 0 for no changes)
   -dry-run      In combination with -update
@@ -96,7 +96,7 @@ do
     -h | -help*)
         usage
         ;;
-    -check)
+    -cmp | -check)
         optCheck=true
         ;;
     -diff)
@@ -156,12 +156,11 @@ fi
 
 #------------------------------------------------------------------------------
 
-# Variables
-declare -A makeInfo
-declare -A metaInfo
+# Variables - for portability, avoiding bash associative arrays
+unset make_info meta_info
 
-#
-# Populate makeInfo array
+
+# Populate make_* variables
 #
 #  - api    : from rules/General/general
 #  - patch  : cached value from previous make
@@ -177,10 +176,9 @@ declare -A metaInfo
 #
 # - Working on detached head.
 #   -> branch has value "HEAD" instead of something more readable.
-#
 getMakeInfo()
 {
-    if [ "${#makeInfo[*]}" -eq 4 ]
+    if [ -n "$make_info" ]
     then
         ##echo "use cached value for make info" 1>&2
         return 0
@@ -188,7 +186,7 @@ getMakeInfo()
     ##echo "get make info" 1>&2
 
     local api patch build branch
-    makeInfo=()
+    unset make_api make_patch make_branch make_build
 
     # (api) from WM_DIR/rules/General/general
     # - extract WM_VERSION = OPENFOAM=<digits>
@@ -211,15 +209,15 @@ getMakeInfo()
         branch="$(git --git-dir=$WM_PROJECT_DIR/.git rev-parse --abbrev-ref HEAD 2>/dev/null)"
     fi
 
-    makeInfo[api]="$api"
-    makeInfo[patch]="${patch:-0}"  # default is 0
-    makeInfo[branch]="$branch"
-    makeInfo[build]="$build"
+    make_api="$api"
+    make_patch="${patch:-0}"  # Default is 0 (unpatched)
+    make_branch="$branch"
+    make_build="$build"
+    make_info=true
 }
 
 
-#
-# Populate metaInfo array
+# Populate meta_* variables
 #
 #  - api    : from META-INFO/api-info
 #  - patch  : from META-INFO/api-info
@@ -229,10 +227,9 @@ getMakeInfo()
 # Failure modes:
 # - Directory, file or entry not found.
 #   -> corresponding entries are empty strings
-#
 getMetaInfo()
 {
-    if [ "${#metaInfo[*]}" -eq 4 ]
+    if [ -n "$meta_info" ]
     then
         ##echo "use cached value for meta info" 1>&2
         return 0
@@ -240,7 +237,7 @@ getMetaInfo()
     ##echo "get meta info" 1>&2
 
     local api patch build branch
-    metaInfo=()
+    unset meta_api meta_patch meta_branch meta_build
 
     if [ -d "$metaInfoDir" ]
     then
@@ -253,14 +250,14 @@ getMetaInfo()
         build="$(sed -ne 's@^build *= *\([^ ]*\).*@\1@p' $metaInfoDir/build-info 2>/dev/null)"
     fi
 
-    metaInfo[api]="$api"
-    metaInfo[patch]="${patch:-0}"  # default is 0
-    metaInfo[branch]="$branch"
-    metaInfo[build]="$build"
+    meta_api="$api"
+    meta_patch="${patch:-0}"  # Default is 0 (unpatched)
+    meta_branch="$branch"
+    meta_build="$build"
+    meta_info=true
 }
 
 
-#
 # Get api from rules/General/general
 #
 # Failure modes:
@@ -268,18 +265,17 @@ getMetaInfo()
 #   -> Fatal for building, but could be OK for a stripped down version
 #
 # Fallback. Get from api-info
-#
 getApi()
 {
     getMakeInfo
 
     # Local copy
-    local api="${makeInfo[api]}"
+    local api="${make_api}"
 
     if [ -z "$api" ]
     then
         getMetaInfo
-        api="${metaInfo[api]}"
+        api="${meta_api}"
     fi
 
     if [ -n "$api" ]
@@ -295,53 +291,69 @@ getApi()
 #
 # Failure modes:
 # - No patch information (can't find file etc).
-#
 getPatchLevel()
 {
     getMetaInfo
 
     # Local copy
-    local value="${metaInfo[patch]}"
+    local patch="${meta_patch}"
 
-    if [ -n "$value" ]
+    if [ -n "$patch" ]
     then
-        echo "$value"
+        echo "$patch"
     else
         return 1
     fi
 }
 
 
+#
 # Report make info
+#
 reportMakeInfo()
 {
     getMakeInfo
     getMetaInfo
 
-    local patch="${metaInfo[patch]}" # <- From meta-info only
-    makeInfo[patch]="${patch:=0}"    # Extra safety
-
     echo "make"
-    for key in api patch branch build
-    do
-        echo "    $key = ${makeInfo[$key]}"
-    done
+    echo "    api = ${make_api}"
+    echo "    patch = ${meta_patch:-0}"  # <- From meta-info only
+    echo "    branch = ${make_branch}"
+    echo "    build = ${make_build}"
 }
 
 
+#
 # Report meta info
+#
 reportMetaInfo()
 {
     getMetaInfo
 
-    local patch="${metaInfo[patch]}" # <- From meta-info only
-    metaInfo[patch]="${patch:=0}"    # Extra safety
-
     echo "meta"
-    for key in api patch branch build
-    do
-        echo "    $key = ${metaInfo[$key]}"
-    done
+    echo "    api = ${meta_api}"
+    echo "    patch = ${meta_patch:-0}"  # <- From meta-info only
+    echo "    branch = ${meta_branch}"
+    echo "    build = ${meta_build}"
+}
+
+
+# Report diff between make and meta info (single key).
+# Set diff_header prior to the first call.
+# $1 == key
+# $2 == make value
+# $3 == meta value
+unset diff_header
+_reportDiff()
+{
+    if [ -n "$diff_header" ]
+    then
+        echo "$diff_header"
+        unset diff_header
+    fi
+    echo "$1:"
+    echo "    make $2"
+    echo "    meta $3"
 }
 
 
@@ -350,50 +362,68 @@ reportMetaInfo()
 # $1 == verbose, print as diff. Silent otherwise
 checkDiff()
 {
-    local verbose="$1"
-    local key diff
+    local diff verbose
+
+    if [ "$1" = "verbose" ]
+    then
+        diff_header="Differences"
+        verbose=true
+    fi
 
     getMakeInfo
     getMetaInfo
 
-    for key in api patch branch build
-    do
-        if [ "${makeInfo[$key]}" != "${metaInfo[$key]}" ]
+    # api
+    if [ "${make_api}" != "${meta_api}" ]
+    then
+        diff=true
+
+        if [ -n "$verbose" ]
         then
-            case "$key" in
-            (branch | build)
-                # Only trigger when make info (branch, build) are non-empty
-                if [ -n "${makeInfo[$key]}" ]
-                then
-                    diff="$diff $key"
-                fi
-
-                ;;
-            (*)
-                diff="$diff $key"
-                ;;
-            esac
+            _reportDiff "api" "${make_api}" "${meta_api}"
         fi
-    done
+    fi
 
-    if [ "$verbose" = verbose ] && [ -n "$diff" ]
+    # patch
+    if [ "${make_patch}" != "${meta_patch}" ]
     then
-        echo "Differences"
-        for key in $diff
-        do
-            echo "$key:"
-            echo "     make ${makeInfo[$key]}"
-            echo "     meta ${metaInfo[$key]}"
-        done
+        diff=true
+
+        if [ -n "$verbose" ]
+        then
+            _reportDiff "patch" "${make_patch}" "${meta_patch}"
+        fi
+    fi
+
+    # branch - only test when make info is non-empty
+    if [ -n "${make_branch}" ] && [ "${make_branch}" != "${meta_branch}" ]
+    then
+        diff=true
+
+        if [ -n "$verbose" ]
+        then
+            _reportDiff "branch" "${make_branch}" "${meta_branch}"
+        fi
+    fi
+
+    # build - only test when make info is non-empty
+    if [ -n "${make_build}" ] && [ "${make_build}" != "${meta_build}" ]
+    then
+        diff=true
+
+        if [ -n "$verbose" ]
+        then
+            _reportDiff "build" "${make_build}" "${meta_build}"
+        fi
     fi
 
     # No diffs, but never permit entirely empty values for build.
-    test -z "$diff" || test -z "${makeInfo[build]}${metaInfo[build]}"
+    test -z "$diff" || test -z "${make_build}${meta_build}"
 }
 
 
 #
-# Update metaInfo (on disk) based on the makeInfo
+# Update meta info (on disk) based on the make info
 #
 performUpdate()
 {
@@ -401,16 +431,16 @@ performUpdate()
     getMetaInfo
 
     # Local copies of the make info
-    local api="${makeInfo[api]}"
-    local branch="${makeInfo[branch]}"
-    local build="${makeInfo[build]}"
-    local patch="${makeInfo[patch]}"
+    local api="${make_api}"
+    local branch="${make_branch}"
+    local build="${make_build}"
+    local patch="${make_patch}"
 
     # If any of the make-info are empty (bad),
     # use the meta-info to avoid spurious changes
-    [ -n "$api" ] || api="${metaInfo[api]}"
-    [ -n "$branch" ] || branch="${metaInfo[branch]}"
-    [ -n "$build" ] || build="${metaInfo[build]}"
+    [ -n "$api" ] || api="${meta_api}"
+    [ -n "$branch" ] || branch="${meta_branch}"
+    [ -n "$build" ] || build="${meta_build}"
 
     # Fallback to WM_PROJECT_VERSION alone
     [ -n "$build" ] || build="${WM_PROJECT_VERSION:-unknown}"
@@ -419,12 +449,11 @@ performUpdate()
 
     # build-info
     outputFile="$metaInfoDir/build-info"
-    if [ "$branch" != "${metaInfo[branch]}" ] || \
-       [ "$build" != "${metaInfo[build]}" ] || \
-       [ "$patch" != "${metaInfo[patch]}" ]
+    if [ "$branch" != "${meta_branch}" ] || \
+       [ "$build" != "${meta_build}" ] || \
+       [ "$patch" != "${meta_patch}" ]
     then
-        patch="${metaInfo[patch]}"      # <- From meta-info only
-        : "${patch:=0}"                 # Extra safety
+        patch="${meta_patch:-0}"        # <- From meta-info only
 
         if [ -n "$optDryRun" ]
         then
@@ -441,10 +470,9 @@ performUpdate()
 
     # api-info
     outputFile="$metaInfoDir/api-info"
-    if [ "$api" != "${metaInfo[api]}" ]
+    if [ "$api" != "${meta_api}" ]
     then
-        patch="${metaInfo[patch]}"      # <- From meta-info only
-        : "${patch:=0}"                 # Extra safety
+        patch="${meta_patch:-0}"        # <- From meta-info only
 
         if [ -n "$optDryRun" ]
         then
@@ -461,8 +489,7 @@ performUpdate()
 
 
 #
-# Update metaInfo (on disk) based on the makeInfo
-# This is the
+# Update meta info (on disk) based on the make info
 #
 performFiltering()
 {
@@ -477,11 +504,10 @@ performFiltering()
     getMetaInfo
 
     # Local copies of the make info
-    local api="${makeInfo[api]}"
-    local branch="${makeInfo[branch]}"
-    local build="${makeInfo[build]}"
-    local patch="${metaInfo[patch]}"   # <- From meta-info only
-    : "${patch:=0}"                    # Extra safety
+    local api="${make_api}"
+    local branch="${make_branch}"
+    local build="${make_build}"
+    local patch="${meta_patch:-0}"  # <- From meta-info only
 
 
     # If any of the make-info are empty (bad),
@@ -492,19 +518,20 @@ performFiltering()
 
     if [ -z "$api" ]
     then
-        api="${metaInfo[api]}"
+        api="${meta_api}"
         api="${api:-0}"  # integer value
     fi
 
     # branch/build could be missing for non-git
     if [ -z "$branch" ]
     then
-        branch="${metaInfo[branch]}"
+        branch="${meta_branch}"
         branch="${branch:-unknown}"
     fi
+
     if [ -z "$build" ]
     then
-        build="${metaInfo[build]}"
+        build="${meta_build}"
         # Fallback to WM_PROJECT_VERSION
         build="${build:-${WM_PROJECT_VERSION:-unknown}}"
     fi
@@ -523,7 +550,7 @@ performFiltering()
 
 #------------------------------------------------------------------------------
 
-# Dispatching
+# Dispatch
 
 if [ -n "$optCheck" ]
 then
diff --git a/wmake/wmakeScheduler b/wmake/wmakeScheduler
index 08b05d5d5269a9069210b3a2c65e15f0ef0cf2a2..0a92eaa0d84fc87f13fdaec46ef007bfe7c60cc7 100755
--- a/wmake/wmakeScheduler
+++ b/wmake/wmakeScheduler
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2018-2019 OpenCFD Ltd.
 #-------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -44,20 +44,24 @@
 #     Sources the relevant cshrc/bashrc if not set.
 #
 # Environment
+#     - FOAM_API
 #     - WM_PROJECT_DIR
-#     - WM_PROJECT
-#     - WM_PROJECT_API
+#     - WM_PROJECT  (defaults to OpenFOAM)
 #
 #-------------------------------------------------------------------------------
-Script=${0##*/}
+Script="${0##*/}"
 
-# csh sets HOST, bash sets HOSTNAME
-: ${HOST:=$HOSTNAME}
+# Default project
+[ -n "$WM_PROJECT" ] || WM_PROJECT=OpenFOAM
 
 lockDir="$HOME/.$WM_PROJECT/.wmake"
 
+# csh sets HOST, bash sets HOSTNAME
+[ -n "$HOST" ] || HOST="$HOSTNAME"
+
 # Fallback - 1 core on current host
-: ${WM_HOSTS:=$HOST:1}
+[ -n "$WM_HOSTS" ] || WM_HOSTS="${HOST}:1"
+
 
 # Count the total number of slots available and exit
 if [ "$1" = "-count" ]
@@ -90,13 +94,13 @@ esac
 
 # Same as foamEtcFile -mode=uo bashrc
 #
-# Check ~/.$WM_PROJECT/$WM_PROJECT_API/
+# Check ~/.$WM_PROJECT/$FOAM_API/
 # Check ~/.$WM_PROJECT/
 # Check projectDir/etc/
-if [ -n "$WM_PROJECT" ]
+if [ -n "$WM_PROJECT_DIR" ]
 then
     for i in \
-        "$HOME/.$WM_PROJECT/$WM_PROJECT_API" \
+        "$HOME/.$WM_PROJECT/$FOAM_API" \
         "$HOME/.$WM_PROJECT" \
         "$WM_PROJECT_DIR/etc" \
         ;
@@ -114,11 +118,11 @@ fi
 # Use FOAM_SETTINGS to pass command-line settings
 case "$sourceFoam" in
 */bashrc)
-    sourceFoam='[ -n "$WM_PROJECT" ] || '". $sourceFoam $FOAM_SETTINGS"
+    sourceFoam='[ -n "$WM_PROJECT_DIR" ] || '". $sourceFoam $FOAM_SETTINGS"
     ;;
 
 */cshrc)
-    sourceFoam='if ( ! $?WM_PROJECT ) source '"$sourceFoam $FOAM_SETTINGS"
+    sourceFoam='if ( ! $?WM_PROJECT_DIR ) source '"$sourceFoam $FOAM_SETTINGS"
     ;;
 esac
 
diff --git a/wmake/wmakeSchedulerUptime b/wmake/wmakeSchedulerUptime
index ec8d2e72484027f660641c93fc520ee101b8ef1f..2873d35d4783477c496f1cb664a55b351690562f 100755
--- a/wmake/wmakeSchedulerUptime
+++ b/wmake/wmakeSchedulerUptime
@@ -4,7 +4,7 @@
 # \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
 #  \\    /   O peration     |
 #   \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
-#    \\/     M anipulation  | Copyright (C) 2018 OpenCFD Ltd.
+#    \\/     M anipulation  | Copyright (C) 2018-2019 OpenCFD Ltd.
 #-------------------------------------------------------------------------------
 # License
 #     This file is part of OpenFOAM.
@@ -44,20 +44,24 @@
 #     Sources the relevant cshrc/bashrc if not set.
 #
 # Environment
+#     - FOAM_API
 #     - WM_PROJECT_DIR
-#     - WM_PROJECT
-#     - WM_PROJECT_API
+#     - WM_PROJECT  (defaults to OpenFOAM)
 #
 #-------------------------------------------------------------------------------
-Script=${0##*/}
+Script="${0##*/}"
 
-# csh sets HOST, bash sets HOSTNAME
-: ${HOST:=$HOSTNAME}
+# Default project
+[ -n "$WM_PROJECT" ] || WM_PROJECT=OpenFOAM
 
 lockDir="$HOME/.$WM_PROJECT/.wmake"
 
+# csh sets HOST, bash sets HOSTNAME
+[ -n "$HOST" ] || HOST="$HOSTNAME"
+
 # Fallback - 1 core on current host
-: ${WM_HOSTS:=$HOST:1}
+[ -n "$WM_HOSTS" ] || WM_HOSTS="${HOST}:1"
+
 
 # Count the total number of slots available and exit
 if [ "$1" = "-count" ]
@@ -90,13 +94,13 @@ esac
 
 # Same as foamEtcFile -mode=uo bashrc
 #
-# Check ~/.$WM_PROJECT/$WM_PROJECT_API/
+# Check ~/.$WM_PROJECT/$FOAM_API/
 # Check ~/.$WM_PROJECT/
 # Check projectDir/etc/
-if [ -n "$WM_PROJECT" ]
+if [ -n "$WM_PROJECT_DIR" ]
 then
     for i in \
-        "$HOME/.$WM_PROJECT/$WM_PROJECT_API" \
+        "$HOME/.$WM_PROJECT/$FOAM_API" \
         "$HOME/.$WM_PROJECT" \
         "$WM_PROJECT_DIR/etc" \
         ;
@@ -114,11 +118,11 @@ fi
 # Use FOAM_SETTINGS to pass command-line settings
 case "$sourceFoam" in
 */bashrc)
-    sourceFoam='[ -n "$WM_PROJECT" ] || '". $sourceFoam $FOAM_SETTINGS"
+    sourceFoam='[ -n "$WM_PROJECT_DIR" ] || '". $sourceFoam $FOAM_SETTINGS"
     ;;
 
 */cshrc)
-    sourceFoam='if ( ! $?WM_PROJECT ) source '"$sourceFoam $FOAM_SETTINGS"
+    sourceFoam='if ( ! $?WM_PROJECT_DIR ) source '"$sourceFoam $FOAM_SETTINGS"
     ;;
 esac