My Project
Loading...
Searching...
No Matches
ErrorMacros.hpp
1/*
2 Copyright 2013 Andreas Lauser
3 Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
4 Copyright 2009, 2010 Statoil ASA.
5
6 This file is part of the Open Porous Media project (OPM).
7
8 OPM is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 OPM is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with OPM. If not, see <http://www.gnu.org/licenses/>.
20*/
21#ifndef OPM_ERRORMACROS_HPP
22#define OPM_ERRORMACROS_HPP
23
24#include <opm/common/OpmLog/OpmLog.hpp>
25#include <opm/common/utility/gpuDecorators.hpp>
26
27#include <string>
28#include <exception>
29#include <stdexcept>
30#include <cassert>
31
32// macros for reporting to stderr
33#ifdef OPM_VERBOSE // Verbose mode
34# include <iostream>
35# define OPM_REPORT do { std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] " } while (false)
36# define OPM_MESSAGE(x) do { OPM_REPORT; std::cerr << x << "\n"; } while (false)
37# define OPM_MESSAGE_IF(cond, m) do {if(cond) OPM_MESSAGE(m);} while (false)
38#else // non-verbose mode (default)
39# define OPM_REPORT do {} while (false)
40# define OPM_MESSAGE(x) do {} while (false)
41# define OPM_MESSAGE_IF(cond, m) do {} while (false)
42#endif
43
44#if OPM_IS_INSIDE_HOST_FUNCTION
45// Macro to throw an exception that counts as an error in PRT file.
46// NOTE: For this macro to work, the
47// exception class must exhibit a constructor with the signature
48// (const std::string &message). Since this condition is not fulfilled
49// for the std::exception, you should use this macro with some
50// exception class derived from either std::logic_error or
51// std::runtime_error.
52//
53// Usage: OPM_THROW(ExceptionClass, "Error message");
54#define OPM_THROW(Exception, message) \
55 do { \
56 std::string oss_ = std::string{"["} + __FILE__ + ":" + \
57 std::to_string(__LINE__) + "] " + \
58 message; \
59 ::Opm::OpmLog::error(oss_); \
60 throw Exception(oss_); \
61 } while (false)
62
63// Macro to throw an exception that only counts as a problem in PRT file.
64// NOTE: For this macro to work, the
65// exception class must exhibit a constructor with the signature
66// (const std::string &message). Since this condition is not fulfilled
67// for the std::exception, you should use this macro with some
68// exception class derived from either std::logic_error or
69// std::runtime_error.
70//
71// Usage: OPM_THROW_PROBLEM(ExceptionClass, "Error message");
72#define OPM_THROW_PROBLEM(Exception, message) \
73 do { \
74 std::string oss_ = std::string{"["} + __FILE__ + ":" + \
75 std::to_string(__LINE__) + "] " + \
76 message; \
77 ::Opm::OpmLog::problem(oss_); \
78 throw Exception(oss_); \
79 } while (false)
80
81// Same as OPM_THROW, except for not making an OpmLog::error() call.
82//
83// Usage: OPM_THROW_NOLOG(ExceptionClass, "Error message");
84#define OPM_THROW_NOLOG(Exception, message) \
85 do { \
86 std::string oss_ = std::string{"["} + __FILE__ + ":" + \
87 std::to_string(__LINE__) + "] " + \
88 message; \
89 throw Exception(oss_); \
90 } while (false)
91
92// throw an exception if a condition is true
93#define OPM_ERROR_IF(condition, message) do {if(condition){ OPM_THROW(std::logic_error, message);}} while(false)
94
95#else // On GPU
96// On the GPU, we cannot throw exceptions, so we use assert(false) instead.
97// This will allow us to keep the same code for both CPU and GPU when using
98// the macros. The assert(false) will only cause the CUDA kernel to terminate,
99// but it will not throw an exception. However, later calls to cudaGetLastError
100// or similar functions that check for errors will report the error, and if
101// they are wrapped in the OPM_GPU_SAFE_CALL macro, that will throw an exception.
102//
103// Notice however, that once we assert(false) in a CUDA kernel, the CUDA context
104// is broken for the rest of the process, see
105// https://forums.developer.nvidia.com/t/how-to-clear-cuda-errors/296393/5
106
110#define OPM_THROW(Exception, message) \
111 assert(false)
112
116#define OPM_THROW_PROBLEM(Exception, message) \
117 assert(false)
118
122#define OPM_THROW_NOLOG(Exception, message) \
123 assert(false)
124
128#define OPM_ERROR_IF(condition, message) \
129 do {if(condition){assert(false);}} while(false)
130#endif // GPU
131#endif // OPM_ERRORMACROS_HPP