47 PyObject *type_ptr =
nullptr, *value_ptr =
nullptr,
48 *traceback_ptr =
nullptr;
51 PyErr_Fetch(&type_ptr, &value_ptr, &traceback_ptr);
54 std::string ret(
"Unfetchable Python error");
57 if (type_ptr !=
nullptr)
59 py::handle h_type(type_ptr);
60 ret = py::str(h_type);
65 if (value_ptr !=
nullptr)
67 py::handle h_val(value_ptr);
68 ret +=
": " + std::string(py::str(h_val));
72 if (traceback_ptr !=
nullptr)
74 py::handle h_tb(traceback_ptr);
77 py::object tb(py::module_::import(
"traceback"));
78 py::object fmt_tb(tb.attr(
"format_tb"));
81 py::object tb_list(fmt_tb(h_tb));
84 py::object tb_str(py::str(
"\n").attr(
"join")(tb_list));
87 ret +=
": " + std::string(py::str(tb_str));
98 for (
int i = 0; i < pFields.size(); ++i)
100 expLists.append(py::cast(pFields[i]));
110 const std::shared_ptr<EquationSystem> &pEquation,
112 :
Filter(pSession, pEquation)
114 if (!Py_IsInitialized())
116 py::initialize_interpreter();
119 auto it = pParams.find(
"PythonFile");
120 ASSERTL0(it != pParams.end(),
"Empty parameter 'PythonFile'.");
121 std::string pythonFile = it->second, pythonCode;
124 m_global = py::module_::import(
"__main__").attr(
"__dict__");
128 std::ifstream t(pythonFile);
129 std::string str((std::istreambuf_iterator<char>(t)),
130 std::istreambuf_iterator<char>());
135 ASSERTL0(
false,
"Error reading Python file: " + pythonFile);
139 if (pSession->DefinesCmdLineArgument(
"verbose"))
141 std::cout <<
"-----------------" << std::endl;
142 std::cout <<
"BEGIN PYTHON CODE" << std::endl;
143 std::cout <<
"-----------------" << std::endl;
144 std::cout << pythonCode << std::endl;
145 std::cout <<
"-----------------" << std::endl;
146 std::cout <<
"END PYTHON CODE" << std::endl;
147 std::cout <<
"-----------------" << std::endl;
154 auto nekpy = py::module_::import(
"NekPy");
155 auto multireg = py::module_::import(
"NekPy.MultiRegions");
161 catch (py::error_already_set
const &)
170 it = pParams.find(
"FilterName");
171 if (it != pParams.end())
173 std::string filterName = it->second;
177 "Unable to locate filter named '" + filterName +
"'");
184 catch (py::error_already_set
const &)
212 catch (py::error_already_set
const &)
234 catch (py::error_already_set
const &)
256 catch (py::error_already_set
const &)
#define ASSERTL0(condition, msg)
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
std::map< std::string, std::string > ParamMap
py::object m_global
Container for Python global variables.
void v_Finalise(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
std::shared_ptr< Filter > m_pyFilter
Python filter class to run (optionally)
SOLVER_UTILS_EXPORT ~FilterPython() override
bool v_IsTimeDependent() override
void v_Update(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
SOLVER_UTILS_EXPORT FilterPython(const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< EquationSystem > &pEquation, const ParamMap &pParams)
static FilterSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const std::shared_ptr< EquationSystem > &pEquation, const std::map< std::string, std::string > &pParams)
Creates an instance of this class.
static std::string className
Name of the class.
void v_Initialise(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields, const NekDouble &time) override
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::string parse_python_exception()
Temporarily stolen from boost examples.
py::list ArrayOneDToPyList(const Array< OneD, const MultiRegions::ExpListSharedPtr > &pFields)
FilterFactory & GetFilterFactory()