Is there no way to read/load a mesh and function space saved to an xdmf file, without adios2 or adios4doflinx? I have been unable to install adios2 through pip (MacOS with standard conda installation of dolfinx/fenicsx), and the need for adios2 for this simple act of loading data that dolfinx itself saved is odd to me.
Frankly, I would settle for any mode of loading data back in to a mesh and function… .bp file, vtk, vtu, whatever.
dokken
March 26, 2025, 8:17am
2
If you use conda, you should install adios2 with conda, not pip. The pip build of adios2 does not support mpi.
I’ve sketched out how to read data from xdmf at
opened 05:09PM - 15 Jul 23 UTC
enhancement
dolfin-legacy
quick and "dirty" python version of reading data at geometry nodes.
Should be p… roperly implemented with ADIOS2.
```python
from pathlib import Path
import adios4dolfinx
import dolfinx
import numpy as np
from mpi4py import MPI
with dolfinx.io.XDMFFile(MPI.COMM_WORLD, "idealized_LV_ref_0.xdmf", "r") as xdmf:
mesh = xdmf.read_mesh(name="mesh", xpath="Xdmf/Domain/Grid")
import basix
import h5py
def read_mesh_data(file_path:Path, mesh: dolfinx.mesh.Mesh, data_path:str):
assert file_path.is_file(), f"File {file_path} does not exist"
infile = h5py.File(file_path, "r", driver="mpio", comm=mesh.comm)
num_nodes_global = mesh.geometry.index_map().size_global
assert data_path in infile.keys(), f"Data {data_path} does not exist"
dataset = infile[data_path]
shape = dataset.shape
assert shape[0] == num_nodes_global, f"Got data of shape {shape}, expected {num_nodes_global, shape[1]}"
dtype = dataset.dtype
# Read data locally on each process
local_input_range = adios4dolfinx.comm_helpers.compute_local_range(mesh.comm, num_nodes_global)
local_input_data = dataset[local_input_range[0]:local_input_range[1]]
# Create appropriate function space (based on coordinate map)
assert len(mesh.geometry.cmaps) == 1, "Mixed cell-type meshes not supported"
element = basix.ufl.element(
basix.ElementFamily.P,
mesh.topology.cell_name(),
mesh.geometry.cmaps[0].degree,
mesh.geometry.cmaps[0].variant,
shape=(shape[1],),
gdim=mesh.geometry.dim)
# Assumption: Same doflayout for geometry and function space, cannot test in python
V = dolfinx.fem.FunctionSpace(mesh, element)
uh = dolfinx.fem.Function(V, name=data_path)
# Assume that mesh is first order for now
assert mesh.geometry.cmaps[0].degree == 1, "Only linear meshes supported"
x_dofmap = mesh.geometry.dofmap
igi = np.array(mesh.geometry.input_global_indices, dtype=np.int64)
global_geom_input = igi[x_dofmap]
global_geom_owner = adios4dolfinx.utils.index_owner(mesh.comm, global_geom_input.reshape(-1), num_nodes_global)
for i in range(shape[1]):
arr_i = adios4dolfinx.comm_helpers.send_dofs_and_recv_values(global_geom_input.reshape(-1), global_geom_owner, mesh.comm, local_input_data[:,i], local_input_range[0])
dof_pos = x_dofmap.reshape(-1)*shape[1]+i
uh.x.array[dof_pos] = arr_i
infile.close()
return uh
infile = Path("idealized_LV_ref_0.h5")
for data in ["f0", "n0", "phi", "psi", "s0"]:
uh = read_mesh_data(infile, mesh, data)
with dolfinx.io.XDMFFile(mesh.comm, f"{data}.xdmf", "w") as xdmf:
xdmf.write_mesh(mesh)
xdmf.write_function(uh)
```
ref:
https://fenicsproject.discourse.group/t/i-o-from-xdmf-hdf5-files-in-dolfin-x/3122/47
It uses adios2 as a backend, but it can be reimplemented with h5py quite easily.
1 Like