mirror of https://github.com/lammps/lammps.git
Merge pull request #2362 from akohlmey/library-progguide
Updates to C-Library interface progammer guide and reference
This commit is contained in:
commit
165444004e
|
@ -1,9 +1,51 @@
|
|||
Retrieving LAMMPS configuration information
|
||||
===========================================
|
||||
|
||||
The following library functions can be used to query the
|
||||
LAMMPS library about compile time settings and included
|
||||
packages and styles.
|
||||
The following library functions can be used to query the LAMMPS library
|
||||
about compile time settings and included packages and styles. This
|
||||
enables programs that use the library interface to run LAMMPS
|
||||
simulations to determine, whether the linked LAMMPS library is compatible
|
||||
with the requirements of the application without crashing during the
|
||||
LAMMPS functions (e.g. due to missing pair styles from packages) or to
|
||||
choose between different options (e.g. whether to use ``lj/cut``,
|
||||
``lj/cut/opt``, ``lj/cut/omp`` or ``lj/cut/intel``). Most of the
|
||||
functions can be called directly without first creating a LAMMPS
|
||||
instance. While crashes within LAMMPS may be recovered from through
|
||||
enabling :ref:`exceptions <exceptions>`, avoiding them proactively is
|
||||
a safer approach.
|
||||
|
||||
.. code-block:: C
|
||||
:caption: Example for using configuration settings functions
|
||||
|
||||
#include "library.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
void *handle;
|
||||
|
||||
handle = lammps_open_no_mpi(0, NULL, NULL);
|
||||
lammps_file(handle, "in.missing");
|
||||
if (lammps_has_error(handle)) {
|
||||
char errmsg[256];
|
||||
int errtype;
|
||||
errtype = lammps_get_last_error_message(handle, errmsg, 256);
|
||||
fprintf(stderr, "LAMMPS failed with error: %s\n", errmsg);
|
||||
return 1;
|
||||
}
|
||||
/* write compressed dump file depending on available of options */
|
||||
if (lammps_has_style(handle, "dump", "atom/zstd")) {
|
||||
lammps_command(handle, "dump d1 all atom/zstd 100 dump.zst");
|
||||
} else if (lammps_has_style(handle, "dump", "atom/gz")) {
|
||||
lammps_command(handle, "dump d1 all atom/gz 100 dump.gz");
|
||||
} else if (lammps_config_has_gzip_support()) {
|
||||
lammps_command(handle, "dump d1 all atom 100 dump.gz");
|
||||
} else {
|
||||
lammps_command(handle, "dump d1 all atom 100 dump");
|
||||
}
|
||||
lammps_close(handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
-----------------------
|
||||
|
||||
|
|
|
@ -2,8 +2,8 @@ Retrieving or setting LAMMPS system properties
|
|||
==============================================
|
||||
|
||||
The library interface allows to extract different kinds of information
|
||||
about the active simulation instance and also to modify some of them.
|
||||
This allows to combine MD simulation steps with other processing and
|
||||
about the active simulation instance and also to modify some of it.
|
||||
This enables combining MD simulation steps with other processing and
|
||||
simulation methods computed in the calling code or another code that is
|
||||
coupled to LAMMPS via the library interface. In some cases the data
|
||||
returned is direct reference to the original data inside LAMMPS cast
|
||||
|
@ -14,6 +14,34 @@ is the per-processor **local** data and indexed accordingly. These arrays
|
|||
can change sizes and order at every neighbor list rebuild and atom sort
|
||||
event as atoms are migrating between sub-domains.
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
#include "library.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
void *handle;
|
||||
int i;
|
||||
|
||||
handle = lammps_open_no_mpi(0, NULL, NULL);
|
||||
lammps_file(handle,"in.sysinit");
|
||||
printf("running simulation with %g atoms\n",
|
||||
lammps_get_natoms(handle));
|
||||
|
||||
lammps_command(handle,"run 1000 post no");
|
||||
|
||||
for (i=0; i < 10; ++i) {
|
||||
lammps_command(handle,"run 100 pre no post no");
|
||||
printf("PE = %g\nKE = %g\n",
|
||||
lammps_get_thermo(handle,"pe"),
|
||||
lammps_get_thermo(handle,"ke"));
|
||||
}
|
||||
lammps_close(handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
-----------------------
|
||||
|
||||
.. doxygenfunction:: lammps_version
|
||||
|
|
|
@ -2508,7 +2508,7 @@ length of the data area, and a short description.
|
|||
Typically the name of the pointer variable returned
|
||||
* \return pointer to the requested data cast to ``void *`` or NULL */
|
||||
|
||||
void *Atom::extract(char *name)
|
||||
void *Atom::extract(const char *name)
|
||||
{
|
||||
// --------------------------------------------------------------------
|
||||
// 4th customization section: customize by adding new variable name
|
||||
|
|
|
@ -331,7 +331,7 @@ class Atom : protected Pointers {
|
|||
|
||||
virtual void sync_modify(ExecutionSpace, unsigned int, unsigned int) {}
|
||||
|
||||
void *extract(char *);
|
||||
void *extract(const char *);
|
||||
|
||||
inline int* get_map_array() {return map_array;};
|
||||
inline int get_map_size() {return map_tag_max+1;};
|
||||
|
|
|
@ -616,7 +616,7 @@ a double, so it can also return information that is computed on-the-fly.
|
|||
* \param keyword string with the name of the thermo keyword
|
||||
* \return value of the requested thermo property or 0.0 */
|
||||
|
||||
double lammps_get_thermo(void *handle, char *keyword)
|
||||
double lammps_get_thermo(void *handle, const char *keyword)
|
||||
{
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
double dval = 0.0;
|
||||
|
@ -807,7 +807,7 @@ recognized, the function returns -1. Please also see :cpp:func:`lammps_extract_
|
|||
* \param keyword string with the name of the thermo keyword
|
||||
* \return value of the queried setting or -1 if unknown */
|
||||
|
||||
int lammps_extract_setting(void * handle, char *keyword)
|
||||
int lammps_extract_setting(void *handle, const char *keyword)
|
||||
{
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
|
||||
|
@ -865,7 +865,8 @@ Please also see :cpp:func:`lammps_extract_setting`,
|
|||
This table lists the supported names, their data types, length of the
|
||||
data area, and a short description. The ``bigint`` type may be defined
|
||||
to be either an ``int`` or an ``int64_t``. This is selected at
|
||||
:ref:`compile time <size>`.
|
||||
:ref:`compile time <size>` and can be queried through calling
|
||||
:cpp:func:`lammps_extract_setting`.
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
|
@ -1073,7 +1074,7 @@ to be either an ``int`` or an ``int64_t``. This is selected at
|
|||
* \return pointer (cast to ``void *``) to the location of the
|
||||
requested property. NULL if name is not known. */
|
||||
|
||||
void *lammps_extract_global(void *handle, char *name)
|
||||
void *lammps_extract_global(void *handle, const char *name)
|
||||
{
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
|
||||
|
@ -1165,7 +1166,7 @@ of the :cpp:func:`Atom::extract() <LAMMPS_NS::Atom::extract>` function.
|
|||
* \return pointer (cast to ``void *``) to the location of the
|
||||
* requested data or ``NULL`` if not found. */
|
||||
|
||||
void *lammps_extract_atom(void *handle, char *name)
|
||||
void *lammps_extract_atom(void *handle, const char *name)
|
||||
{
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
return lmp->atom->extract(name);
|
||||
|
@ -3724,7 +3725,7 @@ specific :doc:`LAMMPS package <Packages>` provided as argument.
|
|||
* \param name string with the name of the package
|
||||
* \return 1 if included, 0 if not.
|
||||
*/
|
||||
int lammps_config_has_package(char * name) {
|
||||
int lammps_config_has_package(const char *name) {
|
||||
return Info::has_package(name) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
@ -3792,10 +3793,10 @@ Valid categories are: *atom*\ , *integrate*\ , *minimize*\ ,
|
|||
* \param name name of the style
|
||||
* \return 1 if included, 0 if not.
|
||||
*/
|
||||
int lammps_has_style(void * handle, char * category, char * name) {
|
||||
int lammps_has_style(void *handle, const char *category, const char *name) {
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
Info info(lmp);
|
||||
return info.has_style(category, name) ? 0 : 1;
|
||||
return info.has_style(category, name) ? 1 : 0;
|
||||
}
|
||||
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
@ -3813,7 +3814,7 @@ categories.
|
|||
* \param category category of styles
|
||||
* \return number of styles in category
|
||||
*/
|
||||
int lammps_style_count(void * handle, char * category) {
|
||||
int lammps_style_count(void *handle, const char *category) {
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
Info info(lmp);
|
||||
return info.get_available_styles(category).size();
|
||||
|
@ -3839,7 +3840,8 @@ Please see :cpp:func:`lammps_has_style` for a list of valid categories.
|
|||
* \param buf_size size of the provided string buffer
|
||||
* \return 1 if successful, otherwise 0
|
||||
*/
|
||||
int lammps_style_name(void* handle, char * category, int idx, char * buffer, int buf_size) {
|
||||
int lammps_style_name(void *handle, const char *category, int idx,
|
||||
char *buffer, int buf_size) {
|
||||
LAMMPS *lmp = (LAMMPS *) handle;
|
||||
Info info(lmp);
|
||||
auto styles = info.get_available_styles(category);
|
||||
|
|
|
@ -100,7 +100,7 @@ void lammps_commands_string(void *handle, const char *str);
|
|||
int lammps_version(void *handle);
|
||||
int lammps_get_mpi_comm(void* handle);
|
||||
double lammps_get_natoms(void *handle);
|
||||
double lammps_get_thermo(void *handle, char *keyword);
|
||||
double lammps_get_thermo(void *handle, const char *keyword);
|
||||
|
||||
void lammps_extract_box(void *handle, double *boxlo, double *boxhi,
|
||||
double *xy, double *yz, double *xz,
|
||||
|
@ -108,9 +108,9 @@ void lammps_extract_box(void *handle, double *boxlo, double *boxhi,
|
|||
void lammps_reset_box(void *handle, double *boxlo, double *boxhi,
|
||||
double xy, double yz, double xz);
|
||||
|
||||
int lammps_extract_setting(void *handle, char *keyword);
|
||||
void *lammps_extract_global(void *handle, char *name);
|
||||
void *lammps_extract_atom(void *handle, char *name);
|
||||
int lammps_extract_setting(void *handle, const char *keyword);
|
||||
void *lammps_extract_global(void *handle, const char *name);
|
||||
void *lammps_extract_atom(void *handle, const char *name);
|
||||
|
||||
#if !defined(LAMMPS_BIGBIG)
|
||||
int lammps_create_atoms(void *handle, int n, int *id, int *type,
|
||||
|
@ -152,7 +152,7 @@ void lammps_scatter_atoms_subset(void *, char *, int, int, int, int *, void *);
|
|||
* ---------------------------------------------------------------------- */
|
||||
|
||||
int lammps_config_has_mpi_support();
|
||||
int lammps_config_has_package(char *);
|
||||
int lammps_config_has_package(const char *);
|
||||
int lammps_config_package_count();
|
||||
int lammps_config_package_name(int, char *, int);
|
||||
int lammps_config_has_gzip_support();
|
||||
|
@ -161,9 +161,9 @@ int lammps_config_has_jpeg_support();
|
|||
int lammps_config_has_ffmpeg_support();
|
||||
int lammps_config_has_exceptions();
|
||||
|
||||
int lammps_has_style(void *, char *, char *);
|
||||
int lammps_style_count(void *, char *);
|
||||
int lammps_style_name(void *, char *, int, char *, int);
|
||||
int lammps_has_style(void *, const char *, const char *);
|
||||
int lammps_style_count(void *, const char *);
|
||||
int lammps_style_name(void *, const char *, int, char *, int);
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
* Library functions for accessing neighbor lists
|
||||
|
|
|
@ -1,13 +1,57 @@
|
|||
|
||||
add_executable(test_library_open test_library_open.cpp)
|
||||
target_link_libraries(test_library_open PRIVATE lammps GTest::GTest GTest::GTestMain)
|
||||
add_executable(test_library_open test_library_open.cpp test_main.cpp)
|
||||
target_link_libraries(test_library_open PRIVATE lammps GTest::GTest GTest::GMock)
|
||||
add_test(LibraryOpen test_library_open)
|
||||
|
||||
add_executable(test_library_commands test_library_commands.cpp)
|
||||
target_link_libraries(test_library_commands PRIVATE lammps GTest::GTest GTest::GTestMain)
|
||||
add_executable(test_library_commands test_library_commands.cpp test_main.cpp)
|
||||
target_link_libraries(test_library_commands PRIVATE lammps GTest::GTest GTest::GMock)
|
||||
add_test(LibraryCommands test_library_commands)
|
||||
|
||||
add_executable(test_library_properties test_library_properties.cpp)
|
||||
target_link_libraries(test_library_properties PRIVATE lammps GTest::GTest GTest::GTestMain)
|
||||
add_executable(test_library_properties test_library_properties.cpp test_main.cpp)
|
||||
target_link_libraries(test_library_properties PRIVATE lammps GTest::GTest GTest::GMock)
|
||||
target_compile_definitions(test_library_properties PRIVATE -DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR})
|
||||
add_test(LibraryProperties test_library_properties)
|
||||
|
||||
set(TEST_CONFIG_DEFS "-DTEST_INPUT_FOLDER=${CMAKE_CURRENT_SOURCE_DIR};-DLAMMPS_${LAMMPS_SIZES}")
|
||||
set(PKG_COUNT 0)
|
||||
foreach(PKG ${STANDARD_PACKAGES} ${SUFFIX_PACKAGES})
|
||||
if(PKG_${PKG})
|
||||
MATH(EXPR PKG_COUNT "${PKG_COUNT}+1")
|
||||
endif()
|
||||
endforeach()
|
||||
list(APPEND TEST_CONFIG_DEFS -DNUM_LAMMPS_PACKAGES=${PKG_COUNT})
|
||||
|
||||
if(PKG_MANYBODY)
|
||||
set(HAS_MANYBODY 1)
|
||||
else()
|
||||
set(HAS_MANYBODY 0)
|
||||
endif()
|
||||
list(APPEND TEST_CONFIG_DEFS -DLAMMPS_HAS_MANYBODY=${HAS_MANYBODY})
|
||||
|
||||
if(BUILD_MPI)
|
||||
set(HAS_MPI 1)
|
||||
else()
|
||||
set(HAS_MPI 0)
|
||||
endif()
|
||||
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")
|
||||
if(WITH_${WITH})
|
||||
set(HAS_${WITH} 1)
|
||||
else()
|
||||
set(HAS_${WITH} 0)
|
||||
endif()
|
||||
list(APPEND TEST_CONFIG_DEFS -DLAMMPS_HAS_${WITH}=${HAS_${WITH}})
|
||||
endforeach()
|
||||
|
||||
add_executable(test_library_config test_library_config.cpp test_main.cpp)
|
||||
target_link_libraries(test_library_config PRIVATE lammps GTest::GTest GTest::GMock)
|
||||
target_compile_definitions(test_library_config PRIVATE ${TEST_CONFIG_DEFS})
|
||||
add_test(LibraryConfig test_library_config)
|
||||
|
|
|
@ -0,0 +1,210 @@
|
|||
LAMMPS data file via write_data, version 5 May 2020, timestep = 0
|
||||
|
||||
29 atoms
|
||||
5 atom types
|
||||
24 bonds
|
||||
5 bond types
|
||||
30 angles
|
||||
4 angle types
|
||||
31 dihedrals
|
||||
5 dihedral types
|
||||
2 impropers
|
||||
2 improper types
|
||||
|
||||
-6.024572 8.975428 xlo xhi
|
||||
-7.692866 7.307134 ylo yhi
|
||||
-8.086924 6.913076 zlo zhi
|
||||
|
||||
Masses
|
||||
|
||||
1 12.0107
|
||||
2 4.00794
|
||||
3 14.0067
|
||||
4 15.9994
|
||||
5 15.9994
|
||||
|
||||
Pair Coeffs # zero
|
||||
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
|
||||
Bond Coeffs # zero
|
||||
|
||||
1 1.5
|
||||
2 1.1
|
||||
3 1.3
|
||||
4 1.2
|
||||
5 1
|
||||
|
||||
Angle Coeffs # zero
|
||||
|
||||
1 110.1
|
||||
2 111
|
||||
3 120
|
||||
4 108.5
|
||||
|
||||
Atoms # full
|
||||
|
||||
10 2 1 7.0000000000000007e-02 2.0185283555536988e+00 -1.4283966846517357e+00 -9.6733527271133024e-01 0 0 0
|
||||
11 2 2 8.9999999999999997e-02 1.7929780509347666e+00 -1.9871047540768743e+00 -1.8840626643185674e+00 0 0 0
|
||||
12 2 1 -2.7000000000000002e-01 3.0030247876861225e+00 -4.8923319967572748e-01 -1.6188658531537248e+00 0 0 0
|
||||
13 2 2 8.9999999999999997e-02 4.0447273787895934e+00 -9.0131998547446246e-01 -1.6384447268320836e+00 0 0 0
|
||||
14 2 2 8.9999999999999997e-02 2.6033152817257075e+00 -4.0789761505963579e-01 -2.6554413538823063e+00 0 0 0
|
||||
2 1 2 3.1000000000000000e-01 3.0197083955402204e-01 2.9515239068888608e+00 -8.5689735572907566e-01 0 0 0
|
||||
3 1 1 -2.0000000000000000e-02 -6.9435377880558602e-01 1.2440473127136711e+00 -6.2233801468892025e-01 0 0 0
|
||||
4 1 2 8.9999999999999997e-02 -1.5771614164685133e+00 1.4915333140468066e+00 -1.2487126845040522e+00 0 0 0
|
||||
6 1 1 5.1000000000000001e-01 2.9412607937706009e-01 2.2719282656652909e-01 -1.2843094067857870e+00 0 0 0
|
||||
7 1 4 -5.1000000000000001e-01 3.4019871062879609e-01 -9.1277350075786561e-03 -2.4633113224304561e+00 0 0 0
|
||||
19 3 2 4.2359999999999998e-01 1.5349125211132961e+00 2.6315969880333707e+00 -4.2472859440220647e+00 0 0 0
|
||||
15 2 2 8.9999999999999997e-02 2.9756315249791303e+00 5.6334269722969288e-01 -1.2437650754599008e+00 0 0 0
|
||||
18 3 4 -8.4719999999999995e-01 2.1384791188033843e+00 3.0177261773770208e+00 -3.5160827596876225e+00 0 0 0
|
||||
20 3 2 4.2359999999999998e-01 2.7641167828863153e+00 3.6833419064000221e+00 -3.9380850623312638e+00 0 0 0
|
||||
8 2 3 -4.6999999999999997e-01 1.1641187171852805e+00 -4.8375305955385234e-01 -6.7659823767368688e-01 0 0 0
|
||||
9 2 2 3.1000000000000000e-01 1.3777459838125838e+00 -2.5366338669522998e-01 2.6877644730326306e-01 0 0 0
|
||||
16 2 1 5.1000000000000001e-01 2.6517554244980306e+00 -2.3957110424978438e+00 3.2908335999178327e-02 0 0 0
|
||||
17 2 4 -5.1000000000000001e-01 2.2309964792710639e+00 -2.1022918943319384e+00 1.1491948328949437e+00 0 0 0
|
||||
1 1 3 -4.6999999999999997e-01 -2.7993683669226832e-01 2.4726588069312840e+00 -1.7200860244148433e-01 0 0 0
|
||||
5 1 2 8.9999999999999997e-02 -8.9501761359359255e-01 9.3568128743071344e-01 4.0227731871484346e-01 0 0 0
|
||||
21 4 5 -8.4719999999999995e-01 4.9064454390208301e+00 -4.0751205255383196e+00 -3.6215576073601046e+00 0 0 0
|
||||
22 4 2 4.2359999999999998e-01 4.3687453488627543e+00 -4.2054270536772504e+00 -4.4651491269372565e+00 0 0 0
|
||||
23 4 2 4.2359999999999998e-01 5.7374928154769504e+00 -3.5763355905184966e+00 -3.8820297194230728e+00 0 0 0
|
||||
24 5 5 -8.4719999999999995e-01 2.0684115301174013e+00 3.1518221747664397e+00 3.1554242678474576e+00 0 0 0
|
||||
25 5 2 4.2359999999999998e-01 1.2998381073113014e+00 3.2755513587518097e+00 2.5092990173114837e+00 0 0 0
|
||||
26 5 2 4.2359999999999998e-01 2.5807438597688113e+00 4.0120175892854135e+00 3.2133398379059099e+00 0 0 0
|
||||
27 6 5 -8.4719999999999995e-01 -1.9613581876744359e+00 -4.3556300596085160e+00 2.1101467673534788e+00 0 0 0
|
||||
28 6 2 4.2359999999999998e-01 -2.7406520384725965e+00 -4.0207251278130975e+00 1.5828689861678511e+00 0 0 0
|
||||
29 6 2 4.2359999999999998e-01 -1.3108232656499081e+00 -3.5992986322410760e+00 2.2680459788743503e+00 0 0 0
|
||||
|
||||
Velocities
|
||||
|
||||
1 7.7867804888392077e-04 5.8970331623292821e-04 -2.2179517633030531e-04
|
||||
2 2.7129529964126462e-03 4.6286427111164284e-03 3.5805549693846352e-03
|
||||
3 -1.2736791029204805e-03 1.6108674226414498e-03 -3.3618185901550799e-04
|
||||
4 -9.2828595122009308e-04 -1.2537885319521818e-03 -4.1204974953432108e-03
|
||||
5 -1.1800848061603740e-03 7.5424401975844038e-04 6.9023177964912290e-05
|
||||
6 -3.0914004879905335e-04 1.2755385764678133e-03 7.9574303350202582e-04
|
||||
7 -1.1037894966874103e-04 -7.6764845099077425e-04 -7.7217630460203659e-04
|
||||
8 3.9060281273221989e-04 -8.1444231918053418e-04 1.5134641148324972e-04
|
||||
9 1.2475530960659720e-03 -2.6608454451432528e-03 1.1117602907112732e-03
|
||||
10 4.5008983776042893e-04 4.9530197647538077e-04 -2.3336234361093645e-04
|
||||
11 -3.6977669078869707e-04 -1.5289071951960539e-03 -2.9176389881837113e-03
|
||||
12 1.0850834530183159e-03 -6.4965897903201833e-04 -1.2971152622619948e-03
|
||||
13 4.0754559196230639e-03 3.5043502394946119e-03 -7.8324487687854666e-04
|
||||
14 -1.3837220448746613e-04 -4.0656048637594394e-03 -3.9333461173944500e-03
|
||||
15 -4.3301707382721859e-03 -3.1802661664634938e-03 3.2037919043360571e-03
|
||||
16 -9.6715751018414326e-05 -5.0016572678960377e-04 1.4945658875149626e-03
|
||||
17 6.5692180538157174e-04 3.6635779995305095e-04 8.3495414466050911e-04
|
||||
18 -6.0936815808025862e-04 -9.3774557532468582e-04 -3.3558072507805731e-04
|
||||
19 -6.9919768291957119e-04 -3.6060777270430031e-03 4.2833405289822791e-03
|
||||
20 4.7777805013736515e-03 5.1003745845520452e-03 1.8002873923729241e-03
|
||||
21 -9.5568188553430398e-04 1.6594630943762931e-04 -1.8199788009966615e-04
|
||||
22 -3.3137518957653462e-03 -2.8683968287936054e-03 3.6384389958326871e-03
|
||||
23 2.4209481134686401e-04 -4.5457709985051130e-03 2.7663581642115042e-03
|
||||
24 2.5447450568861086e-04 4.8412447786110117e-04 -4.8021914527341357e-04
|
||||
25 4.3722771097312743e-03 -4.5184411669545515e-03 2.5200952006556795e-03
|
||||
26 -1.9250110555001179e-03 -3.0342169883610837e-03 3.5062814567984532e-03
|
||||
27 -2.6510179146429716e-04 3.6306203629019116e-04 -5.6235585400647747e-04
|
||||
28 -2.3068708109787484e-04 -8.5663070212203200e-04 2.1302563179109169e-03
|
||||
29 -2.5054744388303732e-03 -1.6773997805290820e-04 2.8436699761004796e-03
|
||||
|
||||
Bonds
|
||||
|
||||
1 5 1 2
|
||||
2 3 1 3
|
||||
3 2 3 4
|
||||
4 2 3 5
|
||||
5 1 3 6
|
||||
6 3 6 8
|
||||
7 4 6 7
|
||||
8 5 8 9
|
||||
9 3 8 10
|
||||
10 2 10 11
|
||||
11 1 10 12
|
||||
12 1 10 16
|
||||
13 2 12 13
|
||||
14 2 12 14
|
||||
15 2 12 15
|
||||
16 4 16 17
|
||||
17 5 18 19
|
||||
18 5 18 20
|
||||
19 5 21 22
|
||||
20 5 21 23
|
||||
21 5 24 25
|
||||
22 5 24 26
|
||||
23 5 27 28
|
||||
24 5 27 29
|
||||
|
||||
Angles
|
||||
|
||||
1 4 2 1 3
|
||||
2 4 1 3 5
|
||||
3 4 1 3 4
|
||||
4 4 1 3 6
|
||||
5 4 4 3 5
|
||||
6 2 5 3 6
|
||||
7 2 4 3 6
|
||||
8 3 3 6 7
|
||||
9 3 3 6 8
|
||||
10 3 7 6 8
|
||||
11 2 6 8 9
|
||||
12 2 9 8 10
|
||||
13 3 6 8 10
|
||||
14 2 8 10 11
|
||||
15 3 8 10 16
|
||||
16 2 11 10 12
|
||||
17 1 12 10 16
|
||||
18 1 8 10 12
|
||||
19 2 11 10 16
|
||||
20 2 10 12 15
|
||||
21 2 10 12 14
|
||||
22 2 10 12 13
|
||||
23 4 13 12 15
|
||||
24 4 13 12 14
|
||||
25 4 14 12 15
|
||||
26 4 10 16 17
|
||||
27 1 19 18 20
|
||||
28 1 22 21 23
|
||||
29 1 25 24 26
|
||||
30 1 28 27 29
|
||||
|
||||
Dihedrals
|
||||
|
||||
1 2 2 1 3 6
|
||||
2 2 2 1 3 4
|
||||
3 3 2 1 3 5
|
||||
4 1 1 3 6 8
|
||||
5 1 1 3 6 7
|
||||
6 5 4 3 6 8
|
||||
7 5 4 3 6 7
|
||||
8 5 5 3 6 8
|
||||
9 5 5 3 6 7
|
||||
10 4 3 6 8 9
|
||||
11 3 3 6 8 10
|
||||
12 3 7 6 8 9
|
||||
13 4 7 6 8 10
|
||||
14 2 6 8 10 12
|
||||
15 2 6 8 10 16
|
||||
16 2 6 8 10 11
|
||||
17 2 9 8 10 12
|
||||
18 4 9 8 10 16
|
||||
19 5 9 8 10 11
|
||||
20 5 8 10 12 13
|
||||
21 1 8 10 12 14
|
||||
22 5 8 10 12 15
|
||||
23 4 8 10 16 17
|
||||
24 5 11 10 12 13
|
||||
25 5 11 10 12 14
|
||||
26 5 11 10 12 15
|
||||
27 2 11 10 16 17
|
||||
28 2 12 10 16 17
|
||||
29 5 16 10 12 13
|
||||
30 5 16 10 12 14
|
||||
31 5 16 10 12 15
|
||||
|
||||
Impropers
|
||||
|
||||
1 1 6 3 8 7
|
||||
2 2 8 6 10 9
|
|
@ -0,0 +1,25 @@
|
|||
variable units index real
|
||||
variable input_dir index .
|
||||
variable data_file index ${input_dir}/data.fourmol
|
||||
variable pair_style index 'zero 8.0'
|
||||
variable bond_style index zero
|
||||
variable angle_style index zero
|
||||
variable dihedral_style index zero
|
||||
variable improper_style index zero
|
||||
|
||||
atom_style full
|
||||
atom_modify map array
|
||||
neigh_modify delay 2 every 2 check no
|
||||
timestep 0.1
|
||||
units ${units}
|
||||
|
||||
pair_style ${pair_style}
|
||||
bond_style ${bond_style}
|
||||
angle_style ${angle_style}
|
||||
dihedral_style ${dihedral_style}
|
||||
improper_style ${improper_style}
|
||||
|
||||
read_data ${data_file}
|
||||
dihedral_coeff *
|
||||
improper_coeff *
|
||||
|
|
@ -1,50 +1,54 @@
|
|||
// unit tests for issuing command to a LAMMPS instance through the library interface
|
||||
|
||||
#include "library.h"
|
||||
#include "lammps.h"
|
||||
#include "library.h"
|
||||
#include <string>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
const char *demo_input[] = {
|
||||
"region box block 0 $x 0 2 0 2",
|
||||
"create_box 1 box",
|
||||
"create_atoms 1 single 1.0 1.0 ${zpos}" };
|
||||
const char *cont_input[] = {
|
||||
"create_atoms 1 single &",
|
||||
"0.2 0.1 0.1" };
|
||||
#include "test_main.h"
|
||||
|
||||
class LAMMPS_commands : public ::testing::Test
|
||||
{
|
||||
using ::testing::HasSubstr;
|
||||
using ::testing::StartsWith;
|
||||
|
||||
const char *demo_input[] = {"region box block 0 $x 0 2 0 2", "create_box 1 box",
|
||||
"create_atoms 1 single 1.0 1.0 ${zpos}"};
|
||||
const char *cont_input[] = {"create_atoms 1 single &", "0.2 0.1 0.1"};
|
||||
|
||||
class LibraryCommands : public ::testing::Test {
|
||||
protected:
|
||||
void *lmp;
|
||||
LAMMPS_commands() {};
|
||||
~LAMMPS_commands() override {};
|
||||
LibraryCommands(){};
|
||||
~LibraryCommands() override{};
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
const char *args[] = {"LAMMPS_test", "-log", "none", "-echo", "screen", "-nocite",
|
||||
"-var", "x", "2", "-var", "zpos", "1.5"};
|
||||
|
||||
void SetUp() override {
|
||||
const char *args[] = {"LAMMPS_test",
|
||||
"-log", "none",
|
||||
"-echo", "screen",
|
||||
"-nocite", "-var","x","2",
|
||||
"-var", "zpos", "1.5"};
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
::testing::internal::CaptureStdout();
|
||||
lmp = lammps_open_no_mpi(argc, argv, NULL);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,8).c_str(), "LAMMPS (");
|
||||
if (verbose) std::cout << output;
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
}
|
||||
void TearDown() override {
|
||||
void TearDown() override
|
||||
{
|
||||
::testing::internal::CaptureStdout();
|
||||
lammps_close(lmp);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
lmp = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_commands, from_file) {
|
||||
TEST_F(LibraryCommands, from_file)
|
||||
{
|
||||
FILE *fp;
|
||||
const char demo_file[] = "in.test";
|
||||
const char cont_file[] = "in.cont";
|
||||
|
@ -63,30 +67,42 @@ TEST_F(LAMMPS_commands, from_file) {
|
|||
fclose(fp);
|
||||
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_file(lmp, demo_file);
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 1);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_file(lmp, cont_file);
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 2);
|
||||
|
||||
unlink(demo_file);
|
||||
unlink(cont_file);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_commands, from_line) {
|
||||
TEST_F(LibraryCommands, from_line)
|
||||
{
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) {
|
||||
lammps_command(lmp, demo_input[i]);
|
||||
}
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 1);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_commands, from_list) {
|
||||
TEST_F(LibraryCommands, from_list)
|
||||
{
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_commands_list(lmp, sizeof(demo_input) / sizeof(char *), demo_input);
|
||||
lammps_commands_list(lmp, sizeof(cont_input) / sizeof(char *), cont_input);
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 2);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_commands, from_string) {
|
||||
TEST_F(LibraryCommands, from_string)
|
||||
{
|
||||
std::string cmds("");
|
||||
|
||||
for (unsigned int i = 0; i < sizeof(demo_input) / sizeof(char *); ++i) {
|
||||
|
@ -98,6 +114,8 @@ TEST_F(LAMMPS_commands, from_string) {
|
|||
cmds += "\n";
|
||||
}
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_commands_string(lmp, cmds.c_str());
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 2);
|
||||
};
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
// unit tests for checking LAMMPS configuration settings through the library interface
|
||||
|
||||
#include "lammps.h"
|
||||
#include "library.h"
|
||||
#include <string>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include "test_main.h"
|
||||
|
||||
#define STRINGIFY(val) XSTR(val)
|
||||
#define XSTR(val) #val
|
||||
|
||||
using ::testing::HasSubstr;
|
||||
using ::testing::StartsWith;
|
||||
using ::testing::StrEq;
|
||||
|
||||
class LibraryConfig : public ::testing::Test {
|
||||
protected:
|
||||
void *lmp;
|
||||
std::string INPUT_DIR = STRINGIFY(TEST_INPUT_FOLDER);
|
||||
|
||||
LibraryConfig(){};
|
||||
~LibraryConfig() override{};
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
const char *args[] = {"LAMMPS_test", "-log", "none",
|
||||
"-echo", "screen", "-nocite",
|
||||
"-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER)};
|
||||
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
::testing::internal::CaptureStdout();
|
||||
lmp = lammps_open_no_mpi(argc, argv, NULL);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
if (verbose) std::cout << output;
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
}
|
||||
void TearDown() override
|
||||
{
|
||||
::testing::internal::CaptureStdout();
|
||||
lammps_close(lmp);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
lmp = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, package_count)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_package_count(), NUM_LAMMPS_PACKAGES);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, has_package)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_package("MANYBODY"), LAMMPS_HAS_MANYBODY);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, package_name)
|
||||
{
|
||||
char buf[128];
|
||||
int numpkgs = lammps_config_package_count();
|
||||
if (numpkgs > 0) {
|
||||
EXPECT_EQ(lammps_config_package_name(0, buf, 128), 1);
|
||||
EXPECT_EQ(lammps_config_package_name(numpkgs + 10, buf, 128), 0);
|
||||
EXPECT_THAT(buf, StrEq(""));
|
||||
} else {
|
||||
EXPECT_EQ(lammps_config_package_name(0, buf, 128), 1);
|
||||
EXPECT_THAT(buf, StrEq(""));
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LibraryConfig, has_style)
|
||||
{
|
||||
EXPECT_EQ(lammps_has_style(lmp, "atom", "atomic"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "compute", "temp"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "fix", "nve"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "pair", "lj/cut"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "bond", "zero"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "dump", "custom"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "region", "sphere"), 1);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "xxxxx", "lj/cut"), 0);
|
||||
EXPECT_EQ(lammps_has_style(lmp, "pair", "xxxxxx"), 0);
|
||||
#if LAMMPS_HAS_MANYBODY
|
||||
EXPECT_EQ(lammps_has_style(lmp, "pair", "sw"), 1);
|
||||
#else
|
||||
EXPECT_EQ(lammps_has_style(lmp, "pair", "sw"), 0);
|
||||
#endif
|
||||
};
|
||||
|
||||
TEST_F(LibraryConfig, style_count)
|
||||
{
|
||||
EXPECT_GT(lammps_style_count(lmp, "atom"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "bond"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "angle"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "dihedral"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "improper"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "pair"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "kspace"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "compute"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "fix"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "region"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "dump"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "integrate"), 1);
|
||||
EXPECT_GT(lammps_style_count(lmp, "minimize"), 1);
|
||||
};
|
||||
|
||||
TEST_F(LibraryConfig, style_name)
|
||||
{
|
||||
char buf[128];
|
||||
int numstyles = lammps_style_count(lmp, "atom");
|
||||
EXPECT_EQ(lammps_style_name(lmp, "atom", 0, buf, 128), 1);
|
||||
EXPECT_EQ(lammps_style_name(lmp, "atom", numstyles + 10, buf, 128), 0);
|
||||
EXPECT_THAT(buf, StrEq(""));
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, exceptions)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_exceptions(), LAMMPS_HAS_EXCEPTIONS);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, mpi_support)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_mpi_support(), LAMMPS_HAS_MPI);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, png_support)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_png_support(), LAMMPS_HAS_PNG);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, jpeg_support)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_jpeg_support(), LAMMPS_HAS_JPEG);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, gzip_support)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_gzip_support(), LAMMPS_HAS_GZIP);
|
||||
};
|
||||
|
||||
TEST(LAMMPSConfig, ffmpeg_support)
|
||||
{
|
||||
EXPECT_EQ(lammps_config_has_ffmpeg_support(), LAMMPS_HAS_FFMPEG);
|
||||
};
|
|
@ -1,18 +1,26 @@
|
|||
// unit tests for the LAMMPS base class
|
||||
// unit tests creating LAMMPS instances via the library interface
|
||||
|
||||
#include "library.h"
|
||||
#include "lammps.h"
|
||||
#include <mpi.h>
|
||||
#include "library.h"
|
||||
#include <cstdio> // for stdin, stdout
|
||||
#include <mpi.h>
|
||||
#include <string>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
TEST(lammps_open, null_args) {
|
||||
#include "test_main.h"
|
||||
|
||||
using ::testing::HasSubstr;
|
||||
using ::testing::StartsWith;
|
||||
|
||||
TEST(lammps_open, null_args)
|
||||
{
|
||||
::testing::internal::CaptureStdout();
|
||||
void *handle = lammps_open(0, NULL, MPI_COMM_WORLD, NULL);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS");
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
if (verbose) std::cout << output;
|
||||
int mpi_init = 0;
|
||||
MPI_Initialized(&mpi_init);
|
||||
EXPECT_GT(mpi_init, 0);
|
||||
|
@ -24,13 +32,13 @@ TEST(lammps_open, null_args) {
|
|||
::testing::internal::CaptureStdout();
|
||||
lammps_close(handle);
|
||||
output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
}
|
||||
|
||||
TEST(lammps_open, with_args) {
|
||||
const char *args[] = {"liblammps",
|
||||
"-log", "none",
|
||||
"-nocite"};
|
||||
TEST(lammps_open, with_args)
|
||||
{
|
||||
const char *args[] = {"liblammps", "-log", "none", "-nocite"};
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
|
@ -41,7 +49,8 @@ TEST(lammps_open, with_args) {
|
|||
void *alt_ptr;
|
||||
void *handle = lammps_open(argc, argv, mycomm, &alt_ptr);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS");
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
if (verbose) std::cout << output;
|
||||
EXPECT_EQ(handle, alt_ptr);
|
||||
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
|
||||
|
||||
|
@ -60,15 +69,14 @@ TEST(lammps_open, with_args) {
|
|||
::testing::internal::CaptureStdout();
|
||||
lammps_close(handle);
|
||||
output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
}
|
||||
|
||||
TEST(lammps_open, with_kokkos) {
|
||||
TEST(lammps_open, with_kokkos)
|
||||
{
|
||||
if (!LAMMPS_NS::LAMMPS::is_installed_pkg("KOKKOS")) GTEST_SKIP();
|
||||
const char *args[] = {"liblammps",
|
||||
"-k", "on", "t", "2",
|
||||
"-sf", "kk",
|
||||
"-log", "none" };
|
||||
const char *args[] = {"liblammps", "-k", "on", "t", "2", "-sf", "kk", "-log", "none"};
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
|
@ -76,7 +84,8 @@ TEST(lammps_open, with_kokkos) {
|
|||
void *alt_ptr;
|
||||
void *handle = lammps_open(argc, argv, MPI_COMM_WORLD, &alt_ptr);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS");
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
if (verbose) std::cout << output;
|
||||
EXPECT_EQ(handle, alt_ptr);
|
||||
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
|
||||
|
||||
|
@ -91,14 +100,13 @@ TEST(lammps_open, with_kokkos) {
|
|||
::testing::internal::CaptureStdout();
|
||||
lammps_close(handle);
|
||||
output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
}
|
||||
|
||||
TEST(lammps_open_no_mpi, no_screen) {
|
||||
const char *args[] = {"liblammps",
|
||||
"-log", "none",
|
||||
"-screen", "none",
|
||||
"-nocite"};
|
||||
TEST(lammps_open_no_mpi, no_screen)
|
||||
{
|
||||
const char *args[] = {"liblammps", "-log", "none", "-screen", "none", "-nocite"};
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
|
@ -125,13 +133,11 @@ TEST(lammps_open_no_mpi, no_screen) {
|
|||
EXPECT_STREQ(output.c_str(), "");
|
||||
}
|
||||
|
||||
TEST(lammps_open_no_mpi, with_omp) {
|
||||
TEST(lammps_open_no_mpi, with_omp)
|
||||
{
|
||||
if (!LAMMPS_NS::LAMMPS::is_installed_pkg("USER-OMP")) GTEST_SKIP();
|
||||
const char *args[] = {"liblammps",
|
||||
"-pk", "omp", "2", "neigh", "no",
|
||||
"-sf", "omp",
|
||||
"-log", "none",
|
||||
"-nocite"};
|
||||
const char *args[] = {"liblammps", "-pk", "omp", "2", "neigh", "no",
|
||||
"-sf", "omp", "-log", "none", "-nocite"};
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
|
@ -139,7 +145,8 @@ TEST(lammps_open_no_mpi, with_omp) {
|
|||
void *alt_ptr;
|
||||
void *handle = lammps_open_no_mpi(argc, argv, &alt_ptr);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS");
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
if (verbose) std::cout << output;
|
||||
EXPECT_EQ(handle, alt_ptr);
|
||||
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
|
||||
|
||||
|
@ -155,10 +162,12 @@ TEST(lammps_open_no_mpi, with_omp) {
|
|||
::testing::internal::CaptureStdout();
|
||||
lammps_close(handle);
|
||||
output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
}
|
||||
|
||||
TEST(lammps_open_fortran, no_args) {
|
||||
TEST(lammps_open_fortran, no_args)
|
||||
{
|
||||
// MPI is already initialized
|
||||
MPI_Comm mycomm;
|
||||
MPI_Comm_split(MPI_COMM_WORLD, 0, 1, &mycomm);
|
||||
|
@ -166,7 +175,8 @@ TEST(lammps_open_fortran, no_args) {
|
|||
::testing::internal::CaptureStdout();
|
||||
void *handle = lammps_open_fortran(0, NULL, fcomm);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,6).c_str(),"LAMMPS");
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
if (verbose) std::cout << output;
|
||||
LAMMPS_NS::LAMMPS *lmp = (LAMMPS_NS::LAMMPS *)handle;
|
||||
|
||||
// MPI STUBS uses no real communicators
|
||||
|
@ -182,5 +192,6 @@ TEST(lammps_open_fortran, no_args) {
|
|||
::testing::internal::CaptureStdout();
|
||||
lammps_close(handle);
|
||||
output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
}
|
||||
|
|
|
@ -1,47 +1,61 @@
|
|||
// unit tests for checking and changing simulation properties through the library interface
|
||||
|
||||
#include "library.h"
|
||||
#include "lammps.h"
|
||||
#include "library.h"
|
||||
#include <string>
|
||||
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
const char *demo_input[] = {
|
||||
"region box block 0 $x 0 2 0 2",
|
||||
"create_box 1 box",
|
||||
"create_atoms 1 single 1.0 1.0 ${zpos}" };
|
||||
const char *cont_input[] = {
|
||||
"create_atoms 1 single &",
|
||||
"0.2 0.1 0.1" };
|
||||
#include "test_main.h"
|
||||
|
||||
class LAMMPS_properties : public ::testing::Test
|
||||
{
|
||||
#define STRINGIFY(val) XSTR(val)
|
||||
#define XSTR(val) #val
|
||||
|
||||
using ::testing::HasSubstr;
|
||||
using ::testing::StartsWith;
|
||||
|
||||
class LibraryProperties : public ::testing::Test {
|
||||
protected:
|
||||
void *lmp;
|
||||
LAMMPS_properties() {};
|
||||
~LAMMPS_properties() override {};
|
||||
std::string INPUT_DIR = STRINGIFY(TEST_INPUT_FOLDER);
|
||||
|
||||
void SetUp() override {
|
||||
LibraryProperties(){};
|
||||
~LibraryProperties() override{};
|
||||
|
||||
void SetUp() override
|
||||
{
|
||||
const char *args[] = {"LAMMPS_test", "-log", "none",
|
||||
"-echo", "screen", "-nocite" };
|
||||
"-echo", "screen", "-nocite",
|
||||
"-var", "input_dir", STRINGIFY(TEST_INPUT_FOLDER)};
|
||||
|
||||
char **argv = (char **)args;
|
||||
int argc = sizeof(args) / sizeof(char *);
|
||||
|
||||
::testing::internal::CaptureStdout();
|
||||
lmp = lammps_open_no_mpi(argc, argv, NULL);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,8).c_str(), "LAMMPS (");
|
||||
if (verbose) std::cout << output;
|
||||
EXPECT_THAT(output, StartsWith("LAMMPS ("));
|
||||
}
|
||||
void TearDown() override {
|
||||
void TearDown() override
|
||||
{
|
||||
::testing::internal::CaptureStdout();
|
||||
lammps_close(lmp);
|
||||
std::string output = ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_STREQ(output.substr(0,16).c_str(), "Total wall time:");
|
||||
EXPECT_THAT(output, HasSubstr("Total wall time:"));
|
||||
if (verbose) std::cout << output;
|
||||
lmp = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_properties, get_mpi_comm) {
|
||||
TEST_F(LibraryProperties, version)
|
||||
{
|
||||
EXPECT_GE(20200824, lammps_version(lmp));
|
||||
};
|
||||
|
||||
TEST_F(LibraryProperties, get_mpi_comm)
|
||||
{
|
||||
int f_comm = lammps_get_mpi_comm(lmp);
|
||||
if (lammps_config_has_mpi_support())
|
||||
EXPECT_GE(f_comm, 0);
|
||||
|
@ -49,5 +63,154 @@ TEST_F(LAMMPS_properties, get_mpi_comm) {
|
|||
EXPECT_EQ(f_comm, -1);
|
||||
};
|
||||
|
||||
TEST_F(LAMMPS_properties, box) {
|
||||
TEST_F(LibraryProperties, natoms)
|
||||
{
|
||||
if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP();
|
||||
std::string input = INPUT_DIR + PATH_SEP + "in.fourmol";
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_file(lmp, input.c_str());
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_natoms(lmp), 29);
|
||||
};
|
||||
|
||||
TEST_F(LibraryProperties, thermo)
|
||||
{
|
||||
if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP();
|
||||
std::string input = INPUT_DIR + PATH_SEP + "in.fourmol";
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_file(lmp, input.c_str());
|
||||
lammps_command(lmp, "run 2 post no");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_get_thermo(lmp, "step"), 2);
|
||||
EXPECT_EQ(lammps_get_thermo(lmp, "atoms"), 29);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "vol"), 3375.0);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "density"), 0.12211250945013695);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "cellalpha"), 90.0);
|
||||
};
|
||||
|
||||
TEST_F(LibraryProperties, box)
|
||||
{
|
||||
if (!lammps_has_style(lmp, "atom", "full")) GTEST_SKIP();
|
||||
std::string input = INPUT_DIR + PATH_SEP + "in.fourmol";
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_file(lmp, input.c_str());
|
||||
lammps_command(lmp, "run 2 post no");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
double boxlo[3], boxhi[3], xy, yz, xz;
|
||||
int pflags[3], boxflag;
|
||||
lammps_extract_box(lmp, boxlo, boxhi, &xy, &yz, &xz, pflags, &boxflag);
|
||||
EXPECT_DOUBLE_EQ(boxlo[0], -6.024572);
|
||||
EXPECT_DOUBLE_EQ(boxlo[1], -7.692866);
|
||||
EXPECT_DOUBLE_EQ(boxlo[2], -8.086924);
|
||||
EXPECT_DOUBLE_EQ(boxhi[0], 8.975428);
|
||||
EXPECT_DOUBLE_EQ(boxhi[1], 7.307134);
|
||||
EXPECT_DOUBLE_EQ(boxhi[2], 6.913076);
|
||||
EXPECT_DOUBLE_EQ(xy, 0.0);
|
||||
EXPECT_DOUBLE_EQ(yz, 0.0);
|
||||
EXPECT_DOUBLE_EQ(xz, 0.0);
|
||||
EXPECT_EQ(pflags[0], 1);
|
||||
EXPECT_EQ(pflags[1], 1);
|
||||
EXPECT_EQ(pflags[2], 1);
|
||||
EXPECT_EQ(boxflag, 0);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "vol"), 3375.0);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "density"), 0.12211250945013695);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "cellalpha"), 90.0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_command(lmp, "change_box all boundary p p f triclinic xy final 0.5");
|
||||
lammps_command(lmp, "fix box all box/relax x 0.0 y 0.0");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
lammps_extract_box(lmp, boxlo, boxhi, &xy, &yz, &xz, pflags, &boxflag);
|
||||
EXPECT_DOUBLE_EQ(boxlo[0], -6.024572);
|
||||
EXPECT_DOUBLE_EQ(boxlo[1], -7.692866);
|
||||
EXPECT_DOUBLE_EQ(boxlo[2], -8.086924);
|
||||
EXPECT_DOUBLE_EQ(boxhi[0], 8.975428);
|
||||
EXPECT_DOUBLE_EQ(boxhi[1], 7.307134);
|
||||
EXPECT_DOUBLE_EQ(boxhi[2], 6.913076);
|
||||
EXPECT_DOUBLE_EQ(xy, 0.5);
|
||||
EXPECT_DOUBLE_EQ(yz, 0.0);
|
||||
EXPECT_DOUBLE_EQ(xz, 0.0);
|
||||
EXPECT_EQ(pflags[0], 1);
|
||||
EXPECT_EQ(pflags[1], 1);
|
||||
EXPECT_EQ(pflags[2], 0);
|
||||
EXPECT_EQ(boxflag, 1);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "vol"), 3375.0);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "density"), 0.12211250945013695);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "cellalpha"), 90.0);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "cellbeta"), 90.0);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "cellgamma"), 88.090847567003621);
|
||||
|
||||
boxlo[0] = -6.1;
|
||||
boxhi[1] = 7.3;
|
||||
xy = 0.1;
|
||||
lammps_reset_box(lmp, boxlo, boxhi, xy, yz, xz);
|
||||
lammps_extract_box(lmp, boxlo, boxhi, &xy, &yz, &xz, pflags, &boxflag);
|
||||
EXPECT_DOUBLE_EQ(boxlo[0], -6.1);
|
||||
EXPECT_DOUBLE_EQ(boxlo[1], -7.692866);
|
||||
EXPECT_DOUBLE_EQ(boxlo[2], -8.086924);
|
||||
EXPECT_DOUBLE_EQ(boxhi[0], 8.975428);
|
||||
EXPECT_DOUBLE_EQ(boxhi[1], 7.3);
|
||||
EXPECT_DOUBLE_EQ(boxhi[2], 6.913076);
|
||||
EXPECT_DOUBLE_EQ(xy, 0.1);
|
||||
EXPECT_DOUBLE_EQ(yz, 0.0);
|
||||
EXPECT_DOUBLE_EQ(xz, 0.0);
|
||||
EXPECT_EQ(pflags[0], 1);
|
||||
EXPECT_EQ(pflags[1], 1);
|
||||
EXPECT_EQ(pflags[2], 0);
|
||||
EXPECT_EQ(boxflag, 1);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "vol"), 3390.3580784497199);
|
||||
EXPECT_DOUBLE_EQ(lammps_get_thermo(lmp, "cellgamma"), 89.61785205109274);
|
||||
};
|
||||
TEST_F(LibraryProperties, setting)
|
||||
{
|
||||
#if defined(LAMMPS_SMALLSMALL)
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "bigint"), 4);
|
||||
#else
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "bigint"), 8);
|
||||
#endif
|
||||
#if defined(LAMMPS_BIGBIG)
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "tagint"), 8);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "imageint"), 8);
|
||||
#else
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "tagint"), 4);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "imageint"), 4);
|
||||
#endif
|
||||
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "box_exist"), 0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_command(lmp, "dimension 2");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "dimension"), 2);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_command(lmp, "dimension 3");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 0);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 0);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "rmass_flag"), 0);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "UNKNOWN"), -1);
|
||||
|
||||
if (lammps_has_style(lmp, "atom", "full")) {
|
||||
std::string input = INPUT_DIR + PATH_SEP + "in.fourmol";
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_file(lmp, input.c_str());
|
||||
lammps_command(lmp, "run 2 post no");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "triclinic"), 0);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "box_exist"), 1);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "dimension"), 3);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "nlocal"), 29);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "nghost"), 518);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "nall"), 547);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "nmax"), 16384);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "molecule_flag"), 1);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "q_flag"), 1);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "mu_flag"), 0);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "rmass_flag"), 0);
|
||||
if (!verbose) ::testing::internal::CaptureStdout();
|
||||
lammps_command(lmp, "change_box all triclinic");
|
||||
lammps_command(lmp, "fix rmass all property/atom rmass ghost yes");
|
||||
if (!verbose) ::testing::internal::GetCapturedStdout();
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "triclinic"), 1);
|
||||
EXPECT_EQ(lammps_extract_setting(lmp, "rmass_flag"), 1);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/* ----------------------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
http://lammps.sandia.gov, Sandia National Laboratories
|
||||
Steve Plimpton, sjplimp@sandia.gov
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#include "test_main.h"
|
||||
#include "utils.h"
|
||||
#include "gmock/gmock.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
#include <iostream>
|
||||
#include <mpi.h>
|
||||
|
||||
// whether to print verbose output (i.e. not capturing LAMMPS screen output).
|
||||
bool verbose = false;
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
MPI_Init(&argc, &argv);
|
||||
::testing::InitGoogleMock(&argc, argv);
|
||||
|
||||
if (argc < 1) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
// handle arguments passed via environment variable
|
||||
if (const char *var = getenv("TEST_ARGS")) {
|
||||
std::vector<std::string> env = LAMMPS_NS::utils::split_words(var);
|
||||
for (auto arg : env) {
|
||||
if (arg == "-v") {
|
||||
verbose = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int iarg = 1;
|
||||
while (iarg < argc) {
|
||||
if (strcmp(argv[iarg], "-v") == 0) {
|
||||
verbose = true;
|
||||
++iarg;
|
||||
} else {
|
||||
std::cerr << "unknown option: " << argv[iarg] << "\n\n";
|
||||
MPI_Finalize();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
int rv = RUN_ALL_TESTS();
|
||||
MPI_Finalize();
|
||||
return rv;
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/* -*- c++ -*- ----------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
http://lammps.sandia.gov, Sandia National Laboratories
|
||||
Steve Plimpton, sjplimp@sandia.gov
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#ifndef TEST_MAIN_H
|
||||
#define TEST_MAIN_H
|
||||
|
||||
extern bool verbose;
|
||||
|
||||
#define EXPECT_FP_LE_WITH_EPS(val1, val2, eps) \
|
||||
do { \
|
||||
const double diff = fabs(val1 - val2); \
|
||||
const double div = std::min(fabs(val1), fabs(val2)); \
|
||||
const double err = (div == 0.0) ? diff : diff / div; \
|
||||
EXPECT_PRED_FORMAT2(::testing::DoubleLE, err, eps); \
|
||||
} while (0);
|
||||
|
||||
#endif
|
||||
|
||||
#if defined _WIN32
|
||||
static const char PATH_SEP = '\\';
|
||||
#else
|
||||
static const char PATH_SEP = '/';
|
||||
#endif
|
Loading…
Reference in New Issue