Assertions and error checking
AMReX assert macros
AMReX provides several assertion macros:
AMREX_ASSERT: Enabled when either-DAMREX_DEBUGor-DAMREX_USE_ASSERTIONis defined. When enabled, it callsamrex::Assert()which will abort unless both-DNDEBUGis defined AND-DAMREX_USE_ASSERTIONis NOT defined. This means:- The macro itself is a no-op when neither
AMREX_DEBUGnorAMREX_USE_ASSERTIONis defined - When the macro is enabled and assertion fails, it will abort unless
NDEBUGis defined withoutAMREX_USE_ASSERTION
- The macro itself is a no-op when neither
AMREX_ALWAYS_ASSERT: Always callsamrex::Assert()regardless of build configuration. The actual abort behavior follows the same rules asAMREX_ASSERT- it will abort unless both-DNDEBUGis defined AND-DAMREX_USE_ASSERTIONis NOT defined. Note that CMake adds "-DNDEBUG" by default when "CMAKE_BUILD_TYPE=Release". (See this GitHub discussion for details.)
Abort
Because the default CMake flags added in Release mode causes AMREX_ALWAYS_ASSERT not to function in GPU code, amrex::Abort is the best option to use if you want to abort a GPU kernel.
amrex::Abort requires additional GPU register usage, so it should be used sparingly. The best strategy for error handling is often to set a value in an array that indicates an iterative solve failed in a given cell. (This is what Castro does for its nuclear burning networks.)
For more details, see the AMReX documentation on assertions and error checking.