Integer Bulkdata Storage Details

The EXODUS database can store integer bulk data, entity map data, and
mesh entity (block/set) ids in either 32-bit or 64-bit integer format. The data
considered "bulk data" are:

 * element, face, and edge connectivity lists,
 * element, face, edge, and node set entity lists,

The entity map data is any data stored in one of the 'map' objects on
the exodus file.  This includes:
 * id maps
 * number maps
 * order maps
 * processor node maps
 * processor element maps.

A mesh entity id is the id of any block (element block, edge block,
...); set (node set, face set, ...), coordinate frame, and
communication map.


When an EXODUS file is created via the ex_create() function, the
'mode' argument provides the method for specifying how integer data
will be passed as arguments to the API functions and also how the
integer data will be stored on the database. The ex_open() function
provides the same method for specifying how integer data will be
passed as arguments to the API functions.

The method uses the 'mode' argument to the ex_open() and
ex_create() functions. The mode is a 32-bit integer in which certain
bits are turned on by or'ing certain predefined constants.
 
exoid = ex_create( EX_TEST_FILENAME,
		   EX_CLOBBER|EX_MAPS_INT64_DB|EX_MAPS_INT64_API,
		   &appWordSize, &diskWordSize );

The constants related to the integer size (32-bit or 64-bit) specification are:

    EX_MAPS_INT64_DB   -- entity map data
    EX_IDS_INT64_DB    -- mesh entity ids
    EX_BULK_INT64_DB   -- bulk data
    EX_ALL_INT64_DB    -- (the above 3 or'd together)
    EX_MAPS_INT64_API  -- entity map data
    EX_IDS_INT64_API   -- mesh entity ids
    EX_BULK_INT64_API  -- bulk data
    EX_ALL_INT64_API   -- (the above 3 or'd together)

The constants that end with "_DB" specify that that particular integer
data is stored on the database as 64-bit integers; the constants that
end with "_API" specify that that particular integer data is passed
to/from API functions as 64-bit integers.

If the range of the data being transmitted is larger than the
permitted integer range (for example, if the data is stored on the
database truly requires 64-bit ints and the application specifies
passing data as 32-bit ints), the api function will return an error.

The three types of integer data whose storage can be specified are:

    * maps (EX_MAPS_INT64_),
    * "bulk data" including connectivity lists and entity lists
      (EX_BULK_INT64_), and
    * entity ids which are the ids of element, face, edge, and node
      sets and blocks; and map ids (EX_IDS_INT64_)

The function ex_int64_status(exoid) is used to determine the integer
storage types being used for the EXODUS database 'exoid'. The function
returns an integer which can be and'ed with the above flags to
determine either the storage type or function parameter type. 

For example, if (EX_MAPS_INT64_DB & ex_int64_status(exoid)) is true,
then map data is being stored as 64-bit integers for that database.

It is not possible to determine the integer data size on a database
without opening the database via an ex_open() call. However, the
integer size specification for API functions can be changed at any
time via the ex_set_int64_status(exoid, mode) function. The mode is
one or more of EX_MAPS_INT64_API, EX_IDS_INT64_API, or
EX_BULK_INT64_API, or'd together.  Any exodus function calls after
that point will use the specified integer size. Note that a call to
ex_set_int64_status(exoid, mode) overrides any previous setting for
the integer sizes used in the API.  The ex_create() function is the
only way to specify the integer sizes specification for database
integers.

========================================================================

IOSS: IO System libraries

The IO System (Ioss) is also 64-bit integer capable.  When Ioss opens
and reads the intial metadata from an exodus file, it will determine
the size of integers stored on the database. If either 'maps' or 'bulk
data' are stored as 64-bit integers, then Ioss will automatically
specify that all integers will be transferred as 64-bit integers.
Entity (block/set) ids are always treated as 64-bit integers in Ioss. 

The setting can be queried via the Ioss::DatabaseIO
int_byte_size_api() member function call which will return either 4 or
8. The setting can be modified via the set_int_byte_size_api(mode)
function call where mode is one of:

  * Ioss::USE_INT64_API or
  * Ioss::USE_INT32_API.

The integer byte size setting should only be changed prior to assiging
the database to an Ioss::Region since fields are created using the
setting when the meta data of the database is read.  An Ioss::Field
that stores 64-bit integers will have a type of 'Ioss::Field::INT64'
and a field that stores 32-bit integers will have a type of
'Ioss::Field::INTEGER' (Ioss::Field::INT32 can also be used).

The Ioss io_shell application will maintain the integer size of the
input database to the output database by default.  If the '--64'
option is specified, the the output database will use 64-bit integers
for all quantities.

========================================================================

SEACAS Applications

Many of the SEACAS applications have been modified to be 64-bit
capable. The include:

  * epu
  * nem_spread
  * nem_slice -- Note that only the linear, random, or scattered
                 decomposition options are allowed for 64-bit integer
		 meshes. Other options are being investigated for the
		 slicing of large meshes.

  * algebra, blot, exotxt, gen3d, genshell, gjoin, grepos, explore,
    mapvar, numbers, txtexo
     -- These will probably work, but have not all been tested on
        very large models. Blot has read and displayed a 4.4 billion
	element model; explore and grepos have also read/written the
	same model, but that is the extent of the testing.

Still need conversion:
  * exodiff
  * conjoin
  * ejoin


========================================================================
AVAILABILITY:

The 64-bit integer capability is currently available in the following
locations:

 * SEACAS repository
 * Sierra repository
 * Sourceforge exodusII repository
 * Sourceforge seacas repository

The Trilinos repository will be updated as soon as a newer version of
netcdf is available on the Trilinos build/test machines.

========================================================================
Other Details:

* Exodus requires netcdf-4.1.2 or later.

* The Nemesis library has been absorbed into the exodus library.
  -- All api functions that were ne_* are now ex_*
  -- A wrapper exists in the old nemesis library that will forward all
     ne_* calls to the corresponding ex_* call to maintain backward 
     compatability with unconverted applications.
