remove -DLAMMPS_EXCEPTIONS and always enable the corresponding code paths

This commit is contained in:
Axel Kohlmeyer
2023-04-15 17:49:08 -04:00
parent e506dd738b
commit 0cd5ae5f2e
17 changed files with 58 additions and 208 deletions

View File

@ -384,11 +384,6 @@ if(NOT ${LAMMPS_MEMALIGN} STREQUAL "0")
target_compile_definitions(lammps PRIVATE -DLAMMPS_MEMALIGN=${LAMMPS_MEMALIGN}) target_compile_definitions(lammps PRIVATE -DLAMMPS_MEMALIGN=${LAMMPS_MEMALIGN})
endif() endif()
option(LAMMPS_EXCEPTIONS "enable the use of C++ exceptions for error messages (useful for library interface)" ${ENABLE_TESTING})
if(LAMMPS_EXCEPTIONS)
target_compile_definitions(lammps PUBLIC -DLAMMPS_EXCEPTIONS)
endif()
# "hard" dependencies between packages resulting # "hard" dependencies between packages resulting
# in an error instead of skipping over files # in an error instead of skipping over files
pkg_depends(ML-IAP ML-SNAP) pkg_depends(ML-IAP ML-SNAP)

View File

@ -28,10 +28,8 @@ if(MSVC)
add_compile_options(/Zc:__cplusplus) add_compile_options(/Zc:__cplusplus)
add_compile_options(/wd4244) add_compile_options(/wd4244)
add_compile_options(/wd4267) add_compile_options(/wd4267)
if(LAMMPS_EXCEPTIONS)
add_compile_options(/EHsc) add_compile_options(/EHsc)
endif() endif()
endif()
add_compile_definitions(_CRT_SECURE_NO_WARNINGS) add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
endif() endif()

View File

@ -38,9 +38,6 @@ endif()
if(BUILD_LAMMPS_SHELL) if(BUILD_LAMMPS_SHELL)
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(READLINE IMPORTED_TARGET REQUIRED readline) pkg_check_modules(READLINE IMPORTED_TARGET REQUIRED readline)
if(NOT LAMMPS_EXCEPTIONS)
message(WARNING "The LAMMPS shell needs LAMMPS_EXCEPTIONS enabled for full functionality")
endif()
# include resource compiler to embed icons into the executable on Windows # include resource compiler to embed icons into the executable on Windows
if(CMAKE_SYSTEM_NAME STREQUAL "Windows") if(CMAKE_SYSTEM_NAME STREQUAL "Windows")

View File

@ -459,27 +459,13 @@ those systems:
.. _exceptions: .. _exceptions:
Exception handling when using LAMMPS as a library Exception handling when using LAMMPS as a library
------------------------------------------------------------------ -------------------------------------------------
This setting is useful when external codes drive LAMMPS as a library. LAMMPS errors do not kill the calling code, but throw an exception. In
With this option enabled, LAMMPS errors do not kill the calling code. the C-library interface, the call stack is unwound and control returns
Instead, the call stack is unwound and control returns to the caller, to the caller, e.g. to Python or a code that is coupled to LAMMPS and
e.g. to Python. Of course, the calling code has to be set up to the error status can be queried. When using C++ directly, the calling
*catch* exceptions thrown from within LAMMPS. code has to be set up to *catch* exceptions thrown from within LAMMPS.
.. tabs::
.. tab:: CMake build
.. code-block:: bash
-D LAMMPS_EXCEPTIONS=value # yes or no (default)
.. tab:: Traditional make
.. code-block:: make
LMP_INC = -DLAMMPS_EXCEPTIONS <other LMP_INC settings>
.. note:: .. note::

View File

