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