add lammps_add_molecule API to the C-library interface and python/fortran module
This commit is contained in:
@ -2099,7 +2099,7 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
|
|
||||||
--------
|
--------
|
||||||
|
|
||||||
.. f:subroutine:: create_atoms([id,] type, x, [v,] [image,] [bexpand])
|
.. f:function:: create_atoms([id,] type, x, [v,] [image,] [bexpand])
|
||||||
|
|
||||||
This method calls :cpp:func:`lammps_create_atoms` to create additional atoms
|
This method calls :cpp:func:`lammps_create_atoms` to create additional atoms
|
||||||
from a given list of coordinates and a list of atom types. Additionally,
|
from a given list of coordinates and a list of atom types. Additionally,
|
||||||
@ -2128,6 +2128,8 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
will be created, not dropped, and the box dimensions will be extended.
|
will be created, not dropped, and the box dimensions will be extended.
|
||||||
Default is ``.FALSE.``
|
Default is ``.FALSE.``
|
||||||
:otype bexpand: logical,optional
|
:otype bexpand: logical,optional
|
||||||
|
:r atoms: number of created atoms
|
||||||
|
:rtype atoms: integer(c_int)
|
||||||
:to: :cpp:func:`lammps_create_atoms`
|
:to: :cpp:func:`lammps_create_atoms`
|
||||||
|
|
||||||
.. note::
|
.. note::
|
||||||
@ -2152,6 +2154,18 @@ Procedures Bound to the :f:type:`lammps` Derived Type
|
|||||||
|
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
.. f:subroutine:: create_molecule(id, jsonstr)
|
||||||
|
|
||||||
|
Add molecule template from string with JSON data
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
:p character(len=\*) id: desired molecule-ID
|
||||||
|
:p character(len=\*) jsonstr: string with JSON data defining the molecule template
|
||||||
|
:to: :cpp:func:`lammps_create_molecule`
|
||||||
|
|
||||||
|
--------
|
||||||
|
|
||||||
.. f:function:: find_pair_neighlist(style[, exact][, nsub][, reqid])
|
.. f:function:: find_pair_neighlist(style[, exact][, nsub][, reqid])
|
||||||
|
|
||||||
Find index of a neighbor list requested by a pair style.
|
Find index of a neighbor list requested by a pair style.
|
||||||
|
|||||||
@ -27,6 +27,7 @@ It documents the following functions:
|
|||||||
- :cpp:func:`lammps_scatter`
|
- :cpp:func:`lammps_scatter`
|
||||||
- :cpp:func:`lammps_scatter_subset`
|
- :cpp:func:`lammps_scatter_subset`
|
||||||
- :cpp:func:`lammps_create_atoms`
|
- :cpp:func:`lammps_create_atoms`
|
||||||
|
- :cpp:func:`lammps_create_molecule`
|
||||||
|
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
||||||
@ -103,4 +104,8 @@ It documents the following functions:
|
|||||||
.. doxygenfunction:: lammps_create_atoms(void *handle, int n, const int *id, const int *type, const double *x, const double *v, const int *image, int bexpand)
|
.. doxygenfunction:: lammps_create_atoms(void *handle, int n, const int *id, const int *type, const double *x, const double *v, const int *image, int bexpand)
|
||||||
:project: progguide
|
:project: progguide
|
||||||
|
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
.. doxygenfunction:: lammps_create_molecule
|
||||||
|
:project: progguide
|
||||||
|
|
||||||
|
|||||||
@ -141,6 +141,7 @@ liblammpsplugin_t *liblammpsplugin_load(const char *lib)
|
|||||||
ADDSYM(scatter_subset);
|
ADDSYM(scatter_subset);
|
||||||
|
|
||||||
ADDSYM(create_atoms);
|
ADDSYM(create_atoms);
|
||||||
|
ADDSYM(create_molecule);
|
||||||
|
|
||||||
ADDSYM(find_pair_neighlist);
|
ADDSYM(find_pair_neighlist);
|
||||||
ADDSYM(find_fix_neighlist);
|
ADDSYM(find_fix_neighlist);
|
||||||
|
|||||||
@ -207,6 +207,7 @@ struct _liblammpsplugin {
|
|||||||
int (*create_atoms)(void *, int, const int64_t *, const int *, const double *, const double *,
|
int (*create_atoms)(void *, int, const int64_t *, const int *, const double *, const double *,
|
||||||
const int64_t *, int);
|
const int64_t *, int);
|
||||||
#endif
|
#endif
|
||||||
|
int (*create_molecule)(void *, const char *, const char *);
|
||||||
|
|
||||||
int (*find_pair_neighlist)(void *, const char *, int, int, int);
|
int (*find_pair_neighlist)(void *, const char *, int, int, int);
|
||||||
int (*find_fix_neighlist)(void *, const char *, int);
|
int (*find_fix_neighlist)(void *, const char *, int);
|
||||||
|
|||||||
@ -197,6 +197,8 @@ MODULE LIBLAMMPS
|
|||||||
PROCEDURE, PRIVATE :: lmp_create_atoms_bigbig
|
PROCEDURE, PRIVATE :: lmp_create_atoms_bigbig
|
||||||
GENERIC :: create_atoms => lmp_create_atoms_int, &
|
GENERIC :: create_atoms => lmp_create_atoms_int, &
|
||||||
lmp_create_atoms_bigbig
|
lmp_create_atoms_bigbig
|
||||||
|
PROCEDURE :: create_molecule => lmp_create_molecule
|
||||||
|
|
||||||
PROCEDURE :: find_pair_neighlist => lmp_find_pair_neighlist
|
PROCEDURE :: find_pair_neighlist => lmp_find_pair_neighlist
|
||||||
PROCEDURE :: find_fix_neighlist => lmp_find_fix_neighlist
|
PROCEDURE :: find_fix_neighlist => lmp_find_fix_neighlist
|
||||||
PROCEDURE :: find_compute_neighlist => lmp_find_compute_neighlist
|
PROCEDURE :: find_compute_neighlist => lmp_find_compute_neighlist
|
||||||
@ -762,6 +764,12 @@ MODULE LIBLAMMPS
|
|||||||
INTEGER(c_int) :: lammps_create_atoms
|
INTEGER(c_int) :: lammps_create_atoms
|
||||||
END FUNCTION lammps_create_atoms
|
END FUNCTION lammps_create_atoms
|
||||||
|
|
||||||
|
SUBROUTINE lammps_create_molecule(handle, id, jsonstr) BIND(C)
|
||||||
|
IMPORT :: c_ptr
|
||||||
|
IMPLICIT NONE
|
||||||
|
TYPE(c_ptr), VALUE :: handle, id, jsonstr
|
||||||
|
END SUBROUTINE lammps_create_molecule
|
||||||
|
|
||||||
FUNCTION lammps_find_pair_neighlist(handle, style, exact, nsub, reqid) &
|
FUNCTION lammps_find_pair_neighlist(handle, style, exact, nsub, reqid) &
|
||||||
BIND(C)
|
BIND(C)
|
||||||
IMPORT :: c_ptr, c_int
|
IMPORT :: c_ptr, c_int
|
||||||
@ -2881,6 +2889,19 @@ CONTAINS
|
|||||||
END IF
|
END IF
|
||||||
END SUBROUTINE lmp_create_atoms_bigbig
|
END SUBROUTINE lmp_create_atoms_bigbig
|
||||||
|
|
||||||
|
! equivalent function to lammps_create_molecule
|
||||||
|
SUBROUTINE lmp_create_molecule(self, id, jsonstr)
|
||||||
|
CLASS(lammps), INTENT(IN) :: self
|
||||||
|
CHARACTER(LEN=*), INTENT(IN) :: id, jsonstr
|
||||||
|
TYPE(c_ptr) :: Cid, Cjsonstr
|
||||||
|
|
||||||
|
Cid = f2c_string(id)
|
||||||
|
Cjsonstr = f2c_string(jsonstr)
|
||||||
|
CALL lammps_create_molecule(self%handle, Cid, Cjsonstr)
|
||||||
|
CALL lammps_free(Cid)
|
||||||
|
CALL lammps_free(Cjsonstr)
|
||||||
|
END SUBROUTINE lmp_create_molecule
|
||||||
|
|
||||||
! equivalent function to lammps_find_pair_neighlist
|
! equivalent function to lammps_find_pair_neighlist
|
||||||
INTEGER(c_int) FUNCTION lmp_find_pair_neighlist(self, style, exact, nsub, &
|
INTEGER(c_int) FUNCTION lmp_find_pair_neighlist(self, style, exact, nsub, &
|
||||||
reqid)
|
reqid)
|
||||||
|
|||||||
@ -325,6 +325,8 @@ class lammps(object):
|
|||||||
POINTER(c_double), POINTER(c_double), POINTER(self.c_imageint), c_int]
|
POINTER(c_double), POINTER(c_double), POINTER(self.c_imageint), c_int]
|
||||||
self.lib.lammps_create_atoms.retype = c_int
|
self.lib.lammps_create_atoms.retype = c_int
|
||||||
|
|
||||||
|
self.lib.lammps_create_molecule.argtypes = [c_void_p, c_char_p, c_char_p]
|
||||||
|
self.lib.lammps_create_molecule.restype = None
|
||||||
|
|
||||||
self.lib.lammps_find_pair_neighlist.argtypes = [c_void_p, c_char_p, c_int, c_int, c_int]
|
self.lib.lammps_find_pair_neighlist.argtypes = [c_void_p, c_char_p, c_int, c_int, c_int]
|
||||||
self.lib.lammps_find_pair_neighlist.restype = c_int
|
self.lib.lammps_find_pair_neighlist.restype = c_int
|
||||||
@ -2101,6 +2103,28 @@ class lammps(object):
|
|||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
def create_molecule(self, id, jsonstr):
|
||||||
|
""" Create new molecule template from string with JSON data
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This is a wrapper around the :cpp:func:`lammps_create_molecule` function
|
||||||
|
of the library interface.
|
||||||
|
|
||||||
|
:param id: molecule-id of the new molecule template
|
||||||
|
:type name: string
|
||||||
|
:param jsonstr: JSON data defining a new molecule template
|
||||||
|
:type jsonstr: string
|
||||||
|
"""
|
||||||
|
if id: newid = id.encode()
|
||||||
|
else: newid = None
|
||||||
|
if id: newjsonstr = jsonstr.encode()
|
||||||
|
else: newjsonstr = None
|
||||||
|
with ExceptionCheck(self):
|
||||||
|
self.lib.lammps_create_molecule(self.lmp, newid, newjsonstr)
|
||||||
|
|
||||||
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def has_mpi_support(self):
|
def has_mpi_support(self):
|
||||||
""" Report whether the LAMMPS shared library was compiled with a
|
""" Report whether the LAMMPS shared library was compiled with a
|
||||||
|
|||||||
@ -36,6 +36,7 @@
|
|||||||
#include "group.h"
|
#include "group.h"
|
||||||
#include "info.h"
|
#include "info.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
#include "json.h"
|
||||||
#include "lattice.h"
|
#include "lattice.h"
|
||||||
#include "lmppython.h"
|
#include "lmppython.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
@ -6200,6 +6201,50 @@ int lammps_create_atoms(void *handle, int n, const tagint *id, const int *type,
|
|||||||
return (int) lmp->atom->natoms - natoms_prev;
|
return (int) lmp->atom->natoms - natoms_prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
/** Create new molecule template from JSON data provided as C-style string
|
||||||
|
*
|
||||||
|
\verbatim embed:rst
|
||||||
|
|
||||||
|
.. versionadded:: TBD
|
||||||
|
|
||||||
|
This function creates a new molecule template similar to the
|
||||||
|
:doc:`molecule command <molecule>`, but uses JSON data passed
|
||||||
|
as a C-style string instead of reading it from a file.
|
||||||
|
|
||||||
|
\endverbatim
|
||||||
|
*
|
||||||
|
* \param handle pointer to a previously created LAMMPS instance
|
||||||
|
* \param id molecule-ID
|
||||||
|
* \param json molecule data in JSON format as C-style string */
|
||||||
|
|
||||||
|
void lammps_create_molecule(void *handle, const char *id, const char *jsonstr)
|
||||||
|
{
|
||||||
|
auto *lmp = (LAMMPS *) handle;
|
||||||
|
if (!lmp || !lmp->atom || !lmp->comm || !lmp->domain || !lmp->error) {
|
||||||
|
const auto mesg = fmt::format("ERROR: {}(): Invalid LAMMPS handle\n", FNERR);
|
||||||
|
STORE_ERROR_MESSAGE(lmp, mesg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!id || !jsonstr) {
|
||||||
|
const auto mesg = fmt::format("ERROR: {}(): Non-NULL arguments required\n", FNERR);
|
||||||
|
STORE_ERROR_MESSAGE(lmp, mesg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_CAPTURE
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
auto jsondata = json::parse(jsonstr);
|
||||||
|
lmp->atom->add_molecule(id, jsondata);
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
STORE_ERROR_MESSAGE(lmp, e.what());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
END_CAPTURE;
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
// Library functions for accessing neighbor lists
|
// Library functions for accessing neighbor lists
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|||||||
@ -240,6 +240,8 @@ int lammps_create_atoms(void *handle, int n, const int64_t *id, const int *type,
|
|||||||
const double *v, const int64_t *image, int bexpand);
|
const double *v, const int64_t *image, int bexpand);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void lammps_create_molecule(void *handle, const char *id, const char *json);
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* Library functions for accessing neighbor lists
|
* Library functions for accessing neighbor lists
|
||||||
* ---------------------------------------------------------------------- */
|
* ---------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -176,8 +176,10 @@ extern void lammps_scatter(void *, const char *, int, int, void *);
|
|||||||
extern void lammps_scatter_subset(void *, const char *, int, int, int, int *, void *);
|
extern void lammps_scatter_subset(void *, const char *, int, int, int, int *, void *);
|
||||||
extern int lammps_create_atoms(void *handle, int n, const int *id, const int *type,
|
extern int lammps_create_atoms(void *handle, int n, const int *id, const int *type,
|
||||||
const double *x, const double *v, const int *image, int bexpand);
|
const double *x, const double *v, const int *image, int bexpand);
|
||||||
/*
|
/* extern int lammps_create_atoms(void *handle, int n, const int64_t *id, int *type,
|
||||||
extern int lammps_create_atoms(void *handle, int n, int64_t *id, int *type, */
|
const double *x, const double *v, const int64_t *image, int bexpand); */
|
||||||
|
extern void lammps_create_molecule(void *handle, const char *id, const char *json);
|
||||||
|
|
||||||
extern int lammps_find_pair_neighlist(void *, const char *, int, int, int);
|
extern int lammps_find_pair_neighlist(void *, const char *, int, int, int);
|
||||||
extern int lammps_find_fix_neighlist(void *, const char *, int);
|
extern int lammps_find_fix_neighlist(void *, const char *, int);
|
||||||
extern int lammps_find_compute_neighlist(void *, const char *, int);
|
extern int lammps_find_compute_neighlist(void *, const char *, int);
|
||||||
@ -375,8 +377,10 @@ extern void lammps_scatter(void *, const char *, int, int, void *);
|
|||||||
extern void lammps_scatter_subset(void *, const char *, int, int, int, int *, void *);
|
extern void lammps_scatter_subset(void *, const char *, int, int, int, int *, void *);
|
||||||
extern int lammps_create_atoms(void *handle, int n, const int *id, const int *type,
|
extern int lammps_create_atoms(void *handle, int n, const int *id, const int *type,
|
||||||
const double *x, const double *v, const int *image, int bexpand);
|
const double *x, const double *v, const int *image, int bexpand);
|
||||||
/*
|
/* extern int lammps_create_atoms(void *handle, int n, const int64_t *id, int *type,
|
||||||
extern int lammps_create_atoms(void *handle, int n, int64_t *id, int *type, */
|
const double *x, const double *v, const int64_t *image, int bexpand); */
|
||||||
|
extern void lammps_create_molecule(void *handle, const char *id, const char *json);
|
||||||
|
|
||||||
extern int lammps_find_pair_neighlist(void*, const char *, int, int, int);
|
extern int lammps_find_pair_neighlist(void*, const char *, int, int, int);
|
||||||
extern int lammps_find_fix_neighlist(void*, const char *, int);
|
extern int lammps_find_fix_neighlist(void*, const char *, int);
|
||||||
extern int lammps_find_compute_neighlist(void*, const char *, int);
|
extern int lammps_find_compute_neighlist(void*, const char *, int);
|
||||||
|
|||||||
Reference in New Issue
Block a user