@ -2172,19 +2172,13 @@ Procedures Bound to the :f:type:`lammps` Derived Type
.. versionadded:: 3Nov2022 .. versionadded:: 3Nov2022
In case of an error, LAMMPS will either abort or throw a C++ exception. When using the library interface, the library interface functions
The latter has to be :ref:`enabled at compile time <exceptions>`. will "catch" exceptions, and then the error status can be checked by
This function checks if exceptions were enabled. calling :f:func:`has_error`. The most recent error message can be
retrieved via :f:func:`get_last_error_message`. This allows to
When using the library interface with C++ exceptions enabled, the library restart a calculation or delete and recreate the LAMMPS instance when
interface functions will "catch" them, and the error status can then be a C++ exception occurs. One application of using exceptions this way
checked by calling :f:func:`has_error`. The most recent error message can be is the :ref:`lammps_shell`.
retrieved via :f:func:`get_last_error_message`.
This can allow one to restart a calculation or delete and recreate
the LAMMPS instance when a C++ exception occurs. One application
of using exceptions this way is the :ref:`lammps_shell`. If C++
exceptions are disabled and an error happens during a call to
LAMMPS or the Fortran API, the application will terminate.
:to: :cpp:func:`lammps_config_has_exceptions` :to: :cpp:func:`lammps_config_has_exceptions`
:r has_exceptions: :r has_exceptions:

View File

@ -338,8 +338,6 @@ Some common LAMMPS specific variables
- common compiler flags, for optimization or instrumentation (default:) - common compiler flags, for optimization or instrumentation (default:)
* - ``LAMMPS_MACHINE`` * - ``LAMMPS_MACHINE``
- when set to ``name`` the LAMMPS executable and library will be called ``lmp_name`` and ``liblammps_name.a`` - when set to ``name`` the LAMMPS executable and library will be called ``lmp_name`` and ``liblammps_name.a``
* - ``LAMMPS_EXCEPTIONS``
- when set to ``on`` errors will throw a C++ exception instead of aborting (default: ``off``)
* - ``FFT`` * - ``FFT``
- select which FFT library to use: ``FFTW3``, ``MKL``, ``KISS`` (default, unless FFTW3 is found) - select which FFT library to use: ``FFTW3``, ``MKL``, ``KISS`` (default, unless FFTW3 is found)
* - ``FFT_SINGLE`` * - ``FFT_SINGLE``
@ -412,9 +410,9 @@ interface (``ccmake`` or ``cmake-gui``).
Using a preset to select a compiler package (``clang.cmake``, Using a preset to select a compiler package (``clang.cmake``,
``gcc.cmake``, ``intel.cmake``, ``oneapi.cmake``, or ``pgi.cmake``) ``gcc.cmake``, ``intel.cmake``, ``oneapi.cmake``, or ``pgi.cmake``)
are an exception to the mechanism of updating the configuration incrementally, are an exception to the mechanism of updating the configuration
as they will trigger a reset of cached internal CMake settings and thus incrementally, as they will trigger a reset of cached internal CMake
reset settings to their default values. settings and thus reset settings to their default values.
Compilation and build targets Compilation and build targets
----------------------------- -----------------------------

View File

