67#define FENIX_ABORT() \
70 MPI_Initialized(&mpi_is_init); \
71 if (mpi_is_init) MPI_Abort(MPI_COMM_WORLD, 1); \
75#define FENIX_ABORT() abort()
81#define FN_SUFF_I(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
83 FN_SUFF_I(__VA_ARGS__, _a, _a, _a, _a, _a, _a, _a, _a, _a, _s)
84#define FN_SUFF_MERGE_IMPL(fn, suff) fn##suff
85#define FN_SUFF_MERGE(fn, suff) FN_SUFF_MERGE_IMPL(fn, suff)
86#define FN_NAME(base_name, ...) FN_SUFF_MERGE(base_name, FN_SUFF(__VA_ARGS__))
88#define TRACE_PRINT_FMT "%s:%d %s(): "
89#define TRACE_PRINT_ARG __FILE__, __LINE__, __func__
91#define traced_print_s(file, fmt) \
92 fprintf(file, TRACE_PRINT_FMT fmt "\n", TRACE_PRINT_ARG)
93#define traced_print_a(file, fmt, ...) \
94 fprintf(file, TRACE_PRINT_FMT fmt "\n", TRACE_PRINT_ARG, __VA_ARGS__)
95#define traced_print(file, ...) \
96 FN_NAME(traced_print, __VA_ARGS__)(file, __VA_ARGS__)
98#define debug_print(...) traced_print(stderr, __VA_ARGS__)
99#define verbose_print(...) traced_print(stdout, __VA_ARGS__)
103#define fatal_print(...) \
105 traced_print(stderr, __VA_ARGS__); \
106 traced_print(stderr, "Fenix aborting due to fatal error!"); \
110#define fenix_assert_a(predicate, ...) \
112 if (!(predicate)) { \
113 fatal_print(__VA_ARGS__); \
116#define fenix_assert_s(predicate) \
118 predicate, "internal error, failed assertion (%s)", #predicate \
123#define fenix_assert(...) \
127#define fenix_assert(...) FN_NAME(fenix_assert, __VA_ARGS__)(__VA_ARGS__)
134void __fenix_init_opt(
int argc,
char** argv);
Definition fenix_opt.hpp:130