Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
a218134
Bump conda-incubator/setup-miniconda from 3 to 4 (#1876)
dependabot[bot] Apr 28, 2026
5d93ce0
Use most recent main branch of toml11 (#1874)
franzpoeschel Apr 29, 2026
6445feb
Python: reacquire GIL for deallocation operations (#1878)
franzpoeschel Apr 30, 2026
8bda4c1
ADIOS2: enable stats by default, starting ADIOS2 v2.12.1 (#1877)
franzpoeschel Apr 30, 2026
5946dc3
Add memory selection task to backend
franzpoeschel Aug 7, 2025
30eadbf
Add future helper
franzpoeschel Aug 7, 2025
b239cca
Fixes for UniquePtr.hpp
franzpoeschel Aug 7, 2025
8531a8d
Main implementation of LoadStoreChunk.hpp
franzpoeschel Aug 7, 2025
515dbbb
Adapt RecordComponent implementation based on new API
franzpoeschel Aug 7, 2025
1f6dab0
Testing
franzpoeschel Aug 7, 2025
47716c5
Enable support for const unique pointers?
franzpoeschel Aug 7, 2025
d9cc154
Use a better trick to cheat clang-tidy
franzpoeschel Aug 7, 2025
beca753
clang-tidy fixes
franzpoeschel Aug 8, 2025
fca3902
Fix linker error
franzpoeschel Jan 8, 2026
f09efaf
Reimplement unique_ptr-based span API
franzpoeschel Jan 8, 2026
b58ef92
Fix parallel tests
franzpoeschel Jan 8, 2026
1057d0a
Type signature fix
franzpoeschel Jan 8, 2026
7b7a18d
Destructor for ~DeferredComputation
franzpoeschel Jan 9, 2026
95a31d6
CI fixes
franzpoeschel Feb 3, 2026
c76cd46
wip: runtime-erase pointer type
franzpoeschel Feb 9, 2026
f220a84
Continue
franzpoeschel Feb 9, 2026
a548d69
Mostly working again
franzpoeschel Feb 9, 2026
5b18268
bad fix, remove the bool from python bindings
franzpoeschel Feb 9, 2026
c232412
Remove bool dataset operations from python API
franzpoeschel Feb 9, 2026
54ab213
Fix Coretest
franzpoeschel Feb 9, 2026
dcc6663
instantiate some more methods
franzpoeschel Feb 10, 2026
2496991
wip: unify common code into compiled functions
franzpoeschel Feb 10, 2026
78887cf
clang-tidy fixes
franzpoeschel Feb 10, 2026
64f78bf
CI fixes
franzpoeschel Feb 11, 2026
fdec544
Remove CRT pattern and core namespace
franzpoeschel Feb 12, 2026
ddcfc4d
Move wrappers to header code
franzpoeschel Feb 12, 2026
238fcb6
Interface cleanup
franzpoeschel Feb 13, 2026
640c89b
Fix after rebase
franzpoeschel Mar 12, 2026
1170f0c
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Mar 12, 2026
287371d
Suffix ..Raw for internal legacy store/load operations
franzpoeschel Apr 7, 2026
561ebd3
Remove enqueue prefixes, these are now default
franzpoeschel Apr 7, 2026
a5c708f
Add future task with caching option
franzpoeschel Apr 7, 2026
c4e78a0
Add unsafeNoAutomaticFlush
franzpoeschel Apr 7, 2026
6b09c1d
add missing constructor
franzpoeschel Apr 7, 2026
18e6b68
remove internal use of raw methods
franzpoeschel Apr 7, 2026
21c024c
Remove raw methods
franzpoeschel Apr 7, 2026
fdd0898
Avoid if constexpr, msvc doesnt get it
franzpoeschel Apr 8, 2026
b212a9a
Add Doxygen documentation to new functions and types
Apr 8, 2026
d542cb3
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Apr 8, 2026
af17c0e
CI fixes
franzpoeschel Apr 8, 2026
4110819
Documentation fixes
franzpoeschel Apr 14, 2026
d5bab60
AI code review
franzpoeschel Apr 20, 2026
3257d55
Rename forget() -> invalidate()
franzpoeschel Apr 20, 2026
db6528d
Fix MSVC compilation
franzpoeschel Apr 21, 2026
cc34883
Fix move constructor / assignment operator
franzpoeschel Apr 22, 2026
33676af
Add a small test for DeferredComputation
franzpoeschel Apr 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ jobs:
if: github.event.pull_request.draft == false
steps:
- uses: actions/checkout@v6
- uses: conda-incubator/setup-miniconda@v3
- uses: conda-incubator/setup-miniconda@v4
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Does conda-incubator/setup-miniconda GitHub Action have a v4 release? Are there any breaking changes between v3 and v4?

💡 Result:

No, the conda-incubator/setup-miniconda GitHub Action does not have a stable v4 release as of 2026-05-12. The repository's main page lists the latest release as v3.3.0 on 2026-01-20 [1][2][3]. The CHANGELOG.md covers up to v3.3.0 and does not mention v4 [2]. There is a commit titled "Prepare v4 release (#499)" from 2026-04-23 [4], and compare pages exist for v4.0.0...v4.0.1 [5], indicating v4.0.0 may have been tagged but not fully published as a release with notes. Dependabot and Renovate bots reference v4 (e.g., updating to v4 in nf-core/tools [6] and conda/conda bumping from 4.0.0 to 4.0.1 [7]), suggesting the tag exists and is usable, but it is not prominently listed as an official release on the repo's releases page, which stops at v3.3.0 [8]. No specific details on breaking changes between v3 and v4 are available in public sources, as no v4 release notes were found [2].

Citations:


conda-incubator/setup-miniconda@v4 is not officially released.

As of May 2026, conda-incubator/setup-miniconda v4 does not have a stable official release. The latest official version is v3.3.0 (released January 2026). While a v4.0.0 tag exists and appears usable (Dependabot and Renovate bots reference it), no official release notes or breaking change documentation are available. Using a pre-release version of an external GitHub Action introduces risk and should either be reverted to v3 or explicitly justified with documentation of compatibility testing.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/linux.yml at line 342, Replace the pre-release GitHub
Action tag used in the workflow by changing the action reference "uses:
conda-incubator/setup-miniconda@v4" to the latest official release (e.g., "uses:
conda-incubator/setup-miniconda@v3.3.0") or, if you must keep v4, add a brief
justification and link to compatibility testing/docs in the PR description and
workflow comments; update the action reference and PR notes accordingly so the
workflow does not depend on an unofficial v4 tag without documented validation.

name: Setup conda
with:
auto-update-conda: true
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/source.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- uses: conda-incubator/setup-miniconda@v3
- uses: conda-incubator/setup-miniconda@v4
name: Setup conda
with:
auto-update-conda: true
Expand Down
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -400,6 +400,7 @@ set(CORE_SOURCE
src/Format.cpp
src/Iteration.cpp
src/IterationEncoding.cpp
src/LoadStoreChunk.cpp
src/Mesh.cpp
src/ParticlePatches.cpp
src/ParticleSpecies.cpp
Expand All @@ -411,6 +412,7 @@ set(CORE_SOURCE
src/version.cpp
src/auxiliary/Date.cpp
src/auxiliary/Filesystem.cpp
src/auxiliary/Future.cpp
src/auxiliary/JSON.cpp
src/auxiliary/JSONMatcher.cpp
src/auxiliary/Memory.cpp
Expand Down
6 changes: 3 additions & 3 deletions cmake/dependencies/toml11.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -64,18 +64,18 @@ set(openPMD_toml11_src ""
"Local path to toml11 source directory (preferred if set)")

# tarball fetcher
set(openPMD_toml11_tar "https://github.com/ToruNiina/toml11/archive/refs/tags/v4.4.0.tar.gz"
set(openPMD_toml11_tar "https://github.com/ToruNiina/toml11/archive/b32a2fff0d27e1f7522f26a125101500ddb47156.tar.gz"
CACHE STRING
"Remote tarball link to pull and build toml11 from if(openPMD_USE_INTERNAL_TOML11)")
set(openPMD_toml11_tar_hash "SHA256=815bfe6792aa11a13a133b86e7f0f45edc5d71eb78f5fb6686c49c7f792b9049"
set(openPMD_toml11_tar_hash "SHA256=c82df2d6a437795a1b5ac0b87886d5eb481deb60d6e79adb1688017857347cda"
CACHE STRING
"Hash checksum of the tarball of toml11 if(openPMD_USE_INTERNAL_TOML11)")

# Git fetcher
set(openPMD_toml11_repo "https://github.com/ToruNiina/toml11.git"
CACHE STRING
"Repository URI to pull and build toml11 from if(openPMD_USE_INTERNAL_TOML11)")
set(openPMD_toml11_branch "v4.4.0"
set(openPMD_toml11_branch "b32a2fff0d27e1f7522f26a125101500ddb47156"
CACHE STRING
"Repository branch for openPMD_toml11_repo if(openPMD_USE_INTERNAL_TOML11)")

Expand Down
4 changes: 2 additions & 2 deletions docs/source/backends/adios2.rst
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ environment variable default description
``OPENPMD_ADIOS2_ENGINE`` ``File`` `ADIOS2 engine <https://adios2.readthedocs.io/en/latest/engines/engines.html>`_
``OPENPMD_ADIOS2_PRETEND_ENGINE`` *empty* Pretend that an (unknown) ADIOS2 engine is in fact another one (also see the ``adios2.pretend_engine`` :ref:`parameter <backendconfig-adios2>`).
``OPENPMD2_ADIOS2_USE_GROUP_TABLE`` ``0`` Use group table (see below)
``OPENPMD_ADIOS2_STATS_LEVEL`` ``0`` whether to generate statistics for variables in ADIOS2. (``1``: yes, ``0``: no).
``OPENPMD_ADIOS2_STATS_LEVEL`` see below Whether to generate statistics for variables in ADIOS2. (``1``: yes, ``0``: no)
``OPENPMD_ADIOS2_ASYNC_WRITE`` ``0`` ADIOS2 BP5 engine: 1 means setting "AsyncWrite" in ADIOS2 to "on". Flushes will go to the buffer by default (see ``preferred_flush_target``).
``OPENPMD_ADIOS2_BP5_BufferChunkMB`` ``0`` ADIOS2 BP5 engine: applies when using either EveryoneWrites or EveryoneWritesSerial aggregation
``OPENPMD_ADIOS2_BP5_MaxShmMB`` ``0`` ADIOS2 BP5 engine: applies when using TwoLevelShm aggregation
Expand All @@ -98,7 +98,7 @@ Please refer to the `ADIOS2 documentation <https://adios2.readthedocs.io/en/late

Notice that the ADIOS2 backend is alternatively configurable via :ref:`JSON parameters <backendconfig>`.

Due to performance considerations, the ADIOS2 backend configures ADIOS2 not to compute any dataset statistics (Min/Max) by default.
Due to performance considerations, the ADIOS2 backend configures ADIOS2 not to compute any dataset statistics (Min/Max) by default for ADIOS2 versions up until v2.12.0. Starting with `v2.12.1 <https://github.com/ornladios/ADIOS2/releases/tag/v2.12.1>`_, the performance of statistics computation has been improved, so it is turned on by default.
Statistics may be activated by setting the :ref:`JSON parameter <backendconfig>` ``adios2.engine.parameters.StatsLevel = "1"``.

The ADIOS2 backend overrides the default unlimited queueing behavior of the SST engine with a more cautious limit of 2 steps that may be held in the queue at one time.
Expand Down
12 changes: 12 additions & 0 deletions include/openPMD/Dataset.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,18 @@ namespace openPMD
using Extent = std::vector<std::uint64_t>;
using Offset = std::vector<std::uint64_t>;

/** Selection of a region of memory for storing chunks.
*
* Used to specify a non-contiguous memory region when storing
* data chunks. This allows writing data that is not contiguous
* in memory.
*/
struct MemorySelection
{
Offset offset;
Extent extent;
};

class Dataset
{
friend class RecordComponent;
Expand Down
62 changes: 59 additions & 3 deletions include/openPMD/Datatype.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -420,6 +420,11 @@ inline size_t toBits(Datatype d)
return toBytes(d) * CHAR_BIT;
}

/** Check if a Datatype is a signed type
*
* @param d Datatype to test
* @return true if signed type (integer, floating point, complex), else false
*/
constexpr bool isSigned(Datatype d);

/** Compare if a Datatype is a vector type
Expand Down Expand Up @@ -602,6 +607,13 @@ inline bool isSameFloatingPoint(Datatype d)
return isSameFloatingPoint(d, determineDatatype<T_FP>());
}

/** Compare if two Datatypes are equivalent floating point types
*
* @param d1 First Datatype to compare
* @param d2 Second Datatype to compare
* @return true if both types are floating point and have same bitness, else
* false
*/
inline bool isSameFloatingPoint(Datatype d1, Datatype d2)
{
// template
Expand Down Expand Up @@ -629,6 +641,13 @@ inline bool isSameComplexFloatingPoint(Datatype d)
return isSameComplexFloatingPoint(d, determineDatatype<T_CFP>());
}

/** Compare if two Datatypes are equivalent complex floating point types
*
* @param d1 First Datatype to compare
* @param d2 Second Datatype to compare
* @return true if both types are complex floating point and have same bitness,
* else false
*/
inline bool isSameComplexFloatingPoint(Datatype d1, Datatype d2)
{
// template
Expand Down Expand Up @@ -656,6 +675,13 @@ inline bool isSameInteger(Datatype d)
return isSameInteger(d, determineDatatype<T_Int>());
}

/** Compare if two Datatypes are equivalent integer types
*
* @param d1 First Datatype to compare
* @param d2 Second Datatype to compare
* @return true if both types are integers, same signedness and same bitness,
* else false
*/
inline bool isSameInteger(Datatype d1, Datatype d2)
{
// template
Expand Down Expand Up @@ -708,13 +734,24 @@ constexpr bool isChar(Datatype d)
template <typename T_Char>
constexpr bool isSameChar(Datatype d);

/** Compare if two Datatypes are equivalent char types
*
* @param d1 First Datatype to compare
* @param d2 Second Datatype to compare
* @return true if both types are chars with same signedness and size, else
* false
*/
constexpr bool isSameChar(Datatype d1, Datatype d2);

/** Comparison for two Datatypes
*
* Besides returning true for the same types, identical implementations on
* some platforms, e.g. if long and long long are the same or double and
* long double will also return true.
*
* @param d First Datatype to compare
* @param e Second Datatype to compare
* @return true if the datatypes are equivalent
*/
constexpr bool isSame(openPMD::Datatype d, openPMD::Datatype e);

Expand All @@ -726,15 +763,34 @@ constexpr bool isSame(openPMD::Datatype d, openPMD::Datatype e);
*/
Datatype basicDatatype(Datatype dt);

/** Convert a scalar Datatype to its vector variant
*
* @param dt Scalar Datatype to convert
* @return Vector Datatype (e.g., INT becomes VEC_INT)
*/
Datatype toVectorType(Datatype dt);

/** Convert a Datatype to its string representation
*
* @param dt Datatype to convert
* @return String representation of the Datatype
*/
std::string datatypeToString(Datatype dt);

/** Convert a string to a Datatype
*
* @param s String representation of a Datatype
* @return The corresponding Datatype
*/
Datatype stringToDatatype(const std::string &s);

void warnWrongDtype(std::string const &key, Datatype store, Datatype request);

std::ostream &operator<<(std::ostream &, openPMD::Datatype const &);
/** Stream operator for Datatype
*
* @param os Output stream
* @param dt Datatype to output
* @return Reference to the stream
*/
std::ostream &operator<<(std::ostream &os, openPMD::Datatype const &dt);

template <typename T>
constexpr auto datatypeIndex() -> size_t
Expand Down
55 changes: 33 additions & 22 deletions include/openPMD/Datatype.tpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,36 +223,52 @@ namespace detail
template <typename T>
constexpr bool is_char_v = is_char<T>::value;

template <typename T_Char1, typename T_Char2>
inline bool isSameChar()
struct IsChar
{
return
// both must be char types
is_char_v<T_Char1> && is_char_v<T_Char2> &&
// both must have equivalent sign
std::is_signed_v<T_Char1> == std::is_signed_v<T_Char2> &&
// both must have equivalent size
sizeof(T_Char1) == sizeof(T_Char2);
template <typename T>
static constexpr bool call()
{
return is_char_v<T>;
}
template <size_t N>
static constexpr bool call()
{
return false;
}
};

constexpr inline bool isChar(Datatype dtype)
{
return switchType<IsChar>(dtype);
}

template <typename T1>
struct IsSameChar
struct DtypeSize
{
template <typename T2>
static bool call()
template <typename T>
static constexpr size_t call()
{
return isSameChar<T1, T2>();
return sizeof(T);
}

static constexpr char const *errorMsg = "IsSameChar";
static constexpr char const *errorMsg = "DtypeSize";
};

constexpr inline size_t dtypeSize(Datatype dtype)
{
return switchType<DtypeSize>(dtype);
}
} // namespace detail

template <typename T_Char>
constexpr inline bool isSameChar(Datatype d)
{
return switchType<detail::IsSameChar<T_Char>>(d);
return isSameChar(d, determineDatatype<T_Char>());
}

constexpr bool isSameChar(Datatype d1, Datatype d2)
{
return detail::isChar(d1) && detail::isChar(d2) &&
isSigned(d1) == isSigned(d2) &&
detail::dtypeSize(d1) == detail::dtypeSize(d2);
}

namespace detail
Expand Down Expand Up @@ -285,11 +301,6 @@ constexpr inline bool isSigned(Datatype d)
return switchType<detail::IsSigned>(d);
}

constexpr inline bool isSameChar(Datatype d, Datatype e)
{
return isChar(d) && isChar(e) && isSigned(d) == isSigned(e);
}

constexpr bool isSame(openPMD::Datatype const d, openPMD::Datatype const e)
{
return
Expand Down
4 changes: 4 additions & 0 deletions include/openPMD/IO/ADIOS/ADIOS2File.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
*/
#pragma once

#include "openPMD/Dataset.hpp"
#include "openPMD/IO/ADIOS/ADIOS2Auxiliary.hpp"
#include "openPMD/IO/ADIOS/ADIOS2PreloadAttributes.hpp"
#include "openPMD/IO/ADIOS/ADIOS2PreloadVariables.hpp"
Expand Down Expand Up @@ -107,11 +108,14 @@ struct WriteDataset
static void call(Params &&...);
};

/** Buffered put operation with unique pointer */
struct BufferedUniquePtrPut
{
std::string name;
Offset offset;
Extent extent;
/** Optional memory selection for non-contiguous memory regions */
std::optional<MemorySelection> memorySelection;
UniquePtrWithLambda<void> data;
Datatype dtype = Datatype::UNDEFINED;

Expand Down
19 changes: 17 additions & 2 deletions include/openPMD/IO/ADIOS/ADIOS2IOHandler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
*/
#pragma once

#include "openPMD/Dataset.hpp"
#include "openPMD/Error.hpp"
#include "openPMD/IO/ADIOS/ADIOS2Auxiliary.hpp"
#include "openPMD/IO/ADIOS/ADIOS2FilePosition.hpp"
Expand Down Expand Up @@ -509,6 +510,7 @@ class ADIOS2IOHandlerImpl
adios2::Variable<T> verifyDataset(
Offset const &offset,
Extent const &extent,
std::optional<MemorySelection> const &memorySelection,
adios2::IO &IO,
adios2::Engine &engine,
std::string const &varName,
Expand Down Expand Up @@ -622,13 +624,26 @@ class ADIOS2IOHandlerImpl
var.SetSelection(
{adios2::Dims(offset.begin(), offset.end()),
adios2::Dims(extent.begin(), extent.end())});

if (memorySelection.has_value())
{
var.SetMemorySelection(
{adios2::Dims(
memorySelection->offset.begin(),
memorySelection->offset.end()),
adios2::Dims(
memorySelection->extent.begin(),
memorySelection->extent.end())});
}

return var;
}

struct
{
bool noGroupBased = false;
bool blosc2bp5 = false;
bool memorySelection = false;
} printedWarningsAlready;
}; // ADIOS2IOHandlerImpl

Expand Down Expand Up @@ -942,7 +957,7 @@ class ADIOS2IOHandler : public AbstractIOHandler
try
{
auto params = internal::defaultParsedFlushParams;
this->flush(params);
this->flush_impl(params);
}
catch (std::exception const &ex)
{
Expand Down Expand Up @@ -990,6 +1005,6 @@ class ADIOS2IOHandler : public AbstractIOHandler
return true;
}

std::future<void> flush(internal::ParsedFlushParams &) override;
std::future<void> flush_impl(internal::ParsedFlushParams &) override;
}; // ADIOS2IOHandler
} // namespace openPMD
Loading
Loading