@ -53,10 +53,10 @@ System-wide Installation
Step 1: Building LAMMPS as a shared library Step 1: Building LAMMPS as a shared library
""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""
To use LAMMPS inside of Python it has to be compiled as shared library. This To use LAMMPS inside of Python it has to be compiled as shared
library is then loaded by the Python interface. In this example we enable the library. This library is then loaded by the Python interface. In this
MOLECULE package and compile LAMMPS with C++ exceptions, PNG, JPEG and FFMPEG example we enable the MOLECULE package and compile LAMMPS with PNG, JPEG
output support enabled. and FFMPEG output support enabled.
Step 1a: For the CMake based build system, the steps are: Step 1a: For the CMake based build system, the steps are:
@ -66,7 +66,7 @@ Step 1a: For the CMake based build system, the steps are:
cd $LAMMPS_DIR/build-shared cd $LAMMPS_DIR/build-shared
# MPI, PNG, Jpeg, FFMPEG are auto-detected # MPI, PNG, Jpeg, FFMPEG are auto-detected
cmake ../cmake -DPKG_MOLECULE=yes -DLAMMPS_EXCEPTIONS=yes -DBUILD_LIB=yes -DBUILD_SHARED_LIBS=yes cmake ../cmake -DPKG_MOLECULE=yes -DBUILD_LIB=yes -DBUILD_SHARED_LIBS=yes
make make
Step 1b: For the legacy, make based build system, the steps are: Step 1b: For the legacy, make based build system, the steps are:
@ -79,7 +79,7 @@ Step 1b: For the legacy, make based build system, the steps are:
make yes-MOLECULE make yes-MOLECULE
# compile shared library using Makefile # compile shared library using Makefile
make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG -DLAMMPS_EXCEPTIONS" JPG_LIB="-lpng -ljpeg" make mpi mode=shlib LMP_INC="-DLAMMPS_PNG -DLAMMPS_JPEG -DLAMMPS_FFMPEG" JPG_LIB="-lpng -ljpeg"
Step 2: Installing the LAMMPS Python package Step 2: Installing the LAMMPS Python package
"""""""""""""""""""""""""""""""""""""""""""" """"""""""""""""""""""""""""""""""""""""""""
@ -356,18 +356,16 @@ Together with matplotlib plotting data out of LAMMPS becomes simple:
Error handling with PyLammps Error handling with PyLammps
---------------------------- ----------------------------
Compiling the shared library with C++ exception support provides a better error Using C++ exceptions in LAMMPS for errors allows capturing them on the
handling experience. Without exceptions the LAMMPS code will terminate the C++ side and rethrowing them on the Python side. This way you can handle
current Python process with an error message. C++ exceptions allow capturing LAMMPS errors through the Python exception handling mechanism.
them on the C++ side and rethrowing them on the Python side. This way you
can handle LAMMPS errors through the Python exception handling mechanism.
.. warning:: .. warning::
Capturing a LAMMPS exception in Python can still mean that the Capturing a LAMMPS exception in Python can still mean that the
current LAMMPS process is in an illegal state and must be terminated. It is current LAMMPS process is in an illegal state and must be
advised to save your data and terminate the Python instance as quickly as terminated. It is advised to save your data and terminate the Python
possible. instance as quickly as possible.
Using PyLammps in IPython notebooks and Jupyter Using PyLammps in IPython notebooks and Jupyter
----------------------------------------------- -----------------------------------------------

View File

@ -1,11 +1,11 @@
Handling LAMMPS errors Handling LAMMPS errors
******************************* **********************
Compiling the shared library with :ref:`C++ exception support <exceptions>` provides a better error The shared library is compiled with :ref:`C++ exception support
handling experience. Without exceptions the LAMMPS code will terminate the <exceptions>` to provide a better error handling experience. C++
current Python process with an error message. C++ exceptions allow capturing exceptions allow capturing errors on the C++ side and rethrowing them on
them on the C++ side and rethrowing them on the Python side. This way the Python side. This way LAMMPS errors can be handled through the
LAMMPS errors can be handled through the Python exception handling mechanism. Python exception handling mechanism.
.. code-block:: python .. code-block:: python
@ -31,6 +31,6 @@ LAMMPS errors can be handled through the Python exception handling mechanism.
.. warning:: .. warning::
Capturing a LAMMPS exception in Python can still mean that the Capturing a LAMMPS exception in Python can still mean that the
current LAMMPS process is in an illegal state and must be terminated. It is current LAMMPS process is in an illegal state and must be
advised to save your data and terminate the Python instance as quickly as terminated. It is advised to save your data and terminate the Python
possible. instance as quickly as possible when running in parallel with MPI.

View File

