remove compatibility for compiling LAMMPS with Python 2.x and Python 3.5 and older
This commit is contained in:
@ -1,7 +0,0 @@
|
||||
# Settings that the LAMMPS build will import when this package library is used
|
||||
# See the README file for more explanation
|
||||
|
||||
python_SYSINC = $(shell which python2-config > /dev/null 2>&1 && python2-config --includes || (which python-config > /dev/null 2>&1 && python-config --includes || :))
|
||||
python_SYSLIB = $(shell which python2-config > /dev/null 2>&1 && python2-config --ldflags || (which python-config > /dev/null 2>&1 && python-config --ldflags || :))
|
||||
python_SYSPATH =
|
||||
PYTHON=$(shell which python2 > /dev/null 2>&1 && echo python2 || echo python)
|
||||
@ -9,30 +9,29 @@ installation. If needed, you can copy one of the other provided
|
||||
Makefile.lammps.* files to to Makefile.lammps before building
|
||||
LAMMPS itself.
|
||||
|
||||
The files Makefile.lammps.python2 and Makefile.lammps.python3 are
|
||||
similar to the default file, but meant for the case that both,
|
||||
python 2 and python 3, are installed simultaneously and you want
|
||||
to prefer one over the other. If neither of these files work, you
|
||||
may have to create a custom Makefile.lammps file suitable for
|
||||
the version of Python on your system. To illustrate, these are
|
||||
example settings from the Makefile.lammps.python2.7 file:
|
||||
The file Makefile.lammps.python3 is similar to the default file, but
|
||||
meant for the case that both, python 2 and python 3, are installed
|
||||
simultaneously. LAMMPS only supports python 3. If neither of these
|
||||
files work, you may have to create a custom Makefile.lammps file
|
||||
suitable for the version of Python on your system. To illustrate, these
|
||||
are example settings from the Makefile.lammps.python3.13 file:
|
||||
|
||||
python_SYSINC = -I/usr/local/include/python2.7
|
||||
python_SYSLIB = -lpython2.7 -lnsl -ldl -lreadline -ltermcap -lpthread -lutil -lm
|
||||
python_SYSPATH =
|
||||
PYTHON=python2.7
|
||||
python_SYSINC = -I/usr/local/include/python3.13
|
||||
python_SYSLIB = -lpython3.13 -ldl -lm
|
||||
python_SYSPATH = -L/usr/lib64
|
||||
PYTHON=python3.13
|
||||
|
||||
python_SYSINC refers to the directory where Python's Python.h file is
|
||||
found. LAMMPS includes this file.
|
||||
|
||||
python_SYSLIB refers to the libraries needed to link to from an
|
||||
application (LAMMPS in this case) to "embed" Python in the
|
||||
application. The Python library itself is listed (-lpython2.7) are
|
||||
application. The Python library itself is listed (-lpython3.13) are
|
||||
are several system libraries needed by Python.
|
||||
|
||||
python_SYSPATH refers to the path (e.g. -L/usr/local/lib) where the
|
||||
Python library can be found. You may not need this setting if the
|
||||
path is already included in your LD_LIBRARY_PATH environment variable.
|
||||
path is already included in your LIBRARY_PATH environment variable.
|
||||
|
||||
PYTHON is the name of the python interpreter. It is used for
|
||||
installing the LAMMPS python module with "make install-python"
|
||||
@ -45,7 +44,7 @@ run in embedded mode on your machine.
|
||||
|
||||
Here is what this Python doc page says about it:
|
||||
|
||||
https://docs.python.org/2/extending/embedding.html#compiling-and-linking-under-unix-like-systems
|
||||
https://docs.python.org/3/extending/embedding.html#compiling-and-linking-under-unix-like-systems
|
||||
|
||||
"It is not necessarily trivial to find the right flags to pass to your
|
||||
compiler (and linker) in order to embed the Python interpreter into
|
||||
|
||||
@ -68,12 +68,12 @@ MLIAPModelPythonKokkos<DeviceType>::MLIAPModelPythonKokkos(LAMMPS *lmp, char *co
|
||||
// Recipe from lammps/src/pair_python.cpp :
|
||||
// add current directory to PYTHONPATH
|
||||
PyObject *py_path = PySys_GetObject((char *) "path");
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING("."));
|
||||
PyList_Append(py_path, PyUnicode_FromString("."));
|
||||
|
||||
// if LAMMPS_POTENTIALS environment variable is set, add it to PYTHONPATH as well
|
||||
const char *potentials_path = getenv("LAMMPS_POTENTIALS");
|
||||
if (potentials_path != nullptr) {
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING(potentials_path));
|
||||
PyList_Append(py_path, PyUnicode_FromString(potentials_path));
|
||||
}
|
||||
PyGILState_Release(gstate);
|
||||
if (coefffilename) read_coeffs(coefffilename);
|
||||
|
||||
@ -62,12 +62,12 @@ MLIAPModelPython::MLIAPModelPython(LAMMPS *lmp, char *coefffilename, bool is_chi
|
||||
// Recipe from lammps/src/pair_python.cpp :
|
||||
// add current directory to PYTHONPATH
|
||||
PyObject *py_path = PySys_GetObject((char *) "path");
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING("."));
|
||||
PyList_Append(py_path, PyUnicode_FromString("."));
|
||||
|
||||
// if LAMMPS_POTENTIALS environment variable is set, add it to PYTHONPATH as well
|
||||
const char *potentials_path = getenv("LAMMPS_POTENTIALS");
|
||||
if (potentials_path != nullptr) {
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING(potentials_path));
|
||||
PyList_Append(py_path, PyUnicode_FromString(potentials_path));
|
||||
}
|
||||
PyGILState_Release(gstate);
|
||||
if (coefffilename) read_coeffs(coefffilename);
|
||||
|
||||
@ -70,7 +70,7 @@ FixPythonInvoke::FixPythonInvoke(LAMMPS *lmp, int narg, char **arg) :
|
||||
error->all(FLERR,"Could not find Python function");
|
||||
}
|
||||
|
||||
lmpPtr = PY_VOID_POINTER(lmp);
|
||||
lmpPtr = PyCapsule_New((void *)lmp, nullptr, nullptr);
|
||||
|
||||
// nvalid = next step on which end_of_step or post_force does something
|
||||
// add nextvalid() to all computes that store invocation times
|
||||
|
||||
@ -44,7 +44,7 @@ FixPythonMove::FixPythonMove(LAMMPS *lmp, int narg, char **arg) :
|
||||
|
||||
// add current directory to PYTHONPATH
|
||||
PyObject *py_path = PySys_GetObject((char *)"path");
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING("."));
|
||||
PyList_Append(py_path, PyUnicode_FromString("."));
|
||||
|
||||
|
||||
// create integrator instance
|
||||
@ -73,7 +73,7 @@ FixPythonMove::FixPythonMove(LAMMPS *lmp, int narg, char **arg) :
|
||||
error->all(FLERR,"Could not find integrator class {} in module {}", cls_name, module_name);
|
||||
}
|
||||
|
||||
PyObject *ptr = PY_VOID_POINTER(lmp);
|
||||
PyObject *ptr = PyCapsule_New((void *)lmp, nullptr, nullptr);
|
||||
PyObject *py_move_obj = PyObject_CallFunction(py_move_type, (char *)"O", ptr);
|
||||
Py_CLEAR(ptr);
|
||||
|
||||
|
||||
@ -54,14 +54,14 @@ PairPython::PairPython(LAMMPS *lmp) : Pair(lmp) {
|
||||
|
||||
PyUtils::GIL lock;
|
||||
PyObject *py_path = PySys_GetObject((char *)"path");
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING("."));
|
||||
PyList_Append(py_path, PyUnicode_FromString("."));
|
||||
|
||||
// if LAMMPS_POTENTIALS environment variable is set,
|
||||
// add it to PYTHONPATH as well
|
||||
|
||||
const char *potentials_path = getenv("LAMMPS_POTENTIALS");
|
||||
if (potentials_path != nullptr) {
|
||||
PyList_Append(py_path, PY_STRING_FROM_STRING(potentials_path));
|
||||
PyList_Append(py_path, PyUnicode_FromString(potentials_path));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -16,22 +16,11 @@
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
// Wrap API changes between Python 2 and 3 using macros
|
||||
#if PY_MAJOR_VERSION == 2
|
||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||
#define PY_INT_FROM_LONG(X) PyLong_FromLongLong(X)
|
||||
#define PY_INT_AS_LONG(X) PyLong_AsLongLong(X)
|
||||
#define PY_LONG_FROM_STRING(X) std::stoll(X)
|
||||
#else
|
||||
#define PY_INT_FROM_LONG(X) PyInt_FromLong(X)
|
||||
#define PY_INT_AS_LONG(X) PyInt_AsLong(X)
|
||||
#define PY_LONG_FROM_STRING(X) std::stol(X)
|
||||
#if PY_VERSION_HEX < 0x030600f0
|
||||
#error Python version 3.6 or later is required by LAMMPS
|
||||
#endif
|
||||
#define PY_STRING_FROM_STRING(X) PyString_FromString(X)
|
||||
#define PY_VOID_POINTER(X) PyCObject_FromVoidPtr((void *) X, nullptr)
|
||||
#define PY_STRING_AS_STRING(X) PyString_AsString(X)
|
||||
|
||||
#elif PY_MAJOR_VERSION == 3
|
||||
// Wrap API differences between platforms using macros
|
||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||
#define PY_INT_FROM_LONG(X) PyLong_FromLongLong(X)
|
||||
#define PY_INT_AS_LONG(X) PyLong_AsLongLong(X)
|
||||
@ -41,9 +30,5 @@
|
||||
#define PY_INT_AS_LONG(X) PyLong_AsLong(X)
|
||||
#define PY_LONG_FROM_STRING(X) std::stol(X)
|
||||
#endif
|
||||
#define PY_STRING_FROM_STRING(X) PyUnicode_FromString(X)
|
||||
#define PY_VOID_POINTER(X) PyCapsule_New((void *) X, nullptr, nullptr)
|
||||
#define PY_STRING_AS_STRING(X) PyUnicode_AsUTF8(X)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
@ -361,12 +361,12 @@ void PythonImpl::invoke_function(int ifunc, char *result)
|
||||
if (!str)
|
||||
error->all(FLERR, "Could not evaluate Python function {} input variable: {}",
|
||||
pfuncs[ifunc].name, pfuncs[ifunc].svalue[i]);
|
||||
pValue = PY_STRING_FROM_STRING(str);
|
||||
pValue = PyUnicode_FromString(str);
|
||||
} else {
|
||||
pValue = PY_STRING_FROM_STRING(pfuncs[ifunc].svalue[i]);
|
||||
pValue = PyUnicode_FromString(pfuncs[ifunc].svalue[i]);
|
||||
}
|
||||
} else if (itype == PTR) {
|
||||
pValue = PY_VOID_POINTER(lmp);
|
||||
pValue = PyCapsule_New((void *)lmp, nullptr, nullptr);
|
||||
} else {
|
||||
error->all(FLERR, "Unsupported variable type: {}", itype);
|
||||
}
|
||||
@ -397,7 +397,7 @@ void PythonImpl::invoke_function(int ifunc, char *result)
|
||||
auto value = fmt::format("{:.15g}", PyFloat_AsDouble(pValue));
|
||||
strncpy(result, value.c_str(), Variable::VALUELENGTH - 1);
|
||||
} else if (otype == STRING) {
|
||||
const char *pystr = PY_STRING_AS_STRING(pValue);
|
||||
const char *pystr = PyUnicode_AsUTF8(pValue);
|
||||
if (pfuncs[ifunc].longstr)
|
||||
strncpy(pfuncs[ifunc].longstr, pystr, pfuncs[ifunc].length_longstr);
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user