https://mooseframework.inl.gov
MooseError.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #include "MooseError.h"
11 #include "MooseUtils.h"
12 #include "MooseVariable.h"
13 #include "Registry.h"
14 
15 #include "libmesh/string_to_enum.h"
16 
17 using namespace libMesh;
18 
19 namespace moose
20 {
21 
22 namespace internal
23 {
24 
25 std::string
27 {
28  std::stringstream ss;
29  ss << libMesh::Utility::enum_to_string<FEFamily>(var1.feType().family) << ",ORDER"
30  << var1.feType().order
31  << " != " << libMesh::Utility::enum_to_string<FEFamily>(var2.feType().family) << ",ORDER"
32  << var2.feType().order;
33  return ss.str();
34 }
35 
36 std::string
37 mooseMsgFmt(const std::string & msg, const std::string & title, const std::string & color)
38 {
39  std::ostringstream oss;
40  oss << "\n" << color << "\n" << title << "\n" << msg << COLOR_DEFAULT << "\n";
41  return oss.str();
42 }
43 
44 std::string
45 mooseMsgFmt(const std::string & msg, const std::string & color)
46 {
47  std::ostringstream oss;
48  oss << "\n" << color << "\n" << msg << COLOR_DEFAULT << "\n";
49  return oss.str();
50 }
51 
52 [[noreturn]] void
53 mooseErrorRaw(std::string msg,
54  const std::string & prefix /* = "" */,
55  const hit::Node * node /* = nullptr */)
56 {
58  throw MooseRuntimeError(msg, node);
59 
60  // Atomic that will be set as soon as any thread hits this method
61  static std::atomic_flag aborting = ATOMIC_FLAG_INIT;
62 
63  // This branch will be hit after another thread has already set the atomic.
64  // MPI_Abort, despite its name, does not behave like std::abort but instead
65  // calls exit handlers and destroys statics. So we don't want to touch
66  // anything static at this point. We'll just wait until the winning thread
67  // has incurred program exit
68  if (aborting.test_and_set(std::memory_order_acq_rel))
69  {
70  // Waiting for the other thread(s), not burning CPU
71  for (;;)
72  pause();
73  }
74  // We're the first thread to hit this method (we set the atomic), so we're
75  // responsible for dumping the error and trace(s) while the remaining
76  // threads wait for us to exit (via MOOSE_ABORT)
77  else
78  {
79  // Output the message if there is one, but flush it without the trace
80  // as trace retrieval can be slow in some circumstances and we want to
81  // get the error message out ASAP
82  if (!msg.empty())
83  {
84  // If we have a node available, add in the hit context (file location)
85  if (node)
86  msg = Moose::hitMessagePrefix(*node) + msg;
87 
88  msg = mooseMsgFmt(msg, "*** ERROR ***", COLOR_RED) + "\n";
89  if (!prefix.empty()) // multiapp prefix
90  MooseUtils::indentMessage(prefix, msg);
91 
92  {
93  Threads::spin_mutex::scoped_lock lock(moose_stream_lock);
94  Moose::err << msg << std::flush;
95  }
96  }
97 
98  // Print the trace if enabled and on a single rank
100  {
101  std::ostringstream oss;
102  print_trace(oss);
103  auto trace = oss.str();
104  if (!prefix.empty()) // multiapp prefix
105  MooseUtils::indentMessage(prefix, trace);
106 
107  {
108  Threads::spin_mutex::scoped_lock lock(moose_stream_lock);
109  Moose::err << trace << std::flush;
110  }
111  }
112 
113  // In parallel with libMesh configured with --enable-tracefiles, this will
114  // dump a trace for each rank to file
117 
118  MOOSE_ABORT;
119  }
120 }
121 
122 void
123 mooseStreamAll(std::ostringstream &)
124 {
125 }
126 
127 std::string
128 formatMooseDocumentedError(const std::string & repo_name,
129  const unsigned int issue_num,
130  const std::string & msg)
131 {
132  const auto & repo_url = Registry::getRepositoryURL(repo_name);
133  std::stringstream oss;
134  oss << msg << "\n\nThis error is documented at " << repo_url << "/issues/" << issue_num << ".";
135  return oss.str();
136 }
137 
138 } // namespace internal
139 
140 void
141 translateMetaPhysicLError(const MetaPhysicL::LogicError &)
142 {
143  mooseError(
144  "We caught a MetaPhysicL error in while performing element or face loops. This is "
145  "potentially due to AD not having a sufficiently large derivative container size. To "
146  "increase the AD container size, you can run configure in the MOOSE root directory with the "
147  "'--with-derivative-size=<n>' option and then recompile. Other causes of MetaPhysicL logic "
148  "errors include evaluating functions where they are not defined or differentiable like sqrt "
149  "(which gets called for vector norm functions) or log with arguments <= 0");
150 }
151 
152 } // namespace moose
void mooseStreamAll(std::ostringstream &ss)
All of the following are not meant to be called directly - they are called by the normal macros (moos...
Definition: MooseError.C:123
bool show_trace
Set to true (the default) to print the stack trace with error and warning messages - false to omit it...
Definition: Moose.C:794
const libMesh::FEType & feType() const
Get the type of finite element object.
processor_id_type global_n_processors()
std::string incompatVarMsg(MooseVariableFieldBase &var1, MooseVariableFieldBase &var2)
Builds and returns a string of the form:
Definition: MooseError.C:26
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
void translateMetaPhysicLError(const MetaPhysicL::LogicError &)
emit a relatively clear error message when we catch a MetaPhysicL logic error
Definition: MooseError.C:141
OrderWrapper order
This class provides an interface for common operations on field variables of both FE and FV types wit...
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
void write_traceout()
void indentMessage(const std::string &prefix, std::string &message, const char *color=COLOR_CYAN, bool dont_indent_first_line=true, const std::string &post_prefix=": ")
Indents the supplied message given the prefix and color.
Definition: MooseUtils.C:734
void print_trace(std::ostream &out_stream=std::cerr)
void mooseErrorRaw(std::string msg, const std::string &prefix="", const hit::Node *node=nullptr)
Main callback for emitting a moose error.
Definition: MooseError.C:53
static const std::string & getRepositoryURL(const std::string &repo_name)
Returns the repository URL associated with repo_name.
Definition: Registry.C:173
std::string hitMessagePrefix(const hit::Node &node)
Get the prefix to be associated with a hit node for a message.
Definition: Moose.C:778
Exception to be thrown whenever we have _throw_on_error set and a mooseError() is emitted...
Definition: MooseError.h:133
libMesh::Threads::spin_mutex moose_stream_lock
Definition: MooseError.h:156
bool _throw_on_error
Variable to turn on exceptions during mooseError(), should only be used within MOOSE unit tests or wh...
Definition: Moose.C:791
std::string mooseMsgFmt(const std::string &msg, const std::string &title, const std::string &color)
Format a message for output with a title.
Definition: MooseError.C:37
std::string formatMooseDocumentedError(const std::string &repo_name, const unsigned int issue_num, const std::string &msg)
Formats a documented error.
Definition: MooseError.C:128