43 #include <sc_config.h>
46 #define _sc_const const
50 #define _sc_restrict restrict
54 #define SC_CALC_VERSION(major,minor,patchlevel) \
55 (((major) * 1000 + (minor)) * 1000 + (patchlevel))
57 #define SC_GCC_VERSION \
58 SC_CALC_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
61 #define SC_GCC_VERSION \
62 SC_CALC_VERSION (0, 0, 0)
66 #ifdef SC_ENABLE_MEMALIGN
68 #ifdef SC_HAVE_ANY_MEMALIGN
69 #undef SC_HAVE_ANY_MEMALIGN
72 #ifdef SC_HAVE_ANY_MEMALIGN
73 #ifndef SC_HAVE_POSIX_MEMALIGN
74 #ifdef SC_HAVE_ALIGNED_ALLOC
75 #define _ISOC11_SOURCE
83 #ifndef SC_ENABLE_USE_COUNTERS
84 #define SC_NOCOUNT_MALLOC
85 #define SC_NOCOUNT_REFCOUNT
86 #define SC_NOCOUNT_LOGINDENT
91 #ifndef __STDC_LIMIT_MACROS
93 #define __STDC_LIMIT_MACROS
95 #ifndef __STDC_CONSTANT_MACROS
97 #define __STDC_CONSTANT_MACROS
106 #error "mpi.h is included. Use --enable-mpi."
112 #define _USE_MATH_DEFINES
115 #define M_E 2.71828182845904523536
118 #define M_LOG2E 1.44269504088896340736
121 #define M_LOG10E 0.434294481903251827651
124 #define M_LN2 0.693147180559945309417
127 #define M_LN10 2.30258509299404568402
130 #define M_PI 3.14159265358979323846
133 #define M_PI_2 1.57079632679489661923
136 #define M_PI_4 0.785398163397448309616
139 #define M_1_PI 0.318309886183790671538
142 #define M_2_PI 0.636619772367581343076
145 #define M_2_SQRTPI 1.12837916709551257390
148 #define M_SQRT2 1.41421356237309504880
151 #define M_SQRT1_2 0.707106781186547524401
155 #if defined SC_HAVE_LIBGEN_H && !defined _MSC_VER
161 #ifdef SC_HAVE_STDINT_H
165 #ifdef SC_HAVE_STDLIB_H
168 #ifdef SC_HAVE_STRING_H
171 #ifdef SC_HAVE_SYS_TIME_H
172 #include <sys/time.h>
174 #ifdef SC_HAVE_UNISTD_H
178 typedef SSIZE_T ssize_t;
183 #define SC_INIT_COMM_CLEAN
190 #define SC_EXTERN_C_BEGIN extern "C" { void sc_extern_c_hack_1 (void)
191 #define SC_EXTERN_C_END } void sc_extern_c_hack_2 (void)
192 #define SC_NOARGS ...
194 #define SC_EXTERN_C_BEGIN void sc_extern_c_hack_3 (void)
195 #define SC_EXTERN_C_END void sc_extern_c_hack_4 (void)
225 #define SC_EPS 2.220446049250313e-16
228 #define SC_1000_EPS (1000. * 2.220446049250313e-16)
233 #define SC_NOOP() ((void) (0))
234 #define SC_ABORT(s) \
235 sc_abort_verbose (__FILE__, __LINE__, (s))
236 #define SC_ABORT_NOT_REACHED() SC_ABORT ("Unreachable code")
237 #define SC_CHECK_ABORT(q,s) \
238 ((q) ? (void) 0 : SC_ABORT (s))
239 #define SC_CHECK_MPI(r) SC_CHECK_ABORT ((r) == sc_MPI_SUCCESS, "MPI error")
240 #define SC_CHECK_ZLIB(r) SC_CHECK_ABORT ((r) == Z_OK, "zlib error")
248 void SC_ABORTF (
const char *fmt, ...)
249 __attribute__ ((format (printf, 1, 2)))
250 __attribute__ ((noreturn));
251 void SC_CHECK_ABORTF (
int success, const
char *fmt, ...)
252 __attribute__ ((format (printf, 2, 3)));
254 #define SC_ABORTF(fmt,...) \
255 sc_abort_verbosef (__FILE__, __LINE__, (fmt), __VA_ARGS__)
256 #define SC_CHECK_ABORTF(q,fmt,...) \
257 ((q) ? (void) 0 : SC_ABORTF (fmt, __VA_ARGS__))
259 #define SC_ABORT1(fmt,a) \
260 sc_abort_verbosef (__FILE__, __LINE__, (fmt), (a))
261 #define SC_ABORT2(fmt,a,b) \
262 sc_abort_verbosef (__FILE__, __LINE__, (fmt), (a), (b))
263 #define SC_ABORT3(fmt,a,b,c) \
264 sc_abort_verbosef (__FILE__, __LINE__, (fmt), (a), (b), (c))
265 #define SC_ABORT4(fmt,a,b,c,d) \
266 sc_abort_verbosef (__FILE__, __LINE__, (fmt), (a), (b), (c), (d))
267 #define SC_ABORT5(fmt,a,b,c,d,e) \
268 sc_abort_verbosef (__FILE__, __LINE__, (fmt), (a), (b), (c), (d), (e))
269 #define SC_ABORT6(fmt,a,b,c,d,e,f) \
270 sc_abort_verbosef (__FILE__, __LINE__, (fmt), (a), (b), (c), (d), (e), (f))
271 #define SC_CHECK_ABORT1(q,fmt,a) \
272 ((q) ? (void) 0 : SC_ABORT1 ((fmt), (a)))
273 #define SC_CHECK_ABORT2(q,fmt,a,b) \
274 ((q) ? (void) 0 : SC_ABORT2 ((fmt), (a), (b)))
275 #define SC_CHECK_ABORT3(q,fmt,a,b,c) \
276 ((q) ? (void) 0 : SC_ABORT3 ((fmt), (a), (b), (c)))
277 #define SC_CHECK_ABORT4(q,fmt,a,b,c,d) \
278 ((q) ? (void) 0 : SC_ABORT4 ((fmt), (a), (b), (c), (d)))
279 #define SC_CHECK_ABORT5(q,fmt,a,b,c,d,e) \
280 ((q) ? (void) 0 : SC_ABORT5 ((fmt), (a), (b), (c), (d), (e)))
281 #define SC_CHECK_ABORT6(q,fmt,a,b,c,d,e,f) \
282 ((q) ? (void) 0 : SC_ABORT6 ((fmt), (a), (b), (c), (d), (e), (f)))
286 #ifdef SC_ENABLE_DEBUG
287 #define SC_ASSERT(c) SC_CHECK_ABORT ((c), "Assertion '" #c "'")
288 #define SC_EXECUTE_ASSERT_FALSE(expression) \
289 do { int _sc_i = (int) (expression); \
290 SC_CHECK_ABORT (!_sc_i, "Expected false: '" #expression "'"); \
292 #define SC_EXECUTE_ASSERT_TRUE(expression) \
293 do { int _sc_i = (int) (expression); \
294 SC_CHECK_ABORT (_sc_i, "Expected true: '" #expression "'"); \
297 #define SC_ASSERT(c) SC_NOOP ()
298 #define SC_EXECUTE_ASSERT_FALSE(expression) \
299 do { (void) (expression); } while (0)
300 #define SC_EXECUTE_ASSERT_TRUE(expression) \
301 do { (void) (expression); } while (0)
306 #define SC_ALLOC(t,n) (t *) sc_malloc (sc_package_id, (n) * sizeof(t))
307 #define SC_ALLOC_ZERO(t,n) (t *) sc_calloc (sc_package_id, \
308 (size_t) (n), sizeof(t))
309 #define SC_REALLOC(p,t,n) (t *) sc_realloc (sc_package_id, \
310 (p), (n) * sizeof(t))
311 #define SC_STRDUP(s) sc_strdup (sc_package_id, (s))
312 #define SC_FREE(p) sc_free (sc_package_id, (p))
317 #define SC_ALIGN_UP(x,n) ( ((n) <= 0) ? (x) : ((x) + (n) - 1) / (n) * (n) )
319 #if defined (__bgq__)
320 #define SC_ARG_ALIGN(p,t,n) __alignx((n), (p))
321 #elif defined (__ICC)
322 #define SC_ARG_ALIGN(p,t,n) __assume_aligned((p), (n))
323 #elif defined (__clang__)
324 #define SC_ARG_ALIGN(p,t,n) SC_NOOP ()
325 #elif defined (__GNUC__) || defined (__GNUG__)
327 #if SC_GCC_VERSION >= SC_CALC_VERSION (4, 7, 0)
328 #define SC_ARG_ALIGN(p,t,n) do { \
329 (p) = (t) __builtin_assume_aligned((void *) (p), (n)); \
332 #define SC_ARG_ALIGN(p,t,n) SC_NOOP ()
336 #define SC_ARG_ALIGN(p,t,n) SC_NOOP ()
339 #if (defined __GNUC__) || (defined __PGI) || (defined __IBMC__)
340 #define SC_ATTR_ALIGN(n) __attribute__((aligned(n)))
342 #define SC_ATTR_ALIGN(n)
349 #define SC_BZERO(p,n) ((void) memset ((p), 0, (n) * sizeof (*(p))))
353 #define SC_MIN(a,b) (((a) < (b)) ? (a) : (b))
354 #define SC_MAX(a,b) (((a) > (b)) ? (a) : (b))
355 #define SC_SQR(a) ((a) * (a))
359 #define SC_LOG2_8(x) (sc_log2_lookup_table[(x)])
360 #define SC_LOG2_16(x) (((x) > 0xff) ? \
361 (SC_LOG2_8 ((x) >> 8) + 8) : SC_LOG2_8 (x))
362 #define SC_LOG2_32(x) (((x) > 0xffff) ? \
363 (SC_LOG2_16 ((x) >> 16)) + 16 : SC_LOG2_16 (x))
364 #define SC_LOG2_64(x) (((x) > 0xffffffffLL) ? \
365 (SC_LOG2_32 ((x) >> 32)) + 32 : SC_LOG2_32 (x))
366 #define SC_ROUNDUP2_32(x) \
367 (((x) <= 0) ? 0 : (1 << (SC_LOG2_32 ((x) - 1) + 1)))
368 #define SC_ROUNDUP2_64(x) \
369 (((x) <= 0) ? 0 : (1LL << (SC_LOG2_64 ((x) - 1LL) + 1)))
373 #define SC_LC_GLOBAL 1
374 #define SC_LC_NORMAL 2
404 #define SC_LP_DEFAULT (-1)
405 #define SC_LP_ALWAYS 0
406 #define SC_LP_TRACE 1
407 #define SC_LP_DEBUG 2
408 #define SC_LP_VERBOSE 3
410 #define SC_LP_STATISTICS 5
411 #define SC_LP_PRODUCTION 6
412 #define SC_LP_ESSENTIAL 7
413 #define SC_LP_ERROR 8
414 #define SC_LP_SILENT 9
420 #ifdef SC_LOG_PRIORITY
421 #define SC_LP_THRESHOLD SC_LOG_PRIORITY
423 #ifdef SC_ENABLE_DEBUG
424 #define SC_LP_THRESHOLD SC_LP_TRACE
426 #define SC_LP_THRESHOLD SC_LP_INFO
431 #define SC_GEN_LOG(package,category,priority,s) \
432 ((priority) < SC_LP_THRESHOLD ? (void) 0 : \
433 sc_log (__FILE__, __LINE__, (package), (category), (priority), (s)))
434 #define SC_GLOBAL_LOG(p,s) SC_GEN_LOG (sc_package_id, SC_LC_GLOBAL, (p), (s))
435 #define SC_LOG(p,s) SC_GEN_LOG (sc_package_id, SC_LC_NORMAL, (p), (s))
436 void SC_GEN_LOGF (
int package,
int category,
int priority,
437 const char *fmt, ...)
438 __attribute__ ((format (printf, 4, 5)));
439 void SC_GLOBAL_LOGF (
int priority, const
char *fmt, ...)
440 __attribute__ ((format (printf, 2, 3)));
441 void SC_LOGF (
int priority, const
char *fmt, ...)
442 __attribute__ ((format (printf, 2, 3)));
444 #define SC_GEN_LOGF(package,category,priority,fmt,...) \
445 ((priority) < SC_LP_THRESHOLD ? (void) 0 : \
446 sc_logf (__FILE__, __LINE__, (package), (category), (priority), \
448 #define SC_GLOBAL_LOGF(p,fmt,...) \
449 SC_GEN_LOGF (sc_package_id, SC_LC_GLOBAL, (p), (fmt), __VA_ARGS__)
450 #define SC_LOGF(p,fmt,...) \
451 SC_GEN_LOGF (sc_package_id, SC_LC_NORMAL, (p), (fmt), __VA_ARGS__)
455 #define SC_GLOBAL_TRACE(s) SC_GLOBAL_LOG (SC_LP_TRACE, (s))
456 #define SC_GLOBAL_LDEBUG(s) SC_GLOBAL_LOG (SC_LP_DEBUG, (s))
457 #define SC_GLOBAL_VERBOSE(s) SC_GLOBAL_LOG (SC_LP_VERBOSE, (s))
458 #define SC_GLOBAL_INFO(s) SC_GLOBAL_LOG (SC_LP_INFO, (s))
459 #define SC_GLOBAL_STATISTICS(s) SC_GLOBAL_LOG (SC_LP_STATISTICS, (s))
460 #define SC_GLOBAL_PRODUCTION(s) SC_GLOBAL_LOG (SC_LP_PRODUCTION, (s))
461 #define SC_GLOBAL_ESSENTIAL(s) SC_GLOBAL_LOG (SC_LP_ESSENTIAL, (s))
462 #define SC_GLOBAL_LERROR(s) SC_GLOBAL_LOG (SC_LP_ERROR, (s))
463 void SC_GLOBAL_TRACEF (
const char *fmt, ...)
464 __attribute__ ((format (printf, 1, 2)));
465 void SC_GLOBAL_LDEBUGF (const
char *fmt, ...)
466 __attribute__ ((format (printf, 1, 2)));
467 void SC_GLOBAL_VERBOSEF (const
char *fmt, ...)
468 __attribute__ ((format (printf, 1, 2)));
469 void SC_GLOBAL_INFOF (const
char *fmt, ...)
470 __attribute__ ((format (printf, 1, 2)));
471 void SC_GLOBAL_STATISTICSF (const
char *fmt, ...)
472 __attribute__ ((format (printf, 1, 2)));
473 void SC_GLOBAL_PRODUCTIONF (const
char *fmt, ...)
474 __attribute__ ((format (printf, 1, 2)));
475 void SC_GLOBAL_ESSENTIALF (const
char *fmt, ...)
476 __attribute__ ((format (printf, 1, 2)));
477 void SC_GLOBAL_LERRORF (const
char *fmt, ...)
478 __attribute__ ((format (printf, 1, 2)));
480 #define SC_GLOBAL_TRACEF(fmt,...) \
481 SC_GLOBAL_LOGF (SC_LP_TRACE, (fmt), __VA_ARGS__)
482 #define SC_GLOBAL_LDEBUGF(fmt,...) \
483 SC_GLOBAL_LOGF (SC_LP_DEBUG, (fmt), __VA_ARGS__)
484 #define SC_GLOBAL_VERBOSEF(fmt,...) \
485 SC_GLOBAL_LOGF (SC_LP_VERBOSE, (fmt), __VA_ARGS__)
486 #define SC_GLOBAL_INFOF(fmt,...) \
487 SC_GLOBAL_LOGF (SC_LP_INFO, (fmt), __VA_ARGS__)
488 #define SC_GLOBAL_STATISTICSF(fmt,...) \
489 SC_GLOBAL_LOGF (SC_LP_STATISTICS, (fmt), __VA_ARGS__)
490 #define SC_GLOBAL_PRODUCTIONF(fmt,...) \
491 SC_GLOBAL_LOGF (SC_LP_PRODUCTION, (fmt), __VA_ARGS__)
492 #define SC_GLOBAL_ESSENTIALF(fmt,...) \
493 SC_GLOBAL_LOGF (SC_LP_ESSENTIAL, (fmt), __VA_ARGS__)
494 #define SC_GLOBAL_LERRORF(fmt,...) \
495 SC_GLOBAL_LOGF (SC_LP_ERROR, (fmt), __VA_ARGS__)
499 #define SC_TRACE(s) SC_LOG (SC_LP_TRACE, (s))
500 #define SC_LDEBUG(s) SC_LOG (SC_LP_DEBUG, (s))
501 #define SC_VERBOSE(s) SC_LOG (SC_LP_VERBOSE, (s))
502 #define SC_INFO(s) SC_LOG (SC_LP_INFO, (s))
503 #define SC_STATISTICS(s) SC_LOG (SC_LP_STATISTICS, (s))
504 #define SC_PRODUCTION(s) SC_LOG (SC_LP_PRODUCTION, (s))
505 #define SC_ESSENTIAL(s) SC_LOG (SC_LP_ESSENTIAL, (s))
506 #define SC_LERROR(s) SC_LOG (SC_LP_ERROR, (s))
507 void SC_TRACEF (
const char *fmt, ...)
508 __attribute__ ((format (printf, 1, 2)));
509 void SC_LDEBUGF (const
char *fmt, ...)
510 __attribute__ ((format (printf, 1, 2)));
511 void SC_VERBOSEF (const
char *fmt, ...)
512 __attribute__ ((format (printf, 1, 2)));
513 void SC_INFOF (const
char *fmt, ...)
514 __attribute__ ((format (printf, 1, 2)));
515 void SC_STATISTICSF (const
char *fmt, ...)
516 __attribute__ ((format (printf, 1, 2)));
517 void SC_PRODUCTIONF (const
char *fmt, ...)
518 __attribute__ ((format (printf, 1, 2)));
519 void SC_ESSENTIALF (const
char *fmt, ...)
520 __attribute__ ((format (printf, 1, 2)));
521 void SC_LERRORF (const
char *fmt, ...)
522 __attribute__ ((format (printf, 1, 2)));
524 #define SC_TRACEF(fmt,...) \
525 SC_LOGF (SC_LP_TRACE, (fmt), __VA_ARGS__)
526 #define SC_LDEBUGF(fmt,...) \
527 SC_LOGF (SC_LP_DEBUG, (fmt), __VA_ARGS__)
528 #define SC_VERBOSEF(fmt,...) \
529 SC_LOGF (SC_LP_VERBOSE, (fmt), __VA_ARGS__)
530 #define SC_INFOF(fmt,...) \
531 SC_LOGF (SC_LP_INFO, (fmt), __VA_ARGS__)
532 #define SC_STATISTICSF(fmt,...) \
533 SC_LOGF (SC_LP_STATISTICS, (fmt), __VA_ARGS__)
534 #define SC_PRODUCTIONF(fmt,...) \
535 SC_LOGF (SC_LP_PRODUCTION, (fmt), __VA_ARGS__)
536 #define SC_ESSENTIALF(fmt,...) \
537 SC_LOGF (SC_LP_ESSENTIAL, (fmt), __VA_ARGS__)
538 #define SC_LERRORF(fmt,...) \
539 SC_LOGF (SC_LP_ERROR, (fmt), __VA_ARGS__)
544 #define _SC_TOSTRING(x) #x
548 #define SC_TOSTRING(x) _SC_TOSTRING(x)
552 typedef void (*sc_handler_t) (
void *data);
553 typedef void (*sc_log_handler_t) (FILE * log_stream,
554 const char *filename,
int lineno,
555 int package,
int category,
556 int priority,
const char *msg);
563 void *sc_malloc (
int package,
size_t size);
564 void *sc_calloc (
int package,
size_t nmemb,
size_t size);
565 void *sc_realloc (
int package,
void *ptr,
size_t size);
566 char *sc_strdup (
int package,
const char *s);
567 void sc_free (
int package,
void *ptr);
568 int sc_memory_status (
int package);
569 void sc_memory_check (
int package);
576 int sc_int_compare (
const void *v1,
const void *v2);
577 int sc_int8_compare (
const void *v1,
const void *v2);
578 int sc_int16_compare (
const void *v1,
const void *v2);
579 int sc_int32_compare (
const void *v1,
const void *v2);
580 int sc_int64_compare (
const void *v1,
const void *v2);
581 int sc_double_compare (
const void *v1,
const void *v2);
604 sc_log_handler_t log_handler,
619 void sc_log (
const char *filename,
int lineno,
620 int package,
int category,
int priority,
622 void sc_logf (
const char *filename,
int lineno,
623 int package,
int category,
int priority,
624 const char *fmt, ...)
625 __attribute__ ((format (printf, 6, 7)));
626 void sc_logv (const
char *filename,
int lineno,
627 int package,
int category,
int priority,
628 const
char *fmt, va_list ap);
644 __attribute__ ((noreturn));
649 __attribute__ ((noreturn));
653 const
char *fmt, ...)
654 __attribute__ ((format (printf, 3, 4)))
655 __attribute__ ((noreturn));
659 const
char *fmt, va_list ap)
660 __attribute__ ((noreturn));
664 __attribute__ ((noreturn));
673 const
char *name, const
char *full);
750 int catch_signals,
int print_backtrace,
751 sc_log_handler_t log_handler,
int log_threshold);
806 const
char *format, ...)
807 __attribute__ ((format (printf, 3, 4)));
840 int sc_version_point (
void);
int sc_have_json(void)
Return whether we have found a JSON library at configure time.
void sc_set_log_defaults(FILE *log_stream, sc_log_handler_t log_handler, int log_threshold)
Controls the default SC log behavior.
int sc_atoi(const char *nptr)
Safe version of the standard library atoi (3) function.
void sc_log_indent_pop(void)
Remove one space from the start of a sc's default log format.
void sc_package_unregister(int package_id)
Unregister a software package with SC.
void const char * sc_version(void)
Return the full version of libsc.
void sc_finalize(void)
Unregisters all packages, runs the memory check, removes the signal handlers and resets sc_identifier...
int sc_package_is_registered(int package_id)
Query whether an identifier matches a registered package.
int sc_memory_check_noerr(int package)
Return error count or zero if all is ok.
void sc_package_set_verbosity(int package_id, int log_priority)
Set the logging verbosity of a registered package.
void(* sc_abort_handler_t)(void)
Type of the abort handler function.
Definition: sc.h:559
int sc_finalize_noabort(void)
Unregisters all packages, runs the memory check, removes the signal handlers and resets sc_identifier...
void sc_package_unlock(int package_id)
Release a pthread mutex lock.
void sc_log_indent_pop_count(int package, int count)
Remove spaces from the start of a package's default log format.
void sc_log(const char *filename, int lineno, int package, int category, int priority, const char *msg)
The central log function to be called by all packages.
void sc_init(sc_MPI_Comm mpicomm, int catch_signals, int print_backtrace, sc_log_handler_t log_handler, int log_threshold)
Sets the global program identifier (e.g.
void sc_set_abort_handler(sc_abort_handler_t abort_handler)
Set the default SC abort behavior.
void sc_snprintf(char *str, size_t size, const char *format,...) __attribute__((format(printf
Wrap the system snprintf function, allowing for truncation.
void sc_package_lock(int package_id)
Acquire a pthread mutex lock.
int sc_package_id
libsc allows for multiple packages to use their own log priorities etc.
void sc_abort_collective(const char *msg) __attribute__((noreturn))
Collective abort where only root prints a message.
FILE * sc_trace_file
Optional trace file for logging (see sc_init).
void sc_log_indent_push_count(int package, int count)
Add spaces to the start of a package's default log format.
int sc_version_major(void)
Return the major version of libsc.
void sc_abort_verbosef(const char *filename, int lineno, const char *fmt,...) __attribute__((format(printf
Print a message to stderr and then call sc_abort ().
void sc_abort_verbosev(const char *filename, int lineno, const char *fmt, va_list ap) __attribute__((noreturn))
Print a message to stderr and then call sc_abort ().
const int sc_log2_lookup_table[256]
Lookup table to provide fast base-2 logarithm of integers.
void sc_abort(void) __attribute__((noreturn))
Print a stack trace, call the abort handler and then call abort ().
int sc_package_register(sc_log_handler_t log_handler, int log_threshold, const char *name, const char *full)
Register a software package with SC.
void sc_strcopy(char *dest, size_t size, const char *src)
Provide a string copy function.
void sc_package_set_abort_alloc_mismatch(int package_id, int set_abort)
Set the unregister behavior of sc_package_unregister().
void sc_abort_verbose(const char *filename, int lineno, const char *msg) __attribute__((noreturn))
Print a message to stderr and then call sc_abort ().
void sc_log_indent_push(void)
Add one space to the start of sc's default log format.
int sc_trace_prio
Optional minimum log priority for messages that go into the trace file.
int sc_version_minor(void)
Return the minor version of libsc.
int sc_is_root(void)
Identify the root process.
long sc_atol(const char *nptr)
Safe version of the standard library atol (3) function.
void sc_package_print_summary(int log_priority)
Print a summary of all packages registered with SC.
Provide a consistent MPI interface with and without MPI configured.
sc3_MPI_Comm_t sc_MPI_Comm
Emulate an MPI communicator.
Definition: sc_mpi.h:392