opm-common
Toggle main menu visibility
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
opm
common
ErrorMacros.hpp
Generated by
1.17.0