From 42765b6db76f527349ce2183aa04d4ebf3f521db Mon Sep 17 00:00:00 2001 From: Joe Jordan Date: Mon, 28 Jun 2021 09:18:17 +0000 Subject: [PATCH] Add nblib virials function with test --- api/nblib/CMakeLists.txt | 1 + api/nblib/tests/CMakeLists.txt | 1 + api/nblib/tests/virials.cpp | 75 ++++++++++++++++++++++++++++++ api/nblib/virials.cpp | 85 ++++++++++++++++++++++++++++++++++ api/nblib/virials.h | 69 +++++++++++++++++++++++++++ 5 files changed, 231 insertions(+) create mode 100644 api/nblib/tests/virials.cpp create mode 100644 api/nblib/virials.cpp create mode 100644 api/nblib/virials.h diff --git a/api/nblib/CMakeLists.txt b/api/nblib/CMakeLists.txt index 82e406d806..0259b3b43f 100644 --- a/api/nblib/CMakeLists.txt +++ b/api/nblib/CMakeLists.txt @@ -99,6 +99,7 @@ target_sources(nblib simulationstate.cpp topologyhelpers.cpp topology.cpp + virials.cpp ) gmx_target_compile_options(nblib) diff --git a/api/nblib/tests/CMakeLists.txt b/api/nblib/tests/CMakeLists.txt index ae965706f9..6346ff29fb 100644 --- a/api/nblib/tests/CMakeLists.txt +++ b/api/nblib/tests/CMakeLists.txt @@ -61,6 +61,7 @@ gmx_add_gtest_executable( molecules.cpp nbnxmsetup.cpp topology.cpp + virials.cpp ) target_link_libraries(${exename} PRIVATE mdrun_test_infrastructure) target_link_libraries(${exename} PRIVATE nblib_test_infrastructure nblib) diff --git a/api/nblib/tests/virials.cpp b/api/nblib/tests/virials.cpp new file mode 100644 index 0000000000..235de30b44 --- /dev/null +++ b/api/nblib/tests/virials.cpp @@ -0,0 +1,75 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * GROMACS is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * GROMACS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GROMACS; if not, see + * http://www.gnu.org/licenses, or write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * If you want to redistribute modifications to GROMACS, please + * consider that scientific software is very special. Version + * control is crucial - bugs must be traceable. We will be happy to + * consider code for inclusion in the official distribution, but + * derived work must not be called official GROMACS. Details are found + * in the README & COPYING files - if they are missing, get the + * official version at http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ +/*! \internal \file + * \brief + * This implements virials tests + * + * \author Victor Holanda + * \author Joe Jordan + * \author Prashanth Kanduri + * \author Sebastian Keller + */ +#include + +#include "gromacs/mdtypes/forcerec.h" +#include "nblib/box.h" +#include "nblib/nbnxmsetuphelpers.h" +#include "nblib/virials.h" + +namespace nblib +{ +namespace test +{ + +TEST(VirialsTest, computeVirialTensorWorks) +{ + std::vector coords = { { 0, 1, 2 }, { 2, 3, 4 } }; + std::vector forces = { { 2, 1, 2 }, { 4, 3, 4 } }; + std::vector shiftForces(gmx::c_numShiftVectors, Vec3(0.0, 1.0, 0.0)); + Box box(1, 2, 3); + t_forcerec forcerec; + updateForcerec(&forcerec, box.legacyMatrix()); + std::vector shiftVectors(gmx::c_numShiftVectors); + // copy shift vectors from ForceRec + std::copy(forcerec.shift_vec.begin(), forcerec.shift_vec.end(), shiftVectors.begin()); + std::vector virialTest(9, 0); + computeVirialTensor(coords, forces, shiftVectors, shiftForces, box, virialTest); + std::vector virialRef{ -4, -3, -4, -7, -5, -7, -10, -7, -10 }; + EXPECT_EQ(virialRef, virialTest); +} + +} // namespace test + +} // namespace nblib diff --git a/api/nblib/virials.cpp b/api/nblib/virials.cpp new file mode 100644 index 0000000000..74f90a62df --- /dev/null +++ b/api/nblib/virials.cpp @@ -0,0 +1,85 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * GROMACS is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * GROMACS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GROMACS; if not, see + * http://www.gnu.org/licenses, or write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * If you want to redistribute modifications to GROMACS, please + * consider that scientific software is very special. Version + * control is crucial - bugs must be traceable. We will be happy to + * consider code for inclusion in the official distribution, but + * derived work must not be called official GROMACS. Details are found + * in the README & COPYING files - if they are missing, get the + * official version at http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ +/*! \inpublicapi \file + * \brief + * Implements functionality to compute virials from force data + * + * \author Victor Holanda + * \author Joe Jordan + * \author Prashanth Kanduri + * \author Sebastian Keller + */ + +#include "gromacs/mdlib/calcvir.h" +#include "gromacs/utility/arrayref.h" +#include "nblib/box.h" +#include "nblib/exception.h" +#include "nblib/virials.h" + +namespace nblib +{ + +void computeVirialTensor(gmx::ArrayRef coordinates, + gmx::ArrayRef forces, + gmx::ArrayRef shiftVectors, + gmx::ArrayRef shiftForces, + const Box& box, + gmx::ArrayRef virialOutput) +{ + if (virialOutput.size() != 9) + { + throw InputException("Virial array size incorrect, should be 9"); + } + + // set virial output array to zero + std::fill(virialOutput.begin(), virialOutput.end(), 0.0); + // use legacy tensor format + rvec* virial = reinterpret_cast(virialOutput.data()); + + // compute the virials from surrounding boxes + const rvec* fshift = as_rvec_array(shiftForces.data()); + const rvec* shift_vec = as_rvec_array(shiftVectors.data()); + calc_vir(numShiftVectors, shift_vec, fshift, virial, false, box.legacyMatrix()); + + // calculate partial virial, for local atoms only, based on short range + // NOTE: GROMACS uses a variable called mdatoms.homenr which is basically number of atoms in current processor + // Used numAtoms from the coordinate array in its place + auto numAtoms = coordinates.size(); + const rvec* f = as_rvec_array(forces.data()); + const rvec* x = as_rvec_array(coordinates.data()); + calc_vir(numAtoms, x, f, virial, false, box.legacyMatrix()); +} + +} // namespace nblib diff --git a/api/nblib/virials.h b/api/nblib/virials.h new file mode 100644 index 0000000000..bdaab73252 --- /dev/null +++ b/api/nblib/virials.h @@ -0,0 +1,69 @@ +/* + * This file is part of the GROMACS molecular simulation package. + * + * Copyright (c) 2021, by the GROMACS development team, led by + * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, + * and including many others, as listed in the AUTHORS file in the + * top-level source directory and at http://www.gromacs.org. + * + * GROMACS is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 2.1 + * of the License, or (at your option) any later version. + * + * GROMACS is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with GROMACS; if not, see + * http://www.gnu.org/licenses, or write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * If you want to redistribute modifications to GROMACS, please + * consider that scientific software is very special. Version + * control is crucial - bugs must be traceable. We will be happy to + * consider code for inclusion in the official distribution, but + * derived work must not be called official GROMACS. Details are found + * in the README & COPYING files - if they are missing, get the + * official version at http://www.gromacs.org. + * + * To help us fund GROMACS development, we humbly ask that you cite + * the research papers on the package. Check out http://www.gromacs.org. + */ +/*! \internal \file + * \brief + * Implements functionality to compute virials from force data + * + * \author Victor Holanda + * \author Joe Jordan + * \author Prashanth Kanduri + * \author Sebastian Keller + */ +#ifndef NBLIB_VIRIALS_H +#define NBLIB_VIRIALS_H + +#include "nblib/basicdefinitions.h" +#include "nblib/vector.h" + +namespace gmx +{ +template +class ArrayRef; +} + +namespace nblib +{ +class Box; + +//! Computes virial tensor and stores it in an array of size 9 +void computeVirialTensor(gmx::ArrayRef coordinates, + gmx::ArrayRef forces, + gmx::ArrayRef shiftVectors, + gmx::ArrayRef shiftForces, + const Box& box, + gmx::ArrayRef virialOutput); + +} // namespace nblib +#endif // NBLIB_VIRIALS_H -- 2.22.0