Exodus 8.24
|
EXODUS is the successor of the widely used finite element (FE) data file format EXODUS (henceforth referred to as EXODUS I) developed by Mills-Curran and Flanagan. It continues the concept of a common database for multiple application codes (mesh generators, analysis codes, visualization software, etc.) rather than code-specific utilities, affording flexibility and robustness for both the application code developer and application code user. By using the EXODUS data model, a user inherits the flexibility of using a large array of application codes (including vendor-supplied codes) which access this common data file directly or via translators.
The uses of the EXODUS data model include the following:
The Exodus library source code is available on Github at https://github.com/sandialabs/seacas
For bug reports, documentation errors, and enhancement suggestions, contact:
The EXODUS library is licensed under the BSD open source license.
Copyright(C) 1999-2022 National Technology & Engineering Solutions of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with NTESS, the U.S. Government retains certain rights in this software. See packages/seacas/LICENSE for details Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. Neither the name of NTESS nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
The evolution of the EXODUS data model has been steered by FE application code developers who desire the advantages of a common data format. The EXODUS model has been designed to overcome deficiencies in the EXODUS I file format and meet the following functional requirements as specified by these developers:
To address these requirements, the open source database library NetCDF (http://www.unidata.ucar.edu/software/netcdf/) was selected to handle the low-level data storage. The EXODUS II library functions provide the mapping between FE data objects and NetCDF dimensions, attributes, and variables. Thus, the code developer interacts with the data model using the vocabulary of an FE analyst (element connectivity, nodal coordinates, etc.) and is relieved of the details of the data access mechanism.
Because an EXODUS file is a NetCDF file, an application program can access data via the EXODUS API or the NetCDF API directly. Although accessing the data directly via the NetCDF API requires more in-depth understanding of NetCDF, this capability is a powerful feature that allows the development of auxiliary libraries of special purpose functions not offered in the standard EXODUS library. For example, if an application required access to the coordinates of a single node (the standard library function returns the coordinates for all of the nodes in the model), a simple function could be written that calls NetCDF routines directly to read the data of interest.
The data in EXODUS files can be divided into three primary categories: initialization data, model, and results.
Initialization data includes sizing parameters (number of nodes, number of elements, etc.), optional quality assurance information (names of codes that have operated on the data), and optional informational text.
The model is described by data which are static (do not change through time). These data include nodal coordinates, element connectivity (node lists for each element), element attributes, and node sets and side sets (used to aid in applying loading conditions and boundary constraints).
The results are optional and include five types of variables – nodal, element, nodeset, sideset, and global – each of which is stored through time. Nodal results are output (at each time step) for all the nodes in the model. An example of a nodal variable is displacement in the X direction. Element, nodeset, and sideset results are output (at each time step) for all entities (elements, nodes, sides) in one or more entity block. For example, stress may be an element variable. Another use of element variables is to record element status (a binary flag indicating whether each element is "alive" or "dead") through time. Global results are output (at each time step) for a single element or node, or for a single property. Linear momentum of a structure and the acceleration at a particular point are both examples of global variables. Although these examples correspond to typical FE applications, the data format is flexible enough to accommodate a spectrum of uses.
A few conventions and limitations must be cited:
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:
The entity map data is any data stored in one of the 'map' objects on the exodus file. This includes:
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 mechanism 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 also provides a mechanism for specifying how integer data will be passed as arguments.
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( "test.exo", 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:
Constant Name | Which data are 64-bit |
---|---|
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_INQ_INT64_API | integers passed to/from ex_inquire() |
EX_ALL_INT64_API | (the above 4 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 as 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
EX_MAPS_INT64_
),EX_BULK_INT64_
), andEX_IDS_INT64_
)The function ex_int64_status()(exoid) is used to determine the integer storage types being used for the EXODUS database exoid
. It 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.
The fortran API is uses the same mechanism as was described above for the C API. If using the "8-byte real and 8-byte int" fortran mode typically used by the SEACAS applications (the compiler automatically promotes all integers and reals to 8-byte quantities), then the fortran exodus library will automatically enable the EX_*_INT64_API
options; the client still needs to specify the EX_*_INT64_DB
options.
The new capability to pass 64-bit integer data through the fortran and C API functions simplifies the implementation of the "8-byte real 8-byte int" usage of the exodus library. Previously, the wrapper routines in addrwrap.F were required to convert the 8-byte integer data on the client side to/from 4-byte integers on the library side. This required extra memory allocation and complications that are now handled at the lowest level in the NetCDF library. The functions in the fortran API have all been converted to pass 64-bit integers down to the C API which has removed some code and simplified those functions.
The ex_set_option() function call is used to set various options on the database. Valid values for 'option' are:
Option Name | Option Values |
---|---|
EX_OPT_MAX_NAME_LENGTH | Maximum length of names that will be returned/passed via API call. |
EX_OPT_COMPRESSION_TYPE | Not currently used; default is gzip |
EX_OPT_COMPRESSION_LEVEL | In the range [0..9]. A value of 0 indicates no compression |
EX_OPT_COMPRESSION_SHUFFLE | 1 if enabled, 0 if disabled |
EX_OPT_INTEGER_SIZE_API | 4 or 8 indicating byte size of integers used in API functions. |
EX_OPT_INTEGER_SIZE_DB | Query only, returns 4 or 8 indicating byte size of integers stored on the database. |
The compression-related options are only available on NetCDF-4 files since the underlying hdf5 compression functionality is used for the implementation. The compression level indicates how much effort should be expended in the compression and the computational expense increases with higher levels; in many cases, a compression level of 1 is sufficient.
The length of the Variables, Attributes, and Entity Block/Set names is variable. The default length is 32 characters to provide backward compatibility. This is the default on both read and write, so if there is a database with longer names and the reader does not change the length of names to be returned, any API call that returns a name will truncate the name at 32 characters.
To avoid this, the reading application can all
On write, you can call:
which tells the database that you will be using names of that length or shorter.
Following this call, you can define (i.e., read/write) names of any size; if the names are longer than {max_name_length}
, then they will be truncated otherwise they will pass through unchanged.
There are three queries that can be made to ex_inquire() or ex_inquire_int():
max_name_length
(netcdf/hdf5 limitation)entity_descrip
type passed and returnen in the ex_get_block() and ex_put_block() calls is still limited to 32 characters.