@ -18,10 +18,7 @@
#include "input.h" #include "input.h"
#include "output.h" #include "output.h"
#include "universe.h" #include "universe.h"
#if defined(LAMMPS_EXCEPTIONS)
#include "update.h" #include "update.h"
#endif
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
@ -40,10 +37,8 @@ static std::string truncpath(const std::string &path)
Error::Error(LAMMPS *lmp) Error::Error(LAMMPS *lmp)
: Pointers(lmp), numwarn(0), maxwarn(100), allwarn(0) : Pointers(lmp), numwarn(0), maxwarn(100), allwarn(0)
{ {
#ifdef LAMMPS_EXCEPTIONS
last_error_message.clear(); last_error_message.clear();
last_error_type = ERROR_NONE; last_error_type = ERROR_NONE;
#endif
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -73,19 +68,11 @@ void Error::universe_all(const std::string &file, int line, const std::string &s
} }
if (universe->ulogfile) fclose(universe->ulogfile); if (universe->ulogfile) fclose(universe->ulogfile);
#ifdef LAMMPS_EXCEPTIONS
// allow commands if an exception was caught in a run // allow commands if an exception was caught in a run
// update may be a null pointer when catching command line errors // update may be a null pointer when catching command line errors
if (update) update->whichflag = 0; if (update) update->whichflag = 0;
throw LAMMPSException(mesg); throw LAMMPSException(mesg);
#else
KokkosLMP::finalize();
MPI_Finalize();
exit(1);
#endif
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -99,19 +86,11 @@ void Error::universe_one(const std::string &file, int line, const std::string &s
universe->me,str,truncpath(file),line); universe->me,str,truncpath(file),line);
if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen); if (universe->uscreen) fputs(mesg.c_str(),universe->uscreen);
#ifdef LAMMPS_EXCEPTIONS
// allow commands if an exception was caught in a run // allow commands if an exception was caught in a run
// update may be a null pointer when catching command line errors // update may be a null pointer when catching command line errors
if (update) update->whichflag = 0; if (update) update->whichflag = 0;
throw LAMMPSAbortException(mesg, universe->uworld); throw LAMMPSAbortException(mesg, universe->uworld);
#else
KokkosLMP::finalize();
MPI_Abort(universe->uworld,1);
exit(1); // to trick "smart" compilers into believing this does not return
#endif
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -155,31 +134,17 @@ void Error::all(const std::string &file, int line, const std::string &str)
utils::logmesg(lmp,mesg); utils::logmesg(lmp,mesg);
} }
#ifdef LAMMPS_EXCEPTIONS
// allow commands if an exception was caught in a run // allow commands if an exception was caught in a run
// update may be a null pointer when catching command line errors // update may be a null pointer when catching command line errors
if (update) update->whichflag = 0; if (update) update->whichflag = 0;
std::string msg = fmt::format("ERROR: {} ({}:{})\n", std::string msg = fmt::format("ERROR: {} ({}:{})\n", str, truncpath(file), line);
str, truncpath(file), line);
if (universe->nworlds > 1) { if (universe->nworlds > 1)
throw LAMMPSAbortException(msg, universe->uworld); throw LAMMPSAbortException(msg, universe->uworld);
} else
throw LAMMPSException(msg); throw LAMMPSException(msg);
#else
if (output) delete output;
if (screen && screen != stdout) fclose(screen);
if (logfile) fclose(logfile);
KokkosLMP::finalize();
if (universe->nworlds > 1) MPI_Abort(universe->uworld,1);
MPI_Finalize();
exit(1);
#endif
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -204,20 +169,11 @@ void Error::one(const std::string &file, int line, const std::string &str)
if (universe->uscreen) if (universe->uscreen)
fputs(mesg.c_str(),universe->uscreen); fputs(mesg.c_str(),universe->uscreen);
#ifdef LAMMPS_EXCEPTIONS
// allow commands if an exception was caught in a run // allow commands if an exception was caught in a run
// update may be a null pointer when catching command line errors // update may be a null pointer when catching command line errors
if (update) update->whichflag = 0; if (update) update->whichflag = 0;
throw LAMMPSAbortException(mesg, world); throw LAMMPSAbortException(mesg, world);
#else
utils::flush_buffers(lmp);
KokkosLMP::finalize();
MPI_Abort(world,1);
exit(1); // to trick "smart" compilers into believing this does not return
#endif
} }
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
@ -322,7 +278,6 @@ void Error::done(int status)
exit(status); exit(status);
} }
#ifdef LAMMPS_EXCEPTIONS
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
return the last error message reported by LAMMPS (only used if return the last error message reported by LAMMPS (only used if
compiled with -DLAMMPS_EXCEPTIONS) compiled with -DLAMMPS_EXCEPTIONS)
@ -353,4 +308,3 @@ void Error::set_last_error(const std::string &msg, ErrorType type)
last_error_message = msg; last_error_message = msg;
last_error_type = type; last_error_type = type;
} }
#endif

