Note
Go to the end to download the full example code.
HDF5 export and compare precision#
This example shows how to use HDF5 format to export and compare simple precision versus double precision.
Import the dpf-core
module and its examples files, and then create a
temporary directory.
from pathlib import Path
from ansys.dpf import core as dpf
from ansys.dpf.core import examples, operators as ops
Create the model and get the stresses, displacements, and mesh.
transient = examples.download_transient_result()
model = dpf.Model(transient)
stress = model.results.stress()
displacement = model.results.displacement()
mesh = model.metadata.meshed_region
Create the HDF5 export operator. The HDF5 module should already be loaded.
h5op = ops.serialization.serialize_to_hdf5()
print(h5op)
DPF serialize_to_hdf5 Operator:
This operator is deprecated: use 'hdf5::h5dpf::make_result_file' instead. Serialize the inputs in an hdf5 format.
Inputs:
file_path [string]: output file path with .h5 extension
export_floats (optional) [bool]: converts double to float to reduce file size (default is true)
export_flat_vectors (optional) [bool]: if true, vectors and matrices data are exported flat (x1,y1,z1,x2,y2,z2..) (default is false)
data (ellipsis) []: only the data set explicitly to export is exported
Run the operator to get its result
Connect the correct time scoping to the results operators (stress and displacement).
timeIds = list(range(1, model.metadata.time_freq_support.n_sets + 1))
stress.inputs.time_scoping.connect(timeIds)
displacement.inputs.time_scoping.connect(timeIds)
Connect inputs of the HDF5 export operator.
h5op.inputs.data1.connect(stress.outputs)
h5op.inputs.data2.connect(displacement.outputs)
h5op.inputs.data3.connect(mesh)
Define a temporary folder for outputs
tmpdir = dpf.core.make_tmp_dir_server(dpf.SERVER)
files = [
Path(dpf.path_utilities.join(tmpdir, "dpf_float.h5")),
Path(dpf.path_utilities.join(tmpdir, "dpf_double.h5")),
]
Export with simple precision.
h5op.inputs.file_path.connect(files[0])
h5op.run()
Export with double precision.
h5op.inputs.export_floats.connect(False)
h5op.inputs.file_path.connect(files[1])
h5op.run()
Download the resulting .h5 files if necessary
if not dpf.SERVER.local_server:
float_file_path = Path.cwd() / "dpf_float.h5"
double_file_path = Path.cwd() / "dpf_double.h5"
dpf.download_file(files[0], float_file_path)
dpf.download_file(files[1], double_file_path)
else:
float_file_path = files[0]
double_file_path = files[1]
Compare simple precision versus double precision.
float_precision = float_file_path.stat().st_size
double_precision = double_file_path.stat().st_size
print(
f"size with float precision: {float_precision}\n"
f"size with double precision: {double_precision}"
)
size with float precision: 6703264
size with double precision: 13112464
Total running time of the script: (0 minutes 0.344 seconds)