diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index 60ac3f70c0..e58bb73029 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -379,6 +379,14 @@ foreach(PKG_WITH_INCL KSPACE PYTHON VORONOI USER-COLVARS USER-MOLFILE USER-NETCD endif() endforeach() +# optionally enable building script wrappers using swig +option(WITH_SWIG "Build scripting language wrappers with SWIG" OFF) +if(WITH_SWIG) + get_filename_component(LAMMPS_SWIG_DIR ${LAMMPS_SOURCE_DIR}/../swig ABSOLUTE) + get_filename_component(LAMMPS_SWIG_BIN ${CMAKE_BINARY_DIR}/swig ABSOLUTE) + add_subdirectory(${LAMMPS_SWIG_DIR} ${LAMMPS_SWIG_BIN}) +endif() + set(CMAKE_TUNE_FLAGS "${CMAKE_TUNE_DEFAULT}" CACHE STRING "Compiler and machine specific optimization flags (compilation only)") separate_arguments(CMAKE_TUNE_FLAGS) foreach(_FLAG ${CMAKE_TUNE_FLAGS}) diff --git a/swig/CMakeLists.txt b/swig/CMakeLists.txt new file mode 100644 index 0000000000..18c6ac3195 --- /dev/null +++ b/swig/CMakeLists.txt @@ -0,0 +1,55 @@ +# CMake configuration for generating script language interfaces with swig + +# set minimum CMake version required and switch to new policies +cmake_minimum_required(VERSION 3.14) +if(POLICY CMP0078) + cmake_policy(SET CMP0078 NEW) +endif() +if(POLICY CMP0086) + cmake_policy(SET CMP0086 NEW) +endif() + +if(NOT BUILD_SHARED_LIBS) + error(FATAL_ERROR "Option BUILD_SHARED_LIBS must be enabled to use SWIG wrappers") +endif() + +find_package(SWIG REQUIRED) +include(${SWIG_USE_FILE}) + +option(BUILD_SWIG_LUA "Build Lua wrapper with SWIG" OFF) +option(BUILD_SWIG_PERL5 "Build Perl5 wrapper with SWIG" OFF) +option(BUILD_SWIG_PYTHON "Build Python wrapper with SWIG" OFF) +option(BUILD_SWIG_TCL "Build Tcl wrapper with SWIG" OFF) + +if(BUILD_SWIG_PYTHON) + set_property(SOURCE lammps.i PROPERTY SWIG_MODULE_NAME pylammps) + swig_add_library(pylammps TYPE MODULE LANGUAGE python SOURCES lammps.i) + find_package(Python REQUIRED COMPONENTS Development) + swig_link_libraries(pylammps PRIVATE lammps Python::Python) +endif() + +if(BUILD_SWIG_PERL5) + set_property(SOURCE lammps.i PROPERTY SWIG_MODULE_NAME pllammps) + swig_add_library(pllammps TYPE MODULE LANGUAGE perl5 SOURCES lammps.i) + find_package(PerlLibs REQUIRED 5.0) + target_compile_definitions(pllammps PRIVATE _LARGEFILE64_SOURCE) + target_include_directories(pllammps PRIVATE ${PERL_INCLUDE_PATH}) + swig_link_libraries(pllammps PRIVATE lammps ${PERL_LIBRARY}) +endif() + +if(BUILD_SWIG_LUA) + set_property(SOURCE lammps.i PROPERTY SWIG_MODULE_NAME lualammps) + swig_add_library(lualammps TYPE MODULE LANGUAGE lua SOURCES lammps.i) + find_package(Lua REQUIRED) + target_include_directories(lualammps PRIVATE ${LUA_INCLUDE_PATH}) + swig_link_libraries(lualammps PRIVATE lammps ${LUA_LIBRARY}) +endif() + +if(BUILD_SWIG_TCL) + set_property(SOURCE lammps.i PROPERTY SWIG_MODULE_NAME tcllammps) + swig_add_library(tcllammps TYPE MODULE LANGUAGE tcl SOURCES lammps.i) + find_package(TCL REQUIRED) + target_include_directories(tcllammps PRIVATE ${TCL_INCLUDE_PATH}) + swig_link_libraries(tcllammps PRIVATE lammps ${TCL_LIBRARY}) +endif() + diff --git a/swig/lammps.i b/swig/lammps.i new file mode 100644 index 0000000000..4ef6fdf994 --- /dev/null +++ b/swig/lammps.i @@ -0,0 +1,161 @@ +%{ +/* extern void *lammps_open(int argc, char **argv, MPI_Comm comm, void **ptr); */ +extern void *lammps_open_no_mpi(int argc, char **argv, void **ptr); +extern void *lammps_open_fortran(int argc, char **argv, int f_comm); +extern void lammps_close(void *handle); +extern void lammps_mpi_init(); +extern void lammps_mpi_finalize(); +extern void lammps_free(void *ptr); +extern void lammps_file(void *handle, const char *file); +extern char *lammps_command(void *handle, const char *cmd); +extern void lammps_commands_list(void *handle, int ncmd, const char **cmds); +extern void lammps_commands_string(void *handle, const char *str); +extern int lammps_version(void *handle); +extern void lammps_get_os_info(char *buffer, int buf_size); +extern void lammps_memory_usage(void *handle, double *meminfo); +extern int lammps_get_mpi_comm(void *handle); +extern double lammps_get_natoms(void *handle); +extern double lammps_get_thermo(void *handle, const char *keyword); +extern void lammps_extract_box(void *handle, double *boxlo, double *boxhi, + double *xy, double *yz, double *xz, + int *pflags, int *boxflag); +extern void lammps_reset_box(void *handle, double *boxlo, double *boxhi, + double xy, double yz, double xz); +extern int lammps_extract_setting(void *handle, const char *keyword); +extern void *lammps_extract_global(void *handle, const char *name); +extern void *lammps_extract_atom(void *handle, const char *name); +extern int lammps_extract_global_datatype(void *handle, const char *name); +extern int lammps_extract_atom_datatype(void *handle, const char *name); +/* extern int lammps_create_atoms(void *handle, int n, int *id, int *type, + extern int lammps_create_atoms(void *handle, int n, int64_t *id, int *type, */ +extern void *lammps_extract_compute(void *handle, char *id, int, int); +extern void *lammps_extract_fix(void *handle, char *, int, int, int, int); +extern void *lammps_extract_variable(void *handle, char *, char *); +extern int lammps_set_variable(void *, char *, char *); +extern void lammps_gather(void *, char *, int, int, void *); +extern void lammps_gather_concat(void *, char *, int, int, void *); +extern void lammps_gather_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_scatter(void *, char *, int, int, void *); +extern void lammps_scatter_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_gather_atoms(void *, char *, int, int, void *); +extern void lammps_gather_atoms_concat(void *, char *, int, int, void *); +extern void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_scatter_atoms(void *, char *, int, int, void *); +extern void lammps_scatter_atoms_subset(void *, char *, int, int, int, int *, void *); +extern int lammps_config_has_mpi_support(); +extern int lammps_config_has_package(const char *); +extern int lammps_config_package_count(); +extern int lammps_config_package_name(int, char *, int); +extern int lammps_config_has_gzip_support(); +extern int lammps_config_has_png_support(); +extern int lammps_config_has_jpeg_support(); +extern int lammps_config_has_ffmpeg_support(); +extern int lammps_config_has_exceptions(); +extern int lammps_has_style(void *, const char *, const char *); +extern int lammps_style_count(void *, const char *); +extern int lammps_style_name(void *, const char *, int, char *, int); +extern int lammps_has_id(void *, const char *, const char *); +extern int lammps_id_count(void *, const char *); +extern int lammps_id_name(void *, const char *, int, char *, int); +extern int lammps_find_pair_neighlist(void*, char *, int, int, int); +extern int lammps_find_fix_neighlist(void*, char *, int); +extern int lammps_find_compute_neighlist(void*, char *, int); +extern int lammps_neighlist_num_elements(void*, int); +extern void lammps_neighlist_element_neighbors(void *, int, int, int *, int *, int ** ); +/* +extern int lammps_encode_image_flags(int ix, int iy, int iz); +extern void lammps_decode_image_flags(int image, int *flags); +extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); +extern void lammps_decode_image_flags(int64_t image, int *flags); +extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); +extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); +extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); +extern void lammps_fix_external_set_energy_global(void *, char *, double); +extern void lammps_fix_external_set_virial_global(void *, char *, double *); +*/ +extern int lammps_is_running(void *handle); +extern void lammps_force_timeout(void *handle); +extern int lammps_has_error(void *handle); +extern int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +%} + +/* extern void *lammps_open(int argc, char **argv, MPI_Comm comm, void **ptr); */ +extern void *lammps_open_no_mpi(int argc, char **argv, void **ptr); +extern void *lammps_open_fortran(int argc, char **argv, int f_comm); +extern void lammps_close(void *handle); +extern void lammps_mpi_init(); +extern void lammps_mpi_finalize(); +extern void lammps_free(void *ptr); +extern void lammps_file(void *handle, const char *file); +extern char *lammps_command(void *handle, const char *cmd); +extern void lammps_commands_list(void *handle, int ncmd, const char **cmds); +extern void lammps_commands_string(void *handle, const char *str); +extern int lammps_version(void *handle); +extern void lammps_get_os_info(char *buffer, int buf_size); +extern void lammps_memory_usage(void *handle, double *meminfo); +extern int lammps_get_mpi_comm(void *handle); +extern double lammps_get_natoms(void *handle); +extern double lammps_get_thermo(void *handle, const char *keyword); +extern void lammps_extract_box(void *handle, double *boxlo, double *boxhi, + double *xy, double *yz, double *xz, + int *pflags, int *boxflag); +extern void lammps_reset_box(void *handle, double *boxlo, double *boxhi, + double xy, double yz, double xz); +extern int lammps_extract_setting(void *handle, const char *keyword); +extern void *lammps_extract_global(void *handle, const char *name); +extern void *lammps_extract_atom(void *handle, const char *name); +extern int lammps_extract_global_datatype(void *handle, const char *name); +extern int lammps_extract_atom_datatype(void *handle, const char *name); +/* +extern int lammps_create_atoms(void *handle, int n, int *id, int *type, +extern int lammps_create_atoms(void *handle, int n, int64_t *id, int *type, */ +extern void *lammps_extract_compute(void *handle, char *id, int, int); +extern void *lammps_extract_fix(void *handle, char *, int, int, int, int); +extern void *lammps_extract_variable(void *handle, char *, char *); +extern int lammps_set_variable(void *, char *, char *); +extern void lammps_gather(void *, char *, int, int, void *); +extern void lammps_gather_concat(void *, char *, int, int, void *); +extern void lammps_gather_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_scatter(void *, char *, int, int, void *); +extern void lammps_scatter_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_gather_atoms(void *, char *, int, int, void *); +extern void lammps_gather_atoms_concat(void *, char *, int, int, void *); +extern void lammps_gather_atoms_subset(void *, char *, int, int, int, int *, void *); +extern void lammps_scatter_atoms(void *, char *, int, int, void *); +extern void lammps_scatter_atoms_subset(void *, char *, int, int, int, int *, void *); +extern int lammps_config_has_mpi_support(); +extern int lammps_config_has_package(const char *); +extern int lammps_config_package_count(); +extern int lammps_config_package_name(int, char *, int); +extern int lammps_config_has_gzip_support(); +extern int lammps_config_has_png_support(); +extern int lammps_config_has_jpeg_support(); +extern int lammps_config_has_ffmpeg_support(); +extern int lammps_config_has_exceptions(); +extern int lammps_has_style(void *, const char *, const char *); +extern int lammps_style_count(void *, const char *); +extern int lammps_style_name(void *, const char *, int, char *, int); +extern int lammps_has_id(void *, const char *, const char *); +extern int lammps_id_count(void *, const char *); +extern int lammps_id_name(void *, const char *, int, char *, int); +extern int lammps_find_pair_neighlist(void*, char *, int, int, int); +extern int lammps_find_fix_neighlist(void*, char *, int); +extern int lammps_find_compute_neighlist(void*, char *, int); +extern int lammps_neighlist_num_elements(void*, int); +extern void lammps_neighlist_element_neighbors(void *, int, int, int *, int *, int ** ); +/* +extern int lammps_encode_image_flags(int ix, int iy, int iz); +extern void lammps_decode_image_flags(int image, int *flags); +extern int64_t lammps_encode_image_flags(int ix, int iy, int iz); +extern void lammps_decode_image_flags(int64_t image, int *flags); +extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); +extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); +extern void lammps_set_fix_external_callback(void *, char *, FixExternalFnPtr, void*); +extern void lammps_fix_external_set_energy_global(void *, char *, double); +extern void lammps_fix_external_set_virial_global(void *, char *, double *); +*/ +extern int lammps_is_running(void *handle); +extern void lammps_force_timeout(void *handle); +extern int lammps_has_error(void *handle); +extern int lammps_get_last_error_message(void *handle, char *buffer, int buf_size); +