Hi there,
I am running a large 3D model with PyLith 5.0.1. Because reading a Cubit Exodus mesh is serial, I converted the mesh to PETSc HDF5 so that PyLith could read it in parallel. I expected the HDF5 workflow to make initialization faster, but the run now remains at Inserting cohesive cells for several hours.
I would like to know whether my workflow and configuration are correct, and why converting the mesh to HDF5 does not improve this part of the initialization.
My mesh has approximately 16.7 million tetrahedra and 2.9 million vertices. The fault is a Cubit side set named FAULT containing 54,754 triangular faces. FAULT_EDGE is a node set containing 635 vertices.
First, I converted the Exodus mesh using:
pylith_convertmesh \
--mesh_initializer.phases.read_mesh.reader=pylith.meshio.MeshIOCubit \
--mesh_initializer.phases.read_mesh.reader.filename=sumatra_v5.exo \
--mesh_initializer.phases.write_mesh.writer.filename=sumatra_v5.h5
I then configured PyLith to read the HDF5 mesh in parallel:
[pylithapp.problem.mesh_initializer]
phases = [read_mesh, distribute_mesh, insert_interfaces]
phases.read_mesh = pylith.initializers.MeshReader
phases.distribute_mesh = pylith.initializers.MeshDistributor
phases.insert_interfaces = pylith.initializers.MeshInsertInterfaces
[pylithapp.problem.mesh_initializer.phases.read_mesh]
reader = pylith.meshio.MeshIOPetsc
reader.filename = sumatra_v5.h5
reader.coordsys.space_dim = 3
I did not include reorder_mesh because pylith_convertmesh had already reordered the mesh. I did not include refine_mesh because I want to use the original mesh resolution.
The fault is configured as:
[pylithapp.problem]
interfaces = [fault]
[pylithapp.problem.interfaces.fault]
label = FAULT
label_value = 1
edge = FAULT_EDGE
edge_value = 1
ref_dir_1 = [-0.1, -0.1, 0.9]
I run PyLith with:
pylith sumatra_v5.cfg --nodes=24
The HDF5 mesh appears to be read and distributed successfully. PyLith then prints:
-- Inserting cohesive cells.
and remains there for more than three hours. All 24 MPI processes continue to use one CPU core each. The workstation has 251 GiB of RAM, about 216 GiB remains available, and there is no swapping, so it does not appear to be waiting for memory or disk I/O.
I also attached gdb to one of the running MPI processes. It was inside:
DMPlexTransformCheckImpingingPoint_Internal
DMPlexTransformCheckImpingingStratum_Internal
DMPlexTransformCheck_Cohesive
DMPlexTransformCheck
My questions are:
- Is the Exodus-to-HDF5 conversion command above correct?
- Are
[read_mesh, distribute_mesh, insert_interfaces]the correct phases for a converted HDF5 mesh when I do not want refinement? - Does HDF5 only improve mesh I/O, while
insert_interfacesstill performs a separate operation on the complete mesh? - Is more than three hours in
DMPlexTransformCheck_Cohesive()expected for a mesh of this size? - Is there a recommended way to reduce this initialization time, especially when running many Green’s-function simulations with the same mesh and fault geometry?
I have checked the FAULT side set for duplicate faces, invalid element-side entries, disconnected components, and nonmanifold edges, and did not find any problems. I can provide the complete configuration files, parameter JSON, log, gdb backtrace, and mesh metadata if needed.
Thank you.