diff --git a/python/buildPythonInterface.py b/python/buildPythonInterface.py index ffb33307a2c951fe3e8e2fcbf0bf53e793e89c14..ff7fd60bda94c6a54f98aa1903763c44253a852c 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 513ec72be52e781b855559ffaea3ee5225fabd38..4535d36c53aa6b4d6d54b5bc6ec22a7974f48a4c 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 96b99f335447bf7ec1916f96656257098c06494f..1a897863a3871a35949bfcb05a6784714e533e39 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):