https://mooseframework.inl.gov
ADFParser.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 "ADFParser.h"
11 #include "MooseUtils.h"
12 #include "ExecutablePath.h"
13 
14 ADFParser::ADFParser() : FunctionParserAD(), _epsilon(1e-12) {}
15 
16 ADFParser::ADFParser(const ADFParser & cpy) : FunctionParserAD(cpy), _epsilon(1e-12) {}
17 
18 #ifndef ADFPARSER_INCLUDES
19 #error ... \
20  The ADFPARSER_INCLUDES macro is not defined. A possible reason is that you \
21  are compiling MOOSE from a custom application. Please check your application \
22  Makefile and make sure that you are appending options to ADDITIONAL_CPPFLAGS \
23  using the += operator, rather than overwriting the variable with the := operator.
24 #endif
25 
26 bool
28 {
29 #if LIBMESH_HAVE_FPARSER_JIT
30  std::string includes;
31  const auto type_hash = typeid(ADReal).hash_code();
32  bool result;
33 
34  std::string fopenmp;
35 #if defined(_OPENMP)
36 #if defined(__INTEL_LLVM_COMPILER)
37  fopenmp = "-qopenmp";
38 #else
39  fopenmp = "-fopenmp";
40 #endif
41 #endif
42 
43  const auto include_path_env = std::getenv("MOOSE_ADFPARSER_JIT_INCLUDE");
44  if (include_path_env)
45  result = JITCompileHelper(
46  "ADReal", fopenmp, "#include \"" + std::string(include_path_env) + "\"\n", type_hash);
47  else
48  {
49  // check if we can find an installed version of the monolithic include
50  const std::string include_path =
51  MooseUtils::pathjoin(Moose::getExecutablePath(), "../include/moose/ADRealMonolithic.h");
52  if (MooseUtils::checkFileReadable(include_path, false, false, false))
53  result =
54  JITCompileHelper("ADReal", fopenmp, "#include \"" + include_path + "\"\n", type_hash);
55  else
56  // otherwise use the compiled in location from the source tree
57  result = JITCompileHelper("ADReal",
58  fopenmp + " " + ADFPARSER_INCLUDES,
59  "#include \"MooseConfig.h\"\n#include \"ADReal.h\"\n",
60  type_hash);
61  }
62 
63  if (!result)
64 #endif
65  mooseError("ADFParser::JITCompile() failed. Evaluation not possible.");
66 
67  return true;
68 }
69 
70 ADReal
72 {
73  mooseAssert(compiledFunction, "ADFParser objects must be JIT compiled before evaluation!");
74  ADReal ret;
75  (*reinterpret_cast<CompiledFunctionPtr<ADReal>>(compiledFunction))(&ret, vars, pImmed, _epsilon);
76  return ret;
77 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:323
std::string getExecutablePath()
Gets the directory the running executable is on Mac OS X and linux.
char ** vars
ADFParser()
Definition: ADFParser.C:14
const Real _epsilon
Definition: ADFParser.h:29
DualNumber< Real, DNDerivativeType, true > ADReal
Definition: ADRealForward.h:46
bool JITCompile()
Definition: ADFParser.C:27
Real Eval(const Real *)
Definition: ADFParser.h:25
bool checkFileReadable(const std::string &filename, bool check_line_endings=false, bool throw_on_unreadable=true, bool check_for_git_lfs_pointer=true)
Checks to see if a file is readable (exists and permissions)
Definition: MooseUtils.C:250
std::filesystem::path pathjoin(const std::filesystem::path &p)
Definition: MooseUtils.C:59