From d980421ce059e41babb400346c6c0df0f3867c12 Mon Sep 17 00:00:00 2001 From: Giovanni Bussi <giovanni.bussi@gmail.com> Date: Tue, 13 Nov 2018 14:58:03 +0100 Subject: [PATCH] Added dlopen constructors to python interface This allows creating plumed objects with p=plumed.Plumed(kernel="/path/to/libplumedKernel.so") Not strictly necessary, but might be useful to allow more flexibility. --- python/buildPythonInterface.py | 2 +- python/cplumed.pxd | 4 ++++ python/plumed.pyx | 16 +++++++++++++--- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/python/buildPythonInterface.py b/python/buildPythonInterface.py index ffb33307a..ff7fd60bd 100644 --- a/python/buildPythonInterface.py +++ b/python/buildPythonInterface.py @@ -38,7 +38,7 @@ plumedversion = subprocess.check_output(['grep','-v','#','../VERSION']).decode(" print( "Module name " + plumedname ) print( "Version number " + plumedversion ) -extra_compile_args=['-D__PLUMED_HAS_DLOPEN','-D__PLUMED_WRAPPER_LINK_RUNTIME=1','-D__PLUMED_WRAPPER_CXX=1','-D__PLUMED_WRAPPER_IMPLEMENTATION=1','-D__PLUMED_WRAPPER_EXTERN=0'] +extra_compile_args=['-D__PLUMED_HAS_DLOPEN','-D__PLUMED_WRAPPER_LINK_RUNTIME=1','-D__PLUMED_WRAPPER_CXX=1','-D__PLUMED_WRAPPER_IMPLEMENTATION=1','-D__PLUMED_WRAPPER_EXTERN=0','-D__PLUMED_WRAPPER_CXX_DEFAULT_INVALID=1'] defaultkernel=os.getenv("default_kernel") if defaultkernel is not None: diff --git a/python/cplumed.pxd b/python/cplumed.pxd index 513ec72be..4535d36c5 100644 --- a/python/cplumed.pxd +++ b/python/cplumed.pxd @@ -33,3 +33,7 @@ cdef extern from "Plumed.h" namespace "PLMD": void cmd(const char*key, const void*val) except + void cmd(const char*key) except + bool valid() except + + @staticmethod + Plumed dlopen(const char*path) except + + @staticmethod + Plumed makeValid() except + diff --git a/python/plumed.pyx b/python/plumed.pyx index 96b99f335..1a897863a 100644 --- a/python/plumed.pyx +++ b/python/plumed.pyx @@ -30,9 +30,19 @@ cimport numpy as np cdef class Plumed: cdef cplumed.Plumed c_plumed - def __cinit__(self): - if not self.c_plumed.valid(): - raise RuntimeError("PLUMED not available, check your PLUMED_KERNEL environment variable") + def __cinit__(self,kernel=None): + cdef bytes py_kernel + cdef char* ckernel + if kernel is None: + self.c_plumed=cplumed.Plumed.makeValid() + if not self.c_plumed.valid(): + raise RuntimeError("PLUMED not available, check your PLUMED_KERNEL environment variable") + else: + py_kernel= kernel.encode() + ckernel = py_kernel + self.c_plumed=cplumed.Plumed.dlopen(ckernel) + if not self.c_plumed.valid(): + raise RuntimeError("Error loading PLUMED kernel at path " + kernel) cdef int pres = 8 self.c_plumed.cmd( "setRealPrecision", <void*>&pres ) def cmd_ndarray_real(self, ckey, val): -- GitLab