1c6db04a5SJed Brown #include <petscsys.h> /*I "petscsys.h" I*/ 2c4aff060SBarry Smith 3c4aff060SBarry Smith /* ---------------------------------------------------------------- */ 4c4aff060SBarry Smith 5c4aff060SBarry Smith #if !defined(PETSC_PYTHON_EXE) 6c4aff060SBarry Smith #define PETSC_PYTHON_EXE "python" 7c4aff060SBarry Smith #endif 8c4aff060SBarry Smith 9c4aff060SBarry Smith #undef __FUNCT__ 10c4aff060SBarry Smith #define __FUNCT__ "PetscPythonFindExecutable" 11c4aff060SBarry Smith static PetscErrorCode PetscPythonFindExecutable(char pythonexe[PETSC_MAX_PATH_LEN]) 12c4aff060SBarry Smith { 13ace3abfcSBarry Smith PetscBool flag; 14c4aff060SBarry Smith PetscErrorCode ierr; 15*6e111a19SKarl Rupp 16c4aff060SBarry Smith PetscFunctionBegin; 17c4aff060SBarry Smith /* get the path for the Python interpreter executable */ 18c4aff060SBarry Smith ierr = PetscStrncpy(pythonexe,PETSC_PYTHON_EXE,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 19c4aff060SBarry Smith ierr = PetscOptionsGetString(PETSC_NULL,"-python",pythonexe,PETSC_MAX_PATH_LEN,&flag);CHKERRQ(ierr); 20c4aff060SBarry Smith if (!flag || pythonexe[0]==0) { 21c4aff060SBarry Smith ierr = PetscStrncpy(pythonexe,PETSC_PYTHON_EXE,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 22c4aff060SBarry Smith } 23c4aff060SBarry Smith PetscFunctionReturn(0); 24c4aff060SBarry Smith } 25c4aff060SBarry Smith 26c4aff060SBarry Smith #undef __FUNCT__ 27c4aff060SBarry Smith #define __FUNCT__ "PetscPythonFindLibrary" 28c4aff060SBarry Smith static PetscErrorCode PetscPythonFindLibrary(char pythonexe[PETSC_MAX_PATH_LEN], 29c4aff060SBarry Smith char pythonlib[PETSC_MAX_PATH_LEN]) 30c4aff060SBarry Smith { 31c4aff060SBarry Smith const char cmdline[] = "-c 'import sys; print(sys.exec_prefix); print(sys.version[:3])'"; 32c4aff060SBarry Smith char command[PETSC_MAX_PATH_LEN+1+sizeof(cmdline)+1]; 33c4aff060SBarry Smith char prefix[PETSC_MAX_PATH_LEN],version[8],sep[2]={PETSC_DIR_SEPARATOR, 0},*eol; 34c4aff060SBarry Smith FILE* fp = NULL; 35c4aff060SBarry Smith char path[PETSC_MAX_PATH_LEN+1]; 36ace3abfcSBarry Smith PetscBool found = PETSC_FALSE; 37c4aff060SBarry Smith PetscErrorCode ierr; 38c4aff060SBarry Smith 39*6e111a19SKarl Rupp PetscFunctionBegin; 40c4aff060SBarry Smith #if defined(PETSC_PYTHON_LIB) 41c4aff060SBarry Smith ierr = PetscStrcpy(pythonlib,PETSC_PYTHON_LIB);CHKERRQ(ierr); 42c4aff060SBarry Smith PetscFunctionReturn(0); 43c4aff060SBarry Smith #endif 44c4aff060SBarry Smith 45c4aff060SBarry Smith /* call Python to find out the name of the Python dynamic library */ 46c4aff060SBarry Smith ierr = PetscStrncpy(command,pythonexe,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 47c4aff060SBarry Smith ierr = PetscStrcat(command," ");CHKERRQ(ierr); 48c4aff060SBarry Smith ierr = PetscStrcat(command,cmdline);CHKERRQ(ierr); 49c4aff060SBarry Smith #if defined(PETSC_HAVE_POPEN) 50c4aff060SBarry Smith ierr = PetscPOpen(PETSC_COMM_SELF,PETSC_NULL,command,"r",&fp);CHKERRQ(ierr); 51c4aff060SBarry Smith if (!fgets(prefix,sizeof(prefix),fp)) 52e32f2f54SBarry Smith { SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Python: bad output from executable: %s",pythonexe); } 53c4aff060SBarry Smith if (!fgets(version,sizeof(version),fp)) 54e32f2f54SBarry Smith { SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Python: bad output from executable: %s",pythonexe); } 55784ad74dSJed Brown ierr = PetscPClose(PETSC_COMM_SELF,fp,PETSC_NULL);CHKERRQ(ierr); 56c4aff060SBarry Smith #else 57e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,1,"Python: Aborted due to missing popen()"); 58c4aff060SBarry Smith #endif 59c4aff060SBarry Smith /* remove newlines */ 60c4aff060SBarry Smith ierr = PetscStrchr(prefix,'\n',&eol);CHKERRQ(ierr); 61c4aff060SBarry Smith if (eol) eol[0] = 0; 62c4aff060SBarry Smith ierr = PetscStrchr(version,'\n',&eol);CHKERRQ(ierr); 63c4aff060SBarry Smith if (eol) eol[0] = 0; 64c4aff060SBarry Smith 65c4aff060SBarry Smith /* test for $prefix/lib64/libpythonX.X[.so]*/ 66c4aff060SBarry Smith ierr = PetscStrcpy(pythonlib,prefix);CHKERRQ(ierr); 67c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); 68c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,"lib64");CHKERRQ(ierr); 69c4aff060SBarry Smith ierr = PetscTestDirectory(pythonlib,'r',&found);CHKERRQ(ierr); 70c4aff060SBarry Smith if (found) { 71c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); 72c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,"libpython");CHKERRQ(ierr); 73c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,version);CHKERRQ(ierr); 74c4aff060SBarry Smith ierr = PetscDLLibraryRetrieve(PETSC_COMM_SELF,pythonlib,path,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); 75c4aff060SBarry Smith if (found) PetscFunctionReturn(0); 76c4aff060SBarry Smith } 77c4aff060SBarry Smith 78c4aff060SBarry Smith /* test for $prefix/lib/libpythonX.X[.so]*/ 79c4aff060SBarry Smith ierr = PetscStrcpy(pythonlib,prefix);CHKERRQ(ierr); 80c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); 81c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,"lib");CHKERRQ(ierr); 82c4aff060SBarry Smith ierr = PetscTestDirectory(pythonlib,'r',&found);CHKERRQ(ierr); 83c4aff060SBarry Smith if (found) { 84c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,sep);CHKERRQ(ierr); 85c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,"libpython");CHKERRQ(ierr); 86c4aff060SBarry Smith ierr = PetscStrcat(pythonlib,version);CHKERRQ(ierr); 87c4aff060SBarry Smith ierr = PetscDLLibraryRetrieve(PETSC_COMM_SELF,pythonlib,path,PETSC_MAX_PATH_LEN,&found);CHKERRQ(ierr); 88c4aff060SBarry Smith if (found) PetscFunctionReturn(0); 89c4aff060SBarry Smith } 90c4aff060SBarry Smith 91c4aff060SBarry Smith /* nothing good found */ 92c4aff060SBarry Smith ierr = PetscMemzero(pythonlib,PETSC_MAX_PATH_LEN);CHKERRQ(ierr); 93c4aff060SBarry Smith ierr = PetscInfo(0,"Python dynamic library not found\n");CHKERRQ(ierr); 94c4aff060SBarry Smith 95c4aff060SBarry Smith PetscFunctionReturn(0); 96c4aff060SBarry Smith } 97c4aff060SBarry Smith 98c4aff060SBarry Smith /* ---------------------------------------------------------------- */ 99c4aff060SBarry Smith 100c4aff060SBarry Smith typedef struct _Py_object_t PyObject; /* fake definition */ 101c4aff060SBarry Smith 102e0ab9aedSLisandro Dalcin static PyObject* Py_None = 0; 103e0ab9aedSLisandro Dalcin 1049ac80d5eSLisandro Dalcin static const char* (*Py_GetVersion)(void); 1059ac80d5eSLisandro Dalcin 106c4aff060SBarry Smith static int (*Py_IsInitialized)(void); 107c4aff060SBarry Smith static void (*Py_InitializeEx)(int); 108c4aff060SBarry Smith static void (*Py_Finalize)(void); 109c4aff060SBarry Smith 110c4aff060SBarry Smith static void (*PySys_SetArgv)(int, char **); 1112f2e82b0SLisandro Dalcin static PyObject* (*PySys_GetObject)(const char *); 1122f2e82b0SLisandro Dalcin static PyObject* (*PyObject_CallMethod)(PyObject *, const char *, const char *, ...); 113c4aff060SBarry Smith static PyObject* (*PyImport_ImportModule)(const char *); 114c4aff060SBarry Smith 115c4aff060SBarry Smith static void (*Py_IncRef)(PyObject *); 116c4aff060SBarry Smith static void (*Py_DecRef)(PyObject *); 117c4aff060SBarry Smith 118c4aff060SBarry Smith static void (*PyErr_Clear)(void); 119c4aff060SBarry Smith static PyObject* (*PyErr_Occurred)(void); 120e0ab9aedSLisandro Dalcin static void (*PyErr_Fetch)(PyObject **, PyObject **, PyObject **); 121e0ab9aedSLisandro Dalcin static void (*PyErr_NormalizeException)(PyObject **, PyObject **, PyObject **); 122e0ab9aedSLisandro Dalcin static void (*PyErr_Display)(PyObject *, PyObject *, PyObject *); 123e0ab9aedSLisandro Dalcin static void (*PyErr_Restore)(PyObject *, PyObject *, PyObject *); 124c4aff060SBarry Smith 125c4aff060SBarry Smith 126c4aff060SBarry Smith #define PetscDLPyLibOpen(libname) \ 127d44a1e48SBarry Smith PetscDLLibraryAppend(PETSC_COMM_SELF,&PetscDLLibrariesLoaded,libname) 128c4aff060SBarry Smith #define PetscDLPyLibSym(symbol, value) \ 129d44a1e48SBarry Smith PetscDLLibrarySym(PETSC_COMM_SELF,&PetscDLLibrariesLoaded,PETSC_NULL,symbol,(void**)value) 130c4aff060SBarry Smith #define PetscDLPyLibClose(comm) \ 131c4aff060SBarry Smith do { } while (0) 132c4aff060SBarry Smith 133c4aff060SBarry Smith #undef __FUNCT__ 134c4aff060SBarry Smith #define __FUNCT__ "PetscPythonLoadLibrary" 135c4aff060SBarry Smith static PetscErrorCode PetscPythonLoadLibrary(const char pythonlib[]) 136c4aff060SBarry Smith { 137c4aff060SBarry Smith PetscErrorCode ierr; 138c4aff060SBarry Smith 139*6e111a19SKarl Rupp PetscFunctionBegin; 140c4aff060SBarry Smith /* open the Python dynamic library */ 141c4aff060SBarry Smith ierr = PetscDLPyLibOpen(pythonlib);CHKERRQ(ierr); 142c4aff060SBarry Smith ierr = PetscInfo1(0,"Python: loaded dynamic library %s\n", pythonlib);CHKERRQ(ierr); 143c4aff060SBarry Smith /* look required symbols from the Python C-API */ 144e0ab9aedSLisandro Dalcin ierr = PetscDLPyLibSym("_Py_NoneStruct" , &Py_None );CHKERRQ(ierr); 1459ac80d5eSLisandro Dalcin ierr = PetscDLPyLibSym("Py_GetVersion" , &Py_GetVersion );CHKERRQ(ierr); 146c4aff060SBarry Smith ierr = PetscDLPyLibSym("Py_IsInitialized" , &Py_IsInitialized );CHKERRQ(ierr); 147c4aff060SBarry Smith ierr = PetscDLPyLibSym("Py_InitializeEx" , &Py_InitializeEx );CHKERRQ(ierr); 148c4aff060SBarry Smith ierr = PetscDLPyLibSym("Py_Finalize" , &Py_Finalize );CHKERRQ(ierr); 1492f2e82b0SLisandro Dalcin ierr = PetscDLPyLibSym("PySys_GetObject" , &PySys_GetObject );CHKERRQ(ierr); 150c4aff060SBarry Smith ierr = PetscDLPyLibSym("PySys_SetArgv" , &PySys_SetArgv );CHKERRQ(ierr); 1512f2e82b0SLisandro Dalcin ierr = PetscDLPyLibSym("PyObject_CallMethod" , &PyObject_CallMethod );CHKERRQ(ierr); 152c4aff060SBarry Smith ierr = PetscDLPyLibSym("PyImport_ImportModule" , &PyImport_ImportModule );CHKERRQ(ierr); 153c4aff060SBarry Smith ierr = PetscDLPyLibSym("Py_IncRef" , &Py_IncRef );CHKERRQ(ierr); 154c4aff060SBarry Smith ierr = PetscDLPyLibSym("Py_DecRef" , &Py_DecRef );CHKERRQ(ierr); 155c4aff060SBarry Smith ierr = PetscDLPyLibSym("PyErr_Clear" , &PyErr_Clear );CHKERRQ(ierr); 156c4aff060SBarry Smith ierr = PetscDLPyLibSym("PyErr_Occurred" , &PyErr_Occurred );CHKERRQ(ierr); 157e0ab9aedSLisandro Dalcin ierr = PetscDLPyLibSym("PyErr_Fetch" , &PyErr_Fetch );CHKERRQ(ierr); 158e0ab9aedSLisandro Dalcin ierr = PetscDLPyLibSym("PyErr_NormalizeException", &PyErr_NormalizeException);CHKERRQ(ierr); 159e0ab9aedSLisandro Dalcin ierr = PetscDLPyLibSym("PyErr_Display", &PyErr_Display );CHKERRQ(ierr); 160e0ab9aedSLisandro Dalcin ierr = PetscDLPyLibSym("PyErr_Restore", &PyErr_Restore );CHKERRQ(ierr); 161c4aff060SBarry Smith /* XXX TODO: check that ALL symbols were there !!! */ 162e0ab9aedSLisandro Dalcin if (!Py_None) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library"); 1639ac80d5eSLisandro Dalcin if (!Py_GetVersion) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library"); 164c1235816SBarry Smith if (!Py_IsInitialized) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library"); 165c1235816SBarry Smith if (!Py_InitializeEx) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library"); 166c1235816SBarry Smith if (!Py_Finalize) SETERRQ(PETSC_COMM_SELF,1,"Python: failed to load symbols from dynamic library"); 167c4aff060SBarry Smith ierr = PetscInfo(0,"Python: all required symbols loaded from Python dynamic library\n");CHKERRQ(ierr); 168c4aff060SBarry Smith 169c4aff060SBarry Smith PetscFunctionReturn(0); 170c4aff060SBarry Smith } 171c4aff060SBarry Smith 172c4aff060SBarry Smith /* ---------------------------------------------------------------- */ 173c4aff060SBarry Smith 174c4aff060SBarry Smith static char PetscPythonExe[PETSC_MAX_PATH_LEN] = { 0 }; 175c4aff060SBarry Smith static char PetscPythonLib[PETSC_MAX_PATH_LEN] = { 0 }; 176ace3abfcSBarry Smith static PetscBool PetscBeganPython = PETSC_FALSE; 177c4aff060SBarry Smith 178c4aff060SBarry Smith #undef __FUNCT__ 179c4aff060SBarry Smith #define __FUNCT__ "PetscPythonFinalize" 180c4aff060SBarry Smith /*@C 181c4aff060SBarry Smith PetscPythonFinalize - Finalize Python. 182c4aff060SBarry Smith 183c4aff060SBarry Smith Level: intermediate 184c4aff060SBarry Smith 185c4aff060SBarry Smith .keywords: Python 186c4aff060SBarry Smith @*/ 1877087cfbeSBarry Smith PetscErrorCode PetscPythonFinalize(void) 188c4aff060SBarry Smith { 189c4aff060SBarry Smith PetscFunctionBegin; 190c4aff060SBarry Smith if (PetscBeganPython) { if (Py_IsInitialized()) Py_Finalize(); } 191c4aff060SBarry Smith PetscBeganPython = PETSC_FALSE; 192c4aff060SBarry Smith PetscFunctionReturn(0); 193c4aff060SBarry Smith } 194c4aff060SBarry Smith 195c4aff060SBarry Smith #undef __FUNCT__ 196c4aff060SBarry Smith #define __FUNCT__ "PetscPythonInitialize" 197c4aff060SBarry Smith /*@C 198c4aff060SBarry Smith PetscPythonInitialize - Initialize Python and import petsc4py. 199c4aff060SBarry Smith 200c4aff060SBarry Smith Input Parameter: 201c4aff060SBarry Smith + pyexe - path to the Python interpreter executable, or PETSC_NULL. 202c4aff060SBarry Smith - pylib - full path to the Python dynamic library, or PETSC_NULL. 203c4aff060SBarry Smith 204c4aff060SBarry Smith Level: intermediate 205c4aff060SBarry Smith 206c4aff060SBarry Smith .keywords: Python 207c4aff060SBarry Smith 208c4aff060SBarry Smith @*/ 2097087cfbeSBarry Smith PetscErrorCode PetscPythonInitialize(const char pyexe[],const char pylib[]) 210c4aff060SBarry Smith { 211c4aff060SBarry Smith PyObject *module = 0; 212c4aff060SBarry Smith PetscErrorCode ierr; 213*6e111a19SKarl Rupp 214c4aff060SBarry Smith PetscFunctionBegin; 215c4aff060SBarry Smith if (PetscBeganPython) PetscFunctionReturn(0); 216c4aff060SBarry Smith /* Python executable */ 217c4aff060SBarry Smith if (pyexe && pyexe[0] != 0) { 218c4aff060SBarry Smith ierr = PetscStrncpy(PetscPythonExe,pyexe,sizeof(PetscPythonExe));CHKERRQ(ierr); 219c4aff060SBarry Smith } else { 220c4aff060SBarry Smith ierr = PetscPythonFindExecutable(PetscPythonExe);CHKERRQ(ierr); 221c4aff060SBarry Smith } 222c4aff060SBarry Smith /* Python dynamic library */ 223c4aff060SBarry Smith if (pylib && pylib[0] != 0) { 224c4aff060SBarry Smith ierr = PetscStrncpy(PetscPythonLib,pylib,sizeof(PetscPythonLib));CHKERRQ(ierr); 225c4aff060SBarry Smith } else { 226c4aff060SBarry Smith ierr = PetscPythonFindLibrary(PetscPythonExe,PetscPythonLib);CHKERRQ(ierr); 227c4aff060SBarry Smith } 228c4aff060SBarry Smith /* dynamically load Python library */ 229c4aff060SBarry Smith ierr = PetscPythonLoadLibrary(PetscPythonLib);CHKERRQ(ierr); 230c4aff060SBarry Smith /* initialize Python */ 231c4aff060SBarry Smith PetscBeganPython = PETSC_FALSE; 232c4aff060SBarry Smith if (!Py_IsInitialized()) { 2332f2e82b0SLisandro Dalcin static PetscBool registered = PETSC_FALSE; 2342f2e82b0SLisandro Dalcin const char *py_version; 2352f2e82b0SLisandro Dalcin PyObject *sys_path; 2362f2e82b0SLisandro Dalcin char path[PETSC_MAX_PATH_LEN] = { 0 }; 2372f2e82b0SLisandro Dalcin /* initialize Python */ 2382f2e82b0SLisandro Dalcin Py_InitializeEx(0); /* 0: do not install signal handlers */ 2392f2e82b0SLisandro Dalcin /* build 'sys.argv' list */ 2402f2e82b0SLisandro Dalcin py_version = Py_GetVersion(); 2419ac80d5eSLisandro Dalcin if (py_version[0] == '2') { 2422f2e82b0SLisandro Dalcin int argc = 0; char **argv = 0; 243c4aff060SBarry Smith ierr = PetscGetArgs(&argc,&argv);CHKERRQ(ierr); 2442f2e82b0SLisandro Dalcin PySys_SetArgv(argc,argv); 2452f2e82b0SLisandro Dalcin } 2462f2e82b0SLisandro Dalcin if (py_version[0] == '3') { 2472f2e82b0SLisandro Dalcin /* XXX 'argv' is type 'wchar_t**' */ 2482f2e82b0SLisandro Dalcin PySys_SetArgv(0,PETSC_NULL); 2492f2e82b0SLisandro Dalcin } 2502f2e82b0SLisandro Dalcin /* add PETSC_LIB_DIR in front of 'sys.path' */ 2512f2e82b0SLisandro Dalcin sys_path = PySys_GetObject("path"); 2522f2e82b0SLisandro Dalcin if (sys_path) { 2532f2e82b0SLisandro Dalcin ierr = PetscStrreplace(PETSC_COMM_SELF,"${PETSC_LIB_DIR}",path,sizeof(path));CHKERRQ(ierr); 2542f2e82b0SLisandro Dalcin Py_DecRef(PyObject_CallMethod(sys_path,"insert","is",(int)0,(char*)path)); 2559ac80d5eSLisandro Dalcin } 256c4aff060SBarry Smith /* register finalizer */ 257c4aff060SBarry Smith if (!registered) { 258c4aff060SBarry Smith ierr = PetscRegisterFinalize(PetscPythonFinalize);CHKERRQ(ierr); 259c4aff060SBarry Smith registered = PETSC_TRUE; 260c4aff060SBarry Smith } 261c4aff060SBarry Smith PetscBeganPython = PETSC_TRUE; 262c4aff060SBarry Smith } 263c4aff060SBarry Smith /* import 'petsc4py.PETSc' module */ 264c4aff060SBarry Smith module = PyImport_ImportModule("petsc4py.PETSc"); 265c4aff060SBarry Smith if (module) { 266c4aff060SBarry Smith ierr = PetscInfo(0,"Python: successfully imported module 'petsc4py.PETSc'\n");CHKERRQ(ierr); 267c4aff060SBarry Smith Py_DecRef(module); module = 0; 268c4aff060SBarry Smith } else { 269e0ab9aedSLisandro Dalcin PetscPythonPrintError(); 270e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Python: could not import module 'petsc4py.PETSc', perhaps your PYTHONPATH does not contain it\n"); 271c4aff060SBarry Smith } 272c4aff060SBarry Smith PetscFunctionReturn(0); 273c4aff060SBarry Smith } 274c4aff060SBarry Smith 275e0ab9aedSLisandro Dalcin #undef __FUNCT__ 276e0ab9aedSLisandro Dalcin #define __FUNCT__ "PetscPythonPrintError" 277e0ab9aedSLisandro Dalcin /*@C 278e0ab9aedSLisandro Dalcin PetscPythonPrintError - Print Python errors. 279e0ab9aedSLisandro Dalcin 280e0ab9aedSLisandro Dalcin Level: developer 281e0ab9aedSLisandro Dalcin 282e0ab9aedSLisandro Dalcin .keywords: Python 283e0ab9aedSLisandro Dalcin 284e0ab9aedSLisandro Dalcin @*/ 2857087cfbeSBarry Smith PetscErrorCode PetscPythonPrintError(void) 286e0ab9aedSLisandro Dalcin { 287e0ab9aedSLisandro Dalcin PyObject *exc=0, *val=0, *tb=0; 288*6e111a19SKarl Rupp 289e0ab9aedSLisandro Dalcin PetscFunctionBegin; 290e0ab9aedSLisandro Dalcin if (!PetscBeganPython) PetscFunctionReturn(0); 291e0ab9aedSLisandro Dalcin if (!PyErr_Occurred()) PetscFunctionReturn(0); 292e0ab9aedSLisandro Dalcin PyErr_Fetch(&exc,&val,&tb); 293e0ab9aedSLisandro Dalcin PyErr_NormalizeException(&exc,&val,&tb); 294e0ab9aedSLisandro Dalcin PyErr_Display(exc ? exc : Py_None, 295e0ab9aedSLisandro Dalcin val ? val : Py_None, 296e0ab9aedSLisandro Dalcin tb ? tb : Py_None); 297e0ab9aedSLisandro Dalcin PyErr_Restore(exc,val,tb); 298e0ab9aedSLisandro Dalcin PetscFunctionReturn(0); 299e0ab9aedSLisandro Dalcin } 300e0ab9aedSLisandro Dalcin 301c4aff060SBarry Smith /* ---------------------------------------------------------------- */ 3025180491cSLisandro Dalcin 3035180491cSLisandro Dalcin EXTERN_C_BEGIN 3045180491cSLisandro Dalcin extern PetscErrorCode (*PetscPythonMonitorSet_C)(PetscObject,const char[]); 3055180491cSLisandro Dalcin PetscErrorCode (*PetscPythonMonitorSet_C)(PetscObject,const char[]) = PETSC_NULL; 3065180491cSLisandro Dalcin EXTERN_C_END 3075180491cSLisandro Dalcin 3085180491cSLisandro Dalcin #undef __FUNCT__ 3095180491cSLisandro Dalcin #define __FUNCT__ "PetscPythonMonitorSet" 3105180491cSLisandro Dalcin /*@C 3115180491cSLisandro Dalcin PetscPythonMonitorSet - Set Python monitor 3125180491cSLisandro Dalcin 3135180491cSLisandro Dalcin Level: developer 3145180491cSLisandro Dalcin 3155180491cSLisandro Dalcin .keywords: Python 3165180491cSLisandro Dalcin 3175180491cSLisandro Dalcin @*/ 3185180491cSLisandro Dalcin PetscErrorCode PetscPythonMonitorSet(PetscObject obj, const char url[]) 3195180491cSLisandro Dalcin { 3205180491cSLisandro Dalcin PetscErrorCode ierr; 321*6e111a19SKarl Rupp 3225180491cSLisandro Dalcin PetscFunctionBegin; 3235180491cSLisandro Dalcin PetscValidHeader(obj,1); 3245180491cSLisandro Dalcin PetscValidCharPointer(url,2); 3255180491cSLisandro Dalcin if (PetscPythonMonitorSet_C == PETSC_NULL) { 3265180491cSLisandro Dalcin ierr = PetscPythonInitialize(PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 3275180491cSLisandro Dalcin if (PetscPythonMonitorSet_C == PETSC_NULL) 3285180491cSLisandro Dalcin SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Couldn't initialize Python support for monitors"); 3295180491cSLisandro Dalcin } 3305180491cSLisandro Dalcin ierr = PetscPythonMonitorSet_C(obj,url);CHKERRQ(ierr); 3315180491cSLisandro Dalcin PetscFunctionReturn(0); 3325180491cSLisandro Dalcin } 3335180491cSLisandro Dalcin 3345180491cSLisandro Dalcin /* ---------------------------------------------------------------- */ 335