View File

@ -15,10 +15,7 @@
#define LMP_ERROR_H #define LMP_ERROR_H
#include "pointers.h" #include "pointers.h"
#ifdef LAMMPS_EXCEPTIONS
#include "exceptions.h" #include "exceptions.h"
#endif
namespace LAMMPS_NS { namespace LAMMPS_NS {
@ -65,7 +62,6 @@ class Error : protected Pointers {
void set_maxwarn(int val) { maxwarn = val; } void set_maxwarn(int val) { maxwarn = val; }
void set_allwarn(int val) { allwarn = val; } void set_allwarn(int val) { allwarn = val; }
#ifdef LAMMPS_EXCEPTIONS
std::string get_last_error() const; std::string get_last_error() const;
ErrorType get_last_error_type() const; ErrorType get_last_error_type() const;
void set_last_error(const std::string &msg, ErrorType type = ERROR_NORMAL); void set_last_error(const std::string &msg, ErrorType type = ERROR_NORMAL);
@ -73,9 +69,7 @@ class Error : protected Pointers {
private: private:
std::string last_error_message; std::string last_error_message;
ErrorType last_error_type; ErrorType last_error_type;
#endif
private:
int numwarn, maxwarn, allwarn; int numwarn, maxwarn, allwarn;
// internal versions that accept explicit fmtlib arguments // internal versions that accept explicit fmtlib arguments
[[noreturn]] void _all(const std::string &, int, fmt::string_view, fmt::format_args args); [[noreturn]] void _all(const std::string &, int, fmt::string_view, fmt::format_args args);

View File

@ -298,7 +298,6 @@ void Info::command(int narg, char **arg)
if (has_jpeg_support()) fputs("-DLAMMPS_JPEG\n",out); if (has_jpeg_support()) fputs("-DLAMMPS_JPEG\n",out);
if (has_ffmpeg_support()) fputs("-DLAMMPS_FFMPEG\n",out); if (has_ffmpeg_support()) fputs("-DLAMMPS_FFMPEG\n",out);
if (has_fft_single_support()) fputs("-DFFT_SINGLE\n",out); if (has_fft_single_support()) fputs("-DFFT_SINGLE\n",out);
if (has_exceptions()) fputs("-DLAMMPS_EXCEPTIONS\n",out);
#if defined(LAMMPS_BIGBIG) #if defined(LAMMPS_BIGBIG)
fputs("-DLAMMPS_BIGBIG\n",out); fputs("-DLAMMPS_BIGBIG\n",out);
@ -1096,11 +1095,7 @@ bool Info::has_fft_single_support() {
} }
bool Info::has_exceptions() { bool Info::has_exceptions() {
#ifdef LAMMPS_EXCEPTIONS
return true; return true;
#else
return false;
#endif
} }
bool Info::has_package(const std::string &package_name) { bool Info::has_package(const std::string &package_name) {

View File

@ -1431,7 +1431,6 @@ void LAMMPS::print_config(FILE *fp)
if (Info::has_jpeg_support()) fputs("-DLAMMPS_JPEG\n",fp); if (Info::has_jpeg_support()) fputs("-DLAMMPS_JPEG\n",fp);
if (Info::has_ffmpeg_support()) fputs("-DLAMMPS_FFMPEG\n",fp); if (Info::has_ffmpeg_support()) fputs("-DLAMMPS_FFMPEG\n",fp);
if (Info::has_fft_single_support()) fputs("-DFFT_SINGLE\n",fp); if (Info::has_fft_single_support()) fputs("-DFFT_SINGLE\n",fp);
if (Info::has_exceptions()) fputs("-DLAMMPS_EXCEPTIONS\n",fp);
#if defined(LAMMPS_BIGBIG) #if defined(LAMMPS_BIGBIG)
fputs("-DLAMMPS_BIGBIG\n",fp); fputs("-DLAMMPS_BIGBIG\n",fp);
#elif defined(LAMMPS_SMALLBIG) #elif defined(LAMMPS_SMALLBIG)

View File

@ -27,6 +27,7 @@
#include "domain.h" #include "domain.h"
#include "dump.h" #include "dump.h"
#include "error.h" #include "error.h"
#include "exceptions.h"
#include "fix.h" #include "fix.h"
#include "fix_external.h" #include "fix_external.h"
#include "force.h" #include "force.h"
@ -53,10 +54,6 @@
#include <cstring> #include <cstring>
#if defined(LAMMPS_EXCEPTIONS)
#include "exceptions.h"
#endif
#if defined(LMP_PYTHON) #if defined(LMP_PYTHON)
#include <Python.h> #include <Python.h>
#endif #endif
@ -93,7 +90,6 @@ static void ptr_argument_warning()
END_CAPTURE END_CAPTURE
------------------------------------------------------------------------- */ ------------------------------------------------------------------------- */
#ifdef LAMMPS_EXCEPTIONS
#define BEGIN_CAPTURE \ #define BEGIN_CAPTURE \
Error *error = lmp->error; \ Error *error = lmp->error; \
try try
@ -111,10 +107,6 @@ static void ptr_argument_warning()
} catch(LAMMPSException &e) { \ } catch(LAMMPSException &e) { \
error->set_last_error(e.message, ERROR_NORMAL); \ error->set_last_error(e.message, ERROR_NORMAL); \
} }
#else
#define BEGIN_CAPTURE
#define END_CAPTURE
#endif
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Library functions to create/destroy an instance of LAMMPS // Library functions to create/destroy an instance of LAMMPS
@ -176,20 +168,19 @@ void *lammps_open(int argc, char **argv, MPI_Comm comm, void **ptr)
lammps_mpi_init(); lammps_mpi_init();
if (ptr) ptr_argument_warning(); if (ptr) ptr_argument_warning();
#ifdef LAMMPS_EXCEPTIONS try {
try
{
lmp = new LAMMPS(argc, argv, comm); lmp = new LAMMPS(argc, argv, comm);
if (ptr) *ptr = (void *) lmp; if (ptr) *ptr = (void *) lmp;
} } catch(LAMMPSException &e) {
catch(LAMMPSException &e) { fprintf(stderr, "LAMMPS Exception: %s\n", e.message);
fmt::print(stderr, "LAMMPS Exception: {}", e.message); if (ptr) *ptr = nullptr;
} catch (fmt::format_error &fe) {
fprintf(stderr, "fmt::format_error: %s\n", fe.what());
if (ptr) *ptr = nullptr;
} catch (std::exception &e) {
fprintf(stderr, "Exception: %s\n", e.what());
if (ptr) *ptr = nullptr; if (ptr) *ptr = nullptr;
} }
#else
lmp = new LAMMPS(argc, argv, comm);
if (ptr) *ptr = (void *) lmp;
#endif
return (void *) lmp; return (void *) lmp;
} }
@ -484,7 +475,6 @@ void lammps_error(void *handle, int error_type, const char *error_text)
} }
END_CAPTURE END_CAPTURE
#if defined(LAMMPS_EXCEPTIONS)
// with enabled exceptions the above code will simply throw an // with enabled exceptions the above code will simply throw an
// exception and record the error message. So we have to explicitly // exception and record the error message. So we have to explicitly
// stop here like we do in main.cpp // stop here like we do in main.cpp
@ -500,7 +490,6 @@ void lammps_error(void *handle, int error_type, const char *error_text)
exit(1); exit(1);
} }
} }
#endif
} }
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
@ -2195,9 +2184,7 @@ void *lammps_extract_variable(void *handle, const char *name, const char *group)
} }
} }
END_CAPTURE END_CAPTURE
#if defined(LAMMPS_EXCEPTIONS)
return nullptr; return nullptr;
#endif
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -6335,26 +6322,15 @@ void lammps_force_timeout(void *handle)
This function can be used to query if an error inside of LAMMPS This function can be used to query if an error inside of LAMMPS
has thrown a :ref:`C++ exception <exceptions>`. has thrown a :ref:`C++ exception <exceptions>`.
.. note::
This function will always report "no error" when the LAMMPS library
has been compiled without ``-DLAMMPS_EXCEPTIONS``, which turns fatal
errors aborting LAMMPS into C++ exceptions. You can use the library
function :cpp:func:`lammps_config_has_exceptions` to check whether this is
the case.
\endverbatim \endverbatim
* *
* \param handle pointer to a previously created LAMMPS instance cast to ``void *``. * \param handle pointer to a previously created LAMMPS instance cast to ``void *``.
* \return 0 on no error, 1 on error. * \return 0 on no error, 1 on error.
*/ */
int lammps_has_error(void *handle) { int lammps_has_error(void *handle) {
#ifdef LAMMPS_EXCEPTIONS
LAMMPS *lmp = (LAMMPS *) handle; LAMMPS *lmp = (LAMMPS *) handle;
Error *error = lmp->error; Error *error = lmp->error;
return (error->get_last_error().empty()) ? 0 : 1; return (error->get_last_error().empty()) ? 0 : 1;
#else
return 0;
#endif
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
@ -6373,12 +6349,6 @@ a "2" indicates an abort that would happen only in a single MPI rank
and thus may not be recoverable, as other MPI ranks may be waiting on and thus may not be recoverable, as other MPI ranks may be waiting on
the failing MPI ranks to send messages. the failing MPI ranks to send messages.
.. note::
This function will do nothing when the LAMMPS library has been
compiled without ``-DLAMMPS_EXCEPTIONS``, which turns errors aborting
LAMMPS into C++ exceptions. You can use the library function
:cpp:func:`lammps_config_has_exceptions` to check whether this is the case.
\endverbatim \endverbatim
* *
* \param handle pointer to a previously created LAMMPS instance cast to ``void *``. * \param handle pointer to a previously created LAMMPS instance cast to ``void *``.
@ -6387,7 +6357,6 @@ the failing MPI ranks to send messages.
* \return 1 when all ranks had the error, 2 on a single rank error. */ * \return 1 when all ranks had the error, 2 on a single rank error. */
int lammps_get_last_error_message(void *handle, char *buffer, int buf_size) { int lammps_get_last_error_message(void *handle, char *buffer, int buf_size) {
#ifdef LAMMPS_EXCEPTIONS
LAMMPS *lmp = (LAMMPS *) handle; LAMMPS *lmp = (LAMMPS *) handle;
Error *error = lmp->error; Error *error = lmp->error;
buffer[0] = buffer[buf_size-1] = '\0'; buffer[0] = buffer[buf_size-1] = '\0';
@ -6398,7 +6367,6 @@ int lammps_get_last_error_message(void *handle, char *buffer, int buf_size) {
error->set_last_error("", ERROR_NONE); error->set_last_error("", ERROR_NONE);
return error_type; return error_type;
} }
#endif
return 0; return 0;
} }

View File

@ -13,13 +13,10 @@
#include "lammps.h" #include "lammps.h"
#include "exceptions.h"
#include "input.h" #include "input.h"
#include "library.h" #include "library.h"
#if defined(LAMMPS_EXCEPTIONS)
#include "exceptions.h"
#endif
#include <cstdlib> #include <cstdlib>
#include <mpi.h> #include <mpi.h>
@ -75,7 +72,6 @@ int main(int argc, char **argv)
feenableexcept(FE_OVERFLOW); feenableexcept(FE_OVERFLOW);
#endif #endif
#ifdef LAMMPS_EXCEPTIONS
try { try {
auto lammps = new LAMMPS(argc, argv, lammps_comm); auto lammps = new LAMMPS(argc, argv, lammps_comm);
lammps->input->file(); lammps->input->file();
@ -99,18 +95,6 @@ int main(int argc, char **argv)
MPI_Abort(MPI_COMM_WORLD, 1); MPI_Abort(MPI_COMM_WORLD, 1);
exit(1); exit(1);
} }
#else
try {
auto lammps = new LAMMPS(argc, argv, lammps_comm);
lammps->input->file();
delete lammps;
} catch (fmt::format_error &fe) {
fprintf(stderr, "fmt::format_error: %s\n", fe.what());
finalize();
MPI_Abort(MPI_COMM_WORLD, 1);
exit(1);
}
#endif
finalize(); finalize();
MPI_Barrier(lammps_comm); MPI_Barrier(lammps_comm);
MPI_Finalize(); MPI_Finalize();

View File

@ -46,13 +46,6 @@ else()
endif() endif()
list(APPEND TEST_CONFIG_DEFS -DLAMMPS_HAS_MPI=${HAS_MPI}) list(APPEND TEST_CONFIG_DEFS -DLAMMPS_HAS_MPI=${HAS_MPI})
if(LAMMPS_EXCEPTIONS)
set(HAS_EXCEPTIONS 1)
else()
set(HAS_EXCEPTIONS 0)
endif()
list(APPEND TEST_CONFIG_DEFS -DLAMMPS_HAS_EXCEPTIONS=${HAS_EXCEPTIONS})
foreach(WITH "JPEG" "PNG" "GZIP" "FFMPEG") foreach(WITH "JPEG" "PNG" "GZIP" "FFMPEG")
if(WITH_${WITH}) if(WITH_${WITH})
set(HAS_${WITH} 1) set(HAS_${WITH} 1)

View File

@ -195,7 +195,7 @@ TEST_F(LibraryConfig, force_timeout)
TEST(LAMMPSConfig, exceptions) TEST(LAMMPSConfig, exceptions)
{ {
EXPECT_EQ(lammps_config_has_exceptions(), LAMMPS_HAS_EXCEPTIONS); EXPECT_EQ(lammps_config_has_exceptions(), 1);
}; };
TEST(LAMMPSConfig, mpi_support) TEST(LAMMPSConfig, mpi_support)

View File

@ -86,13 +86,10 @@ if(Python_EXECUTABLE)
WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
set_tests_properties(PythonOpen PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}") set_tests_properties(PythonOpen PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}")
# some of the tests in this file will fail without exceptions enabled
if(LAMMPS_EXCEPTIONS)
add_test(NAME PythonCommands add_test(NAME PythonCommands
COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-commands.py -v COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-commands.py -v
WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}) WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
set_tests_properties(PythonCommands PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}") set_tests_properties(PythonCommands PROPERTIES ENVIRONMENT "${PYTHON_TEST_ENVIRONMENT}")
endif()
add_test(NAME PythonNumpy add_test(NAME PythonNumpy
COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-numpy.py -v COMMAND ${PYTHON_TEST_RUNNER} ${CMAKE_CURRENT_SOURCE_DIR}/python-numpy.py -v