Source code for adios4dolfinx.snapshot

# Copyright (C) 2024 Jørgen Schartum Dokken
#
# This file is part of adios4dolfinx
#
# SPDX-License-Identifier:    MIT

from pathlib import Path

import adios2
import dolfinx

from .adios2_helpers import ADIOSFile, resolve_adios_scope

adios2 = resolve_adios_scope(adios2)

__all__ = [
    "snapshot_checkpoint",
]


[docs] def snapshot_checkpoint(uh: dolfinx.fem.Function, file: Path, mode: adios2.Mode): """Read or write a snapshot checkpoint This checkpoint is only meant to be used on the same mesh during the same simulation. :param uh: The function to write data from or read to :param file: The file to write to or read from :param mode: Either read or write """ if mode not in [adios2.Mode.Write, adios2.Mode.Read]: raise ValueError("Got invalid mode {mode}") # Create ADIOS IO adios = adios2.ADIOS(uh.function_space.mesh.comm) with ADIOSFile( adios=adios, filename=file, mode=mode, io_name="SnapshotCheckPoint", engine="BP4", ) as adios_file: if mode == adios2.Mode.Write: dofmap = uh.function_space.dofmap num_dofs_local = dofmap.index_map.size_local * dofmap.index_map_bs local_dofs = uh.x.array[:num_dofs_local].copy() # Write to file adios_file.file.BeginStep() dofs = adios_file.io.DefineVariable("dofs", local_dofs, count=[num_dofs_local]) adios_file.file.Put(dofs, local_dofs, adios2.Mode.Sync) adios_file.file.EndStep() else: adios_file.file.BeginStep() in_variable = adios_file.io.InquireVariable("dofs") in_variable.SetBlockSelection(uh.function_space.mesh.comm.rank) adios_file.file.Get(in_variable, uh.x.array, adios2.Mode.Sync) adios_file.file.EndStep() uh.x.scatter_forward()