From a22dd66a283770f00741a793d6853c07d6063a63 Mon Sep 17 00:00:00 2001 From: Daniele Rapetti <5535617+Iximiel@users.noreply.github.com> Date: Fri, 18 Oct 2024 15:03:20 +0200 Subject: [PATCH] Now pycv appears to load correcly --- plugins/pycv/pythontests/justInit.py | 10 ++ plugins/pycv/pythontests/justInitDict.py | 8 ++ plugins/pycv/pythontests/justPrepare.py | 13 +++ plugins/pycv/pythontests/justUpdate.py | 12 +++ plugins/pycv/pythontests/test_cv_calls.py | 122 ++++++++++++++++++++++ plugins/pycv/src/PythonCVInterface.cpp | 1 + 6 files changed, 166 insertions(+) create mode 100644 plugins/pycv/pythontests/justInit.py create mode 100644 plugins/pycv/pythontests/justInitDict.py create mode 100644 plugins/pycv/pythontests/justPrepare.py create mode 100644 plugins/pycv/pythontests/justUpdate.py create mode 100644 plugins/pycv/pythontests/test_cv_calls.py diff --git a/plugins/pycv/pythontests/justInit.py b/plugins/pycv/pythontests/justInit.py new file mode 100644 index 0000000000..b0df723d36 --- /dev/null +++ b/plugins/pycv/pythontests/justInit.py @@ -0,0 +1,10 @@ +import numpy as np +import plumedCommunications + + +def myInit(_: plumedCommunications.PythonCVInterface): + return{"Value": plumedCommunications.defaults.COMPONENT_NODEV,} + +def plumedCalculate(action: plumedCommunications.PythonCVInterface): + at: np.ndarray = action.getPositions() + return at[0][0]+at[0][1] diff --git a/plugins/pycv/pythontests/justInitDict.py b/plugins/pycv/pythontests/justInitDict.py new file mode 100644 index 0000000000..009b089f4f --- /dev/null +++ b/plugins/pycv/pythontests/justInitDict.py @@ -0,0 +1,8 @@ +import numpy as np +import plumedCommunications + +plumedInit={"Value": plumedCommunications.defaults.COMPONENT,} + +def plumedCalculate(action: plumedCommunications.PythonCVInterface): + at: np.ndarray = action.getPositions() + return at[0][0]+at[0][1] diff --git a/plugins/pycv/pythontests/justPrepare.py b/plugins/pycv/pythontests/justPrepare.py new file mode 100644 index 0000000000..1e1bb7301f --- /dev/null +++ b/plugins/pycv/pythontests/justPrepare.py @@ -0,0 +1,13 @@ +import numpy as np +import plumedCommunications + +plumedInit={"Value": plumedCommunications.defaults.COMPONENT,} + +def plumedPrepare(_: plumedCommunications.PythonCVInterface): + toret = {"setAtomRequest": f"1"} + return toret + + +def plumedCalculate(action: plumedCommunications.PythonCVInterface): + at: np.ndarray = action.getPositions() + return at[0][0]+at[0][1] diff --git a/plugins/pycv/pythontests/justUpdate.py b/plugins/pycv/pythontests/justUpdate.py new file mode 100644 index 0000000000..182049abf5 --- /dev/null +++ b/plugins/pycv/pythontests/justUpdate.py @@ -0,0 +1,12 @@ +import numpy as np +import plumedCommunications + +plumedInit={"Value": plumedCommunications.defaults.COMPONENT,} + +def myUpdate(_: plumedCommunications.PythonCVInterface): + print("myUpdate") + return {} + +def plumedCalculate(action: plumedCommunications.PythonCVInterface): + at: np.ndarray = action.getPositions() + return at[0][0]+at[0][1] diff --git a/plugins/pycv/pythontests/test_cv_calls.py b/plugins/pycv/pythontests/test_cv_calls.py new file mode 100644 index 0000000000..d32264cc1e --- /dev/null +++ b/plugins/pycv/pythontests/test_cv_calls.py @@ -0,0 +1,122 @@ +import unittest +import numpy as np + +from utilities_for_test import * + +import os + +THIS_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class TestPyCV(unittest.TestCase): + def test_INIT(self): + with cd(THIS_DIR): + os.environ["PLUMED_MAXBACKUP"] = "0" + traj, _, num_atoms, box, virial, masses, forces, charges = setUpTraj( + "traj.xyz" + ) + plmd = preparePlumed(num_atoms) + + cvPy = create_plumed_var( + plmd, "cvPy", "PYCVINTERFACE ATOMS=4 IMPORT=justInit INIT=myInit" + ) + + plmd.cmd("readInputLine", "PRINT FILE=colvar.out ARG=*") + + step = 0 + + plmd.cmd("setStep", step) + plmd.cmd("setBox", box) + plmd.cmd("setMasses", masses) + plmd.cmd("setCharges", charges) + plmd.cmd("setPositions", traj[step]) + plmd.cmd("setForces", forces) + plmd.cmd("setVirial", virial) + plmd.cmd("calc") + np.testing.assert_almost_equal(cvPy, 10.0, decimal=4) + + def test_INITDICT(self): + with cd(THIS_DIR): + os.environ["PLUMED_MAXBACKUP"] = "0" + traj, _, num_atoms, box, virial, masses, forces, charges = setUpTraj( + "traj.xyz" + ) + plmd = preparePlumed(num_atoms) + + cvPy = create_plumed_var( + plmd, "cvPy", "PYCVINTERFACE ATOMS=4 IMPORT=justInitDict" + ) + + plmd.cmd("readInputLine", "PRINT FILE=colvar.out ARG=*") + + step = 0 + + plmd.cmd("setStep", step) + plmd.cmd("setBox", box) + plmd.cmd("setMasses", masses) + plmd.cmd("setCharges", charges) + plmd.cmd("setPositions", traj[step]) + plmd.cmd("setForces", forces) + plmd.cmd("setVirial", virial) + plmd.cmd("calc") + np.testing.assert_almost_equal(cvPy, 10.0, decimal=4) + + def test_UPDATE(self): + with cd(THIS_DIR): + os.environ["PLUMED_MAXBACKUP"] = "0" + traj, _, num_atoms, box, virial, masses, forces, charges = setUpTraj( + "traj.xyz" + ) + plmd = preparePlumed(num_atoms) + + cvPy = create_plumed_var( + plmd, "cvPy", "PYCVINTERFACE ATOMS=4 IMPORT=justUpdate UPDATE=myUpdate" + ) + + plmd.cmd("readInputLine", "PRINT FILE=colvar.out ARG=*") + + step = 0 + + plmd.cmd("setStep", step) + plmd.cmd("setBox", box) + plmd.cmd("setMasses", masses) + plmd.cmd("setCharges", charges) + plmd.cmd("setPositions", traj[step]) + plmd.cmd("setForces", forces) + plmd.cmd("setVirial", virial) + plmd.cmd("calc") + np.testing.assert_almost_equal(cvPy, 10.0, decimal=4) + + def test_PREPARE(self): + with cd(THIS_DIR): + os.environ["PLUMED_MAXBACKUP"] = "0" + traj, _, num_atoms, box, virial, masses, forces, charges = setUpTraj( + "traj.xyz" + ) + plmd = preparePlumed(num_atoms) + #atoms=4 but the module choses 1 + cvPy = create_plumed_var( + plmd, "cvPy", "PYCVINTERFACE ATOMS=4 IMPORT=justPrepare PREPARE=plumedPrepare") + plmd.cmd("readInputLine", "PRINT FILE=colvar.out ARG=*") + # Open an output file + + step = 0 + + plmd.cmd("setStep", step) + plmd.cmd("setBox", box) + plmd.cmd("setMasses", masses) + plmd.cmd("setCharges", charges) + plmd.cmd("setPositions", traj[step]) + plmd.cmd("setForces", forces) + plmd.cmd("setVirial", virial) + plmd.cmd("calc") + + np.testing.assert_almost_equal(cvPy, 5.0, decimal=4) + + + + +if __name__ == "__main__": + # Output to four decimal places only + np.set_printoptions(precision=4) + unittest.main() diff --git a/plugins/pycv/src/PythonCVInterface.cpp b/plugins/pycv/src/PythonCVInterface.cpp index bf725b7c17..4632abf8c6 100644 --- a/plugins/pycv/src/PythonCVInterface.cpp +++ b/plugins/pycv/src/PythonCVInterface.cpp @@ -643,6 +643,7 @@ void PythonCVInterface::prepare() { void PythonCVInterface::update() { try { if(hasUpdate) { + py::gil_scoped_acquire gil; py::dict updateDict=pyUpdate(this); //See what to do here }