Fenix @develop
 
Loading...
Searching...
No Matches
fenix_opt.hpp
1/*
2//@HEADER
3// ************************************************************************
4//
5//
6// _|_|_|_| _|_|_|_| _| _| _|_|_| _| _|
7// _| _| _|_| _| _| _| _|
8// _|_|_| _|_|_| _| _| _| _| _|
9// _| _| _| _|_| _| _| _|
10// _| _|_|_|_| _| _| _|_|_| _| _|
11//
12//
13//
14//
15// Copyright (C) 2016 Rutgers University and Sandia Corporation
16//
17// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
18// the U.S. Government retains certain rights in this software.
19//
20// Redistribution and use in source and binary forms, with or without
21// modification, are permitted provided that the following conditions are
22// met:
23//
24// 1. Redistributions of source code must retain the above copyright
25// notice, this list of conditions and the following disclaimer.
26//
27// 2. Redistributions in binary form must reproduce the above copyright
28// notice, this list of conditions and the following disclaimer in the
29// documentation and/or other materials provided with the distribution.
30//
31// 3. Neither the name of the Corporation nor the names of the
32// contributors may be used to endorse or promote products derived from
33// this software without specific prior written permission.
34//
35// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
36// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
37// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
38// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
39// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
40// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
41// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
42// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46//
47// Author Marc Gamell, Eric Valenzuela, Keita Teranishi, Manish Parashar
48// Michael Heroux, and Matthew Whitlock
49//
50// Questions? Contact Keita Teranishi (knteran@sandia.gov) and
51// Marc Gamell (mgamell@cac.rutgers.edu)
52//
53// ************************************************************************
54//@HEADER
55*/
56
57#ifndef __FENIX_OPT__
58#define __FENIX_OPT__
59
60#include <cstdio>
61#include <cstdlib>
62
63// FENIX_ABORT kills whole MPI job if MPI visible in current file, else just
64// aborts this process
65// Prefer fenix_assert or fatal_print instead of using this directly
66#ifdef MPI_VERSION
67#define FENIX_ABORT() \
68 do { \
69 int mpi_is_init_; \
70 MPI_Initialized(&mpi_is_init_); \
71 if (mpi_is_init_) MPI_Abort(MPI_COMM_WORLD, 1); \
72 abort(); \
73 } while (0)
74#else
75#define FENIX_ABORT() abort()
76#endif
77
78#define traced_print_impl(file, fmt, ...) \
79 fprintf( \
80 file, "%s:%d %s(): " fmt "\n", __FILE__, __LINE__, \
81 __func__ __VA_OPT__(, ) __VA_ARGS__ \
82 )
83
84#ifdef MPI_VERSION
85#define traced_print(f, fmt, ...) \
86 do { \
87 int mpi_is_init_; \
88 MPI_Initialized(&mpi_is_init_); \
89 if (mpi_is_init_) { \
90 int rank_; \
91 MPI_Comm_rank(MPI_COMM_WORLD, &rank_); \
92 traced_print_impl(f, "rank %d: " fmt, rank_ __VA_OPT__(, ) __VA_ARGS__); \
93 } else { \
94 traced_print_impl(f, fmt __VA_OPT__(, ) __VA_ARGS__); \
95 } \
96 } while (0)
97#else
98#define traced_print(...) traced_print_impl(__VA_ARGS__)
99#endif
100
101#define error_print(...) traced_print(stderr, __VA_ARGS__)
102#define debug_print(...) traced_print(stderr, __VA_ARGS__)
103#define verbose_print(...) traced_print(stdout, __VA_ARGS__)
104
105//Multi-line macro functions wrapped in do-while to maintain correct behavior
106//regardless of what surrounding code is
107#define fatal_print(...) \
108 do { \
109 __VA_OPT__(error_print(__VA_ARGS__);) \
110 error_print("Fenix aborting due to fatal error!"); \
111 FENIX_ABORT(); \
112 } while (0)
113
114// Checks even during release builds. Generally used in our ci tests or examples
115#define fenix_require(predicate, ...) \
116 do { \
117 if (!(predicate)) { \
118 error_print("internal error, failed assertion (%s)", #predicate); \
119 __VA_OPT__(error_print(__VA_ARGS__);) \
120 fatal_print(); \
121 } \
122 } while (0)
123
124#ifdef NDEBUG
125//Disable normal assertions when NDEBUG
126#define fenix_assert(...) \
127 do { \
128 } while (0)
129#else
130#define fenix_assert(...) fenix_require(__VA_ARGS__)
131#endif
132
133typedef struct __fenix_debug_opt_t {
134 int verbose = -1;
136
137void __fenix_init_opt(int argc, char** argv);
138
139#endif
Definition fenix_opt.hpp:133