add lammps_expand() method and make available in python

This commit is contained in:
Axel Kohlmeyer
2024-09-20 00:17:06 -04:00
parent 11838801d6
commit 5e15eb6949
3 changed files with 72 additions and 0 deletions

View File

@ -178,6 +178,9 @@ class lammps(object):
self.lib.lammps_error.argtypes = [c_void_p, c_int, c_char_p] self.lib.lammps_error.argtypes = [c_void_p, c_int, c_char_p]
self.lib.lammps_expand.argtypes = [c_void_p, c_char_p]
self.lib.lammps_expand.restype = c_char_p
self.lib.lammps_file.argtypes = [c_void_p, c_char_p] self.lib.lammps_file.argtypes = [c_void_p, c_char_p]
self.lib.lammps_file.restype = None self.lib.lammps_file.restype = None
@ -613,6 +616,28 @@ class lammps(object):
# ------------------------------------------------------------------------- # -------------------------------------------------------------------------
def expand(self,line):
"""Expand a single LAMMPS string like an input line
This is a wrapper around the :cpp:func:`lammps_expand`
function of the C-library interface.
:param cmd: a single lammps line
:type cmd: string
:return: expanded string
:rtype: string
"""
if line: newline = line.encode()
else: return None
with ExceptionCheck(self):
strptr = self.lib.lammps_expand(self.lmp, newline)
rval = strptr.decode()
return rval
return None
# -------------------------------------------------------------------------
def file(self, path): def file(self, path):
"""Read LAMMPS commands from a file. """Read LAMMPS commands from a file.

View File

@ -501,6 +501,51 @@ void lammps_error(void *handle, int error_type, const char *error_text)
} }
} }
/* ---------------------------------------------------------------------- */
/** expand a single LAMMPS input line from a string.
*
\verbatim embed:rst
This function tells LAMMPS to expand the string in *cmd* like it would process
an input line fed to :cpp:func:`lammps_command` **without** executing it.
The entire string is considered as command and need not have a
(final) newline character. Newline characters in the body of the
string, however, will be treated as part of the command and will **not**
start a second command.
The function returns the expanded string in a new string buffer that
must be freed with :cpp:func:`lammps_free` after use to avoid a memory leak.
\endverbatim
*
* \param handle pointer to a previously created LAMMPS instance
* \param cmd string with a single LAMMPS input line
* \return string with expanded line */
char *lammps_expand(void *handle, const char *line)
{
auto lmp = (LAMMPS *) handle;
char *copy, *work;
int n, maxcopy, maxwork;
if (!line) return nullptr;
BEGIN_CAPTURE
{
n = strlen(line) + 1;
copy = (char *) malloc(n * sizeof(char));
work = (char *) malloc(n * sizeof(char));
maxwork = maxcopy = n;
memcpy(copy, line, maxcopy);
lmp->input->substitute(copy, work, maxcopy, maxwork, 0);
free(work);
}
END_CAPTURE
return copy;
}
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
// Library functions to process commands // Library functions to process commands
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------

View File

@ -133,6 +133,8 @@ void lammps_python_finalize();
void lammps_error(void *handle, int error_type, const char *error_text); void lammps_error(void *handle, int error_type, const char *error_text);
char *lammps_expand(void *handle, const char *line);
/* ---------------------------------------------------------------------- /* ----------------------------------------------------------------------
* Library functions to process commands * Library functions to process commands
* ---------------------------------------------------------------------- */ * ---------------------------------------------------------------------- */