20 #ifndef LIBMESH_LIBMESH_COMMON_H 21 #define LIBMESH_LIBMESH_COMMON_H 26 #if defined(DEBUG) && defined(NDEBUG) 27 # error DEBUG and NDEBUG should never be defined simultaneously 31 #include "libmesh/libmesh_config.h" 34 #ifdef LIBMESH_ENABLE_TIMESTAMPS 35 # define LIBMESH_TIME __TIME__ 36 # define LIBMESH_DATE __DATE__ 38 # define LIBMESH_TIME "notime" 39 # define LIBMESH_DATE "nodate" 55 #include <type_traits> 60 #ifdef LIBMESH_HAVE_MPI 61 # include "libmesh/ignore_warnings.h" 63 # include "libmesh/restore_warnings.h" 67 #ifdef LIBMESH_DEFAULT_QUADRUPLE_PRECISION 68 #include "libmesh/float128_shims.h" 72 #include "libmesh/libmesh_base.h" 73 #include "libmesh/libmesh_exceptions.h" 76 #include "libmesh/ostream_proxy.h" 80 #include "libmesh/libmesh_nullptr.h" 109 namespace MacroFunctions
111 void here(
const char * file,
int line,
const char * date,
const char * time, std::ostream & os =
libMesh::err);
112 void stop(
const char * file,
int line,
const char * date,
const char * time);
113 void report_error(
const char * file,
int line,
const char * date,
const char * time, std::ostream & os =
libMesh::err);
136 DIE A HORRIBLE DEATH HERE...
144 typedef LIBMESH_DEFAULT_SCALAR_TYPE
Real;
150 #ifdef LIBMESH_DEFAULT_SINGLE_PRECISION 152 # if defined (LIBMESH_DEFAULT_TRIPLE_PRECISION) || \ 153 defined (LIBMESH_DEFAULT_QUADRUPLE_PRECISION) 154 # error Cannot define multiple precision levels 158 #ifdef LIBMESH_DEFAULT_TRIPLE_PRECISION 160 # if defined (LIBMESH_DEFAULT_QUADRUPLE_PRECISION) 161 # error Cannot define multiple precision levels 165 #ifdef LIBMESH_DEFAULT_QUADRUPLE_PRECISION 169 #if !defined (LIBMESH_DEFAULT_SINGLE_PRECISION) && \ 170 !defined (LIBMESH_DEFAULT_TRIPLE_PRECISION) && \ 171 !defined (LIBMESH_DEFAULT_QUADRUPLE_PRECISION) 197 inline std::complex<T>
libmesh_conj(std::complex<T> a) {
return std::conj(a); }
200 template <
typename T>
203 template <
typename T>
208 template <
typename T>
211 template <
typename T>
218 #if defined (LIBMESH_USE_REAL_NUMBERS) 220 #elif defined (LIBMESH_USE_COMPLEX_NUMBERS) 223 DIE A HORRIBLE DEATH HERE...
231 #define MPI_ERRORVECTORREAL MPI_FLOAT 234 #ifdef LIBMESH_HAVE_MPI 257 #define libmesh_here() \ 259 libMesh::MacroFunctions::here(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \ 268 #define libmesh_stop() \ 270 libMesh::MacroFunctions::stop(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); \ 276 #define libmesh_dbg_var(var) var 278 #define libmesh_dbg_var(var) 283 #ifdef LIBMESH_ENABLE_INFINITE_ELEMENTS 284 #define libmesh_inf_var(var) var 286 #define libmesh_inf_var(var) 293 #define libmesh_assert_msg(asserted, msg) ((void) 0) 294 #define libmesh_exceptionless_assert_msg(asserted, msg) ((void) 0) 295 #define libmesh_assert_equal_to_msg(expr1,expr2, msg) ((void) 0) 296 #define libmesh_assert_not_equal_to_msg(expr1,expr2, msg) ((void) 0) 297 #define libmesh_assert_less_msg(expr1,expr2, msg) ((void) 0) 298 #define libmesh_assert_greater_msg(expr1,expr2, msg) ((void) 0) 299 #define libmesh_assert_less_equal_msg(expr1,expr2, msg) ((void) 0) 300 #define libmesh_assert_greater_equal_msg(expr1,expr2, msg) ((void) 0) 304 #define libmesh_assertion_types(expr1,expr2) \ 305 typedef typename std::decay<decltype(expr1)>::type libmesh_type1; \ 306 typedef typename std::decay<decltype(expr2)>::type libmesh_type2 308 #define libmesh_assert_msg(asserted, msg) \ 311 libmesh_error_msg(msg); \ 314 #define libmesh_exceptionless_assert_msg(asserted, msg) \ 317 libMesh::Threads::lock_singleton_spin_mutex(); \ 318 libMesh::err << "Assertion `" #asserted "' failed." << std::endl; \ 319 libMesh::Threads::unlock_singleton_spin_mutex(); \ 320 libmesh_exceptionless_error(); \ 323 #define libmesh_assert_equal_to_msg(expr1,expr2, msg) \ 325 if (!((expr1) == (expr2))) { \ 326 libmesh_error_msg(std::setprecision(17) << "Assertion `" #expr1 " == " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl); \ 329 #define libmesh_assert_not_equal_to_msg(expr1,expr2, msg) \ 331 if (!((expr1) != (expr2))) { \ 332 libmesh_error_msg(std::setprecision(17) << "Assertion `" #expr1 " != " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl); \ 335 template <
template <
class>
class Comp>
338 template <
typename T1,
typename T2>
341 typedef typename std::decay<T1>::type DT1;
342 typedef typename std::decay<T2>::type DT2;
343 return (Comp<DT2>()(static_cast<DT2>(e1), e2) &&
344 Comp<DT1>()(e1, static_cast<DT1>(e2)));
347 template <
typename T1>
350 return Comp<T1>()(e1, e2);
354 #define libmesh_assert_less_msg(expr1,expr2, msg) \ 356 if (!libMesh::casting_compare<std::less>()(expr1, expr2)) { \ 357 libmesh_error_msg(std::setprecision(17) << "Assertion `" #expr1 " < " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl); \ 360 #define libmesh_assert_greater_msg(expr1,expr2, msg) \ 362 if (!libMesh::casting_compare<std::greater>()(expr1, expr2)) { \ 363 libmesh_error_msg(std::setprecision(17) << "Assertion `" #expr1 " > " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl); \ 366 #define libmesh_assert_less_equal_msg(expr1,expr2, msg) \ 368 if (!libMesh::casting_compare<std::less_equal>()(expr1, expr2)) { \ 369 libmesh_error_msg(std::setprecision(17) << "Assertion `" #expr1 " <= " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl); \ 372 #define libmesh_assert_greater_equal_msg(expr1,expr2, msg) \ 374 if (!libMesh::casting_compare<std::greater_equal>()(expr1, expr2)) { \ 375 libmesh_error_msg(std::setprecision(17) << "Assertion `" #expr1 " >= " #expr2 "' failed.\n" #expr1 " = " << (expr1) << "\n" #expr2 " = " << (expr2) << '\n' << msg << std::endl); \ 381 #define libmesh_assert(asserted) libmesh_assert_msg(asserted, "") 382 #define libmesh_exceptionless_assert(asserted) libmesh_exceptionless_assert_msg(asserted, "") 383 #define libmesh_assert_equal_to(expr1,expr2) libmesh_assert_equal_to_msg(expr1,expr2, "") 384 #define libmesh_assert_not_equal_to(expr1,expr2) libmesh_assert_not_equal_to_msg(expr1,expr2, "") 385 #define libmesh_assert_less(expr1,expr2) libmesh_assert_less_msg(expr1,expr2, "") 386 #define libmesh_assert_greater(expr1,expr2) libmesh_assert_greater_msg(expr1,expr2, "") 387 #define libmesh_assert_less_equal(expr1,expr2) libmesh_assert_less_equal_msg(expr1,expr2, "") 388 #define libmesh_assert_greater_equal(expr1,expr2) libmesh_assert_greater_equal_msg(expr1,expr2, "") 407 #define libmesh_error_msg(msg) \ 409 std::stringstream message_stream; \ 410 message_stream << msg << '\n'; \ 411 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME, message_stream); \ 412 LIBMESH_THROW(libMesh::LogicError(message_stream.str())); \ 415 #define libmesh_error() libmesh_error_msg("") 417 #define libmesh_error_msg_if(cond, msg) \ 420 libmesh_error_msg(msg); \ 423 #define libmesh_exceptionless_error_msg(msg) \ 425 libMesh::Threads::lock_singleton_spin_mutex(); \ 426 libMesh::err << msg << '\n'; \ 427 libMesh::Threads::unlock_singleton_spin_mutex(); \ 428 libmesh_try { libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME); } \ 429 libmesh_catch (...) {} \ 433 #define libmesh_exceptionless_error() libmesh_exceptionless_error_msg("") 435 #define libmesh_not_implemented_msg(msg) \ 437 std::stringstream message_stream; \ 438 message_stream << msg << '\n'; \ 439 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME, message_stream); \ 440 LIBMESH_THROW(libMesh::NotImplemented(message_stream.str())); \ 443 #define libmesh_not_implemented() libmesh_not_implemented_msg("") 445 #define libmesh_file_error_msg(filename, msg) \ 447 std::stringstream message_stream; \ 448 message_stream << msg << '\n'; \ 449 libMesh::MacroFunctions::report_error(__FILE__, __LINE__, LIBMESH_DATE, LIBMESH_TIME, message_stream); \ 450 LIBMESH_THROW(libMesh::FileError(filename, message_stream.str())); \ 453 #define libmesh_file_error(filename) libmesh_file_error_msg(filename,"") 455 #define libmesh_convergence_failure() \ 457 LIBMESH_THROW(libMesh::ConvergenceFailure()); \ 460 #define libmesh_degenerate_mapping_msg(msg) \ 462 std::stringstream message_stream; \ 463 message_stream << msg << '\n'; \ 464 LIBMESH_THROW(libMesh::DegenerateMap(message_stream.str())); \ 467 #define libmesh_degenerate_mapping(filename) libmesh_degenerate_mapping_msg("") 469 #define libmesh_terminate() \ 471 LIBMESH_THROW(libMesh::TerminationException()); \ 486 #define libmesh_example_requires(condition, option) \ 488 if (!(condition)) { \ 489 libMesh::out << "Configuring libMesh with " << option << " is required to run this example." << std::endl; \ 495 #undef libmesh_do_once 496 #define libmesh_do_once(do_this) \ 498 static bool did_this_already = false; \ 499 if (!did_this_already) { \ 500 did_this_already = true; \ 507 #ifdef LIBMESH_ENABLE_WARNINGS 508 #define libmesh_warning(message) \ 509 libmesh_do_once(libMesh::out << message \ 510 << __FILE__ << ", line " << __LINE__ << ", compiled " << LIBMESH_DATE << " at " << LIBMESH_TIME << " ***" << std::endl;) 512 #define libmesh_warning(message) ((void) 0) 517 #undef libmesh_experimental 518 #define libmesh_experimental() \ 519 libmesh_warning("*** Warning, This code is untested, experimental, or likely to see future API changes: "); 523 #undef libmesh_deprecated 524 #ifndef LIBMESH_ENABLE_DEPRECATED 525 #define libmesh_deprecated() \ 526 libmesh_error_msg("*** Error, This code is deprecated, and likely to be removed in future library versions! "); 528 #define libmesh_deprecated() \ 529 libmesh_warning("*** Warning, This code is deprecated, and likely to be removed in future library versions! "); 541 #ifdef LIBMESH_HAVE_CXX17_SPLICING 542 template <
typename T>
545 target.merge(std::move(source));
548 template <
typename T>
551 target.insert(source.begin(), source.end());
554 #endif // LIBMESH_HAVE_CXX17_SPLICING 568 template <
typename Tnew,
typename Told>
571 #if !defined(NDEBUG) && defined(LIBMESH_HAVE_RTTI) && defined(LIBMESH_ENABLE_EXCEPTIONS) 574 Tnew newvar =
dynamic_cast<Tnew
>(oldvar);
577 catch (std::bad_cast &)
583 <<
" appears to be a " 588 return(static_cast<Tnew>(oldvar));
594 template <
typename Tnew,
typename Told>
597 #if !defined(NDEBUG) && defined(LIBMESH_HAVE_RTTI) 598 Tnew newvar =
dynamic_cast<Tnew
>(oldvar);
605 <<
" appears to be a " 606 <<
demangle(
typeid(*oldvar).name()) << std::endl;
611 return(static_cast<Tnew>(oldvar));
616 #ifdef LIBMESH_ENABLE_DEPRECATED 617 template <
typename Tnew,
typename Told>
620 libmesh_deprecated();
623 return cast_ptr<Tnew>(oldvar);
625 #endif // LIBMESH_ENABLE_DEPRECATED 635 template <
typename Tnew,
typename Told>
638 libmesh_assert_equal_to
639 (oldvar, static_cast<Told>(static_cast<Tnew>(oldvar)));
641 return(static_cast<Tnew>(oldvar));
645 template <
typename Tnew,
typename Told>
649 return cast_int<Tnew>(oldvar);
663 template <
typename Tnew,
typename Told>
666 if constexpr (!std::is_same_v<Tnew, Told>)
668 const Tnew returnval =
static_cast<Tnew
>(oldvar);
670 libmesh_error_msg_if (oldvar != static_cast<Told>(returnval),
671 "restrict_int failed: " << oldvar <<
" does not fit in type " <<
typeid(returnval).
name());
689 #define LIBMESH_VERSION_ID(major,minor,patch) (((major) << 16) | ((minor) << 8) | ((patch) & 0xFF)) 694 #define libmesh_override override 698 #define libmesh_delete =delete 702 #define libmesh_final final 707 #ifdef LIBMESH_HAVE_CXX17_FALLTHROUGH_ATTRIBUTE 708 #define libmesh_fallthrough() [[fallthrough]] 709 #elif defined(LIBMESH_HAVE_DOUBLE_UNDERSCORE_ATTRIBUTE_FALLTHROUGH) 710 #define libmesh_fallthrough() __attribute__((fallthrough)) 712 #define libmesh_fallthrough() ((void) 0) 715 template <
typename T>
735 using namespace TIMPI;
751 #ifdef LIBMESH_IS_COMPILING_ITSELF 752 # include "libmesh/libmesh_augment_std_namespace.h" 757 #define LIBMESH_EXPORT __declspec(dllexport) 759 #define LIBMESH_EXPORT 763 #endif // LIBMESH_LIBMESH_COMMON_H
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
static constexpr std::size_t libmesh_dim
boost::multiprecision::float128 real(const boost::multiprecision::float128 in)
bool operator()(const T1 &e1, const T1 &e2) const
void here(const char *file, int line, const char *date, const char *time, std::ostream &os=libMesh::err)
constexpr PassKey()=default
static constexpr Real TOLERANCE
void libmesh_merge_move(T &target, T &source)
Tnew cast_ref(Told &oldvar)
Tnew cast_ptr(Told *oldvar)
bool warned_about_auto_ptr
Tnew restrict_int(Told oldvar)
restrict_int checks that the value of the castee is within the bounds which are exactly representable...
MPI_Comm GLOBAL_COMM_WORLD
MPI Communicator used to initialize libMesh.
Tnew libmesh_cast_ptr(Told *oldvar)
The libMesh namespace provides an interface to certain functionality in the library.
DIE A HORRIBLE DEATH HERE typedef float ErrorVectorReal
Tnew cast_int(Told oldvar)
This class is intended to be reseatable like a pointer-to-ostream for flexibility, but to look like a reference when used to produce less awkward user code.
void libmesh_ignore(const Args &...)
std::complex< Real > COMPLEX
bool operator()(const T1 &e1, const T2 &e2) const
void report_error(const char *file, int line, const char *date, const char *time, std::ostream &os=libMesh::err)
void unlock_singleton_spin_mutex()
void stop(const char *file, int line, const char *date, const char *time)
constexpr std::false_type always_false
This is a helper variable template for cases when we want to use a default compile-time error with co...
std::string demangle(const char *name)
Mostly system independent demangler.
std::complex< Real > Complex
void lock_singleton_spin_mutex()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
boost::multiprecision::float128 imag(const boost::multiprecision::float128)
Tnew libmesh_cast_int(Told oldvar)