Go to the documentation of this file.
20 #ifndef LIBMESH_LIBMESH_COMMON_H
21 #define LIBMESH_LIBMESH_COMMON_H
24 #include "libmesh/libmesh_config.h"
27 #ifdef LIBMESH_ENABLE_TIMESTAMPS
28 # define LIBMESH_TIME __TIME__
29 # define LIBMESH_DATE __DATE__
31 # define LIBMESH_TIME "notime"
32 # define LIBMESH_DATE "nodate"
48 #include <type_traits>
52 #ifdef LIBMESH_HAVE_MPI
53 # include "libmesh/ignore_warnings.h"
55 # include "libmesh/restore_warnings.h"
59 #ifdef LIBMESH_DEFAULT_QUADRUPLE_PRECISION
60 #include "libmesh/float128_shims.h"
64 #include "libmesh/libmesh_base.h"
65 #include "libmesh/libmesh_exceptions.h"
68 #include "libmesh/ostream_proxy.h"
72 #include "libmesh/libmesh_nullptr.h"
82 namespace MacroFunctions
84 void here(
const char * file,
int line,
const char * date,
const char * time);
85 void stop(
const char * file,
int line,
const char * date,
const char * time);
86 void report_error(
const char * file,
int line,
const char * date,
const char * time);
113 DIE
A HORRIBLE DEATH HERE...
121 typedef LIBMESH_DEFAULT_SCALAR_TYPE
Real;
127 #ifdef LIBMESH_DEFAULT_SINGLE_PRECISION
129 # define MPI_REAL MPI_FLOAT
130 # if defined (LIBMESH_DEFAULT_TRIPLE_PRECISION) || \
131 defined (LIBMESH_DEFAULT_QUADRUPLE_PRECISION)
132 # error Cannot define multiple precision levels
135 #ifdef LIBMESH_DEFAULT_TRIPLE_PRECISION
137 # define MPI_REAL MPI_LONG_DOUBLE
138 # if defined (LIBMESH_DEFAULT_QUADRUPLE_PRECISION)
139 # error Cannot define multiple precision levels
142 #ifdef LIBMESH_DEFAULT_QUADRUPLE_PRECISION
144 # ifdef LIBMESH_HAVE_MPI
145 # define MPI_REAL libMesh::Parallel::StandardType<Real>()
148 #if !defined (LIBMESH_DEFAULT_SINGLE_PRECISION) && \
149 !defined (LIBMESH_DEFAULT_TRIPLE_PRECISION) && \
150 !defined (LIBMESH_DEFAULT_QUADRUPLE_PRECISION)
152 # define MPI_REAL MPI_DOUBLE
173 inline std::complex<T>
libmesh_conj(std::complex<T> a) {
return std::conj(a); }
176 template <
typename T>
179 template <
typename T>
184 template <
typename T>
187 template <
typename T>
194 #if defined (LIBMESH_USE_REAL_NUMBERS)
196 #elif defined (LIBMESH_USE_COMPLEX_NUMBERS)
199 DIE
A HORRIBLE DEATH HERE...
207 #define MPI_ERRORVECTORREAL MPI_FLOAT
210 #ifdef LIBMESH_HAVE_MPI
243 #define libmesh_here() \
245 libMesh::MacroFunctions::here(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \
254 #define libmesh_stop() \
256 libMesh::MacroFunctions::stop(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \
262 #define libmesh_dbg_var(var) var
264 #define libmesh_dbg_var(var)
271 #define libmesh_assert_msg(asserted, msg) ((void) 0)
272 #define libmesh_exceptionless_assert_msg(asserted, msg) ((void) 0)
273 #define libmesh_assert_equal_to_msg(expr1,expr2, msg) ((void) 0)
274 #define libmesh_assert_not_equal_to_msg(expr1,expr2, msg) ((void) 0)
275 #define libmesh_assert_less_msg(expr1,expr2, msg) ((void) 0)
276 #define libmesh_assert_greater_msg(expr1,expr2, msg) ((void) 0)
277 #define libmesh_assert_less_equal_msg(expr1,expr2, msg) ((void) 0)
278 #define libmesh_assert_greater_equal_msg(expr1,expr2, msg) ((void) 0)
282 #define libmesh_assertion_types(expr1,expr2) \
283 typedef typename std::decay<decltype(expr1)>::type libmesh_type1; \
284 typedef typename std::decay<decltype(expr2)>::type libmesh_type2
286 #define libmesh_assert_msg(asserted, msg) \
289 libMesh::err << "Assertion `" #asserted "' failed." << std::endl; \
290 libmesh_error_msg(msg); \
293 #define libmesh_exceptionless_assert_msg(asserted, msg) \
296 libMesh::err << "Assertion `" #asserted "' failed." << std::endl; \
297 libmesh_exceptionless_error(); \
300 #define libmesh_assert_equal_to_msg(expr1,expr2, msg) \
302 if (!((expr1) == (expr2))) { \
303 libMesh::err << "Assertion `" #expr1 " == " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
307 #define libmesh_assert_not_equal_to_msg(expr1,expr2, msg) \
309 if (!((expr1) != (expr2))) { \
310 libMesh::err << "Assertion `" #expr1 " != " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
316 #if defined(__clang__) && (__clang_major__ <= 3)
318 #define libmesh_assert_less_msg(expr1,expr2, msg) \
320 if (!((expr1) < (expr2))) { \
321 libMesh::err << "Assertion `" #expr1 " < " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
325 #define libmesh_assert_greater_msg(expr1,expr2, msg) \
327 if (!((expr1) > (expr2))) { \
328 libMesh::err << "Assertion `" #expr1 " > " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
332 #define libmesh_assert_less_equal_msg(expr1,expr2, msg) \
334 if (!((expr1) <= (expr2))) { \
335 libMesh::err << "Assertion `" #expr1 " <= " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
339 #define libmesh_assert_greater_equal_msg(expr1,expr2, msg) \
341 if (!((expr1) >= (expr2))) { \
342 libMesh::err << "Assertion `" #expr1 " >= " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
349 template <
template <
class>
class Comp>
352 template <
typename T1,
typename T2>
355 typedef typename std::decay<T1>::type DT1;
356 typedef typename std::decay<T2>::type DT2;
357 return (Comp<DT2>()(static_cast<DT2>(e1), e2) &&
358 Comp<DT1>()(e1, static_cast<DT1>(e2)));
361 template <
typename T1>
364 return Comp<T1>()(e1, e2);
368 #define libmesh_assert_less_msg(expr1,expr2, msg) \
370 if (!libMesh::casting_compare<std::less>()(expr1, expr2)) { \
371 libMesh::err << "Assertion `" #expr1 " < " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
375 #define libmesh_assert_greater_msg(expr1,expr2, msg) \
377 if (!libMesh::casting_compare<std::greater>()(expr1, expr2)) { \
378 libMesh::err << "Assertion `" #expr1 " > " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
382 #define libmesh_assert_less_equal_msg(expr1,expr2, msg) \
384 if (!libMesh::casting_compare<std::less_equal>()(expr1, expr2)) { \
385 libMesh::err << "Assertion `" #expr1 " <= " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
389 #define libmesh_assert_greater_equal_msg(expr1,expr2, msg) \
391 if (!libMesh::casting_compare<std::greater_equal>()(expr1, expr2)) { \
392 libMesh::err << "Assertion `" #expr1 " >= " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl; \
401 #define libmesh_assert(asserted) libmesh_assert_msg(asserted, "")
402 #define libmesh_exceptionless_assert(asserted) libmesh_exceptionless_assert_msg(asserted, "")
403 #define libmesh_assert_equal_to(expr1,expr2) libmesh_assert_equal_to_msg(expr1,expr2, "")
404 #define libmesh_assert_not_equal_to(expr1,expr2) libmesh_assert_not_equal_to_msg(expr1,expr2, "")
405 #define libmesh_assert_less(expr1,expr2) libmesh_assert_less_msg(expr1,expr2, "")
406 #define libmesh_assert_greater(expr1,expr2) libmesh_assert_greater_msg(expr1,expr2, "")
407 #define libmesh_assert_less_equal(expr1,expr2) libmesh_assert_less_equal_msg(expr1,expr2, "")
408 #define libmesh_assert_greater_equal(expr1,expr2) libmesh_assert_greater_equal_msg(expr1,expr2, "")
421 #define libmesh_error_msg(msg) \
423 libMesh::err << msg << std::endl; \
424 std::stringstream msg_stream; \
426 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \
427 LIBMESH_THROW(libMesh::LogicError(msg_stream.str())); \
430 #define libmesh_error() libmesh_error_msg("")
432 #define libmesh_exceptionless_error_msg(msg) \
434 libMesh::err << msg << std::endl; \
435 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \
439 #define libmesh_exceptionless_error() libmesh_exceptionless_error_msg("")
441 #define libmesh_not_implemented_msg(msg) \
443 libMesh::err << msg << std::endl; \
444 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \
445 LIBMESH_THROW(libMesh::NotImplemented()); \
448 #define libmesh_not_implemented() libmesh_not_implemented_msg("")
450 #define libmesh_file_error_msg(filename, msg) \
452 libMesh::err << "Error with file `" << filename << "'" << std::endl; \
453 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \
454 libMesh::err << msg << std::endl; \
455 LIBMESH_THROW(libMesh::FileError(filename)); \
458 #define libmesh_file_error(filename) libmesh_file_error_msg(filename,"")
460 #define libmesh_convergence_failure() \
462 LIBMESH_THROW(libMesh::ConvergenceFailure()); \
477 #define libmesh_example_requires(condition, option) \
479 if (!(condition)) { \
480 libMesh::out << "Configuring libMesh with " << option << " is required to run this example." << std::endl; \
486 #undef libmesh_do_once
487 #define libmesh_do_once(do_this) \
489 static bool did_this_already = false; \
490 if (!did_this_already) { \
491 did_this_already = true; \
498 #ifdef LIBMESH_ENABLE_WARNINGS
499 #define libmesh_warning(message) \
500 libmesh_do_once(libMesh::out << message \
501 << __FILE__ << ", line " << __LINE__ << ", compiled " << LIBMESH_DATE << " at " << LIBMESH_TIME << " ***" << std::endl;)
503 #define libmesh_warning(message) ((void) 0)
508 #undef libmesh_experimental
509 #define libmesh_experimental() \
510 libmesh_warning("*** Warning, This code is untested, experimental, or likely to see future API changes: ");
514 #undef libmesh_deprecated
515 #ifndef LIBMESH_ENABLE_DEPRECATED
516 #define libmesh_deprecated() \
517 libmesh_error_msg("*** Error, This code is deprecated, and likely to be removed in future library versions! ");
519 #define libmesh_deprecated() \
520 libmesh_warning("*** Warning, This code is deprecated, and likely to be removed in future library versions! ");
536 template <
typename Tnew,
typename Told>
539 #if !defined(NDEBUG) && defined(LIBMESH_HAVE_RTTI) && defined(LIBMESH_ENABLE_EXCEPTIONS)
542 Tnew newvar = dynamic_cast<Tnew>(oldvar);
545 catch (std::bad_cast &)
548 <<
" reference to " <<
typeid(Tnew).
name()
551 <<
" appears to be a "
552 <<
typeid(*(&oldvar)).name() << std::endl;
556 return(static_cast<Tnew>(oldvar));
560 #ifdef LIBMESH_ENABLE_DEPRECATED
561 template <
typename Tnew,
typename Told>
565 libmesh_deprecated();
566 return cast_ref<Tnew>(oldvar);
572 template <
typename Tnew,
typename Told>
575 #if !defined(NDEBUG) && defined(LIBMESH_HAVE_RTTI)
576 Tnew newvar = dynamic_cast<Tnew>(oldvar);
580 <<
" pointer to " <<
typeid(Tnew).
name()
583 <<
" appears to be a "
584 <<
typeid(*oldvar).name() << std::endl;
589 return(static_cast<Tnew>(oldvar));
594 template <
typename Tnew,
typename Told>
598 return cast_ptr<Tnew>(oldvar);
609 template <
typename Tnew,
typename Told>
612 libmesh_assert_equal_to
613 (oldvar, static_cast<Told>(static_cast<Tnew>(oldvar)));
615 return(static_cast<Tnew>(oldvar));
619 template <
typename Tnew,
typename Told>
623 return cast_int<Tnew>(oldvar);
628 #define LIBMESH_VERSION_ID(major,minor,patch) (((major) << 16) | ((minor) << 8) | ((patch) & 0xFF))
633 #define libmesh_override override
637 #define libmesh_delete =delete
641 #define libmesh_final final
646 #ifdef LIBMESH_HAVE_CXX17_FALLTHROUGH_ATTRIBUTE
647 #define libmesh_fallthrough() [[fallthrough]]
648 #elif defined(LIBMESH_HAVE_DOUBLE_UNDERSCORE_ATTRIBUTE_FALLTHROUGH)
649 #define libmesh_fallthrough() __attribute__((fallthrough))
651 #define libmesh_fallthrough() ((void) 0)
668 using namespace TIMPI;
684 #ifdef LIBMESH_IS_COMPILING_ITSELF
685 # include "libmesh/libmesh_augment_std_namespace.h"
689 #endif // LIBMESH_LIBMESH_COMMON_H
Tnew libmesh_cast_int(Told oldvar)
MPI_Comm GLOBAL_COMM_WORLD
MPI Communicator used to initialize libMesh.
Tnew libmesh_cast_ptr(Told *oldvar)
bool warned_about_auto_ptr
DIE A HORRIBLE DEATH HERE typedef float ErrorVectorReal
The libMesh namespace provides an interface to certain functionality in the library.
static const Real TOLERANCE
Tnew cast_ptr(Told *oldvar)
Tnew cast_ref(Told &oldvar)
bool operator()(const T1 &e1, const T1 &e2) const
void stop(const char *file, int line, const char *date, const char *time)
std::complex< Real > COMPLEX
void libmesh_ignore(const Args &...)
Tnew cast_int(Told oldvar)
This class is intended to be reseatable like a pointer-to-ostream for flexibility,...
static PetscErrorCode Mat * A
bool operator()(const T1 &e1, const T2 &e2) const
void here(const char *file, int line, const char *date, const char *time)
std::complex< Real > Complex
Tnew libmesh_cast_ref(Told &oldvar)
void report_error(const char *file, int line, const char *date, const char *time)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
boost::multiprecision::float128 imag(const boost::multiprecision::float128)
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)