Changelog
Last update: 16.07.2025What's new in 2024 R2
- Cache store infrastructure changes - Single Writer/Multiple Reader support
- The cache store, for both the supported HDF5 and Flatfile caches, has been upgraded so that the data are split per update number. This introduces the support for the Single Writer, Multiple Reader case where data can be accessed while the DVS servers are still writing data. Furthermore, it is possible to delete corrupted updates without losing the whole DVS data stored. Old datasets get a database migration in case of appending new data, if the cache is HDF5. Reading only does not trigger a database migration but backward compatibility loading is fully supported. The flatfile cache infrastructure has been changed to allow in the future support of new compression algorithms.
- Memory management improvements
- A memory data pool has been introduced to significantly improve the memory management, avoiding data duplication. This applies to both the cache and in-situ scenarios. Currently this is limited only to the larger objects like coordinates and connectivity data. For the next release it is planned to be extended to all the objects available.
- Rigid Body Motion support
- A Python/C/C++ API has been introduced to send and store rigid body motion data that can be used when loading in EnSight to pre-apply rigid body motion to the geometry. Future work is planned to apply the rigid body motion directly in the library so to take advantage of the feature even outside of EnSight.
- Reader API support for the in-situ case
- The C++ and Python reader API now fully support the in-situ case. Specifically, each DVS Server can now create DVS Query objects to retrieve data and optionally apply filters.
- Port allocation improvements The support for the random ports allocation, to be used for the transport connection between the DVS Server and Client objects, has been improved. A C/C++/Python API has been introduced on the DVS Server objects to retrieve the port number after the allocation. This is particularly significant in EnSight where also a Python API has been introduced to pre-allocate the ports and to retrieve them afterawrds without the need of loading a DVS file.
What's new in 2024 R1
- 64-bit Integer support
- It is now possible to send and read 64-bit integers through the DVS interfaces. It is so now possible, for instance, to send 64-bit Element and Node IDs, but the support is extended to any other entity, like variables for example. The 64-bit Integer support is also available for the DVS Reader API and the Merge Utility.
- Python Reader API
- The existing C++ Reader API is now available in Python through a wrapper API. The API is available using importing the dynamic_visualization_store module, with specific interfaces to create DVS Query objects, similarly to what is done using the C++ APIs (See DVS Reader).
- (Beta) C/C++/Python API for copying data from a previous timestep
- A new API is available to copy data from a previous timestep. It is so possible to avoid resending large data like mesh/connectivity if already available. The APIs can be called at any time during the begin_update/end_update sequences, since it is actually executed only when the timestep is being completed by the DynamicDataReader instance.
What's new in 2023 R2
- (Beta) 64-bit Integer support
- Initial support to store and load 64-bit integers in DVS is now available. The user can now send 64-bit integers values for entities like variables, node/element IDs and others. The support for the DVS reader API and the Merge utility is in progress.
- Notable robustness updates and bug fixes
- The gRPC libraries have been upgraded to version 1.46.5.1, commonly used by other Ansys products.
- The use of std::regex has been replaced with fnmatch for better compatibility with other Ansys products.
- It is now possible to send empty variable updates, if needed.
- The delete_item API was reporting errors in the InSitu case. This has been fixed.
What's new in 2023 R1
- Static libraries
- There are now static libraries built and located in the static/{arch} directories for Windows and Linux
- Dataset metadata API
- New dvs_add_metadata() (C and Python) and DVS::IClient::add_metadata() (C++) API added to allow the setting of key/value pairs on the dataset object
- EnSight DVS Reader Element Filtering
- Manual server control
- Some users had a need for more explicit server control so they could handle shutdown more cleanly and better handle threading for their applications. Previously there was one call to DVS::IServer::startup() which would start a server in a thread and run it until DVS::IServer::shutdown() was invoked. Now there are new methods exposed DVS::IServer::startup_unthreaded(), DVS::IServer::update(), and DVS::IServer::terminating() to allow for more manual control. For an example of the usage of these methods please see test_dvs_server.cpp.
- Merged Reader API and Client API libraries into one library named libdvsapi
- The old libraries for libdvsclient and libdvsreader are now removed
- Merge Utility
- The dvs_utility app now can merge a dataset from one cache into another. The main use for this is to merge data from a restart run into the original dataset. Because of this it right now finds the earliest timestep in the dataset it is merging from and removes all timesteps >= to it from the dataset it is merging to. This is available via dvs_utility.exe -merge {from Cache URI} {to Cache URI}.
- Delete Item API change
- Delete item calls now take an update number similar to the begin_update calls. This is to have delete item calls act more like a timestep update so they are asynchronous and happen in lock step with completed timesteps. The update number should be in the same "update timeline" as the begin_update calls (eg begin_update (update 0), begin_update (update 1), delete_item (update 2), begin_update (update 3))
- See dvs_delete_item(), DVS::IClient::delete_item()
- Ability to modify existing timesteps
- It is now possible to modify existing timesteps in a DVS cache. Previously this was only available when running in situ. To do this a begin_update call is made (with a monotonically increasing update number) and a time value that matches a previously sent time. When the update has completed across all ranks it will be merged into the current timestep. It is important to note that the update is merged in and does not overwrite the previously sent data. So only changes are needed to be sent. So if a part mesh has been completely removed an empty update_nodes call must be made. Changes to the coordinates will automatically remove all nodal/element variables for that part. Changes to the connectivity will automatically remove all elemental variables for that part.
- Reader API fully released
- The Reader API (See DVS Reader) has gone through much more extensive usage and testing.
- UTF8 Support Fixed
- The DVS library was improperly handling UTF8 strings. The initial intent was that all strings sent to DVS were UTF8. However with a lack of testing in that area that did not work correctly. As of version 1.2 UTF8 support should be working.
What's new in 2022 R2
- DVS Reader API
- There is now a full external C++ Reader API available (See DVS Reader)
- New logger example
- Added a LoggerVerbose class in logger_verbose.h as an example of logging based on verbosity instead of flags. The flag method wasn't really working well so we will be moving to using verbosity on the client and server in future versions to make logging more consistent.
- Logging
- Added a lot more logging into the server to diagnose potential problems with a DVS Server. Set the server option "VERBOSE" to 0-3 (0 being none or 3 being max).
- Notable Bug fixes
- Server logging verbosity was broken in 2022 R1, this has been fixed so setting server verbosity should start outputting more information.
What's new in 2022 R1
- Versioning
- There is now a dynamic_visualization_store_version.h file which has a DVS_CURRENT_API_VERSION defined in it. It follows the normal semantic versioning convention of X.Y.Z where any changes to Z are deemed compatible with the previous version but a change in X or Y is not.
- This same versioning is built into the gRPC API as well and an error of DVS_VERSION_MISMATCH or DVS_VERSION_UNKNOWN will be returned if there is an issue.
- To find the version the library was built with a user can call dvs_get_version() or DVS::IClient::get_version(). The python version is available via the "version" attribute on the module.
- Code Restructuring
- A lot of code refactoring is ongoing to support the DVS Reader API, the code is beginning to be split into include and src directories. This work will be finished next release so that all headers needed to be included for use of the libraries will be within the include directory.
- DVS Reader API
- An alpha version of the DVS Reader API has been implemented. This can be access via the include/dvs_query_interface.h header file. Example usage of the API can be seen in the test_dvs_reader.cpp. Full documentation will be added when the API is complete in 2022R2. Currently you can only open a dataset and read all of the part/plot/variable definitions and some basic information. Actual access to data will be exposed in the full release.
- Deletion Item API
- A user can now call the delete item API to remove a single or collection of timesteps from the dataset after initialization. See dvs_delete_item_api for more information.
- DVS File Location Server Options
- A user can now specify a different location for the .dvs files to be created for datasets that is separate from the cache location. See Server Options for more information.
What's new in 2021 R1
- Structured Meshes
- New APIs for parallelepiped and curvilinear structured meshes, see dvs_update_nodes_parallelepiped(), dvs_update_nodes_curvilinear(), DVS::IClient::update_nodes_structured() for more information. See test_dvs_client.c and test_dvs_client_cxx.cpp for example usage.
- Sending iblanking information is done through calls to dvs_update_var_node_scalar(), DVS::IClient::update_var_node() using DVS_STRUCTURED_IBLANKED_NODES (see dynamic_visualization_store_enums.h) as the variable id. Variable type for C++ API is SCALAR. See test_dvs_client.c for examples.
- Valid iblanking values are DVS_IBLANK_EXTERIOR, DVS_IBLANK_INTERIOR, DVS_IBLANK_BOUNDARY, DVS_IBLANK_INTERNAL_BOUNDARY, DVS_IBLANK_SYMMETRY
- Sending ghost element information is done through calls to dvs_update_var_element_scalar(), DVS::IClient::update_var_element() using DVS_STRUCTURED_GHOST_ELEMENTS (see dynamic_visualization_store_enums.h) as the variable id. Variable type for C++ API is SCALAR. See test_dvs_client.c for examples.
- Sending iblanking information is done through calls to dvs_update_var_node_scalar(), DVS::IClient::update_var_node() using DVS_STRUCTURED_IBLANKED_NODES (see dynamic_visualization_store_enums.h) as the variable id. Variable type for C++ API is SCALAR. See test_dvs_client.c for examples.
- New APIs for parallelepiped and curvilinear structured meshes, see dvs_update_nodes_parallelepiped(), dvs_update_nodes_curvilinear(), DVS::IClient::update_nodes_structured() for more information. See test_dvs_client.c and test_dvs_client_cxx.cpp for example usage.
- Dynamically add new part/variable/plot definitions between updates (doesn't remove definitions since they may be used by previously sent timesteps)
- After any update has finished you may call the dvs_begin_init() / dvs_end_init() or DVS::IClient::begin_init() / DVS::IClient::end_init() sequence to add new parts/variables/plots.
- Note: This does not allow you to change the dataset name or the unit system.
- Overwrite in-situ timesteps
- You may now send a new update for a previously sent timestep to completely overwrite which data is there. If EnSight is currently reading the data may require a reload_data python call to view the newly received timestep information (please contact Postprocessing team on how to do this).
- Note: Trying to overwrite a previously sent timestep while saving data to a cache will return an error. This is not yet allowed.
- Added Client API to retrieve already sent definitions, see dvs_get_num_part_info(), dvs_get_part_info(), DVS::IClient::get_num_parts(), DVS::IClient::get_part_info(), dvs_get_num_var_info(), dvs_get_var_info(), DVS::IClient::get_num_vars(), DVS::IClient::get_var_info(), dvs_get_num_plot_info(), dvs_get_plot_info(), DVS::IClient::get_num_plots(), DVS::IClient::get_plot_info()
- Added Server API calls to retrieve the number of pending / complete timesteps to allow a user created server to know when all timesteps were flushed to disk so it could shutdown without losing data. See dvs_server_timestep_count(), DVS::IServer::get_timestep_count().
- Improved read performance of cache
- Improved performance of reading large numbers of parts/variables/plots when using multiple servers in EnSight
- Improved memory usage
What's new in 2020 R2
- Major API Overhaul
- In getting ready for releasing the API for other teams to use we have gone ahead and redone much of the API to facilitate future changes. Please refer to documentation for new usage.
- Official API Name
- We made an official name for the API of Dynamic Visualization Store (DVS) as we are starting to officially roll this out to external applications. This affects both the C/C++ and Python APIs as we renamed the namespaces to match the new name, renamed headers, libraries and classes. The details of which are described below.
- Note: All files in the EnSight install now located in CEI/ensightXXX/src/readers/dvs where XXX is version 211 or greater.
- Major Client/Server connection API paradigm changed. Now you need to always create at least a shell server for the client to connect to. This change is to make API calls the same no matter what type of communication you are using, whether it be grpc or direct method calls (null protocol) currently or MPI etc. in the future.
- C API: Call the new dvs_server_create() (see docs) with a uri, which returns the created server_id as a param, calling dvs_server_start() if running the server locally, then use dvs_connect() passing in that server_id to connect to it.
- If the server is being locally started you can call dvs_server_start() with the server_id, server_number and local_ranks count to start it running in a separate thread. Otherwise it will just act as an interface for the dvs client to communicate with.
- Note: If a server is started it MUST be started before connecting with a client.
- C++ API: Create a server instance DVS::CREATE_SERVER_INSTANCE() (see docs) with a uri. If running the server locally call DVS::IServer::startup() on the instance. Then pass that server instance into the DVS::CREATE_CLIENT_INSTANCE() call to connect to that server.
- If the server is being locally started you can call DVS::IServer::startup() on the server to begin running it in a separate thread.
- Note: If a server is started it MUST be started before connecting with a client.
- C API: Call the new dvs_server_create() (see docs) with a uri, which returns the created server_id as a param, calling dvs_server_start() if running the server locally, then use dvs_connect() passing in that server_id to connect to it.
- C API Changes
- Renamed ensight_dynamic_data_api.h to dynamic_visualization_store_api.h
- Renamed all prefixed methods and strucs from edd_ to dvs_ (i.e. edd_connect() to dvs_connect())
- Renamed ensight_dynamic_data_enums.h to dynamic_visualization_store_enums.h
- Renamed all prefixes of enums from edd_ to dvs_ (i.e. edd_var_location to dvs_var_location)
- Shared library renamed from libdynamicdataclient to libdvsclient (extension varies depending on platform)
- A server must always be created now for the client to connect to. This is done via dvs_server_create() which as a param returns a server_id. This server_id is then used for other dvs_server_* methods and more importantly in the dvs_connect() call.
- Starting a server is done via dvs_server_start() which takes the server_id as a param. Only need to start a server if running locally.
- Note: A locally run server must be started via dvs_server_start() before calling dvs_connect().
- dvs_connect() now takes a server_id (which is created from dvs_server_create()) and returns a session_id as a param. This session_id is used as the first param in all other client calls, dvs_begin_init(), dvs_add_part_info(), etc.
- Note: A locally run server must be started before calling dvs_connect().
- All client calls (dvs_begin_init(), dvs_add_part_info(), etc.) now take a session_id (which is created from dvs_connect())
- Renamed ensight_dynamic_data_api.h to dynamic_visualization_store_api.h
- C++ API Changes
- Renamed namespaces of classes from EDD to DVS. (i.e. EDD::CREATE_CLIENT_INSTANCE() to DVS::CREATE_CLIENT_INSTANCE())
- Renamed dynamic_data_client_interface.h to dvs_client_interface.h
- Interface class now DVS::IClient instead of EDD::IDynamicDataClient
- Created dvs_server_interface.h header for C++ Server API
- Access with DVS::IServer* DVS::CREATE_SERVER_INSTANCE() and DVS::DESTROY_SERVER_INSTANCE() methods
- Shared library renamed from libdynamicdataclient to libdvsclient (extension varies depending on platform)
- Python API Changes
- Package now named dynamic_visualization_store (file dynamic_visualization_store.pyd)
- Example usage in test_dvs_client_simple.py
- C/C++ Clients
- Renamed client binaries from test_edd_client* to test_dvs_client*
- See test_dvs_client.c for updated example using new API
- Added C++ client example using C++ API, see test_dvs_client_cxx.cpp
- Renamed client binaries from test_edd_client* to test_dvs_client*
- New protocol available for use. It uses what we are calling the NULL transport. Meaning it doesn't use the network to transport data the data goes directly over method calls within this process. Previously all dvs servers used network communication via grpc, now it is possible to go directly to a dvs server without needing a network connection, letting you directly write into the DVS cache if needed.
- DVS File Changes
- Files read by EnSight now use the .dvs extension instead of .edd
- Keyword option GRPC_SERVER_PORT_BASE renamed to SERVER_PORT_BASE
- Keyword option GRPC_SERVER_PORT_MULT renamed to SERVER_PORT_MULT
- Cache Changes
- When using a cache a .dvs file will be auto created in the root cache folder named based on the dataset name which can be loaded by EnSight
- Multiple datasets can now be stored and loaded from the same cache
- Basic queries are enabled for .dvs files to allow the selection of specific datasets, parts, plots, and variables. See the Cache URIs section for more info.
- Disk caches now use sqlite databases for metadata for both hdf5:// disk:// caches.
- Case and part constants now stored in cache